Index: addons/HeuristicLab.MetaOptimization/Build.cmd
===================================================================
--- addons/HeuristicLab.MetaOptimization/Build.cmd	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/Build.cmd	(revision 15740)
@@ -0,0 +1,94 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=1
+
+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 [Debug]: 
+IF "%CONFIGURATION%"=="" SET CONFIGURATION=Debug
+
+:platform_selection
+IF "%~3"=="" GOTO :prompt_platform
+  
+SET PLATFORM=%~3
+ECHO Building platform %PLATFORM% ...
+GOTO :main
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+: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%"=="1" (
+  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: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HeuristicLab.HiveEngine.Views-3.3.csproj
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HeuristicLab.HiveEngine.Views-3.3.csproj	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HeuristicLab.HiveEngine.Views-3.3.csproj	(revision 15740)
@@ -0,0 +1,200 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.HiveEngine.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.HiveEngine.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\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|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Clients.Hive-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Clients.Hive-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Hive.JobManager-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Clients.Hive.JobManager-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="HiveEngineView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HiveEngineView.Designer.cs">
+      <DependentUpon>HiveEngineView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.HiveEngine\3.3\HeuristicLab.HiveEngine-3.3.csproj">
+      <Project>{2C036542-5451-4A23-AFF6-87575C7BAFE7}</Project>
+      <Name>HeuristicLab.HiveEngine-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="HiveEngineView.resx">
+      <DependentUpon>HiveEngineView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </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: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.Designer.cs	(revision 15740)
@@ -0,0 +1,221 @@
+﻿using HeuristicLab.Clients.Hive.JobManager.Views;
+namespace HeuristicLab.HiveEngine.Views {
+  partial class HiveEngineView {
+    /// <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.resourceIdsLabel = new System.Windows.Forms.Label();
+      this.resourceIdsTextBox = new System.Windows.Forms.TextBox();
+      this.priorityLabel = new System.Windows.Forms.Label();
+      this.priorityTextBox = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.executionTimeOnHiveTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.jobsTabPage = new System.Windows.Forms.TabPage();
+      this.hiveExperimentListView = new HeuristicLab.Clients.Hive.JobManager.Views.RefreshableHiveJobListView();
+      this.logTabPage = new System.Windows.Forms.TabPage();
+      this.logView = new HeuristicLab.Core.Views.LogView();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl.SuspendLayout();
+      this.jobsTabPage.SuspendLayout();
+      this.logTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // resourceIdsLabel
+      // 
+      this.resourceIdsLabel.AutoSize = true;
+      this.resourceIdsLabel.Location = new System.Drawing.Point(113, 55);
+      this.resourceIdsLabel.Name = "resourceIdsLabel";
+      this.resourceIdsLabel.Size = new System.Drawing.Size(70, 13);
+      this.resourceIdsLabel.TabIndex = 3;
+      this.resourceIdsLabel.Text = "ResourceIds:";
+      // 
+      // resourceIdsTextBox
+      // 
+      this.resourceIdsTextBox.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.resourceIdsTextBox.Location = new System.Drawing.Point(189, 52);
+      this.resourceIdsTextBox.Name = "resourceIdsTextBox";
+      this.resourceIdsTextBox.Size = new System.Drawing.Size(517, 20);
+      this.resourceIdsTextBox.TabIndex = 4;
+      this.resourceIdsTextBox.Text = "HEAL";
+      this.resourceIdsTextBox.Validated += new System.EventHandler(this.resourceIdsTextBox_Validated);
+      // 
+      // priorityLabel
+      // 
+      this.priorityLabel.AutoSize = true;
+      this.priorityLabel.Location = new System.Drawing.Point(3, 55);
+      this.priorityLabel.Name = "priorityLabel";
+      this.priorityLabel.Size = new System.Drawing.Size(41, 13);
+      this.priorityLabel.TabIndex = 5;
+      this.priorityLabel.Text = "Priority:";
+      // 
+      // priorityTextBox
+      // 
+      this.priorityTextBox.Location = new System.Drawing.Point(50, 52);
+      this.priorityTextBox.Name = "priorityTextBox";
+      this.priorityTextBox.Size = new System.Drawing.Size(57, 20);
+      this.priorityTextBox.TabIndex = 6;
+      this.priorityTextBox.Text = "0";
+      this.priorityTextBox.Validated += new System.EventHandler(this.priorityTextBox_Validated);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 29);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(123, 13);
+      this.label1.TabIndex = 7;
+      this.label1.Text = "Execution Time on Hive:";
+      // 
+      // executionTimeOnHiveTextBox
+      // 
+      this.executionTimeOnHiveTextBox.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.executionTimeOnHiveTextBox.Location = new System.Drawing.Point(129, 26);
+      this.executionTimeOnHiveTextBox.Name = "executionTimeOnHiveTextBox";
+      this.executionTimeOnHiveTextBox.ReadOnly = true;
+      this.executionTimeOnHiveTextBox.Size = new System.Drawing.Size(577, 20);
+      this.executionTimeOnHiveTextBox.TabIndex = 8;
+      // 
+      // 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.jobsTabPage);
+      this.tabControl.Controls.Add(this.logTabPage);
+      this.tabControl.Location = new System.Drawing.Point(3, 78);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(700, 460);
+      this.tabControl.TabIndex = 9;
+      // 
+      // jobsTabPage
+      // 
+      this.jobsTabPage.Controls.Add(this.hiveExperimentListView);
+      this.jobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.jobsTabPage.Name = "jobsTabPage";
+      this.jobsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.jobsTabPage.Size = new System.Drawing.Size(692, 434);
+      this.jobsTabPage.TabIndex = 0;
+      this.jobsTabPage.Text = "Jobs";
+      this.jobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // hiveExperimentListView
+      // 
+      this.hiveExperimentListView.Caption = "HiveExperimentList View";
+      this.hiveExperimentListView.Content = null;
+      this.hiveExperimentListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.hiveExperimentListView.Location = new System.Drawing.Point(3, 3);
+      this.hiveExperimentListView.Name = "hiveExperimentListView";
+      this.hiveExperimentListView.ReadOnly = false;
+      this.hiveExperimentListView.ShowDetails = true;
+      this.hiveExperimentListView.Size = new System.Drawing.Size(686, 428);
+      this.hiveExperimentListView.TabIndex = 0;
+      // 
+      // logTabPage
+      // 
+      this.logTabPage.Controls.Add(this.logView);
+      this.logTabPage.Location = new System.Drawing.Point(4, 22);
+      this.logTabPage.Name = "logTabPage";
+      this.logTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.logTabPage.Size = new System.Drawing.Size(692, 434);
+      this.logTabPage.TabIndex = 1;
+      this.logTabPage.Text = "Log";
+      this.logTabPage.UseVisualStyleBackColor = true;
+      // 
+      // logView
+      // 
+      this.logView.Caption = "SlaveView";
+      this.logView.Content = null;
+      this.logView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.logView.Location = new System.Drawing.Point(3, 3);
+      this.logView.Name = "logView";
+      this.logView.ReadOnly = false;
+      this.logView.Size = new System.Drawing.Size(686, 428);
+      this.logView.TabIndex = 0;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(4, 6);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 10;
+      this.executionTimeLabel.Text = "Execution Time:";
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.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.executionTimeTextBox.Location = new System.Drawing.Point(129, 3);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(577, 20);
+      this.executionTimeTextBox.TabIndex = 11;
+      // 
+      // HiveEngineView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.executionTimeOnHiveTextBox);
+      this.Controls.Add(this.priorityTextBox);
+      this.Controls.Add(this.priorityLabel);
+      this.Controls.Add(this.resourceIdsLabel);
+      this.Controls.Add(this.resourceIdsTextBox);
+      this.Name = "HiveEngineView";
+      this.Size = new System.Drawing.Size(706, 541);
+      this.tabControl.ResumeLayout(false);
+      this.jobsTabPage.ResumeLayout(false);
+      this.logTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label resourceIdsLabel;
+    private System.Windows.Forms.TextBox resourceIdsTextBox;
+    private System.Windows.Forms.Label priorityLabel;
+    private System.Windows.Forms.TextBox priorityTextBox;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox executionTimeOnHiveTextBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage jobsTabPage;
+    private System.Windows.Forms.TabPage logTabPage;
+    private System.Windows.Forms.Label executionTimeLabel;
+    private System.Windows.Forms.TextBox executionTimeTextBox;
+    private HeuristicLab.Core.Views.LogView logView;
+    private RefreshableHiveJobListView hiveExperimentListView;
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.cs	(revision 15740)
@@ -0,0 +1,108 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.HiveEngine.Views {
+  [View("Hive Engine View")]
+  [Content(typeof(HiveEngine), IsDefaultView = true)]
+  public sealed partial class HiveEngineView : ItemView {
+    public new HiveEngine Content {
+      get { return (HiveEngine)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public HiveEngineView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ExecutionTimeOnHiveChanged -= new EventHandler(Content_ExecutionTimeOnHiveChanged);
+      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExecutionTimeOnHiveChanged += new EventHandler(Content_ExecutionTimeOnHiveChanged);
+      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+    }
+
+    #region Event Handlers (Content)
+    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
+      } else {
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+      }
+    }
+
+    private void Content_ExecutionTimeOnHiveChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_ExecutionTimeOnHiveChanged), sender, e);
+      } else {
+        executionTimeOnHiveTextBox.Text = Content.ExecutionTimeOnHive.ToString();
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        resourceIdsTextBox.Text = string.Empty;
+        priorityTextBox.Text = string.Empty;
+        executionTimeOnHiveTextBox.Text = string.Empty;
+        hiveExperimentListView.Content = null;
+        logView.Content = null;
+      } else {
+        resourceIdsTextBox.Text = Content.ResourceNames;
+        priorityTextBox.Text = Content.Priority.ToString();
+        executionTimeOnHiveTextBox.Text = Content.ExecutionTimeOnHive.ToString();
+        hiveExperimentListView.Content = Content.Jobs;
+        logView.Content = Content.Log;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // Enable or disable controls based on whether the content is null or the view is set readonly
+      if (Content != null) {
+        resourceIdsTextBox.ReadOnly = this.ReadOnly;
+        priorityTextBox.ReadOnly = this.ReadOnly;
+      } else {
+        resourceIdsTextBox.ReadOnly = false;
+        priorityTextBox.ReadOnly = false;
+      }
+    }
+
+    #region Event Handlers (child controls)
+    private void resourceIdsTextBox_Validated(object sender, EventArgs e) {
+      Content.ResourceNames = resourceIdsTextBox.Text;
+    }
+
+    private void priorityTextBox_Validated(object sender, EventArgs e) {
+      Content.Priority = int.Parse(priorityTextBox.Text);
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/HiveEngineView.resx	(revision 15740)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/Plugin.cs.frame
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/Plugin.cs.frame	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/Plugin.cs.frame	(revision 15740)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.HiveEngine.Views {
+  [Plugin("HeuristicLab.HiveEngine.Views", "3.3.5.$WCREV$")]
+  [PluginFile("HeuristicLab.HiveEngine.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Hive", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Hive.JobManager", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.HiveEngine", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  public class HeuristicLabHiveEngineViewsPlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15740)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.HiveEngine.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2011 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("7c14407e-6980-465b-ba3a-4a916d48989b")]
+
+// 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.5.0")]
+[assembly: AssemblyFileVersion("3.3.5.$WCREV$")]
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Exceptions/HiveEngineException.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Exceptions/HiveEngineException.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Exceptions/HiveEngineException.cs	(revision 15740)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.HiveEngine {
+  public class HiveEngineException : Exception {
+    public HiveEngineException(string message) : base(message) { }
+
+    public HiveEngineException(string message, Exception innerException) : base(message, innerException) { }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Exceptions/ScopeMergeException.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Exceptions/ScopeMergeException.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Exceptions/ScopeMergeException.cs	(revision 15740)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.Runtime.Serialization;
+
+namespace HeuristicLab.HiveEngine {
+  [Serializable]
+  public class ScopeMergeException : Exception {
+    public ScopeMergeException() : base() { }
+    public ScopeMergeException(string msg) : base(msg) { }
+    public ScopeMergeException(string msg, Exception e) : base(msg, e) { }
+    protected ScopeMergeException(SerializationInfo info, StreamingContext context) : base(info, context) { }
+
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/HeuristicLab.HiveEngine-3.3.csproj
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/HeuristicLab.HiveEngine-3.3.csproj	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/HeuristicLab.HiveEngine-3.3.csproj	(revision 15740)
@@ -0,0 +1,191 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2C036542-5451-4A23-AFF6-87575C7BAFE7}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.HiveEngine</RootNamespace>
+    <AssemblyName>HeuristicLab.HiveEngine-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Clients.Hive-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Clients.Hive-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-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">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Hive-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Hive-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.SequentialEngine-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Exceptions\ScopeMergeException.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="HiveEngine.cs" />
+    <Compile Include="Exceptions\HiveEngineException.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </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: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/HiveEngine.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/HiveEngine.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/HiveEngine.cs	(revision 15740)
@@ -0,0 +1,340 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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 System.Threading.Tasks;
+using HeuristicLab.Clients.Hive;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.HiveEngine {
+  /// <summary>
+  /// Represents an engine that executes operations which can be executed in parallel on the hive
+  /// </summary>
+  [StorableClass]
+  [Item("Hive Engine", "Engine for parallel execution on the hive. You need enable `Parallel` for at least one operator in your operator graph to have all childoperations parallelized. Also those childoperations must not have sideeffects on a higher scope.")]
+  public class HiveEngine : Engine {
+    private static object locker = new object();
+    private CancellationToken cancellationToken;
+    private bool firstRun = true;
+
+    [Storable]
+    private IOperator currentOperator;
+
+    [Storable]
+    public string ResourceNames { get; set; }
+
+    [Storable]
+    private int priority;
+    public int Priority {
+      get { return priority; }
+      set { priority = value; }
+    }
+
+    [Storable]
+    private TimeSpan executionTimeOnHive;
+    public TimeSpan ExecutionTimeOnHive {
+      get { return executionTimeOnHive; }
+      set {
+        if (value != executionTimeOnHive) {
+          executionTimeOnHive = value;
+          OnExecutionTimeOnHiveChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private bool isPrivileged;
+    public bool IsPrivileged {
+      get { return isPrivileged; }
+      set { isPrivileged = value; }
+    }
+
+    // Task can't be storable, so RefreshableHiveExperiment can't be stored. But as previous runs are only informative it does not matter (only execution time on hive will be wrong because of that -> Todo)
+    private ItemCollection<RefreshableJob> jobs = new ItemCollection<RefreshableJob>();
+    public ItemCollection<RefreshableJob> Jobs {
+      get { return jobs; }
+      set { jobs = value; }
+    }
+
+    private List<Plugin> onlinePlugins;
+    public List<Plugin> OnlinePlugins {
+      get { return onlinePlugins; }
+      set { onlinePlugins = value; }
+    }
+
+    private List<Plugin> alreadyUploadedPlugins;
+    public List<Plugin> AlreadyUploadedPlugins {
+      get { return alreadyUploadedPlugins; }
+      set { alreadyUploadedPlugins = value; }
+    }
+
+    #region constructors and cloning
+    public HiveEngine() {
+      this.ResourceNames = "HEAL";
+      this.Priority = 0;
+      this.log = new ThreadSafeLog();
+    }
+
+    [StorableConstructor]
+    protected HiveEngine(bool deserializing) : base(deserializing) { }
+    protected HiveEngine(HiveEngine original, Cloner cloner)
+      : base(original, cloner) {
+      this.ResourceNames = original.ResourceNames;
+      this.currentOperator = cloner.Clone(original.currentOperator);
+      this.priority = original.priority;
+      this.executionTimeOnHive = original.executionTimeOnHive;
+      this.IsPrivileged = original.IsPrivileged;
+      // do not clone jobs - otherwise they would be sent with every task
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HiveEngine(this, cloner);
+    }
+    #endregion
+
+    #region Events
+    protected override void OnPrepared() {
+      base.OnPrepared();
+      this.ExecutionTimeOnHive = TimeSpan.Zero;
+    }
+
+    public event EventHandler ExecutionTimeOnHiveChanged;
+    protected virtual void OnExecutionTimeOnHiveChanged() {
+      var handler = ExecutionTimeOnHiveChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    protected override void Run(CancellationToken cancellationToken) {
+      this.cancellationToken = cancellationToken;
+      Run(ExecutionStack);
+    }
+
+    private void Run(object state) {
+      Stack<IOperation> executionStack = (Stack<IOperation>)state;
+      IOperation next;
+      OperationCollection coll;
+      IAtomicOperation operation;
+
+      if (firstRun) {
+        TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);
+        this.OnlinePlugins = HiveServiceLocator.Instance.CallHiveService(s => s.GetPlugins()).Where(x => x.Hash != null).ToList();
+        this.AlreadyUploadedPlugins = new List<Plugin>();
+        firstRun = false;
+      }
+
+      while (executionStack.Count > 0) {
+        cancellationToken.ThrowIfCancellationRequested();
+
+        next = executionStack.Pop();
+        if (next is OperationCollection) {
+          coll = (OperationCollection)next;
+
+          if (coll.Parallel) {
+            try {
+              // clone the parent scope here and reuse it for each operation. otherwise for each task the whole scope-tree first needs to be copied and then cleaned, which causes a lot of work for the Garbage Collector
+              IScope parentScopeClone = (IScope)((IAtomicOperation)coll.First()).Scope.Parent.Clone();
+              parentScopeClone.SubScopes.Clear();
+              parentScopeClone.ClearParentScopes();
+
+              EngineTask[] jobs = new EngineTask[coll.Count];
+              for (int i = 0; i < coll.Count; i++) {
+                jobs[i] = new EngineTask(coll[i], new SequentialEngine.SequentialEngine());
+              }
+
+              var experiment = CreateJob();
+              IScope[] scopes = ExecuteOnHive(experiment, jobs, parentScopeClone, cancellationToken);
+
+              for (int i = 0; i < coll.Count; i++) {
+                if (coll[i] is IAtomicOperation) {
+                  ExchangeScope(scopes[i], ((IAtomicOperation)coll[i]).Scope);
+                } else if (coll[i] is OperationCollection) {
+                  // todo ??
+                }
+              }
+            }
+            catch {
+              executionStack.Push(coll); throw;
+            }
+          } else {
+            for (int i = coll.Count - 1; i >= 0; i--)
+              if (coll[i] != null) executionStack.Push(coll[i]);
+          }
+        } else if (next is IAtomicOperation) {
+          operation = (IAtomicOperation)next;
+          try {
+            next = operation.Operator.Execute((IExecutionContext)operation, cancellationToken);
+          }
+          catch (Exception ex) {
+            executionStack.Push(operation);
+            if (ex is OperationCanceledException) throw ex;
+            else throw new OperatorExecutionException(operation.Operator, ex);
+          }
+          if (next != null) executionStack.Push(next);
+
+          if (operation.Operator.Breakpoint) {
+            log.LogMessage(string.Format("Breakpoint: {0}", operation.Operator.Name != string.Empty ? operation.Operator.Name : operation.Operator.ItemName));
+            Pause();
+          }
+        }
+      }
+    }
+
+    private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) {
+      e.SetObserved(); // avoid crash of process
+    }
+
+    private IRandom FindRandomParameter(IExecutionContext ec) {
+      try {
+        if (ec == null)
+          return null;
+
+        foreach (var p in ec.Parameters) {
+          if (p.Name == "Random" && p is IValueParameter)
+            return ((IValueParameter)p).Value as IRandom;
+        }
+        return FindRandomParameter(ec.Parent);
+      }
+      catch { return null; }
+    }
+
+    private static void ReIntegrateScope(IAtomicOperation source, IAtomicOperation target) {
+      ExchangeScope(source.Scope, target.Scope);
+    }
+
+    private static void ExchangeScope(IScope source, IScope target) {
+      target.Variables.Clear();
+      target.Variables.AddRange(source.Variables);
+      target.SubScopes.Clear();
+      target.SubScopes.AddRange(source.SubScopes);
+      // TODO: validate if parent scopes match - otherwise source is invalid
+    }
+
+    /// <summary>
+    /// This method blocks until all jobs are finished
+    /// TODO: Cancelation needs to be refined; all tasks currently stay in Semaphore.WaitOne after cancelation
+    /// </summary>
+    /// <param name="jobs"></param>
+    private IScope[] ExecuteOnHive(RefreshableJob refreshableJob, EngineTask[] jobs, IScope parentScopeClone, CancellationToken cancellationToken) {
+      log.LogMessage(string.Format("Executing {0} operations on the hive.", jobs.Length));
+      IScope[] scopes = new Scope[jobs.Length];
+      object locker = new object();
+      var hiveExperiment = refreshableJob.Job;
+
+      try {
+        // create upload-tasks
+        for (int i = 0; i < jobs.Length; i++) {
+          var engineHiveJob = new EngineHiveTask(jobs[i], parentScopeClone);
+          engineHiveJob.Task.Priority = this.Priority;
+          refreshableJob.HiveTasks.Add(engineHiveJob);
+
+          // shuffle random variable to avoid the same random sequence in each operation; todo: does not yet work (it cannot find the random variable)
+          IRandom random = FindRandomParameter(jobs[i].InitialOperation as IExecutionContext);
+          if (random != null)
+            random.Reset(random.Next());
+        }
+        HiveClient.StartJob((e) => { log.LogException(e); }, refreshableJob, cancellationToken);
+
+        // do polling until experiment is finished and all jobs are downloaded
+        while (!refreshableJob.IsFinished()) {
+          Thread.Sleep(2000);
+          this.ExecutionTimeOnHive = TimeSpan.FromMilliseconds(jobs.Sum(x => x.ExecutionTime.TotalMilliseconds));
+          cancellationToken.ThrowIfCancellationRequested();
+        }
+        log.LogMessage(string.Format("{0} finished (TotalExecutionTime: {1}).", refreshableJob.ToString(), refreshableJob.ExecutionTime));
+
+        var failedJobs = refreshableJob.HiveTasks.Where(x => x.Task.State == TaskState.Failed);
+        if (failedJobs.Count() > 0) {
+          throw new HiveEngineException("Task failed: " + failedJobs.First().Task.StateLog.Last().Exception);
+        }
+
+        // get scopes
+        int j = 0;
+        foreach (var hiveJob in refreshableJob.HiveTasks) {
+          var scope = ((IAtomicOperation)((EngineTask)hiveJob.ItemTask).InitialOperation).Scope;
+          scopes[j++] = scope;
+        }
+        return scopes;
+      }
+      catch (OperationCanceledException e) {
+        throw e;
+      }
+      catch (Exception e) {
+        log.LogException(e);
+        throw e;
+      }
+      finally {
+        DisposeJob(refreshableJob);
+      }
+    }
+
+    private RefreshableJob CreateJob() {
+      lock (locker) {
+        var hiveExperiment = new Job();
+        hiveExperiment.Name = "HiveEngine Run " + jobs.Count;
+        hiveExperiment.DateCreated = DateTime.Now;
+        hiveExperiment.ResourceNames = this.ResourceNames;
+        var refreshableHiveExperiment = new RefreshableJob(hiveExperiment);
+        refreshableHiveExperiment.IsDownloadable = false; // download happens automatically so disable button
+        jobs.Add(refreshableHiveExperiment);
+        return refreshableHiveExperiment;
+      }
+    }
+
+    private void DisposeJob(RefreshableJob refreshableJob) {
+      refreshableJob.RefreshAutomatically = false;
+      DeleteHiveExperiment(refreshableJob.Job.Id);
+      ClearData(refreshableJob);
+    }
+
+    private void ClearData(RefreshableJob refreshableJob) {
+      var jobs = refreshableJob.GetAllHiveTasks();
+      foreach (var job in jobs) {
+        job.ClearData();
+      }
+    }
+
+    private void DeleteHiveExperiment(Guid jobId) {
+      HiveClient.TryAndRepeat(() => {
+        HiveServiceLocator.Instance.CallHiveService(s => s.DeleteJob(jobId));
+      }, 5, string.Format("Could not delete jobs"));
+    }
+
+    private List<Guid> GetResourceIds() {
+      return HiveServiceLocator.Instance.CallHiveService(service => {
+        var resourceNames = ResourceNames.Split(';');
+        var resourceIds = new List<Guid>();
+        foreach (var resourceName in resourceNames) {
+          Guid resourceId = service.GetResourceId(resourceName);
+          if (resourceId == Guid.Empty) {
+            throw new ResourceNotFoundException(string.Format("Could not find the resource '{0}'", resourceName));
+          }
+          resourceIds.Add(resourceId);
+        }
+        return resourceIds;
+      });
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Plugin.cs.frame
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Plugin.cs.frame	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Plugin.cs.frame	(revision 15740)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.HiveEngine {
+  [Plugin("HeuristicLab.HiveEngine", "3.3.5.$WCREV$")]
+  [PluginFile("HeuristicLab.HiveEngine-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Hive", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.SequentialEngine", "3.3")]
+  public class HeuristicLabHiveEnginePlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Properties/AssemblyInfo.cs.frame	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.HiveEngine/3.3/Properties/AssemblyInfo.cs.frame	(revision 15740)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.HiveEngine")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2011 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("7c14407e-6980-465b-ba3a-4a916d48989b")]
+
+// 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.5.0")]
+[assembly: AssemblyFileVersion("3.3.5.$WCREV$")]
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj	(revision 15740)
@@ -0,0 +1,365 @@
+﻿<?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)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.MetaOptimization.Test</RootNamespace>
+    <AssemblyName>HeuristicLab.MetaOptimization.Test</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <OutputPath>bin\Debug\</OutputPath>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <OutputPath>bin\Release\</OutputPath>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="ALGLIB-3.1.0">
+      <HintPath>..\..\..\trunk\sources\bin\ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="Google.ProtocolBuffers-0.9.1">
+      <HintPath>..\..\..\trunk\sources\bin\Google.ProtocolBuffers-0.9.1.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ALGLIB-3.1.0">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.ALGLIB-3.1.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.DataAnalysis-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.DataAnalysis-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.DataAnalysis.Views-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.DataAnalysis.Views-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.EvolutionStrategy-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.EvolutionStrategy-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.LocalSearch-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.LocalSearch-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.NSGA2-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.NSGA2-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.SimulatedAnnealing-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.SimulatedAnnealing-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.TabuSearch-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.TabuSearch-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.VariableNeighborhoodSearch-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.VariableNeighborhoodSearch-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Analysis.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Common-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Clients.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.CodeEditor-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.CodeEditor-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.DebugEngine-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.DebugEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.PermutationEncoding.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.HiveEngine-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.HiveEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.LibSVM-1.6.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.LibSVM-1.6.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.log4net-1.2.10.0">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.log4net-1.2.10.0.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Netron-3.0.2672.12446">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Netron-3.0.2672.12446.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators.Programmable-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Operators.Programmable-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Operators.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators.Views.GraphVisualization-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Operators.Views.GraphVisualization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimizer-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Optimizer-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ParallelEngine-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.ParallelEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Parameters.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence.GUI-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Persistence.GUI-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.ArtificialAnt-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.ArtificialAnt-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.ArtificialAnt.Views-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.ArtificialAnt.Views-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Classification-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Views-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Views-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.ExternalEvaluation-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.ExternalEvaluation-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.ExternalEvaluation.GP-3.4">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.ExternalEvaluation.GP-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.ExternalEvaluation.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.ExternalEvaluation.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Knapsack-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.Knapsack-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Knapsack.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.Knapsack.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.OneMax-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.OneMax-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.OneMax.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.OneMax.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TestFunctions.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.TestFunctions.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TravelingSalesman-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.TravelingSalesman-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TravelingSalesman.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.TravelingSalesman.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.VehicleRouting-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.VehicleRouting-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.VehicleRouting.Views-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.VehicleRouting.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ProtobufCS-0.9.1">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.ProtobufCS-0.9.1.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Selection-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.SequentialEngine-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.SharpDevelop-3.1.1.5327">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.SharpDevelop-3.1.1.5327.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Tracing-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Tracing-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Visualization.ChartControlsExtensions-3.3">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Visualization.ChartControlsExtensions-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.WinFormsUI-2.3.1">
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.WinFormsUI-2.3.1.dll</HintPath>
+    </Reference>
+    <Reference Include="ICSharpCode.NRefactory">
+      <HintPath>..\..\..\trunk\sources\bin\ICSharpCode.NRefactory.dll</HintPath>
+    </Reference>
+    <Reference Include="ICSharpCode.SharpDevelop.Dom">
+      <HintPath>..\..\..\trunk\sources\bin\ICSharpCode.SharpDevelop.Dom.dll</HintPath>
+    </Reference>
+    <Reference Include="ICSharpCode.SharpZipLib">
+      <HintPath>..\..\..\trunk\sources\bin\ICSharpCode.SharpZipLib.dll</HintPath>
+    </Reference>
+    <Reference Include="ICSharpCode.TextEditor">
+      <HintPath>..\..\..\trunk\sources\bin\ICSharpCode.TextEditor.dll</HintPath>
+    </Reference>
+    <Reference Include="LibSVM-1.6.3">
+      <HintPath>..\..\..\trunk\sources\bin\LibSVM-1.6.3.dll</HintPath>
+    </Reference>
+    <Reference Include="log4net">
+      <HintPath>..\..\..\trunk\sources\bin\log4net.dll</HintPath>
+    </Reference>
+    <Reference Include="Mono.Cecil">
+      <HintPath>..\..\..\trunk\sources\bin\Mono.Cecil.dll</HintPath>
+    </Reference>
+    <Reference Include="Netron.Diagramming.Core-3.0.2672.12446">
+      <HintPath>..\..\..\trunk\sources\bin\Netron.Diagramming.Core-3.0.2672.12446.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WeifenLuo.WinFormsUI.Docking-2.3.1">
+      <HintPath>..\..\..\trunk\sources\bin\WeifenLuo.WinFormsUI.Docking-2.3.1.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TableBuilder.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Problems.MetaOptimization.Views\3.3\HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj">
+      <Project>{59567338-A551-4386-8405-A8C0DF3E376D}</Project>
+      <Name>HeuristicLab.Problems.MetaOptimization.Views-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Problems.MetaOptimization\3.3\HeuristicLab.Problems.MetaOptimization-3.3.csproj">
+      <Project>{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}</Project>
+      <Name>HeuristicLab.Problems.MetaOptimization-3.3</Name>
+    </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>
+  -->
+</Project>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 15740)
@@ -0,0 +1,1361 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Algorithms.EvolutionStrategy;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+//using HeuristicLab.Hive.ExperimentManager;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.PluginInfrastructure.Manager;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.MetaOptimization;
+using HeuristicLab.Problems.TestFunctions;
+using HeuristicLab.Random;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.MetaOptimization.Test {
+  class Program {
+    static void Main(string[] args) {
+      PluginManager pm = new PluginManager(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
+      pm.DiscoverAndCheckPlugins();
+      pm.Run(pm.Applications.Where(x => x.Name == "TestApp").SingleOrDefault(), CommandLineArgumentHandling.GetArguments(args));
+    }
+  }
+
+  [Plugin("TestPlugin", "1.0.0.0")]
+  [PluginFile("HeuristicLab.MetaOptimization.Test.exe", PluginFileType.Assembly)]
+  public class TestPlugin : PluginBase { }
+
+  [Application("TestApp")]
+  public class TestApp : ApplicationBase {
+    //private static int metaAlgorithmPopulationSize = 30;
+    //private static int metaAlgorithmMaxGenerations = 30;
+    //private static int metaProblemRepetitions = 3;
+    //private static int baseAlgorithmMaxGenerations = 500;
+    //private static double mutationProbability = 0.10;
+
+    private static int metaAlgorithmPopulationSize = 3;
+    private static int metaAlgorithmMaxGenerations = 10;
+    private static double metaAlgorithmMutationProbability = 0.10;
+    private static int metaProblemRepetitions = 2;
+    private static int baseAlgorithmMaxGenerations = 1;
+    private static int baseAlgorithmPopulationSize = 5;
+
+    public override void Run(ICommandLineArgument[] args) {
+      ContentManager.Initialize(new PersistenceContentManager());
+
+      //TestTableBuilder();
+      //TestShorten();
+
+
+      bool y = ParameterConfiguration.IsSubclassOfRawGeneric(typeof(Tuple<,,,>), typeof(Tuple<,>));
+      bool a = ParameterConfiguration.IsSubclassOfRawGeneric(typeof(Tuple<>), typeof(Tuple<int>));
+
+
+      var x = typeof(float).IsPrimitive;
+
+      //TestSimilarities(); return;
+      //TestIntSampling();
+      //TestDoubleSampling(); return;
+      //TestTypeDiscovery();
+      //TestOperators(); return;
+      //TestCombinations();
+      //TestCombinations2();
+      //TestCombinations3();
+      //TestEnumeratorCollectionEnumerator();
+      //TestCombinations4(); return;
+      //TestAlgorithmPerformanceIssue(); return;
+      //TestWaitAny();
+      //TestExecutionTimeUpdateInvervalPerformance();
+      //TestMemoryConsumption();
+      //TestNormalCrossover();
+      //TestItemDictionary();
+
+      //TestSymbolicDataAnalysisGrammar(); return;
+      //TestObjectGraphObjectsTraversal(); return;
+      //TestParameterizedItem(); return;
+
+      //MetaOptimizationProblem metaOptimizationProblem = LoadOptimizationProblem("Meta Optimization Problem (Genetic Programming - Symbolic Regression 3.4 scaled).hl");
+      //var algorithmVc = metaOptimizationProblem.ParameterConfigurationTree;
+
+      //var metaOptimizationProblem = new MetaOptimizationProblem();
+      //var algorithmVc = SetupGAAlgorithm(typeof(GeneticAlgorithm), metaOptimizationProblem);
+
+      // import classification 4 problems
+      var metaOptimizationProblem = ((MetaOptimizationProblem)ContentManager.Load("MetaOpt GA,OSGA,Classification (melanoma,respiratory,wisconsin,prostata),MSE-Evaluator_test.hl"));
+      metaOptimizationProblem.QualityMeasureNameParameter.Value.Value = "Best training solution.Mean squared error (test)";
+
+      metaOptimizationProblem.Repetitions = new IntValue(metaProblemRepetitions);
+      GeneticAlgorithm metaLevelAlgorithm = GetSequentialMetaGA(metaOptimizationProblem);
+      //GeneticAlgorithm metaLevelAlgorithm = GetParallelMetaGA(metaOptimizationProblem);
+      //GeneticAlgorithm metaLevelAlgorithm = GetHiveParallelMetaGA(metaOptimizationProblem);
+      //EvolutionStrategy metaLevelAlgorithm = GetMetaES(metaOptimizationProblem);
+
+      //Console.WriteLine("Press enter to start"); Console.ReadLine();
+      //TestConfiguration(algorithmVc, typeof(GeneticAlgorithm), metaOptimizationProblem.Problems.First());
+
+      //Console.WriteLine("Press enter to start"); Console.ReadLine();
+      TestOptimization(metaLevelAlgorithm);
+
+      //TestMemoryLeak(metaLevelAlgorithm);
+
+      Console.ReadLine();
+    }
+
+    private void TestParameterizedItem() {
+      var value = new MyParameterizedItem();
+      Console.WriteLine("P1=1;; " + value.ToString());
+
+      var vc = new ParameterizedValueConfiguration(value, typeof(MyParameterizedItem), true);
+      vc.Optimize = true;
+      ((IntValue)vc.ParameterConfigurations.Single(x => x.Name == "P1").ActualValue.Value).Value = 22;
+      Console.WriteLine("P1=22;; " + value.ToString());
+      vc.ParameterConfigurations.Single(x => x.Name == "P1").ActualValue.Value = new IntValue(33);
+      Console.WriteLine("P1=33;; " + value.ToString());
+      vc.Parameterize(value);
+      Console.WriteLine("P1=33;; " + value.ToString());
+
+      Console.ReadLine();
+    }
+
+    private void TestObjectGraphObjectsTraversal() {
+      //var obj = new GeneticAlgorithm();
+      var obj = ContentManager.Load("Genetic Programming - Symbolic Regression 3.4_scaled_paused.hl");
+      Console.WriteLine("loaded");
+
+      for (int i = 0; i < 10; i++) {
+        var sw = new Stopwatch();
+        sw.Start();
+        var objects = obj.GetObjectGraphObjects().ToArray();
+        sw.Stop();
+
+        var typeCount = GetTypeCount(objects).ToArray();
+        Console.WriteLine("objects: {0}", objects.Count());
+        Console.WriteLine(sw.Elapsed);
+      }
+    }
+
+    private IOrderedEnumerable<KeyValuePair<Type, long>> GetTypeCount(object[] objects) {
+      var dict = new Dictionary<Type, long>();
+      foreach (var item in objects) {
+        var t = item.GetType();
+        if (!dict.ContainsKey(t))
+          dict.Add(t, 0);
+        dict[t]++;
+      }
+      return dict.OrderByDescending(x => x.Value);
+    }
+
+    private MetaOptimizationProblem LoadOptimizationProblem(string filename) {
+      return (MetaOptimizationProblem)ContentManager.Load(filename);
+    }
+
+    private void TestSymbolicDataAnalysisGrammar() {
+      var random = new MersenneTwister();
+
+      var grammar1 = new TypeCoherentExpressionGrammar();
+      var grammar2 = new TypeCoherentExpressionGrammar();
+
+      Console.WriteLine("========== Grammar1: ==========");
+      PrintGrammar(grammar1);
+      //Console.WriteLine("========== Grammar2: ==========");
+      //PrintGrammar(grammar2);
+
+      var vc1 = new SymbolicExpressionGrammarValueConfiguration(grammar1);
+
+      string info = vc1.ParameterInfoString;
+
+      ConfigureSymbolicExpressionGrammarVc(vc1);
+
+      info = vc1.ParameterInfoString;
+
+
+      var vc2 = new SymbolicExpressionGrammarValueConfiguration(grammar2);
+      ConfigureSymbolicExpressionGrammarVc(vc2);
+
+      vc1.Mutate(random, new MutateDelegate(ParameterConfigurationManipulator.Mutate), new UniformIntValueManipulator(), new UniformDoubleValueManipulator());
+      vc1.Parameterize(grammar1);
+
+      Console.WriteLine("========== Grammar1 (mutated): ==========");
+      PrintGrammar(grammar1);
+
+      vc1.Cross(random, vc2, new CrossDelegate(ParameterConfigurationCrossover.Cross), new DiscreteIntValueCrossover(), new AverageDoubleValueCrossover());
+      vc1.Parameterize(grammar1);
+
+      Console.WriteLine("========== Grammar1 (crossed): ==========");
+      PrintGrammar(grammar1);
+
+      //RealVector v1 = GetInitialFrequenciesAsRealVector(grammar1);
+      //RealVector v2 = GetInitialFrequenciesAsRealVector(grammar2);
+
+      //for (int i = 0; i < 10; i++) {
+      //  RealVector v3 = DiscreteCrossover.Apply(random, new ItemArray<RealVector>(new List<RealVector> { v1, v2 }));
+
+      //  var grammar3 = new TypeCoherentExpressionGrammar();
+      //  SetInitialFrequenciesFromRealVector(grammar3, v3);
+
+      //  Console.WriteLine("\n========== Crossed: ==========");
+      //  PrintGrammar(grammar3);
+      //}
+
+    }
+
+    private static void PrintGrammar(TypeCoherentExpressionGrammar grammar) {
+      foreach (var symbol in grammar.Symbols) {
+        Console.WriteLine("{0} ({1})", symbol.ToString(), symbol.InitialFrequency);
+      }
+    }
+
+    private static RealVector GetInitialFrequenciesAsRealVector(TypeCoherentExpressionGrammar grammar) {
+      var vector = new RealVector(grammar.Symbols.Count());
+      for (int i = 0; i < grammar.Symbols.Count(); i++) {
+        vector[i] = grammar.Symbols.ElementAt(i).InitialFrequency;
+      }
+      return vector;
+    }
+
+    private static void SetInitialFrequenciesFromRealVector(TypeCoherentExpressionGrammar grammar, RealVector vector) {
+      for (int i = 0; i < grammar.Symbols.Count(); i++) {
+        grammar.Symbols.ElementAt(i).InitialFrequency = vector[i];
+      }
+    }
+
+    private static void TestSimilarities() {
+      Console.WriteLine("\nDoubleRange:");
+      var doubleRange = new DoubleValueRange(new DoubleValue(0), new DoubleValue(10), new DoubleValue(1));
+      var a = new DoubleValue(5.0);
+
+      for (double d = 0; d < 10; d += 0.1) {
+        var similarity = doubleRange.CalculateSimilarity(a, new DoubleValue(d));
+        Console.WriteLine("{0}: {1}", d, similarity);
+      }
+
+      Console.WriteLine("\nPecentRange:");
+      var percentRange = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(1));
+      var b = new PercentValue(0.05);
+
+      for (double d = 0; d < 1; d += 0.01) {
+        var similarity = percentRange.CalculateSimilarity(b, new PercentValue(d));
+        Console.WriteLine("{0}: {1}", d, similarity);
+      }
+
+      Console.WriteLine("\nIntRange:");
+      var intRange = new IntValueRange(new IntValue(50), new IntValue(100), new IntValue(1));
+      var c = new IntValue(90);
+
+      for (int i = 0; i < 100; i++) {
+        var similarity = intRange.CalculateSimilarity(c, new IntValue(i));
+        Console.WriteLine("{0}: {1}", i, similarity);
+      }
+
+      Console.WriteLine("\nValueConfigurations:");
+      var vc1 = SetupGAAlgorithm(typeof(GeneticAlgorithm), new MetaOptimizationProblem());
+      vc1.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "Elites").Optimize = true;
+      vc1.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "PopulationSize").Optimize = true;
+      vc1.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "MutationProbability").Optimize = true;
+      vc1.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "Selector").Optimize = true;
+
+      var vc2 = (ParameterConfigurationTree)vc1.Clone();
+      Console.WriteLine("Assert(1): {0}", vc1.CalculateSimilarity(vc2));
+
+      ((IntValue)vc2.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "PopulationSize").ValueConfigurations[0].ActualValue.Value).Value = 75;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+
+      ((PercentValue)vc2.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.15;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+
+      ((PercentValue)vc2.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.25;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+      ((PercentValue)vc2.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.35;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+      ((PercentValue)vc2.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.45;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+      ((PercentValue)vc2.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "MutationProbability").ValueConfigurations[0].ActualValue.Value).Value = 0.55;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+
+      vc2.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "Selector").ActualValueConfigurationIndex = 3;
+      Console.WriteLine("{0}", vc1.CalculateSimilarity(vc2));
+
+      var random = new Random.MersenneTwister(0);
+      for (int i = 0; i < 10; i++) {
+        vc2.Randomize(random);
+        Console.WriteLine("Randomized: {0}", vc1.CalculateSimilarity(vc2));
+      }
+    }
+
+    private static void TestItemDictionary() {
+      var dict = new ItemDictionary<StringValue, RunCollection>();
+      dict.Add(new StringValue("a"), new RunCollection());
+      dict.Add(new StringValue("b"), new RunCollection());
+      dict.Add(new StringValue("c"), new RunCollection());
+
+      Console.WriteLine(dict.ContainsKey(new StringValue("a")));
+      Console.WriteLine(dict.Count(x => x.Key.Value == "a"));
+
+    }
+
+    private static void TestNormalCrossover() {
+      var random = new MersenneTwister();
+      double d1 = 0.5;
+      double d2 = 0.6;
+      var doubleRange = new DoubleValueRange(new DoubleValue(0.0), new DoubleValue(1.0), new DoubleValue(0.01));
+
+      using (var sw = new StreamWriter("normalCrossover-DoubleValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          sw.WriteLine(NormalDoubleValueCrossover.ApplyStatic(random, new DoubleValue(d1), new DoubleValue(d2), doubleRange));
+        }
+      }
+
+      int i1 = 180;
+      int i2 = 160;
+      var intRange = new IntValueRange(new IntValue(100), new IntValue(200), new IntValue(1));
+
+      using (var sw = new StreamWriter("normalCrossover-IntValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          sw.WriteLine(NormalIntValueCrossover.ApplyStatic(random, new IntValue(i1), new IntValue(i2), intRange));
+        }
+      }
+    }
+
+    private static void TestMemoryConsumption() {
+      Queue<TimeSpan> latestExecutionTimes = new Queue<TimeSpan>();
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+      ga.PopulationSize.Value = 3;
+      ga.MaximumGenerations.Value = 1;
+      ga.Engine = new SequentialEngine.SequentialEngine();
+      throw new NotImplementedException("TODO: set ga properties correctly");
+
+      MetaOptimizationProblem metaOptimizationProblem = new MetaOptimizationProblem();
+      metaOptimizationProblem.Repetitions = new IntValue(metaProblemRepetitions);
+      GeneticAlgorithm metaLevelAlgorithm = GetSequentialMetaGA(metaOptimizationProblem);
+      ParameterConfigurationTree algorithmVc = SetupGAAlgorithm(typeof(GeneticAlgorithm), metaOptimizationProblem);
+      Stopwatch sw = new Stopwatch();
+
+      var algs = new List<IAlgorithm>();
+      for (int i = 0; i < 10000; i++) {
+        sw.Start();
+        GeneticAlgorithm clonedGa = (GeneticAlgorithm)ga.Clone();
+        clonedGa.Name = "CLONED GA";
+        algorithmVc.Parameterize(clonedGa);
+        algs.Add(clonedGa);
+        sw.Reset();
+        ContentManager.Save((IStorableContent)metaLevelAlgorithm, "alg_" + i + ".hl", true);
+        Console.WriteLine("Cloned alg #{0}", i);
+      }
+    }
+
+    private static void TestExecutionTimeUpdateInvervalPerformance() {
+      TableBuilder tb = new TableBuilder("Tasks", "Interval", "TotalExecutionTime", "AvgExecutionTime", "TimeElapsed", "TotalTimeElapsed", "Speedup", "ExecutionTimeChangedCount", "RealExecutionTimeUpdate(ms)");
+      int tasks = 4;
+      int repetitions = 3;
+
+      // warmup
+      RepeatExecuteParallel(3, 1, 1, tb);
+      tb.AppendRow("--", "--", "--", "--", "--", "--", "--", "--", "--");
+      RepeatExecuteParallel(repetitions, tasks, 1, tb);
+      RepeatExecuteParallel(repetitions, tasks, 2.5, tb);
+      RepeatExecuteParallel(repetitions, tasks, 5, tb);
+      RepeatExecuteParallel(repetitions, tasks, 10, tb);
+      RepeatExecuteParallel(repetitions, tasks, 25, tb);
+      RepeatExecuteParallel(repetitions, tasks, 50, tb);
+      RepeatExecuteParallel(repetitions, tasks, 100, tb);
+      RepeatExecuteParallel(repetitions, tasks, 250, tb);
+      RepeatExecuteParallel(repetitions, tasks, 500, tb);
+      RepeatExecuteParallel(repetitions, tasks, 1000, tb);
+      RepeatExecuteParallel(repetitions, tasks, 2500, tb);
+      RepeatExecuteParallel(repetitions, tasks, 5000, tb);
+
+      using (var sw = new StreamWriter("TestExecutionTimeUpdateInvervalPerformance.txt")) {
+        sw.Write(tb.ToString());
+      }
+    }
+
+    private static GeneticAlgorithm CreateGA() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+      ga.Problem = new SingleObjectiveTestFunctionProblem() { ProblemSize = new IntValue(250) };
+      ga.Engine = new SequentialEngine.SequentialEngine();
+      ga.SetSeedRandomly.Value = false;
+      ga.Seed.Value = 0;
+      return ga;
+    }
+
+    private static void RepeatExecuteParallel(int repetitions, int tasks, double executionTimeUpdateIntervalMs, TableBuilder tb) {
+      for (int i = 0; i < repetitions; i++) {
+        ExecuteParallel(tasks, executionTimeUpdateIntervalMs, tb);
+        Console.Clear();
+        Console.WriteLine(tb.ToString());
+      }
+    }
+
+    private static void ExecuteParallel(int taskCount, double executionTimeUpdateIntervalMs, TableBuilder tb) {
+      Task<TimeSpan>[] tasks = new Task<TimeSpan>[taskCount];
+      EngineAlgorithm[] algs = new EngineAlgorithm[taskCount];
+      for (int i = 0; i < taskCount; i++) {
+        GeneticAlgorithm alg = CreateGA();
+        //((Engine)alg.Engine).ExecutionTimeUpdateInterval = TimeSpan.FromMilliseconds(executionTimeUpdateIntervalMs);
+        algs[i] = alg;
+      }
+      Console.WriteLine("Creating algs finished.");
+
+      for (int i = 0; i < taskCount; i++) {
+        tasks[i] = new Task<TimeSpan>((alg) => {
+          Console.WriteLine("Task {0} started.", Task.CurrentId);
+          var cancellationTokenSource = new CancellationTokenSource();
+
+          Stopwatch swx = new Stopwatch();
+          swx.Start();
+          ((EngineAlgorithm)alg).ExecutionTimeChanged += new EventHandler(Program_ExecutionTimeChanged);
+          ((EngineAlgorithm)alg).StartSync(cancellationTokenSource.Token);
+          ((EngineAlgorithm)alg).ExecutionTimeChanged -= new EventHandler(Program_ExecutionTimeChanged);
+          swx.Stop();
+          Console.WriteLine("Task {0} finished.", Task.CurrentId);
+          return swx.Elapsed;
+        }, algs[i]);
+      }
+      Console.WriteLine("Creating tasks finished.");
+      counter = 0;
+      Stopwatch sw = new Stopwatch();
+      sw.Start();
+      foreach (var task in tasks) task.Start();
+      Task.WaitAll(tasks);
+      sw.Stop();
+
+      if (!algs.All(alg => alg.ExecutionState == ExecutionState.Stopped))
+        throw new Exception("Not all algs stopped properly");
+
+      if (!algs.All(alg => ((DoubleValue)alg.Results["BestQuality"].Value).Value == ((DoubleValue)algs.First().Results["BestQuality"].Value).Value))
+        throw new Exception("Not all algs have the same resutls");
+
+      if (tb != null) {
+        double totalExecutionTimeMilliseconds = algs.Select(x => x.ExecutionTime.TotalMilliseconds).Sum();
+        double totalMilliseconds = tasks.Select(t => t.Result.TotalMilliseconds).Sum();
+        tb.AppendRow(
+          taskCount.ToString(),
+          executionTimeUpdateIntervalMs.ToString(),
+          TimeSpan.FromMilliseconds(totalExecutionTimeMilliseconds).ToString(),
+          TimeSpan.FromMilliseconds(totalExecutionTimeMilliseconds / taskCount).ToString(),
+          sw.Elapsed.ToString(),
+          TimeSpan.FromMilliseconds(totalMilliseconds).ToString(),
+          (totalMilliseconds / sw.ElapsedMilliseconds).ToString("0.00"),
+          counter.ToString(),
+          (totalExecutionTimeMilliseconds / counter).ToString("0.00"));
+      }
+      tasks = null;
+      algs = null;
+      GC.Collect();
+      Console.WriteLine("Test finished.");
+    }
+
+    private static int counter = 0;
+    static void Program_ExecutionTimeChanged(object sender, EventArgs e) {
+      System.Threading.Interlocked.Increment(ref counter);
+    }
+
+    private static void TestWaitAny() {
+      System.Random rand = new System.Random();
+      var tasks = new List<Task<int>>();
+      for (int i = 0; i < 10; i++) {
+        tasks.Add(Task.Factory.StartNew<int>((x) => {
+          int sleep = ((int)x - 10) * -1000;
+          Console.WriteLine("sleeping: {0} ms", sleep);
+          Thread.Sleep(0); // make context switch
+          Thread.Sleep(sleep);
+          return (int)x * (int)x;
+        }, i));
+      }
+
+      // --> WaitAll processes tasks lazy but in order.
+      Task.WaitAll();
+      foreach (var task in tasks) {
+        Console.WriteLine(task.Result);
+      }
+
+      // -> WaitAny processes any finished task first. but the finished task needs to be removed from list in order to process all tasks
+      //for (int i = 0; i < 10; i++) {
+      //  var tasksArray = tasks.ToArray();
+      //  var task = tasksArray[Task.WaitAny(tasksArray)];
+      //  Console.WriteLine(task.Result);
+      //  tasks.Remove(task);
+      //}
+
+      Console.WriteLine("Finished TestWaitAny");
+    }
+
+    private static void TestAlgorithmPerformanceIssue() {
+      Queue<TimeSpan> latestExecutionTimes = new Queue<TimeSpan>();
+      int size = 10;
+      var random = new Random.MersenneTwister(0);
+
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+      ga.PopulationSize.Value = 5;
+      ga.MaximumGenerations.Value = 5;
+      ga.Engine = new SequentialEngine.SequentialEngine();
+      ga.Problem = new SingleObjectiveTestFunctionProblem();
+
+      //MetaOptimizationProblem metaOptimizationProblem = new MetaOptimizationProblem();
+      ////metaOptimizationProblem.Repetitions = new IntValue(metaProblemRepetitions);
+      //GeneticAlgorithm metaLevelAlgorithm = GetMetaGA(metaOptimizationProblem);
+      //ParameterConfigurationTree algorithmVc = SetupGAAlgorithm(typeof(GeneticAlgorithm), metaOptimizationProblem);
+      //algorithmVc.Randomize(random);
+      Stopwatch sw = new Stopwatch();
+
+      var algs = new Queue<IAlgorithm>(); // keep them in memory 
+      // -> BINGO! -> .NET cannot hold more than 16 algorithms with their ThreadLocal<T> objects efficiently, 
+      // so if they are kept in memory, runtime at the 17. execution drops significantly
+      // because creating ThreadLocal<T> takes all the runtime.
+      // when the algs are not stored in a list however this effect does not occur.
+
+
+      for (int i = 0; i < 10000; i++) {
+        GeneticAlgorithm clonedGa = (GeneticAlgorithm)ga.Clone();
+        clonedGa.Name = "CLONED GA";
+        //algorithmVc.Randomize(random);
+        //algorithmVc.Parameterize(clonedGa);
+        clonedGa.Prepare(true);
+        sw.Start();
+        algs.Enqueue(clonedGa);
+
+        var cancellationTokenSource = new CancellationTokenSource();
+        //if (algs.Count > 24)
+        //  algs.Dequeue();
+        clonedGa.StartSync(cancellationTokenSource.Token);
+        sw.Stop();
+        latestExecutionTimes.Enqueue(sw.Elapsed);
+        Console.WriteLine("{0}: {1} ({2})", i, sw.Elapsed, latestExecutionTimes.Count > size ? TimeSpan.FromMilliseconds(latestExecutionTimes.Average(t => t.TotalMilliseconds)).ToString() : "-");
+        if (latestExecutionTimes.Count > size) {
+          latestExecutionTimes.Dequeue();
+        }
+        sw.Reset();
+        //Console.ReadLine();
+      }
+    }
+
+    private static void TestTableBuilder() {
+      TableBuilder tb = new TableBuilder("column_1", "col2", "col3");
+      tb.AppendRow("1", "humpi", "0.23124");
+      tb.AppendRow("2", "sf", "0.23124");
+      tb.AppendRow("5", "humpi dampti", "0.224");
+      tb.AppendRow("10", "egon asdf", "0.4");
+      tb.AppendRow("15", "MichaelizcMultiVfds", "0.23124564");
+      Console.WriteLine(tb.ToString());
+    }
+
+    private static void TestToInfoString(IValueConfiguration algorithmVc) {
+      var random = new MersenneTwister();
+      Console.WriteLine(algorithmVc.ParameterInfoString);
+      algorithmVc.Randomize(random);
+      Console.WriteLine(algorithmVc.ParameterInfoString);
+      algorithmVc.Randomize(random);
+      Console.WriteLine(algorithmVc.ParameterInfoString);
+      algorithmVc.Randomize(random);
+    }
+
+    private static void TestCombinations() {
+      Console.WriteLine("IntRange 3-18:3");
+      IntValueRange intRange = new IntValueRange(new IntValue(3), new IntValue(18), new IntValue(3));
+      foreach (var val in intRange.GetCombinations()) {
+        Console.WriteLine(val);
+      }
+
+      Console.WriteLine("DoubleRange 1.0-2.5:0.5");
+      var dblRange = new DoubleValueRange(new DoubleValue(0.7), new DoubleValue(2.8), new DoubleValue(0.5));
+      foreach (var val in dblRange.GetCombinations()) {
+        Console.WriteLine(val);
+      }
+
+      Console.WriteLine("PercentRange 33%-66%:33%");
+      var pctRange = new PercentValueRange(new PercentValue(0.32), new PercentValue(0.98), new PercentValue(0.33));
+      foreach (var val in pctRange.GetCombinations()) {
+        Console.WriteLine(val);
+      }
+    }
+
+    private static void TestCombinations3() {
+      Node root = new Node("root");
+      root.ChildNodes.Add(new Node("root.n1"));
+      root.ChildNodes.Add(new Node("root.n2"));
+      Node n3 = new Node("root.n3");
+      n3.ChildNodes.Add(new Node("root.n3.n1"));
+      n3.ChildNodes.Add(new Node("root.n3.n2"));
+      root.ChildNodes.Add(n3);
+
+      Console.WriteLine(root.ToString());
+      Console.WriteLine("--");
+      int cnt = 0;
+      var enumerator = new NodeEnumerator(root);
+      enumerator.Reset();
+      while (enumerator.MoveNext()) {
+        Console.WriteLine(enumerator.Current.ToString());
+        cnt++;
+      }
+      Console.WriteLine("count: " + cnt);
+    }
+
+    private static void TestEnumeratorCollectionEnumerator() {
+      IEnumerable<int> list1 = new int[] { 1, 2, 3, 4, 5 };
+      IEnumerable<int> list2 = new int[] { 10, 20, 30 };
+      IEnumerable<int> list3 = new int[] { 300, 400, 500 };
+
+      var enumerators = new List<IEnumerator>();
+
+      EnumeratorCollectionEnumerator<int> enu = new EnumeratorCollectionEnumerator<int>();
+      enu.AddEnumerator(list1.GetEnumerator());
+      enu.AddEnumerator(list2.GetEnumerator());
+      enu.AddEnumerator(list3.GetEnumerator());
+      enu.Reset();
+      while (enu.MoveNext()) {
+        Console.WriteLine(enu.Current);
+      }
+    }
+
+    private static void TestCombinations4() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+      ga.Problem = new SingleObjectiveTestFunctionProblem();
+      ga.Engine = new SequentialEngine.SequentialEngine();
+
+      ParameterConfigurationTree vc = new ParameterConfigurationTree(ga, new SingleObjectiveTestFunctionProblem());
+
+      ConfigurePopulationSize(vc, 20, 100, 20);
+      //ConfigureMutationRate(vc, 0.10, 0.60, 0.10);
+      ConfigureMutationOperator(vc);
+      //ConfigureSelectionOperator(vc, true);
+
+      int count = 0;
+      IEnumerator enumerator = new ParameterCombinationsEnumerator(vc);
+      enumerator.Reset();
+      while (enumerator.MoveNext()) {
+        var current = (IValueConfiguration)enumerator.Current;
+        count++;
+        Console.WriteLine(current.ParameterInfoString);
+      }
+      Console.WriteLine("You are about to create {0} algorithms.", count);
+
+      Experiment experiment = vc.GenerateExperiment(ga);
+      //foreach (var opt in experiment.Optimizers) {
+      //  Console.WriteLine(opt.Name);
+      //}
+
+      experiment.Prepare();
+      experiment.Start();
+
+      while (experiment.ExecutionState != ExecutionState.Stopped) {
+        Thread.Sleep(500);
+      }
+    }
+
+    private static void TestOperators() {
+      IRandom random = new MersenneTwister();
+
+      var doubleRange = new DoubleValueRange(new DoubleValue(0), new DoubleValue(1), new DoubleValue(0.001));
+      using (var sw = new StreamWriter("out-DoubleValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          var val = new DoubleValue(0.0);
+          NormalDoubleValueManipulator.ApplyStatic(random, val, doubleRange);
+
+          sw.WriteLine(val);
+          Debug.Assert(val.Value >= 0.0 && val.Value <= 1.0);
+        }
+      }
+
+      var percentRange = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(0.001));
+      using (var sw = new StreamWriter("out-PercentValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          var val = new PercentValue(0.5);
+          NormalDoubleValueManipulator.ApplyStatic(random, val, percentRange.AsDoubleValueRange());
+          sw.WriteLine(val);
+        }
+      }
+
+      var intRange = new IntValueRange(new IntValue(0), new IntValue(100), new IntValue(1));
+      using (var sw = new StreamWriter("out-IntValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          var val = new IntValue(50);
+          UniformIntValueManipulator.ApplyStatic(random, val, intRange);
+          sw.WriteLine(val);
+        }
+      }
+
+      using (var sw = new StreamWriter("out-DoubleValueCrossed.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          var val1 = new DoubleValue(0.0);
+          var val2 = new DoubleValue(0.5);
+          var val3 = NormalDoubleValueCrossover.ApplyStatic(random, val1, val2, doubleRange);
+
+          sw.WriteLine(val3);
+          Debug.Assert(val3.Value >= 0.0 && val3.Value <= 1.0);
+        }
+      }
+
+      Console.ReadLine();
+    }
+
+    private static void TestTypeDiscovery() {
+      var items = ApplicationManager.Manager.GetInstances(typeof(DoubleArray)).ToArray();
+
+      foreach (var item in items) {
+        Console.WriteLine(item.ToString());
+      }
+    }
+
+    private static void TestMemoryLeak(GeneticAlgorithm metaLevelAlgorithm) {
+      IValueConfiguration algorithmVc = ((MetaOptimizationProblem)metaLevelAlgorithm.Problem).ParameterConfigurationTree;
+
+      Console.WriteLine("Starting Memory Test...");
+      Console.ReadLine();
+
+      var clones = new List<object>();
+      for (int i = 0; i < 1000; i++) {
+        var clone = algorithmVc.Clone();
+        clones.Add(clone);
+      }
+
+      Console.WriteLine("Finished. Now GC...");
+      Console.ReadLine();
+
+      GC.Collect();
+
+      Console.WriteLine("Finished!");
+      Console.ReadLine();
+    }
+
+    private static GeneticAlgorithm GetSequentialMetaGA(MetaOptimizationProblem metaOptimizationProblem) {
+      GeneticAlgorithm metaLevelAlgorithm = new GeneticAlgorithm();
+      metaLevelAlgorithm.PopulationSize.Value = metaAlgorithmPopulationSize;
+      metaLevelAlgorithm.MaximumGenerations.Value = metaAlgorithmMaxGenerations;
+
+      metaLevelAlgorithm.Problem = metaOptimizationProblem;
+      metaLevelAlgorithm.Engine = new SequentialEngine.SequentialEngine();
+
+      metaLevelAlgorithm.Mutator = ((OptionalConstrainedValueParameter<IManipulator>)((IAlgorithm)metaLevelAlgorithm).Parameters["Mutator"]).ValidValues.Where(x => x.GetType() == typeof(ParameterConfigurationOnePositionsManipulator)).Single();
+      //metaLevelAlgorithm.Mutator = ((OptionalConstrainedValueParameter<IManipulator>)((IAlgorithm)metaLevelAlgorithm).Parameters["Mutator"]).ValidValues.Where(x => x.GetType() == typeof(ParameterConfigurationAllPositionsManipulator)).Single();
+
+      metaLevelAlgorithm.MutationProbability.Value = metaAlgorithmMutationProbability;
+      //metaLevelAlgorithm.Selector = ((OptionalConstrainedValueParameter<ISelector>)((IAlgorithm)metaLevelAlgorithm).Parameters["Selector"]).ValidValues.Where(x => x.GetType() == typeof(LinearRankSelector)).Single();
+      //metaLevelAlgorithm.Selector = ((OptionalConstrainedValueParameter<ISelector>)((IAlgorithm)metaLevelAlgorithm).Parameters["Selector"]).ValidValues.Where(x => x.GetType() == typeof(TournamentSelector)).Single();
+      //metaLevelAlgorithm.Selector = ((OptionalConstrainedValueParameter<ISelector>)((IAlgorithm)metaLevelAlgorithm).Parameters["Selector"]).ValidValues.Where(x => x.GetType() == typeof(GenderSpecificSelector)).Single();
+      //metaLevelAlgorithm.Selector = ((OptionalConstrainedValueParameter<ISelector>)((IAlgorithm)metaLevelAlgorithm).Parameters["Selector"]).ValidValues.Where(x => x.GetType() == typeof(BestSelector)).Single();
+      metaLevelAlgorithm.Selector = ((OptionalConstrainedValueParameter<ISelector>)((IAlgorithm)metaLevelAlgorithm).Parameters["Selector"]).ValidValues.Where(x => x.GetType() == typeof(TournamentSelector)).Single();
+
+      metaLevelAlgorithm.SetSeedRandomly.Value = false;
+      //metaLevelAlgorithm.Seed.Value = new MersenneTwister().Next(0, 1000000);
+      metaLevelAlgorithm.Seed.Value = 527875;
+
+      return metaLevelAlgorithm;
+    }
+
+    private static GeneticAlgorithm GetParallelMetaGA(MetaOptimizationProblem metaOptimizationProblem) {
+      GeneticAlgorithm metaLevelAlgorithm = GetSequentialMetaGA(metaOptimizationProblem);
+      metaLevelAlgorithm.Engine = new ParallelEngine.ParallelEngine();
+      return metaLevelAlgorithm;
+    }
+
+    //private static GeneticAlgorithm GetHiveParallelMetaGA(MetaOptimizationProblem metaOptimizationProblem) {
+    //  GeneticAlgorithm metaLevelAlgorithm = GetParallelMetaGA(metaOptimizationProblem);
+    //  metaLevelAlgorithm.Engine = new HiveEngine.HiveEngine();
+    //  HiveServiceLocator.Instance.ClientFacadePool.UserName = "cneumuel";
+    //  HiveServiceLocator.Instance.ClientFacadePool.Password = "cneumuel";
+    //  HiveServiceLocator.Instance.StreamedClientFacadePool.UserName = "cneumuel";
+    //  HiveServiceLocator.Instance.StreamedClientFacadePool.Password = "cneumuel";
+    //  return metaLevelAlgorithm;
+    //}
+
+    private static EvolutionStrategy GetMetaES(MetaOptimizationProblem metaOptimizationProblem) {
+      EvolutionStrategy metaLevelAlgorithm = new EvolutionStrategy();
+      metaLevelAlgorithm.PopulationSize.Value = metaAlgorithmPopulationSize;
+      metaLevelAlgorithm.MaximumGenerations.Value = metaAlgorithmMaxGenerations;
+
+      metaLevelAlgorithm.Problem = metaOptimizationProblem;
+      metaLevelAlgorithm.Engine = new SequentialEngine.SequentialEngine();
+
+      metaLevelAlgorithm.Mutator = ((OptionalConstrainedValueParameter<IManipulator>)((IAlgorithm)metaLevelAlgorithm).Parameters["Mutator"]).ValidValues.Last();
+
+      return metaLevelAlgorithm;
+    }
+
+    private static ParameterConfigurationTree SetupGAAlgorithm(Type baseLevelAlgorithmType, MetaOptimizationProblem metaOptimizationProblem) {
+      metaOptimizationProblem.AlgorithmType.Value = baseLevelAlgorithmType;
+
+      //metaOptimizationProblem.ProblemType.Value = typeof(SingleObjectiveTestFunctionProblem);
+      //metaOptimizationProblem.Problems.Clear();
+      //metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
+      //  Evaluator = new GriewankEvaluator(),
+      //  ProblemSize = new IntValue(2)
+      //});
+      //metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
+      //  Evaluator = new GriewankEvaluator(),
+      //  ProblemSize = new IntValue(50)
+      //});
+      //metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
+      //  Evaluator = new GriewankEvaluator(),
+      //  ProblemSize = new IntValue(500)
+      //});
+
+      //metaOptimizationProblem.ProblemType.Value = typeof(SymbolicRegressionSingleObjectiveProblem);
+      //metaOptimizationProblem.Maximization.Value = true;
+
+      // tower problem
+      //metaOptimizationProblem.ImportAlgorithm((IAlgorithm)ContentManager.Load("Genetic Programming - Symbolic Regression 3.4_scaled.hl"));
+      //metaOptimizationProblem.Maximization.Value = true;
+
+      // tsp
+      //metaOptimizationProblem.ProblemType.Value = typeof(TravelingSalesmanProblem);
+
+      ParameterConfigurationTree algorithmVc = metaOptimizationProblem.ParameterConfigurationTree;
+      ((IntValue)algorithmVc.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "MaximumGenerations").ActualValue.Value).Value = baseAlgorithmMaxGenerations;
+      ((IntValue)algorithmVc.AlgorithmConfiguration.ParameterConfigurations.Single(x => x.Name == "PopulationSize").ActualValue.Value).Value = baseAlgorithmPopulationSize;
+
+      //ConfigurePopulationSize(algorithmVc, 10, 100, 1);
+      //ConfigureMutationRate(algorithmVc, 0.0, 1.0, 0.01);
+      //ConfigureMutationOperator(algorithmVc);
+      //ConfigureElites(algorithmVc, 0, 5, 1);
+      //ConfigureSelectionOperator(algorithmVc, true);
+
+      //ConfigureSymbolicExpressionGrammar(algorithmVc);
+
+      return algorithmVc;
+    }
+
+    private static void ConfigureSymbolicExpressionGrammar(ParameterConfigurationTree vc) {
+      var pc = vc.ProblemConfiguration.ParameterConfigurations.Single(x => x.Name == "SymbolicExpressionTreeGrammar");
+      pc.Optimize = true;
+
+      SymbolicExpressionGrammarValueConfiguration symbolicExpressionGrammarVc = null;
+      foreach (var valconf in pc.ValueConfigurations) {
+        if (valconf.ActualValue.Value.ItemName != "TypeCoherentExpressionGrammar") {
+          pc.ValueConfigurations.SetItemCheckedState(valconf, false);
+        } else {
+          symbolicExpressionGrammarVc = valconf as SymbolicExpressionGrammarValueConfiguration;
+        }
+      }
+
+      ConfigureSymbolicExpressionGrammarVc(symbolicExpressionGrammarVc);
+    }
+
+    private static void ConfigureSymbolicExpressionGrammarVc(SymbolicExpressionGrammarValueConfiguration symbolicExpressionGrammarVc) {
+      symbolicExpressionGrammarVc.Optimize = true;
+
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Addition", 1.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Subtraction", 1.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Multiplication", 1.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Division", 1.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Average", 1.0);
+
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "IfThenElse", 0.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "GreaterThan", 0.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "LessThan", 0.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "And", 0.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Or", 0.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Not", 0.0);
+
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Sine", 0.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Cosine", 0.0);
+      SetInitialFrequencyValue(symbolicExpressionGrammarVc, "Tangent", 0.0);
+
+      OptimizeInitialFrequency(symbolicExpressionGrammarVc, "Logarithm", "InitialFrequency", 0.0, 5.0, 0.01);
+      OptimizeInitialFrequency(symbolicExpressionGrammarVc, "Power", "InitialFrequency", 0.0, 5.0, 0.01);
+      OptimizeInitialFrequency(symbolicExpressionGrammarVc, "Root", "InitialFrequency", 0.0, 5.0, 0.01);
+
+      OptimizeInitialFrequency(symbolicExpressionGrammarVc, "Variable", "WeightSigma", 0.01, 10.0, 0.01);
+      OptimizeInitialFrequency(symbolicExpressionGrammarVc, "Variable", "WeightManipulatorSigma", 0.01, 10.0, 0.01);
+      OptimizeInitialFrequency(symbolicExpressionGrammarVc, "Variable", "MultiplicativeWeightManipulatorSigma", 0.01, 10.0, 0.01);
+
+      OptimizeInitialFrequency(symbolicExpressionGrammarVc, "Constant", "ManipulatorSigma", 0.01, 10.0, 0.01);
+      OptimizeInitialFrequency(symbolicExpressionGrammarVc, "Constant", "MultiplicativeManipulatorSigma", 0.01, 10.0, 0.01);
+    }
+
+    private static void SetInitialFrequencyValue(SymbolicExpressionGrammarValueConfiguration symbolicExpressionGrammarVc, string symbolName, double value) {
+      ((Symbol)symbolicExpressionGrammarVc.ParameterConfigurations.Single(x => x.Name == symbolName).ActualValue.Value).InitialFrequency = value;
+    }
+
+    private static void OptimizeInitialFrequency(SymbolicExpressionGrammarValueConfiguration symbolicExpressionGrammarVc, string symbolName, string parameterName, double lower, double upper, double step) {
+      var pc = symbolicExpressionGrammarVc.ParameterConfigurations.Single(x => x.Name == symbolName);
+      pc.Optimize = true;
+      var vc = (SymbolValueConfiguration)pc.ValueConfigurations.Single();
+      var parameterPc = vc.ParameterConfigurations.Single(x => x.Name == parameterName);
+      parameterPc.Optimize = true;
+      parameterPc.ValueConfigurations.Clear();
+      var rvc = new RangeValueConfiguration(new DoubleValue(5.0), typeof(DoubleValue));
+      rvc.Optimize = true;
+      ((DoubleValueRange)rvc.RangeConstraint).LowerBound.Value = lower;
+      ((DoubleValueRange)rvc.RangeConstraint).UpperBound.Value = upper;
+      ((DoubleValueRange)rvc.RangeConstraint).StepSize.Value = step;
+      parameterPc.ValueConfigurations.Add(rvc);
+    }
+
+    private static void TestConfiguration(ParameterConfigurationTree algorithmVc, Type baseLevelAlgorithmType, IProblem problem) {
+      IRandom rand = new FastRandom(0);
+      var baseLevelAlgorithm = (GeneticAlgorithm)MetaOptimizationUtil.CreateParameterizedAlgorithmInstance(algorithmVc, baseLevelAlgorithmType, problem);
+
+      // set random values
+      for (int i = 0; i < 10; i++) {
+        var clonedVc = (ParameterConfigurationTree)algorithmVc.Clone();
+        GeneticAlgorithm newAlg = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
+        clonedVc.Randomize(rand);
+        clonedVc.Parameterize(newAlg);
+        Console.WriteLine(string.Format("PopSize: original: {0}, randomized: {1}", baseLevelAlgorithm.PopulationSize, newAlg.PopulationSize));
+        Console.WriteLine(string.Format("MutRate: original: {0}, randomized: {1}", baseLevelAlgorithm.MutationProbability, newAlg.MutationProbability));
+        Console.WriteLine(string.Format("MutOp: original: {0}, randomized: {1}", baseLevelAlgorithm.Mutator, newAlg.Mutator));
+        Console.WriteLine(string.Format("SelOp: original: {0}, randomized: {1}", baseLevelAlgorithm.Selector, newAlg.Selector));
+        //Console.WriteLine(string.Format("GrSi: original: {0}, randomized: {1}", "?", ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
+        Console.WriteLine("---");
+      }
+
+      Console.WriteLine("=======================");
+      algorithmVc.Randomize(rand);
+      algorithmVc.Parameterize(baseLevelAlgorithm);
+      // mutate
+      for (int i = 0; i < 10; i++) {
+        var clonedVc = (ParameterConfigurationTree)algorithmVc.Clone();
+        GeneticAlgorithm newAlg = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
+        ParameterConfigurationManipulator.Apply(rand, clonedVc, new UniformIntValueManipulator(), new NormalDoubleValueManipulator());
+        clonedVc.Parameterize(newAlg);
+
+        Console.WriteLine(string.Format("PopSize: original: {0}, mutated: {1}", baseLevelAlgorithm.PopulationSize, newAlg.PopulationSize));
+        Console.WriteLine(string.Format("MutRate: original: {0}, mutated: {1}", baseLevelAlgorithm.MutationProbability, newAlg.MutationProbability));
+        Console.WriteLine(string.Format("MutOp: original: {0}, mutated: {1}", baseLevelAlgorithm.Mutator, newAlg.Mutator));
+        Console.WriteLine(string.Format("SelOp: original: {0}, mutated: {1}", baseLevelAlgorithm.Selector, newAlg.Selector));
+        //Console.WriteLine(string.Format("GrSi: original: {0}, mutated: {1}", ((TournamentSelector)baseLevelAlgorithm.Selector).GroupSizeParameter.Value, ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
+        Console.WriteLine("---");
+      }
+
+      Console.WriteLine("=======================");
+      // cross
+      for (int i = 0; i < 10; i++) {
+        var clonedVc1 = (ParameterConfigurationTree)algorithmVc.Clone();
+        var clonedVc2 = (ParameterConfigurationTree)algorithmVc.Clone();
+
+        GeneticAlgorithm first = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
+        GeneticAlgorithm second = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
+
+        clonedVc1.Randomize(rand);
+        clonedVc1.Parameterize(first);
+
+        clonedVc2.Randomize(rand);
+        clonedVc2.Parameterize(second);
+
+        var popSizeBefore = first.PopulationSize.Value;
+        var mutRateBefore = first.MutationProbability.Value;
+        var mutOpBefore = first.Mutator;
+        var selOpBefore = first.Selector;
+        //var groupSizeBefore = ((TournamentSelector)first.Selector).GroupSizeParameter.Value.Value;
+
+        //clonedVc1.Cross(clonedVc2, rand); todo
+
+        ParameterConfigurationCrossover.Apply(rand, clonedVc1, clonedVc2, new DiscreteIntValueCrossover(), new AverageDoubleValueCrossover());
+        clonedVc1.Parameterize(first);
+
+        Console.WriteLine(string.Format("PopSize: first: {0}, second: {1}, crossed: {2}", popSizeBefore, second.PopulationSize, first.PopulationSize));
+        Console.WriteLine(string.Format("MutRate: first: {0}, second: {1}, crossed: {2}", mutRateBefore, second.MutationProbability, first.MutationProbability));
+        Console.WriteLine(string.Format("MutOp: first: {0}, second: {1}, crossed: {2}", mutOpBefore, second.Mutator, first.Mutator));
+        Console.WriteLine(string.Format("SelOp: first: {0}, second: {1}, crossed: {2}", selOpBefore, second.Selector, first.Selector));
+        //Console.WriteLine(string.Format("GrSi: first: {0}, second: {1}, crossed: {2}", groupSizeBefore, ((TournamentSelector)second.Selector).GroupSizeParameter.Value, ((TournamentSelector)first.Selector).GroupSizeParameter.Value));
+        Console.WriteLine("---");
+      }
+      Console.WriteLine("=======================");
+    }
+
+    private static void ConfigureMutationOperator(ParameterConfigurationTree algorithmVc) {
+      var mutationOperator = algorithmVc.AlgorithmConfiguration.ParameterConfigurations.Where(x => x.Name == "Mutator").SingleOrDefault();
+      mutationOperator.Optimize = true;
+
+      // uncheck multiMutator to avoid Michalewicz issue
+      //var multiMutator = mutationOperator.ValueConfigurations.Where(x => x.ActualValue.Value != null && x.ActualValue.Value.ItemName.StartsWith("Multi")).SingleOrDefault();
+      //if (multiMutator != null) {
+      //  mutationOperator.ValueConfigurations.SetItemCheckedState(multiMutator, false);
+      //}
+
+      // add another normal - don't do this with 'new', because ActualNames will not be set correctly. It should be copied from an existing one
+      // mutationOperator.ValueConfigurations.Add(new ParameterizedValueConfiguration(new NormalAllPositionsManipulator(), typeof(NormalAllPositionsManipulator)), true);
+    }
+
+    private static void ConfigureSelectionOperator(ParameterConfigurationTree algorithmVc, bool configureTournamenSize) {
+      var selectionOperatorPc = algorithmVc.AlgorithmConfiguration.ParameterConfigurations.Where(x => x.Name == "Selector").SingleOrDefault();
+      selectionOperatorPc.Optimize = true;
+
+      foreach (var vc in selectionOperatorPc.ValueConfigurations) {
+        if (vc.ActualValue.ValueDataType == typeof(TournamentSelector)) {
+          selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
+          if (configureTournamenSize) {
+            vc.Optimize = true;
+            ConfigureTournamentGroupSize((ParameterizedValueConfiguration)vc);
+          }
+        } else if (vc.ActualValue.ValueDataType == typeof(RandomSelector)) {
+          selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
+        } else {
+          selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
+        }
+      }
+    }
+
+    private static void ConfigureTournamentGroupSize(ParameterizedValueConfiguration tournamentVc) {
+      var groupSizePc = tournamentVc.ParameterConfigurations.Where(x => x.ParameterName == "GroupSize").SingleOrDefault();
+      groupSizePc.Optimize = true;
+      var groupSizeVc = (RangeValueConfiguration)groupSizePc.ValueConfigurations.First();
+      groupSizeVc.Optimize = true;
+      groupSizeVc.RangeConstraint.LowerBound = new IntValue(0);
+      groupSizeVc.RangeConstraint.UpperBound = new IntValue(10);
+      groupSizeVc.RangeConstraint.StepSize = new IntValue(1);
+    }
+
+    private static void ConfigurePopulationSize(ParameterConfigurationTree algorithmVc, int lower, int upper, int stepsize) {
+      var populationSizePc = algorithmVc.AlgorithmConfiguration.ParameterConfigurations.Where(x => x.Name == "PopulationSize").SingleOrDefault();
+      populationSizePc.Optimize = true;
+      var populationSizeVc = (RangeValueConfiguration)populationSizePc.ValueConfigurations.First();
+      populationSizeVc.Optimize = true;
+      populationSizeVc.RangeConstraint.LowerBound = new IntValue(lower);
+      populationSizeVc.RangeConstraint.UpperBound = new IntValue(upper);
+      populationSizeVc.RangeConstraint.StepSize = new IntValue(stepsize);
+    }
+
+    private static void ConfigureMutationRate(ParameterConfigurationTree algorithmVc, double lower, double upper, double stepsize) {
+      var mutationRatePc = algorithmVc.AlgorithmConfiguration.ParameterConfigurations.Where(x => x.Name == "MutationProbability").SingleOrDefault();
+      mutationRatePc.Optimize = true;
+      var mutationRateVc = (RangeValueConfiguration)mutationRatePc.ValueConfigurations.First();
+      mutationRateVc.Optimize = true;
+      mutationRateVc.RangeConstraint.LowerBound = new PercentValue(lower);
+      mutationRateVc.RangeConstraint.UpperBound = new PercentValue(upper);
+      mutationRateVc.RangeConstraint.StepSize = new PercentValue(stepsize);
+    }
+
+    private static void ConfigureElites(ParameterConfigurationTree algorithmVc, int from, int to, int stepSize) {
+      var elitesPc = algorithmVc.AlgorithmConfiguration.ParameterConfigurations.Where(x => x.Name == "Elites").SingleOrDefault();
+      elitesPc.Optimize = true;
+      var elitesVc = (RangeValueConfiguration)elitesPc.ValueConfigurations.First();
+      elitesVc.Optimize = true;
+      elitesVc.RangeConstraint.LowerBound = new IntValue(from);
+      elitesVc.RangeConstraint.UpperBound = new IntValue(to);
+      elitesVc.RangeConstraint.StepSize = new IntValue(stepSize);
+    }
+
+    private static void TestOptimization(EngineAlgorithm metaLevelAlgorithm) {
+      string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Results");
+      if (!Directory.Exists(path))
+        Directory.CreateDirectory(path);
+      string id = DateTime.Now.ToString("yyyy.MM.dd - HH;mm;ss,ffff");
+      string resultPath = Path.Combine(path, string.Format("{0} - Result.hl", id));
+      string outputPath = Path.Combine(path, string.Format("{0} - Console.txt", id));
+
+      ContentManager.Save((IStorableContent)metaLevelAlgorithm, resultPath + "-before.hl", true);
+
+      using (var sw = new StreamWriter(outputPath)) {
+        sw.AutoFlush = true;
+
+        StringBuilder sb1 = new StringBuilder();
+        sb1.AppendFormat("Meta-PopulationSize: {0}\n", metaAlgorithmPopulationSize);
+        sb1.AppendFormat("Meta-MaxGenerations: {0}\n", metaAlgorithmMaxGenerations);
+        sb1.AppendFormat("Meta-Repetitions   : {0}\n", metaProblemRepetitions);
+        sb1.AppendFormat("Meta-MutProb       : {0}\n", ((GeneticAlgorithm)metaLevelAlgorithm).MutationProbability.Value);
+        sb1.AppendFormat("Meta-Seed          : {0}\n", ((GeneticAlgorithm)metaLevelAlgorithm).Seed.Value);
+        sb1.AppendFormat("Base-MaxGenerations: {0}\n", baseAlgorithmMaxGenerations);
+
+        sb1.AppendLine("Problems:");
+        foreach (var prob in ((MetaOptimizationProblem)metaLevelAlgorithm.Problem).Problems) {
+          sb1.Append(prob.Name);
+          var sotf = prob as SingleObjectiveTestFunctionProblem;
+          if (sotf != null) {
+            sb1.AppendFormat(" {0}", sotf.ProblemSize.Value);
+          }
+          sb1.AppendLine();
+        }
+        sw.WriteLine(sb1.ToString());
+        Console.WriteLine(sb1.ToString());
+        metaLevelAlgorithm.Stopped += new EventHandler(metaLevelAlgorithm_Stopped);
+        metaLevelAlgorithm.Paused += new EventHandler(metaLevelAlgorithm_Paused);
+        metaLevelAlgorithm.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(metaLevelAlgorithm_ExceptionOccurred);
+
+        metaLevelAlgorithm.Start();
+        int i = 0;
+        int currentGeneration = -1;
+        do {
+          Thread.Sleep(1000);
+          if (metaLevelAlgorithm.Results.ContainsKey("Generations") && ((IntValue)metaLevelAlgorithm.Results["Generations"].Value).Value != currentGeneration) {
+            while (metaLevelAlgorithm.Results.Count < 6) Thread.Sleep(1000);
+            StringBuilder sb = new StringBuilder();
+            sb.AppendLine(DateTime.Now.ToLongTimeString());
+            sb.AppendLine("=================================");
+
+            sb.AppendLine(metaLevelAlgorithm.ExecutionState.ToString());
+            ResultCollection rsClone = null;
+            while (rsClone == null) {
+              try {
+                rsClone = (ResultCollection)metaLevelAlgorithm.Results.Clone();
+              }
+              catch { }
+            }
+            foreach (var result in rsClone) {
+              sb.AppendLine(result.ToString());
+              if (result.Name == "Population") {
+                RunCollection rc = (RunCollection)result.Value;
+                var orderedRuns = rc.OrderBy(x => x.Results["AverageQualityNormalized"]);
+
+                //TableBuilder tb = new TableBuilder("QNorm", "Qualities"/*, "PoSi"*/ /*,"MutRa"*/ /*,"Eli", "SelOp",*/ /*"MutOp"*//*, "NrSelSubScopes"*/);
+                //foreach (IRun run in orderedRuns) {
+                //  //string selector;
+                //  //if (run.Parameters["Selector"] is TournamentSelector) {
+                //  //  selector = string.Format("{0} ({1})", run.Parameters["Selector"].ToString(), ((TournamentSelector)run.Parameters["Selector"]).GroupSizeParameter.Value.ToString());
+                //  //} else {
+                //  //  selector = string.Format("{0}", run.Parameters["Selector"].ToString());
+                //  //}
+
+                //  tb.AppendRow(
+                //    ((DoubleValue)run.Results["AverageQualityNormalized"]).Value.ToString("#0.0000")
+                //    ,((DoubleArray)run.Results["RunsAverageQualities"]).ToString()
+                //    //,((IntValue)run.Parameters["PopulationSize"]).Value.ToString()
+                //    //,((DoubleValue)run.Parameters["MutationProbability"]).Value.ToString("0.0000")
+                //    //,((IntValue)run.Parameters["Elites"]).Value.ToString()
+                //    //,Shorten(selector, 20)
+                //    //,Shorten(run.Parameters.ContainsKey("Mutator") ? run.Parameters["Mutator"].ToString() : "null", 40)
+                //    //,((ISelector)run.Parameters["Selector"]).NumberOfSelectedSubScopesParameter.Value.ToString()
+                //    );
+                //}
+                //sb.AppendLine(tb.ToString());
+
+                var tb = new TableBuilder("QNorm", "Qualities", "StdDevs", "Evaluations", "Parameters");
+                foreach (IRun run in orderedRuns) {
+                  tb.AppendRow(
+                    ((DoubleValue)run.Results["AverageQualityNormalized"]).Value.ToString("#0.0000")
+                    , ((DoubleArray)run.Results["RunsAverageQualities"]).ToString()
+                    , ((DoubleArray)run.Results["RunsQualityStandardDeviations"]).ToString()
+                    , ((DoubleArray)run.Results["RunsAverageEvaluatedSolutions"]).ToString()
+                    , run.Name
+                    );
+                }
+                sb.AppendLine(tb.ToString());
+              }
+            } // foreach
+            //Console.Clear();
+            Console.WriteLine(sb.ToString());
+            sw.WriteLine(sb.ToString());
+            currentGeneration = ((IntValue)metaLevelAlgorithm.Results["Generations"].Value).Value;
+          } // if
+          //if (i % 30 == 0) GC.Collect();
+          i++;
+        } while (metaLevelAlgorithm.ExecutionState != ExecutionState.Stopped);
+      }
+
+      Console.WriteLine();
+      Console.WriteLine("Storing...");
+
+      ContentManager.Save((IStorableContent)metaLevelAlgorithm, resultPath, true);
+      Console.WriteLine("Finished");
+    }
+
+    private static void metaLevelAlgorithm_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      Console.WriteLine("metaLevelAlgorithm_ExceptionOccurred");
+      Console.WriteLine(e.Value.ToString());
+      if (e.Value.InnerException != null) {
+        Console.WriteLine(e.Value.InnerException.ToString());
+      }
+    }
+
+    private static void metaLevelAlgorithm_Paused(object sender, EventArgs e) {
+      Console.WriteLine("metaLevelAlgorithm_Paused");
+    }
+
+    private static void metaLevelAlgorithm_Stopped(object sender, EventArgs e) {
+      Console.WriteLine("metaLevelAlgorithm_Stopped");
+    }
+
+    private static void TestShorten() {
+      int n = 8;
+      Console.WriteLine(Shorten("1", n));
+      Console.WriteLine(Shorten("12", n));
+      Console.WriteLine(Shorten("123", n));
+      Console.WriteLine(Shorten("1234", n));
+      Console.WriteLine(Shorten("12345", n));
+      Console.WriteLine(Shorten("123456", n));
+      Console.WriteLine(Shorten("1234567", n));
+      Console.WriteLine(Shorten("12345678", n));
+      Console.WriteLine(Shorten("123456789", n));
+      Console.WriteLine(Shorten("1234567890", n));
+      Console.WriteLine(Shorten("12345678901", n));
+    }
+
+    private static string Shorten(string s, int n) {
+      string placeholder = "..";
+      if (s.Length <= n) return s;
+      int len = n / 2 - placeholder.Length / 2;
+      string start = s.Substring(0, len);
+      string end = s.Substring(s.Length - len, len);
+      return start + placeholder + end;
+    }
+
+    private static void TestIntSampling() {
+      System.Random rand = new System.Random();
+      int lower = 10;
+      int upper = 20;
+      int stepsize = 1;
+      for (int i = 0; i < 100; i++) {
+        int val;
+        do {
+          val = rand.Next(lower / stepsize, upper / stepsize + 1) * stepsize;
+        } while (val < lower || val > upper);
+        Console.WriteLine(val);
+      }
+    }
+
+    private static void TestDoubleSampling() {
+      var random = new MersenneTwister();
+      double lower = 0;
+      double upper = 1;
+      double stepsize = 0.0000001;
+      DoubleValueRange range = new DoubleValueRange(new DoubleValue(lower), new DoubleValue(upper), new DoubleValue(stepsize));
+
+      using (var sw = new StreamWriter("out-DoubleValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          var val = range.GetRandomValue(random);
+          Debug.Assert(val.Value >= lower && val.Value <= upper);
+          sw.WriteLine(val);
+        }
+      }
+    }
+
+    private static IEnumerable<IItem> GetValidValues(IValueParameter valueParameter) {
+      return ApplicationManager.Manager.GetInstances(valueParameter.DataType).Select(x => (IItem)x).OrderBy(x => x.ItemName);
+    }
+  }
+
+  public class Node {
+    public string Name { get; set; }
+    public int ActualValue { get; set; }
+    public int[] PossibleValues { get; set; }
+    public List<Node> ChildNodes { get; set; }
+
+    public Node(string name) {
+      this.Name = name;
+      PossibleValues = new int[] { 1, 2, 3 };
+      ChildNodes = new List<Node>();
+    }
+
+    public void Init() {
+      this.ActualValue = PossibleValues.First();
+      foreach (var child in ChildNodes) {
+        child.Init();
+      }
+    }
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder();
+      sb.Append(string.Format("{0}:{1}", this.Name, this.ActualValue));
+      if (this.ChildNodes.Count() > 0) {
+        sb.Append(" (");
+        var lst = new List<string>();
+        foreach (Node child in ChildNodes) {
+          lst.Add(child.ToString());
+        }
+        sb.Append(string.Join(", ", lst.ToArray()));
+        sb.Append(")");
+      }
+
+      return sb.ToString();
+    }
+  }
+
+  public class NodeEnumerator : IEnumerator<Node> {
+    private Node node;
+    private List<IEnumerator> enumerators;
+
+    public NodeEnumerator(Node node) {
+      this.node = node;
+      this.enumerators = new List<IEnumerator>();
+    }
+
+    public Node Current {
+      get { return node; }
+    }
+    object IEnumerator.Current {
+      get { return Current; }
+    }
+
+    public void Dispose() { }
+
+    public bool MoveNext() {
+      int i = 0;
+      bool ok = false;
+      while (!ok && i < enumerators.Count) {
+        if (enumerators[i].MoveNext()) {
+          ok = true;
+        } else {
+          i++;
+        }
+      }
+
+      if (ok) {
+        for (int k = i - 1; k >= 0; k--) {
+          enumerators[k].Reset();
+          enumerators[k].MoveNext();
+        }
+      } else {
+        return false;
+      }
+
+      node.ActualValue = (int)enumerators[0].Current;
+      return true;
+    }
+
+    public void Reset() {
+      enumerators.Clear();
+      enumerators.Add(node.PossibleValues.GetEnumerator());
+      enumerators[0].Reset();
+
+      foreach (var child in node.ChildNodes) {
+        var enumerator = new NodeEnumerator(child);
+        enumerator.Reset();
+        enumerator.MoveNext();
+        enumerators.Add(enumerator);
+      }
+    }
+  }
+
+  class MyParameterizedItem : ParameterizedNamedItem {
+    public MyParameterizedItem() {
+      this.Parameters.Add(new ValueParameter<IntValue>("P1", new IntValue(1)));
+      this.Parameters.Add(new ValueParameter<IntValue>("P2", new IntValue(2)));
+      this.Parameters.Add(new ValueParameter<IntValue>("P3", new IntValue(3)));
+      this.Parameters.Add(new ValueParameter<MyOtherParameterizedItem>("P4", new MyOtherParameterizedItem()));
+    }
+
+    protected MyParameterizedItem(MyParameterizedItem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MyParameterizedItem(this, cloner);
+    }
+
+    public override string ToString() {
+      return string.Format("P1: {0}, P2: {1}, P3: {2}, P4: {3}", Parameters["P1"].ActualValue, Parameters["P2"].ActualValue, Parameters["P3"].ActualValue, Parameters["P4"].ActualValue);
+    }
+  }
+
+  class MyOtherParameterizedItem : ParameterizedNamedItem {
+    public MyOtherParameterizedItem() {
+      this.Parameters.Add(new ValueParameter<IntValue>("PP1", new IntValue(1)));
+      this.Parameters.Add(new ValueParameter<IntValue>("PP2", new IntValue(2)));
+      this.Parameters.Add(new ValueParameter<IntValue>("PP3", new IntValue(3)));
+    }
+
+    protected MyOtherParameterizedItem(MyOtherParameterizedItem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MyOtherParameterizedItem(this, cloner);
+    }
+
+    public override string ToString() {
+      return string.Format("PP1: {0}, PP2: {1}, PP3: {2}", Parameters["PP1"].ActualValue, Parameters["PP2"].ActualValue, Parameters["PP3"].ActualValue);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Properties/AssemblyInfo.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Properties/AssemblyInfo.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Properties/AssemblyInfo.cs	(revision 15740)
@@ -0,0 +1,35 @@
+﻿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.MetaOptimization.Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("HeuristicLab.MetaOptimization.Test")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
+[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("14bfe222-cc2c-44ec-a737-a5e5f59e4924")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/TableBuilder.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/TableBuilder.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/TableBuilder.cs	(revision 15740)
@@ -0,0 +1,49 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.MetaOptimization.Test {
+  public class TableBuilder {
+    private List<string> columnNames;
+    private List<string[]> rows = new List<string[]>();
+
+    public TableBuilder(params string[] columnNames) {
+      this.columnNames = new List<string>(columnNames);
+      AppendRow(columnNames);
+    }
+
+    public void AppendRow(params string[] values) {
+      if (values.Length != columnNames.Count)
+        throw new ArgumentException("Value count does not match column name count");
+      this.rows.Add(values);
+    }
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder();
+      int[] columnSizes = GetColumnSizes();
+
+      for (int rowIdx = 0; rowIdx < rows.Count; rowIdx++) {
+        if (rowIdx == 1) {
+          sb.AppendLine(string.Join("", Enumerable.Repeat("-", columnSizes.Sum() + columnSizes.Count())));
+        }
+        for (int colIdx = 0; colIdx < rows[rowIdx].Length; colIdx++) {
+          sb.AppendFormat("{0} ", rows[rowIdx][colIdx].PadLeft(columnSizes[colIdx]));          
+        }
+        sb.AppendLine();
+      }
+      return sb.ToString();
+    }
+
+    private int[] GetColumnSizes() {
+      int[] sizes = new int[columnNames.Count];
+      for (int i = 0; i < columnNames.Count; i++) {
+        foreach (var row in rows) {
+          if (row[i].Length > sizes[i])
+            sizes[i] = row[i].Length;
+        }
+      }
+      return sizes;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/app.config
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/app.config	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/app.config	(revision 15740)
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<configuration>
+  <configSections>
+  </configSections>
+
+  <system.serviceModel>
+
+    <bindings>
+      <netTcpBinding>
+        <binding name="ClientTcpStreamedEndpoint" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" transactionFlow="false" transferMode="Streamed" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="314572800">
+          <readerQuotas maxDepth="32" maxStringContentLength="104857600" maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600"/>
+          <reliableSession ordered="true" inactivityTimeout="00:30:00" enabled="false"/>
+          <security mode="TransportWithMessageCredential">
+            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
+            <message clientCredentialType="UserName" algorithmSuite="Default"/>
+          </security>
+        </binding>
+      </netTcpBinding>
+      <wsHttpBinding>
+        <binding name="ClientHttpEndpoint" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="314572800" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
+          <readerQuotas maxDepth="32" maxStringContentLength="104857600" maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600"/>
+          <reliableSession ordered="true" inactivityTimeout="00:30:00" enabled="false"/>
+          <security mode="Message">
+            <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
+            <message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default"/>
+          </security>
+        </binding>
+      </wsHttpBinding>
+    </bindings>
+    <client>
+      <endpoint address="net.tcp://christoph:9001/Hive-3.3/ClientService.svc" binding="netTcpBinding" bindingConfiguration="ClientTcpStreamedEndpoint" contract="HeuristicLab.Hive.Contracts.Interfaces.IClientFacade" name="ClientTcpStreamedEndpoint">
+        <identity>
+          <dns value="localhost"/>
+        </identity>
+      </endpoint>
+      <endpoint address="http://christoph/Hive-3.3/ClientService.svc" binding="wsHttpBinding" bindingConfiguration="ClientHttpEndpoint" contract="HeuristicLab.Hive.Contracts.Interfaces.IClientFacade" name="ClientHttpEndpoint">
+        <identity>
+          <certificate encodedValue="AwAAAAEAAAAUAAAAozaKcSPdw1Cdd57hw9mr3eCjxTIgAAAAAQAAAPIBAAAwggHuMIIBW6ADAgECAhBhrVLVbjrtvUe4zWuGbVeuMAkGBSsOAwIdBQAwFDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTEwMTAxMjA2NTYyNloXDTM5MTIzMTIzNTk1OVowFDESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFM6bQUgvCnsnBO9TZnOrC6x1riE2pXUzU6H38GYot674WNfir82fMh9+ojWSY/CiMzExcNWFtC3i8BG7giLYVwSanuwQ8QyRFYq3g5UMqdlm4/aof/4QMmS+SuRDsa8F4lbvdS9zBVFiyyUNYzlzO/rY08DrkCgx4X2IQGOvixwIDAQABo0kwRzBFBgNVHQEEPjA8gBCjMn9uvzNhU2c//E3RSYmUoRYwFDESMBAGA1UEAxMJbG9jYWxob3N0ghBhrVLVbjrtvUe4zWuGbVeuMAkGBSsOAwIdBQADgYEADIf8as2VBfZEpwb/GuVifvPTR0Ud+dTCwTjBdMymqjNR5NTSi408DifssSTBVGIi7xkWbQDlQQHOZmVqVFoqfNbGrtm9w1MSK24HAEMXr0WFBltvldGKCvtYnZqf377qU5gq7IBXcJZi87bZ2l1M3icr6RJo4fIbnZOa5M430aw="/>
+        </identity>
+      </endpoint>
+    </client>
+
+  </system.serviceModel>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln	(revision 15740)
@@ -0,0 +1,106 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.MetaOptimization-3.3", "HeuristicLab.Problems.MetaOptimization\3.3\HeuristicLab.Problems.MetaOptimization-3.3.csproj", "{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.MetaOptimization.Views-3.3", "HeuristicLab.Problems.MetaOptimization.Views\3.3\HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj", "{59567338-A551-4386-8405-A8C0DF3E376D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.MetaOptimization.Test", "HeuristicLab.MetaOptimization.Test\HeuristicLab.MetaOptimization.Test.csproj", "{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F96C8DD1-9B68-4F2D-AD4F-1A174F596041}"
+	ProjectSection(SolutionItems) = preProject
+		PreBuildEvent.cmd = PreBuildEvent.cmd
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HiveEngine-3.3", "HeuristicLab.HiveEngine\3.3\HeuristicLab.HiveEngine-3.3.csproj", "{2C036542-5451-4A23-AFF6-87575C7BAFE7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HiveEngine.Views-3.3", "HeuristicLab.HiveEngine.Views\3.3\HeuristicLab.HiveEngine.Views-3.3.csproj", "{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Debug|x64.ActiveCfg = Debug|x86
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Debug|x86.ActiveCfg = Debug|x86
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Debug|x86.Build.0 = Debug|x86
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Release|Any CPU.Build.0 = Release|Any CPU
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Release|x64.ActiveCfg = Release|x86
+		{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}.Release|x86.ActiveCfg = Release|Any CPU
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Debug|x64.ActiveCfg = Debug|x86
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Debug|x86.ActiveCfg = Debug|x86
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Debug|x86.Build.0 = Debug|x86
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Release|x64.ActiveCfg = Release|x86
+		{59567338-A551-4386-8405-A8C0DF3E376D}.Release|x86.ActiveCfg = Release|Any CPU
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|x64.ActiveCfg = Debug|x86
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|x86.ActiveCfg = Debug|x86
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Debug|x86.Build.0 = Debug|x86
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|Mixed Platforms.Build.0 = Release|x86
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|x64.ActiveCfg = Release|x86
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|x86.ActiveCfg = Release|x86
+		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|x86.Build.0 = Release|x86
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|x64.ActiveCfg = Debug|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|x64.Build.0 = Debug|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|x86.ActiveCfg = Debug|x86
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Debug|x86.Build.0 = Debug|x86
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|Mixed Platforms.Build.0 = Release|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|x64.ActiveCfg = Release|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|x64.Build.0 = Release|x64
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|x86.ActiveCfg = Release|x86
+		{2C036542-5451-4A23-AFF6-87575C7BAFE7}.Release|x86.Build.0 = Release|x86
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Debug|x64.ActiveCfg = Debug|x64
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Debug|x64.Build.0 = Debug|x64
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Debug|x86.ActiveCfg = Debug|x86
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Debug|x86.Build.0 = Debug|x86
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Release|Mixed Platforms.Build.0 = Release|x64
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Release|x64.ActiveCfg = Release|x64
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Release|x64.Build.0 = Release|x64
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Release|x86.ActiveCfg = Release|x86
+		{E37F15E0-D0D6-4C6E-AD22-0DA514C943A3}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ClassDiagram1.cd
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ClassDiagram1.cd	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ClassDiagram1.cd	(revision 15740)
@@ -0,0 +1,44 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IOptimizable">
+    <Position X="3.5" Y="1" Width="2.5" />
+    <Members>
+      <Property Name="IsOptimizable" Hidden="true" />
+      <Event Name="IsOptimizableChanged" Hidden="true" />
+      <Event Name="OptimizeChanged" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAEAAAAAAAAAAAAAACAAMAAAAAACCCAAACAAAA=</HashCode>
+      <FileName>Interfaces\IOptimizable.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IValueConfiguration">
+    <Position X="4.75" Y="3.75" Width="2.25" />
+    <Members>
+      <Method Name="Parameterize" Hidden="true" />
+      <Event Name="ValueChanged" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAQAAAAAAAAAAAAAAAAAAAAAEACAAAAAACAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IValueConfiguration.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IParameterConfiguration">
+    <Position X="2.25" Y="3.75" Width="2.25" />
+    <Members>
+      <Method Name="Parameterize" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAAgEAAAAAAAAAAAAAAAIAAAAAAABAAAACAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IParameterConfiguration.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IRange&lt;T&gt;">
+    <Position X="7.5" Y="3.25" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AACAAAAAAIAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IRange.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs	(revision 15740)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ConstrainedItemListView<T> {
+    /// <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.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Text = "ConstrainedItemListView";
+    }
+
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs	(revision 15740)
@@ -0,0 +1,46 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("Constrained Item List View")]
+  [Content(typeof(ConstrainedItemList<>), IsDefaultView = true)]
+  public sealed partial class ConstrainedItemListView<T> : ItemListView<T> where T : class, IItem {
+    public new ConstrainedItemList<T> Content {
+      get { return (ConstrainedItemList<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ConstrainedItemListView() {
+      InitializeComponent();
+    }
+
+    protected override T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(Content.Type, false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.Designer.cs	(revision 15740)
@@ -0,0 +1,58 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ConstrainedTypeValueView {
+    /// <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.typeComboBox = new System.Windows.Forms.ComboBox();
+      this.SuspendLayout();
+      // 
+      // typeComboBox
+      // 
+      this.typeComboBox.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.typeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.typeComboBox.FormattingEnabled = true;
+      this.typeComboBox.Location = new System.Drawing.Point(3, 3);
+      this.typeComboBox.Name = "typeComboBox";
+      this.typeComboBox.Size = new System.Drawing.Size(440, 21);
+      this.typeComboBox.Sorted = true;
+      this.typeComboBox.TabIndex = 0;
+      this.typeComboBox.SelectedIndexChanged += new System.EventHandler(this.typeComboBox_SelectedIndexChanged);
+      // 
+      // ConstrainedTypeValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.typeComboBox);
+      this.Name = "ConstrainedTypeValueView";
+      this.Size = new System.Drawing.Size(446, 286);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ComboBox typeComboBox;
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.cs	(revision 15740)
@@ -0,0 +1,66 @@
+﻿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.MainForm;
+using HeuristicLab.Core.Views;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("ConstrainedTypeValueView")]
+  [Content(typeof(ConstrainedTypeValue), IsDefaultView = false)]
+  [Content(typeof(ConstrainedTypeValue<>), IsDefaultView = true)]
+  public sealed partial class ConstrainedTypeValueView : ItemView {
+    public new ConstrainedTypeValue Content {
+      get { return (ConstrainedTypeValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ConstrainedTypeValueView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    #region Event Handlers (Content)
+    void Content_ValueChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_ValueChanged), sender, e);
+      } else {
+        this.typeComboBox.SelectedItem = Content.Value;
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        typeComboBox.Items.Clear();
+      } else {
+        typeComboBox.Items.AddRange(Content.ValidTypes.ToArray());
+        Content_ValueChanged(this, EventArgs.Empty);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+    
+    #region Event Handlers (child controls)
+    private void typeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      Content.Value = (Type)typeComboBox.SelectedItem;
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.resx	(revision 15740)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.Designer.cs	(revision 15740)
@@ -0,0 +1,202 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.MetaOptimization.Views {
+  partial class CreateExperimentDialog {
+    /// <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.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.createBatchRunCheckBox = new System.Windows.Forms.CheckBox();
+      this.createBatchRunLabel = new System.Windows.Forms.Label();
+      this.repetitionsLabel = new System.Windows.Forms.Label();
+      this.repetitionsNumericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.label1 = new System.Windows.Forms.Label();
+      this.engineComboBox = new System.Windows.Forms.ComboBox();
+      ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).BeginInit();
+      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(113, 83);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 4;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // 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(194, 83);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 5;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // createBatchRunCheckBox
+      // 
+      this.createBatchRunCheckBox.AutoSize = true;
+      this.createBatchRunCheckBox.Checked = true;
+      this.createBatchRunCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.createBatchRunCheckBox.Location = new System.Drawing.Point(113, 8);
+      this.createBatchRunCheckBox.Name = "createBatchRunCheckBox";
+      this.createBatchRunCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.createBatchRunCheckBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.createBatchRunCheckBox, "Check to create a batch run for executing an optimizer multiple times.");
+      this.createBatchRunCheckBox.UseVisualStyleBackColor = true;
+      this.createBatchRunCheckBox.CheckedChanged += new System.EventHandler(this.createBatchRunCheckBox_CheckedChanged);
+      // 
+      // createBatchRunLabel
+      // 
+      this.createBatchRunLabel.AutoSize = true;
+      this.createBatchRunLabel.Location = new System.Drawing.Point(12, 9);
+      this.createBatchRunLabel.Name = "createBatchRunLabel";
+      this.createBatchRunLabel.Size = new System.Drawing.Size(95, 13);
+      this.createBatchRunLabel.TabIndex = 0;
+      this.createBatchRunLabel.Text = "&Create Batch Run:";
+      // 
+      // repetitionsLabel
+      // 
+      this.repetitionsLabel.AutoSize = true;
+      this.repetitionsLabel.Location = new System.Drawing.Point(12, 30);
+      this.repetitionsLabel.Name = "repetitionsLabel";
+      this.repetitionsLabel.Size = new System.Drawing.Size(63, 13);
+      this.repetitionsLabel.TabIndex = 2;
+      this.repetitionsLabel.Text = "&Repetitions:";
+      // 
+      // repetitionsNumericUpDown
+      // 
+      this.repetitionsNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.repetitionsNumericUpDown.Location = new System.Drawing.Point(113, 28);
+      this.repetitionsNumericUpDown.Maximum = new decimal(new int[] {
+            1000000,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.Name = "repetitionsNumericUpDown";
+      this.repetitionsNumericUpDown.Size = new System.Drawing.Size(156, 20);
+      this.repetitionsNumericUpDown.TabIndex = 3;
+      this.repetitionsNumericUpDown.ThousandsSeparator = true;
+      this.toolTip.SetToolTip(this.repetitionsNumericUpDown, "Number of repetitions executed by the batch run.");
+      this.repetitionsNumericUpDown.Value = new decimal(new int[] {
+            10,
+            0,
+            0,
+            0});
+      this.repetitionsNumericUpDown.Validated += new System.EventHandler(this.repetitionsNumericUpDown_Validated);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(12, 57);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(43, 13);
+      this.label1.TabIndex = 6;
+      this.label1.Text = "&Engine:";
+      // 
+      // engineComboBox
+      // 
+      this.engineComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.engineComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.engineComboBox.FormattingEnabled = true;
+      this.engineComboBox.Location = new System.Drawing.Point(113, 54);
+      this.engineComboBox.Name = "engineComboBox";
+      this.engineComboBox.Size = new System.Drawing.Size(156, 21);
+      this.engineComboBox.TabIndex = 7;
+      // 
+      // CreateExperimentDialog
+      // 
+      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(281, 118);
+      this.Controls.Add(this.engineComboBox);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.repetitionsNumericUpDown);
+      this.Controls.Add(this.repetitionsLabel);
+      this.Controls.Add(this.createBatchRunLabel);
+      this.Controls.Add(this.createBatchRunCheckBox);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "CreateExperimentDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Create Experiment";
+      ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.CheckBox createBatchRunCheckBox;
+    private System.Windows.Forms.Label createBatchRunLabel;
+    private System.Windows.Forms.Label repetitionsLabel;
+    private System.Windows.Forms.NumericUpDown repetitionsNumericUpDown;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ComboBox engineComboBox;
+
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.cs	(revision 15740)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  public partial class CreateExperimentDialog : Form {
+
+    public bool CreateBatchRuns {
+      get { return createBatchRunCheckBox.Checked; }
+    }
+    public int Repetitions {
+      get { return (int)repetitionsNumericUpDown.Value; }
+    }
+    public IEngine Engine {
+      get { return (IEngine)engineComboBox.SelectedItem; }
+    }
+
+    public CreateExperimentDialog(IEnumerable<IEngine> engines, Type selectedEngine) {
+      InitializeComponent();
+      foreach (var engine in engines) {
+        this.engineComboBox.Items.Add(engine);
+        if (engine.GetType() == selectedEngine) {
+          this.engineComboBox.SelectedItem = engine;
+        }
+        if (this.engineComboBox.SelectedItem == null) {
+          this.engineComboBox.SelectedIndex = 0;
+        }
+      }
+    }
+
+    private void createBatchRunCheckBox_CheckedChanged(object sender, EventArgs e) {
+      repetitionsNumericUpDown.Enabled = createBatchRunCheckBox.Checked;
+    }
+    private void repetitionsNumericUpDown_Validated(object sender, EventArgs e) {
+      if (repetitionsNumericUpDown.Text == string.Empty)
+        repetitionsNumericUpDown.Text = repetitionsNumericUpDown.Value.ToString();
+    }
+    private void okButton_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/CreateExperimentDialog.resx	(revision 15740)
@@ -0,0 +1,126 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 15740)
@@ -0,0 +1,296 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{59567338-A551-4386-8405-A8C0DF3E376D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.MetaOptimization.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.MetaOptimization.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\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|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Problems.MetaOptimization.Views-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Problems.MetaOptimization.Views-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data.Views-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-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">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters.Views-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters.Views-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.SequentialEngine-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.SequentialEngine-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="ClassDiagram1.cd" />
+    <Compile Include="ConstrainedItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedItemListView.Designer.cs">
+      <DependentUpon>ConstrainedItemListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedTypeValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedTypeValueView.Designer.cs">
+      <DependentUpon>ConstrainedTypeValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CreateExperimentDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CreateExperimentDialog.Designer.cs">
+      <DependentUpon>CreateExperimentDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemDictionaryView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemDictionaryView.Designer.cs">
+      <DependentUpon>ItemDictionaryView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MessageItem.cs" />
+    <Compile Include="MetaOptimizationProblemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MetaOptimizationProblemView.Designer.cs">
+      <DependentUpon>MetaOptimizationProblemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OptimizableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OptimizableView.Designer.cs">
+      <DependentUpon>OptimizableView.cs</DependentUpon>
+    </Compile>
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="ParameterConfigurationTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ParameterConfigurationTreeView.Designer.cs">
+      <DependentUpon>ParameterConfigurationTreeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="RunCollectionDictionaryView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RunCollectionDictionaryView.Designer.cs">
+      <DependentUpon>RunCollectionDictionaryView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="RunCollectionItemDictionaryView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RunCollectionItemDictionaryView.Designer.cs">
+      <DependentUpon>RunCollectionItemDictionaryView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ValueConfigurationViews\ValueConfigurationCheckedItemCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ValueConfigurationViews\ValueConfigurationCheckedItemCollectionView.Designer.cs">
+      <DependentUpon>ValueConfigurationCheckedItemCollectionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ValueConfigurationViews\RangeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ValueConfigurationViews\RangeView.Designer.cs">
+      <DependentUpon>RangeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ObjectSelectorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ObjectSelectorDialog.Designer.cs">
+      <DependentUpon>ObjectSelectorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ValueConfigurationViews\ValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ValueConfigurationViews\ValueView.Designer.cs">
+      <DependentUpon>ValueView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ConstrainedTypeValueView.resx">
+      <DependentUpon>ConstrainedTypeValueView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="CreateExperimentDialog.resx">
+      <DependentUpon>CreateExperimentDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ItemDictionaryView.resx">
+      <DependentUpon>ItemDictionaryView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MetaOptimizationProblemView.resx">
+      <DependentUpon>MetaOptimizationProblemView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OptimizableView.resx">
+      <DependentUpon>OptimizableView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ParameterConfigurationTreeView.resx">
+      <DependentUpon>ParameterConfigurationTreeView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="RunCollectionItemDictionaryView.resx">
+      <DependentUpon>RunCollectionItemDictionaryView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ValueConfigurationViews\RangeView.resx">
+      <DependentUpon>RangeView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ObjectSelectorDialog.resx">
+      <DependentUpon>ObjectSelectorDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ValueConfigurationViews\ValueView.resx">
+      <DependentUpon>ValueView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.MetaOptimization\3.3\HeuristicLab.Problems.MetaOptimization-3.3.csproj">
+      <Project>{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}</Project>
+      <Name>HeuristicLab.Problems.MetaOptimization-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>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </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: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.Designer.cs	(revision 15740)
@@ -0,0 +1,224 @@
+﻿using System.Windows.Forms;
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ItemDictionaryView<K, T> {
+    /// <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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.itemsListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = ((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.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.itemsGroupBox = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.showDetailsCheckBox = new System.Windows.Forms.CheckBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.itemsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.showDetailsCheckBox);
+      this.splitContainer.Panel1.Controls.Add(this.itemsListView);
+      this.splitContainer.Panel1.Controls.Add(this.sortDescendingButton);
+      this.splitContainer.Panel1.Controls.Add(this.sortAscendingButton);
+      this.splitContainer.Panel1.Controls.Add(this.removeButton);
+      this.splitContainer.Panel1.Controls.Add(this.addButton);
+      this.splitContainer.Panel1MinSize = 100;
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(526, 364);
+      this.splitContainer.SplitterDistance = 250;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.AllowDrop = true;
+      this.itemsListView.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.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.itemsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(3, 33);
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.ShowItemToolTips = true;
+      this.itemsListView.Size = new System.Drawing.Size(244, 327);
+      this.itemsListView.SmallImageList = this.imageList;
+      this.itemsListView.TabIndex = 5;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.itemsListView_ItemDrag);
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragDrop);
+      this.itemsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.itemsListView_DragEnterOver);
+      this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
+      this.itemsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.itemsListView_KeyDown);
+      // 
+      // 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(33, 3);
+      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(63, 3);
+      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(93, 3);
+      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(3, 3);
+      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);
+      // 
+      // 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, 27);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(266, 335);
+      this.detailsGroupBox.TabIndex = 0;
+      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.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(254, 310);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // itemsGroupBox
+      // 
+      this.itemsGroupBox.Controls.Add(this.splitContainer);
+      this.itemsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.itemsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.itemsGroupBox.Name = "itemsGroupBox";
+      this.itemsGroupBox.Size = new System.Drawing.Size(532, 383);
+      this.itemsGroupBox.TabIndex = 0;
+      this.itemsGroupBox.TabStop = false;
+      this.itemsGroupBox.Text = "Items";
+      // 
+      // showDetailsCheckBox
+      // 
+      this.showDetailsCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsCheckBox.Checked = true;
+      this.showDetailsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.showDetailsCheckBox.Image = HeuristicLab.Common.Resources.VSImageLibrary.Properties;
+      this.showDetailsCheckBox.Location = new System.Drawing.Point(123, 3);
+      this.showDetailsCheckBox.Name = "showDetailsCheckBox";
+      this.showDetailsCheckBox.Size = new System.Drawing.Size(24, 24);
+      this.showDetailsCheckBox.TabIndex = 4;
+      this.toolTip.SetToolTip(this.showDetailsCheckBox, "Show/Hide Details");
+      this.showDetailsCheckBox.UseVisualStyleBackColor = true;
+      this.showDetailsCheckBox.CheckedChanged += new System.EventHandler(this.showDetailsCheckBox_CheckedChanged);
+      // 
+      // ItemCollectionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.itemsGroupBox);
+      this.Name = "ItemCollectionView";
+      this.Size = new System.Drawing.Size(532, 383);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.itemsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected System.Windows.Forms.ColumnHeader columnHeader1;
+    protected GroupBox itemsGroupBox;
+    protected ListView itemsListView;
+    protected GroupBox detailsGroupBox;
+    protected Button addButton;
+    protected Button removeButton;
+    protected ToolTip toolTip;
+    protected ImageList imageList;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost viewHost;
+    protected Button sortAscendingButton;
+    protected Button sortDescendingButton;
+    protected CheckBox showDetailsCheckBox;
+
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.cs	(revision 15740)
@@ -0,0 +1,359 @@
+﻿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.MainForm;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Collections;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+
+  [View("ItemDictionaryView")]
+  [Content(typeof(ItemDictionary<,>), IsDefaultView = false)]
+  public partial class ItemDictionaryView<K, T> : ItemView
+    where K : class, IItem
+    where T : class, IItem {
+    protected Dictionary<KeyValuePair<K, T>, List<ListViewItem>> itemListViewItemMapping;
+    protected TypeSelectorDialog typeSelectorDialog;
+
+    public new ItemDictionary<K, T> Content {
+      get { return (ItemDictionary<K, T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ListView ItemsListView {
+      get { return itemsListView; }
+    }
+
+    public ItemDictionaryView() {
+      InitializeComponent();
+      itemListViewItemMapping = new Dictionary<KeyValuePair<K, T>, List<ListViewItem>>();
+    }
+
+    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 -= new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsRemoved);
+      Content.CollectionReset -= new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_CollectionReset);
+      foreach (KeyValuePair<K, T> item in itemListViewItemMapping.Keys) {
+        DeregisterItemEvents(item);
+      }
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsAdded);
+      Content.ItemsRemoved += new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsRemoved);
+      Content.CollectionReset += new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_CollectionReset);
+    }
+    protected virtual void DeregisterItemEvents(KeyValuePair<K, T> item) {
+      item.Value.ItemImageChanged -= new EventHandler(Item_ItemImageChanged);
+      item.Key.ToStringChanged -= new EventHandler(Item_ToStringChanged);
+    }
+    protected virtual void RegisterItemEvents(KeyValuePair<K, T> item) {
+      item.Value.ItemImageChanged += new EventHandler(Item_ItemImageChanged);
+      item.Key.ToStringChanged += new EventHandler(Item_ToStringChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      itemsListView.Items.Clear();
+      itemListViewItemMapping.Clear();
+      RebuildImageList();
+      viewHost.Content = null;
+      if (Content != null) {
+        Caption += " (" + Content.GetType().Name + ")";
+        foreach (KeyValuePair<K, T> item in Content)
+          AddListViewItem(CreateListViewItem(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;
+        itemsListView.Enabled = false;
+        detailsGroupBox.Enabled = false;
+      } else {
+        addButton.Enabled = !ReadOnly;
+        sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+        sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+        removeButton.Enabled = !ReadOnly && itemsListView.SelectedItems.Count > 0;
+        itemsListView.Enabled = true;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+      }
+    }
+
+    protected virtual T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(typeof(T), false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+    protected virtual ListViewItem CreateListViewItem(KeyValuePair<K, T> item) {
+      ListViewItem listViewItem = new ListViewItem();
+      listViewItem.Text = item.Key.ToString();
+      listViewItem.ToolTipText = item.Key.ItemName + ": " + item.Key.ItemDescription;
+      itemsListView.SmallImageList.Images.Add(item.Value.ItemImage);
+      listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      listViewItem.Tag = item;
+      return listViewItem;
+    }
+    protected virtual void AddListViewItem(ListViewItem listViewItem) {
+      KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+      itemsListView.Items.Add(listViewItem);
+      if (!itemListViewItemMapping.ContainsKey(item)) {
+        RegisterItemEvents(item);
+        itemListViewItemMapping.Add(item, new List<ListViewItem>());
+      }
+      itemListViewItemMapping[item].Add(listViewItem);
+      sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+      sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+    }
+    protected virtual void RemoveListViewItem(ListViewItem listViewItem) {
+      KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+      itemListViewItemMapping[item].Remove(listViewItem);
+      if (itemListViewItemMapping[item].Count == 0) {
+        itemListViewItemMapping.Remove(item);
+        DeregisterItemEvents(item);
+      }
+      listViewItem.Remove();
+      sortAscendingButton.Enabled = itemsListView.Items.Count > 1;
+      sortDescendingButton.Enabled = itemsListView.Items.Count > 1;
+    }
+    protected virtual void UpdateListViewItemImage(ListViewItem listViewItem) {
+      KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+      int i = listViewItem.ImageIndex;
+      listViewItem.ImageList.Images[i] = item.Value.ItemImage;
+      listViewItem.ImageIndex = -1;
+      listViewItem.ImageIndex = i;
+    }
+    protected virtual void UpdateListViewItemText(ListViewItem listViewItem) {
+      KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+      listViewItem.Text = item.Key.ToString();
+      listViewItem.ToolTipText = item.Value.ItemName + ": " + item.Value.ItemDescription;
+    }
+    protected virtual IEnumerable<ListViewItem> GetListViewItemsForItem(KeyValuePair<K, T> item) {
+      List<ListViewItem> listViewItems = null;
+      itemListViewItemMapping.TryGetValue(item, out listViewItems);
+      return listViewItems == null ? Enumerable.Empty<ListViewItem>() : listViewItems;
+    }
+
+    #region ListView Events
+    protected virtual void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = (Content != null) && !ReadOnly && itemsListView.SelectedItems.Count > 0;
+      AdjustListViewColumnSizes();
+      if (showDetailsCheckBox.Checked) {
+        if (itemsListView.SelectedItems.Count == 1) {
+          KeyValuePair<K, T> item = (KeyValuePair<K, T>)itemsListView.SelectedItems[0].Tag;
+          detailsGroupBox.Enabled = true;
+          viewHost.Content = item.Value;
+        } else {
+          viewHost.Content = null;
+          detailsGroupBox.Enabled = false;
+        }
+      }
+    }
+    protected virtual void itemsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if ((itemsListView.SelectedItems.Count > 0) && !ReadOnly) {
+          foreach (ListViewItem item in itemsListView.SelectedItems)
+            Content.Remove(((KeyValuePair<K, T>)item.Tag).Key);
+        }
+      }
+    }
+    protected virtual void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)itemsListView.SelectedItems[0].Tag;
+        IContentView view = MainFormManager.MainForm.ShowContent(item.Value);
+        if (view != null) {
+          view.ReadOnly = ReadOnly;
+          view.Locked = Locked;
+        }
+      }
+    }
+    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      if (!Locked) {
+        ListViewItem listViewItem = (ListViewItem)e.Item;
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+        DataObject data = new DataObject();
+        data.SetData("Type", item.GetType());
+        data.SetData("Value", item);
+        if (ReadOnly) {
+          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
+        } else {
+          DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
+          if ((result & DragDropEffects.Move) == DragDropEffects.Move)
+            Content.Remove(item.Key);
+        }
+      }
+    }
+    protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      Type type = e.Data.GetData("Type") as Type;
+      if (!ReadOnly && (type != null) && (typeof(T).IsAssignableFrom(type))) {
+        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 & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
+        else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
+        else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
+      //if (e.Effect != DragDropEffects.None) {
+      //  K item = e.Data.GetData("Value") as K;
+      //  if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (T)item.Clone();
+      //  Content.Add(item);
+      //}
+      throw new NotImplementedException();
+    }
+    #endregion
+
+    #region Button Events
+    protected virtual void addButton_Click(object sender, EventArgs e) {
+      //T item = CreateItem();
+      //if (item != null)
+      //  Content.Add(item);
+      throw new NotImplementedException();
+    }
+    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 (itemsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in itemsListView.SelectedItems)
+          Content.Remove(((KeyValuePair<K, T>)item.Tag).Key);
+        itemsListView.SelectedItems.Clear();
+      }
+    }
+    #endregion
+
+    #region CheckBox Events
+    protected virtual void showDetailsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (showDetailsCheckBox.Checked) {
+        splitContainer.Panel2Collapsed = false;
+        detailsGroupBox.Enabled = itemsListView.SelectedItems.Count == 1;
+        viewHost.Content = itemsListView.SelectedItems.Count == 1 ? ((KeyValuePair<K, T>)itemsListView.SelectedItems[0].Tag).Value : null;
+      } else {
+        splitContainer.Panel2Collapsed = true;
+        viewHost.Content = null;
+      }
+    }
+    #endregion
+
+    #region Content Events
+    protected virtual void Content_ItemsAdded(object sender, CollectionItemsChangedEventArgs<KeyValuePair<K, T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsAdded), sender, e);
+      else {
+        foreach (KeyValuePair<K, T> item in e.Items)
+          AddListViewItem(CreateListViewItem(item));
+        AdjustListViewColumnSizes();
+      }
+
+    }
+    protected virtual void Content_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<KeyValuePair<K, T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_ItemsRemoved), sender, e);
+      else {
+        foreach (KeyValuePair<K, T> item in e.Items) {
+          //remove only the first matching ListViewItem, because the IItem could be contained multiple times in the ItemCollection
+          ListViewItem listviewItem = GetListViewItemsForItem(item).FirstOrDefault();
+          if (listviewItem != null) RemoveListViewItem(listviewItem);
+        }
+        RebuildImageList();
+      }
+    }
+    protected virtual void Content_CollectionReset(object sender, CollectionItemsChangedEventArgs<KeyValuePair<K, T>> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<KeyValuePair<K, T>>(Content_CollectionReset), sender, e);
+      else {
+        foreach (KeyValuePair<K, T> item in e.OldItems) {
+          //remove only the first matching ListViewItem, because the IItem could be contained multiple times in the ItemCollection
+          ListViewItem listviewItem = GetListViewItemsForItem(item).FirstOrDefault();
+          if (listviewItem != null) RemoveListViewItem(listviewItem);
+        }
+        RebuildImageList();
+        foreach (KeyValuePair<K, T> item in e.Items)
+          AddListViewItem(CreateListViewItem(item));
+      }
+    }
+    #endregion
+
+    #region Item Events
+    protected virtual void Item_ItemImageChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ItemImageChanged), sender, e);
+      else {
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemImage(listViewItem);
+      }
+    }
+    protected virtual void Item_ToStringChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Item_ToStringChanged), sender, e);
+      else {
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)sender;
+        foreach (ListViewItem listViewItem in GetListViewItemsForItem(item))
+          UpdateListViewItemText(listViewItem);
+      }
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void SortItemsListView(SortOrder sortOrder) {
+      itemsListView.Sorting = SortOrder.None;
+      itemsListView.Sorting = sortOrder;
+      itemsListView.Sorting = SortOrder.None;
+    }
+    protected virtual void AdjustListViewColumnSizes() {
+      if (itemsListView.Items.Count > 0) {
+        for (int i = 0; i < itemsListView.Columns.Count; i++)
+          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      }
+    }
+    protected virtual void RebuildImageList() {
+      itemsListView.SmallImageList.Images.Clear();
+      foreach (ListViewItem listViewItem in itemsListView.Items) {
+        KeyValuePair<K, T> item = (KeyValuePair<K, T>)listViewItem.Tag;
+        itemsListView.SmallImageList.Images.Add(item.Value.ItemImage);
+        listViewItem.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+      }
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.resx	(revision 15740)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MessageItem.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MessageItem.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MessageItem.cs	(revision 15740)
@@ -0,0 +1,30 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  /// <summary>
+  /// used to display messages in a viewhost
+  /// </summary>
+  public class MessageItem : NamedItem {
+    public override bool CanChangeDescription { get { return !initialized; } }
+    public override bool CanChangeName { get { return !initialized; } }
+    private bool initialized = false;
+
+    public MessageItem() {
+      this.Name = "MessageItem";
+    }
+    public MessageItem(string message)
+      : this() {
+      this.Name = message;
+      this.Description = "This item represents a message to the user.";
+      this.initialized = true;
+    }
+    protected MessageItem(MessageItem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MessageItem();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs	(revision 15740)
@@ -0,0 +1,95 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class MetaOptimizationProblemView {
+    /// <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.createExperimentButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.problemInstanceSplitContainer)).BeginInit();
+      this.problemInstanceSplitContainer.Panel1.SuspendLayout();
+      this.problemInstanceSplitContainer.Panel2.SuspendLayout();
+      this.problemInstanceSplitContainer.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // problemInstanceSplitContainer
+      // 
+      this.problemInstanceSplitContainer.Size = new System.Drawing.Size(601, 399);
+      // 
+      // problemInstanceProviderViewHost
+      // 
+      this.problemInstanceProviderViewHost.Size = new System.Drawing.Size(589, 23);
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.AllowDrop = true;
+      this.parameterCollectionView.Size = new System.Drawing.Size(592, 339);
+      this.parameterCollectionView.DragDrop += new System.Windows.Forms.DragEventHandler(this.parameterCollectionView_DragDrop);
+      this.parameterCollectionView.DragEnter += new System.Windows.Forms.DragEventHandler(this.parameterCollectionView_DragEnterOver);
+      this.parameterCollectionView.DragOver += new System.Windows.Forms.DragEventHandler(this.parameterCollectionView_DragEnterOver);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(620, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(569, 4);
+      // 
+      // createExperimentButton
+      // 
+      this.createExperimentButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.createExperimentButton.Location = new System.Drawing.Point(0, 405);
+      this.createExperimentButton.Name = "createExperimentButton";
+      this.createExperimentButton.Size = new System.Drawing.Size(601, 24);
+      this.createExperimentButton.TabIndex = 5;
+      this.createExperimentButton.Text = "Create Combinations";
+      this.createExperimentButton.UseVisualStyleBackColor = true;
+      this.createExperimentButton.Click += new System.EventHandler(this.createExperimentButton_Click);
+      // 
+      // MetaOptimizationProblemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.createExperimentButton);
+      this.Name = "MetaOptimizationProblemView";
+      this.Size = new System.Drawing.Size(604, 431);
+      this.Controls.SetChildIndex(this.createExperimentButton, 0);
+      this.Controls.SetChildIndex(this.problemInstanceSplitContainer, 0);
+      this.problemInstanceSplitContainer.Panel1.ResumeLayout(false);
+      this.problemInstanceSplitContainer.Panel2.ResumeLayout(false);
+      this.problemInstanceSplitContainer.Panel2.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.problemInstanceSplitContainer)).EndInit();
+      this.problemInstanceSplitContainer.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button createExperimentButton;
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs	(revision 15740)
@@ -0,0 +1,107 @@
+﻿using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Views;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("MetaOptimization View")]
+  [Content(typeof(MetaOptimizationProblem), IsDefaultView = true)]
+  public sealed partial class MetaOptimizationProblemView : ProblemView {
+    public new MetaOptimizationProblem Content {
+      get { return (MetaOptimizationProblem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MetaOptimizationProblemView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // TODO: Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // TODO: Add code when content has been changed and is null
+      } else {
+        // TODO: Add code when content has been changed and is not null
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Enable or disable controls based on whether the content is null or the view is set readonly
+    }
+
+    #region Event Handlers (child controls)
+
+    private void createExperimentButton_Click(object sender, EventArgs e) {
+      if (Content != null) {
+        long max = 100000;
+        long count = Content.ParameterConfigurationTree.GetCombinationCount(max);
+
+        System.Windows.Forms.DialogResult result = System.Windows.Forms.DialogResult.OK;
+        if (count > 512) {
+          if (count == max) {
+            result = System.Windows.Forms.MessageBox.Show(string.Format("Do you really want to create more than {0}+ optimizers? Be aware that this might take a significant amount of time and memory.", count), "Create Experiment", System.Windows.Forms.MessageBoxButtons.OKCancel);
+          } else {
+            result = System.Windows.Forms.MessageBox.Show(string.Format("Do you really want to create {0} optimizers? Be aware that this might take a significant amount of time and memory.", count), "Create Experiment", System.Windows.Forms.MessageBoxButtons.OKCancel);
+          }
+        }
+        if (result == System.Windows.Forms.DialogResult.OK) {
+          CreateExperimentDialog dlg = new CreateExperimentDialog(ApplicationManager.Manager.GetInstances<IEngine>(), typeof(SequentialEngine.SequentialEngine));
+          DialogResult dlgResult = dlg.ShowDialog();
+
+          if (dlgResult == DialogResult.OK) {
+            var algorithm = (IAlgorithm)Content.Algorithm.Clone();
+            if(Content.Problems.Count > 0) algorithm.Problem = Content.Problems.First();
+            if(algorithm is EngineAlgorithm) ((EngineAlgorithm)algorithm).Engine = (IEngine)dlg.Engine.Clone();
+            Experiment experiment;
+
+            if (dlg.CreateBatchRuns) {
+              experiment = Content.ParameterConfigurationTree.GenerateExperiment(algorithm, true, dlg.Repetitions);
+            } else {
+              experiment = Content.ParameterConfigurationTree.GenerateExperiment(algorithm);
+            }
+            MainFormManager.MainForm.ShowContent(experiment);
+          }
+        }
+      }
+    }
+
+    #endregion
+
+    private void parameterCollectionView_DragEnterOver(object sender, System.Windows.Forms.DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var type = e.Data.GetData(Constants.DragDropDataFormat).GetType();
+      if (!ReadOnly && (Content.AlgorithmType.ValidTypes.Contains(type))) {
+        IAlgorithm algorithm = e.Data.GetData(Constants.DragDropDataFormat) as IAlgorithm;
+        if (algorithm != null && algorithm.Problem == null || Content.ProblemType.ValidTypes.Contains(algorithm.Problem.GetType())) {
+          e.Effect = DragDropEffects.Copy;
+        }
+      }
+    }
+    private void parameterCollectionView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IAlgorithm algorithm = e.Data.GetData(Constants.DragDropDataFormat) as IAlgorithm;
+        Content.ImportAlgorithm(algorithm);
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.resx	(revision 15740)
@@ -0,0 +1,129 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs	(revision 15740)
@@ -0,0 +1,121 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ObjectSelectorDialog<T> {
+    /// <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.itemsListView = new System.Windows.Forms.ListView();
+      this.nameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.descriptionColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.typeColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.okButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // itemsListView
+      // 
+      this.itemsListView.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.itemsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameColumnHeader,
+            this.descriptionColumnHeader,
+            this.typeColumnHeader});
+      this.itemsListView.FullRowSelect = true;
+      this.itemsListView.HideSelection = false;
+      this.itemsListView.Location = new System.Drawing.Point(12, 12);
+      this.itemsListView.MultiSelect = false;
+      this.itemsListView.Name = "itemsListView";
+      this.itemsListView.Size = new System.Drawing.Size(653, 360);
+      this.itemsListView.TabIndex = 2;
+      this.itemsListView.UseCompatibleStateImageBehavior = false;
+      this.itemsListView.View = System.Windows.Forms.View.Details;
+      this.itemsListView.SelectedIndexChanged += new System.EventHandler(this.itemsListView_SelectedIndexChanged);
+      this.itemsListView.DoubleClick += new System.EventHandler(this.itemsListView_DoubleClick);
+      // 
+      // nameColumnHeader
+      // 
+      this.nameColumnHeader.Text = "Name";
+      this.nameColumnHeader.Width = 91;
+      // 
+      // descriptionColumnHeader
+      // 
+      this.descriptionColumnHeader.Text = "Description";
+      this.descriptionColumnHeader.Width = 187;
+      // 
+      // typeColumnHeader
+      // 
+      this.typeColumnHeader.Text = "Type";
+      this.typeColumnHeader.Width = 240;
+      // 
+      // 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(590, 378);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 5;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // 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(509, 378);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 4;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // ObjectSelectorDialog
+      // 
+      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(677, 413);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.itemsListView);
+      this.Name = "ObjectSelectorDialog";
+      this.Text = "ObjectSelectorDialog";
+      this.Load += new System.EventHandler(this.ObjectSelectorDialog_Load);
+      this.Shown += new System.EventHandler(this.ObjectSelectorDialog_Shown);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListView itemsListView;
+    private System.Windows.Forms.ColumnHeader nameColumnHeader;
+    private System.Windows.Forms.ColumnHeader descriptionColumnHeader;
+    private System.Windows.Forms.ColumnHeader typeColumnHeader;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Button okButton;
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs	(revision 15740)
@@ -0,0 +1,81 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  public partial class ObjectSelectorDialog<T> : Form where T : IItem {
+    private bool initialized;
+    private List<IItem> items;
+    private IEnumerable<IGrouping<string, T>> selectableItems;
+
+    private T item;
+    public T Item {
+      get { return item; }
+    }
+
+    public ObjectSelectorDialog(IEnumerable<IGrouping<string, T>> selectableItems) {
+      this.initialized = false;
+      this.items = new List<IItem>();
+      this.item = default(T);
+      this.selectableItems = selectableItems;
+      InitializeComponent();
+    }
+
+    private void ObjectSelectorDialog_Load(object sender, EventArgs e) {
+      if (!initialized) {
+        itemsListView.SmallImageList = new ImageList();
+        
+        foreach (IGrouping<string, T> item in selectableItems) {
+          ListViewGroup group = new ListViewGroup(item.Key);
+          itemsListView.Groups.Add(group);
+          foreach (T i in item) {
+            items.Add(i);
+            string[] columns;
+            if(i is INamedItem) {
+              INamedItem ni = i as INamedItem;
+              columns = new string[] { ni.Name, ni.Description, ni.GetType().Name };
+            } else {
+              columns = new string[] { i.ItemName, i.ItemDescription, i.GetType().Name };
+            }
+            ListViewItem value = new ListViewItem(columns, group);
+            itemsListView.SmallImageList.Images.Add(i.ItemImage);
+            value.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+            value.Tag = i;
+            itemsListView.Items.Add(value);
+          }
+        }
+        for (int i = 0; i < itemsListView.Columns.Count; i++)
+          itemsListView.Columns[i].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        initialized = true;
+      }
+    }
+
+    private void ObjectSelectorDialog_Shown(object sender, EventArgs e) {
+      item = default(T);
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        item = (T)itemsListView.SelectedItems[0].Tag;
+        DialogResult = DialogResult.OK;
+        Close();
+      }
+    }
+
+    private void itemsListView_DoubleClick(object sender, EventArgs e) {
+      if (itemsListView.SelectedItems.Count == 1) {
+        item = (T)itemsListView.SelectedItems[0].Tag;
+        DialogResult = DialogResult.OK;
+        Close();
+      }
+    }
+
+    private void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      okButton.Enabled = itemsListView.SelectedItems.Count == 1;
+    }
+
+
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.resx	(revision 15740)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.Designer.cs	(revision 15740)
@@ -0,0 +1,75 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views.ValueConfigurationViews {
+  partial class OptimizableView {
+    /// <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.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.optimizeCheckBox = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // 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(0, 21);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(513, 345);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = false;
+      this.viewHost.ViewType = null;
+      // 
+      // optimizeCheckBox
+      // 
+      this.optimizeCheckBox.AutoSize = true;
+      this.optimizeCheckBox.Location = new System.Drawing.Point(3, 3);
+      this.optimizeCheckBox.Name = "optimizeCheckBox";
+      this.optimizeCheckBox.Size = new System.Drawing.Size(66, 17);
+      this.optimizeCheckBox.TabIndex = 1;
+      this.optimizeCheckBox.Text = "Optimize";
+      this.optimizeCheckBox.UseVisualStyleBackColor = true;
+      this.optimizeCheckBox.CheckedChanged += new System.EventHandler(this.optimizeCheckBox_CheckedChanged);
+      // 
+      // OptimizableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.optimizeCheckBox);
+      this.Controls.Add(this.viewHost);
+      this.Name = "OptimizableView";
+      this.Size = new System.Drawing.Size(513, 366);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private MainForm.WindowsForms.ViewHost viewHost;
+    private System.Windows.Forms.CheckBox optimizeCheckBox;
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.cs	(revision 15740)
@@ -0,0 +1,121 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views.ValueConfigurationViews {
+  [View("IOptimizable View")]
+  [Content(typeof(IOptimizable), IsDefaultView = false)]
+  [Content(typeof(ParameterConfiguration), IsDefaultView = true)]
+  [Content(typeof(ValueConfiguration), IsDefaultView = true)]
+  public sealed partial class OptimizableView : ItemView {
+    public new IOptimizable Content {
+      get { return (IOptimizable)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public OptimizableView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.OptimizeChanged -= new EventHandler(Content_OptimizeChanged);
+      Content.IsOptimizableChanged -= new EventHandler(Content_IsOptimizabeChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.IsOptimizableChanged += new EventHandler(Content_IsOptimizabeChanged);
+      Content.OptimizeChanged += new EventHandler(Content_OptimizeChanged);
+    }
+
+    #region Event Handlers (Content)
+    void Content_OptimizeChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_OptimizeChanged), sender, e);
+      } else {
+        this.optimizeCheckBox.Checked = Content.Optimize;
+        if (Content.Optimize) {
+          this.viewHost.ViewType = null;
+
+          var pc = Content as IParameterConfiguration;
+          var vc = Content as IValueConfiguration;
+
+          if (pc != null) {
+            if (pc is SingleValuedParameterConfiguration) {
+              this.viewHost.Content = ((ParameterizedValueConfiguration)pc.ValueConfigurations.Single()).ParameterConfigurations;
+            } else {
+              this.viewHost.Content = pc.ValueConfigurations;
+            }
+          } else if (vc != null) {
+            var rvc = Content as RangeValueConfiguration;
+            if (rvc != null) {
+              if (Content.ActualValue.ValueDataType == typeof(IntValue) ||
+                Content.ActualValue.ValueDataType == typeof(DoubleValue) ||
+                Content.ActualValue.ValueDataType == typeof(PercentValue)) {
+                this.viewHost.ViewsLabelVisible = true;
+                this.viewHost.Content = rvc.RangeConstraint;
+              } else if (Content.ActualValue.ValueDataType == typeof(BoolValue)) {
+                this.viewHost.Content = null; // no configuration required
+              }
+            }
+
+            var pvc = Content as ParameterizedValueConfiguration;
+            if (pvc != null) {
+              this.viewHost.ViewsLabelVisible = false;
+              this.viewHost.Content = pvc.ParameterConfigurations;
+            }
+
+            //var symbolicVc = Content as SymbolicExpressionGrammarValueConfiguration;
+            //if (symbolicVc != null) {
+            //  this.viewHost.ViewsLabelVisible = false;
+            //  this.viewHost.Content = symbolicVc.ParameterConfigurations;
+            //}
+          } else {
+            throw new NotSupportedException("Only IParameterConfiguration and IValueConfiguration types are allowed.");
+          }
+        } else {
+          this.viewHost.ViewsLabelVisible = false;
+          if (Content.ValuesReadOnly) {
+            this.viewHost.Content = new MessageItem("Cannot modify value directly. Please modify the value in the list of problems.");
+          } else {
+            this.viewHost.Content = Content.ActualValue;
+          }
+        }
+      }
+      SetEnabledStateOfControls();
+    }
+    void Content_IsOptimizabeChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_IsOptimizabeChanged), sender, e);
+      } else {
+        SetEnabledStateOfControls();
+      }
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        Content_OptimizeChanged(this, EventArgs.Empty);
+      } else {
+        this.viewHost.Content = null;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content != null) {
+        this.optimizeCheckBox.Enabled = !this.ReadOnly && Content.IsOptimizable;
+      }
+    }
+
+    #region Event Handlers (child controls)
+    private void optimizeCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.Optimize = optimizeCheckBox.Checked;
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/OptimizableView.resx	(revision 15740)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=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>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.Designer.cs	(revision 15740)
@@ -0,0 +1,61 @@
+﻿using HeuristicLab.Core.Views;
+using System.Windows.Forms;
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ParameterConfigurationTreeView {
+    /// <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.listView = new ItemCollectionView<IParameterConfiguration>();
+      this.SuspendLayout();
+
+    	//
+	    // listView
+	    //
+	    this.listView.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.listView.Caption = "ParameterConfigurationList View";
+	    this.listView.Content = null;
+	    this.listView.Location = new System.Drawing.Point(0, 0);
+	    this.listView.Name = "listView";
+	    this.listView.ReadOnly = false;
+	    this.listView.Size = new System.Drawing.Size(556, 473);
+	    this.listView.TabIndex = 1;
+      // 
+      // ParameterConfigurationTreeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(listView);
+      this.Name = "ParameterConfigurationTreeView";
+      this.Size = new System.Drawing.Size(556, 473);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private ItemCollectionView<IParameterConfiguration> listView;
+
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.cs	(revision 15740)
@@ -0,0 +1,49 @@
+﻿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.MainForm;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="ParameterConfiguration"/>.
+  /// </summary>
+  [View("ParameterConfiguration View")]
+  [Content(typeof(ParameterConfigurationTree), true)]
+  public partial class ParameterConfigurationTreeView : ItemView {
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new ParameterConfigurationTree Content {
+      get { return (ParameterConfigurationTree)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ParameterConfigurationTreeView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        listView.Content = Content.ParameterConfigurations;
+      } else {
+        listView.Content = null;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.resx	(revision 15740)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=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>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/Plugin.cs.frame
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/Plugin.cs.frame	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/Plugin.cs.frame	(revision 15740)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.MetaOptimization {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.MetaOptimization.Views plugin
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.MetaOptimization.Views", "3.3.2.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.MetaOptimization.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.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.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.MetaOptimization", "3.3")]
+  [PluginDependency("HeuristicLab.SequentialEngine", "3.3")]
+  public class HeuristicLabProblemsMetaOptimizationPlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15740)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.MetaOptimization.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 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("449122a5-638c-4b20-a89e-c00730604735")]
+
+// 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.2.0")]
+[assembly: AssemblyFileVersion("3.3.2.$WCREV$")]
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.Designer.cs	(revision 15740)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class RunCollectionDictionaryView {
+    /// <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.Font;
+    }
+
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.cs	(revision 15740)
@@ -0,0 +1,27 @@
+﻿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.MainForm;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("RunCollectionDictionaryView")]
+  [Content(typeof(ItemDictionary<StringValue, RunCollection>), IsDefaultView = false)]
+  public sealed partial class RunCollectionDictionaryView : ItemDictionaryView<StringValue, RunCollection> {
+    public new ItemDictionary<StringValue, RunCollection> Content {
+      get { return (ItemDictionary<StringValue, RunCollection>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public RunCollectionDictionaryView() {
+      InitializeComponent();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.Designer.cs	(revision 15740)
@@ -0,0 +1,121 @@
+﻿using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class RunCollectionItemDictionaryView {
+    /// <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.itemsTabPage = new System.Windows.Forms.TabPage();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runCollectionView = new HeuristicLab.Optimization.Views.RunCollectionView();
+      this.runCollectionDictionaryView = new HeuristicLab.Problems.MetaOptimization.Views.RunCollectionDictionaryView();
+      this.tabControl.SuspendLayout();
+      this.itemsTabPage.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // 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.itemsTabPage);
+      this.tabControl.Controls.Add(this.runsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(758, 450);
+      this.tabControl.TabIndex = 0;
+      // 
+      // itemsTabPage
+      // 
+      this.itemsTabPage.Controls.Add(this.runCollectionDictionaryView);
+      this.itemsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.itemsTabPage.Name = "itemsTabPage";
+      this.itemsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.itemsTabPage.Size = new System.Drawing.Size(750, 424);
+      this.itemsTabPage.TabIndex = 0;
+      this.itemsTabPage.Text = "Items";
+      this.itemsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runCollectionView);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.runsTabPage.Size = new System.Drawing.Size(750, 424);
+      this.runsTabPage.TabIndex = 1;
+      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(744, 418);
+      this.runCollectionView.TabIndex = 0;
+      // 
+      // runCollectionDictionaryView
+      // 
+      this.runCollectionDictionaryView.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.runCollectionDictionaryView.Caption = "RunCollectionDictionaryView";
+      this.runCollectionDictionaryView.Content = null;
+      this.runCollectionDictionaryView.Location = new System.Drawing.Point(-4, 0);
+      this.runCollectionDictionaryView.Name = "runCollectionDictionaryView";
+      this.runCollectionDictionaryView.ReadOnly = false;
+      this.runCollectionDictionaryView.Size = new System.Drawing.Size(751, 421);
+      this.runCollectionDictionaryView.TabIndex = 0;
+      // 
+      // RunCollectionItemDictionaryView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "RunCollectionItemDictionaryView";
+      this.Size = new System.Drawing.Size(758, 450);
+      this.tabControl.ResumeLayout(false);
+      this.itemsTabPage.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage itemsTabPage;
+    private System.Windows.Forms.TabPage runsTabPage;
+    private RunCollectionDictionaryView runCollectionDictionaryView;
+    private Optimization.Views.RunCollectionView runCollectionView;
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.cs	(revision 15740)
@@ -0,0 +1,73 @@
+﻿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.MainForm;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Core.Views;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+
+  [View("RunCollectionItemDictionaryView")]
+  [Content(typeof(ItemDictionary<StringValue, RunCollection>), IsDefaultView = false)]
+  public sealed partial class RunCollectionItemDictionaryView : ItemView {
+    public new ItemDictionary<StringValue,RunCollection> Content {
+      get { return (ItemDictionary<StringValue,RunCollection>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public RunCollectionItemDictionaryView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // TODO: Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        this.runCollectionDictionaryView.Content = null;
+        this.runCollectionView.Content = null;
+      } else {
+        this.runCollectionDictionaryView.Content = Content;
+        this.runCollectionView.Content = new RunCollection(GetAllRuns(Content));
+        // todo: register for runs added/removed and dictionary-entries added/removed
+      }
+    }
+
+    private IEnumerable<IRun> GetAllRuns(ItemDictionary<StringValue, RunCollection> runsDictionary) {
+      var runs = new List<IRun>();
+      foreach (var item in runsDictionary) {
+        runs.AddRange(item.Value);
+      }
+      return runs;
+    }
+
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Enable or disable controls based on whether the content is null or the view is set readonly
+    }
+
+    #region Event Handlers (child controls)
+    // TODO: Put event handlers of child controls here.
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.resx	(revision 15740)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.Designer.cs	(revision 15740)
@@ -0,0 +1,127 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class RangeView {
+    /// <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.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.lowerValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.upperValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.label3 = new System.Windows.Forms.Label();
+      this.stepSizeValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 3);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(36, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Lower";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 32);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(36, 13);
+      this.label2.TabIndex = 1;
+      this.label2.Text = "Upper";
+      // 
+      // lowerValueView
+      // 
+      this.lowerValueView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lowerValueView.Caption = "StringConvertibleValue View";
+      this.lowerValueView.Content = null;
+      this.lowerValueView.LabelVisible = true;
+      this.lowerValueView.Location = new System.Drawing.Point(38, 0);
+      this.lowerValueView.Name = "lowerValueView";
+      this.lowerValueView.ReadOnly = false;
+      this.lowerValueView.Size = new System.Drawing.Size(396, 23);
+      this.lowerValueView.TabIndex = 2;
+      // 
+      // upperValueView
+      // 
+      this.upperValueView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.upperValueView.Caption = "StringConvertibleValue View";
+      this.upperValueView.Content = null;
+      this.upperValueView.LabelVisible = true;
+      this.upperValueView.Location = new System.Drawing.Point(38, 29);
+      this.upperValueView.Name = "upperValueView";
+      this.upperValueView.ReadOnly = false;
+      this.upperValueView.Size = new System.Drawing.Size(396, 23);
+      this.upperValueView.TabIndex = 3;
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(3, 61);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(29, 13);
+      this.label3.TabIndex = 4;
+      this.label3.Text = "Step";
+      // 
+      // stepSizeValueView
+      // 
+      this.stepSizeValueView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.stepSizeValueView.Caption = "StringConvertibleValue View";
+      this.stepSizeValueView.Content = null;
+      this.stepSizeValueView.LabelVisible = true;
+      this.stepSizeValueView.Location = new System.Drawing.Point(38, 58);
+      this.stepSizeValueView.Name = "stepSizeValueView";
+      this.stepSizeValueView.ReadOnly = false;
+      this.stepSizeValueView.Size = new System.Drawing.Size(396, 23);
+      this.stepSizeValueView.TabIndex = 5;
+      // 
+      // IntValueRangeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.stepSizeValueView);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.upperValueView);
+      this.Controls.Add(this.lowerValueView);
+      this.Name = "IntValueRangeView";
+      this.Size = new System.Drawing.Size(434, 85);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private Data.Views.StringConvertibleValueView lowerValueView;
+    private Data.Views.StringConvertibleValueView upperValueView;
+    private System.Windows.Forms.Label label3;
+    private Data.Views.StringConvertibleValueView stepSizeValueView;
+
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.cs	(revision 15740)
@@ -0,0 +1,59 @@
+﻿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.MainForm;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.MetaOptimization.Views.ValueConfigurationViews;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="IRange"/>.
+  /// </summary>
+  [View("Range View")]
+  [Content(typeof(IRange<>), false)]
+  public partial class RangeView : ItemView {
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    public new IRange Content {
+      get { return (IRange)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public RangeView() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        lowerValueView.Content = (IStringConvertibleValue)Content.LowerBound;
+        upperValueView.Content = (IStringConvertibleValue)Content.UpperBound;
+        stepSizeValueView.Content = (IStringConvertibleValue)Content.StepSize;
+      } else {
+        lowerValueView.Content = null;
+        upperValueView.Content = null;
+        stepSizeValueView.Content = null;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/RangeView.resx	(revision 15740)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=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>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs	(revision 15740)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ValueConfigurationCheckedItemCollectionView {
+    /// <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.Font;
+    }
+
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs	(revision 15740)
@@ -0,0 +1,66 @@
+﻿using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("ValueConfigurationList View")]
+  [Content(typeof(ICheckedValueConfigurationList), IsDefaultView = true)]
+  public sealed partial class ValueConfigurationCheckedItemCollectionView : CheckedItemListView<IValueConfiguration> {
+    public new ICheckedValueConfigurationList Content {
+      get { return (ICheckedValueConfigurationList)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ValueConfigurationCheckedItemCollectionView() {
+      InitializeComponent();
+      this.viewHost.ViewsLabelVisible = false;
+    }
+
+    #region Event Handlers (Content)
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        SetEnabledStateOfControls();
+      } else {
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if(Content != null) this.removeButton.Enabled = Content.Count > Content.MinItemCount;
+    }
+
+    #region Event Handlers (child controls)
+    protected override void itemsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      base.itemsListView_SelectedIndexChanged(sender, e);
+      this.removeButton.Enabled = removeButton.Enabled && (Content.Count > Content.MinItemCount);
+    }
+    #endregion
+
+    protected override IValueConfiguration CreateItem() {
+      var objectSelectorDialog = new ObjectSelectorDialog<IItem>(Content.ValidValues.GroupBy(x => ApplicationManager.Manager.GetDeclaringPlugin(x.GetType()).Name));
+      if (objectSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          IItem value = (IItem)objectSelectorDialog.Item.Clone();
+          if (value is NullValue) {
+            return new NullValueConfiguration();
+          } else if(value is IParameterizedItem) {
+            return new ParameterizedValueConfiguration(value, value.GetType(), true);
+          } else {
+            return new RangeValueConfiguration(value, value.GetType());
+          } 
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.Designer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.Designer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.Designer.cs	(revision 15740)
@@ -0,0 +1,107 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ValueView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ValueView));
+      this.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.valueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.clearValueButton = new System.Windows.Forms.Button();
+      this.setValueButton = new System.Windows.Forms.Button();
+      this.valueGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.AllowDrop = true;
+      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.valueViewHost);
+      this.valueGroupBox.Controls.Add(this.clearValueButton);
+      this.valueGroupBox.Controls.Add(this.setValueButton);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(482, 274);
+      this.valueGroupBox.TabIndex = 7;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.AllowDrop = true;
+      this.valueViewHost.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.valueViewHost.Caption = "View";
+      this.valueViewHost.Content = null;
+      this.valueViewHost.Enabled = false;
+      this.valueViewHost.Location = new System.Drawing.Point(6, 49);
+      this.valueViewHost.Name = "valueViewHost";
+      this.valueViewHost.ReadOnly = false;
+      this.valueViewHost.Size = new System.Drawing.Size(470, 219);
+      this.valueViewHost.TabIndex = 3;
+      this.valueViewHost.ViewsLabelVisible = false;
+      this.valueViewHost.ViewType = null;
+      // 
+      // clearValueButton
+      // 
+      this.clearValueButton.Enabled = false;
+      this.clearValueButton.Image = ((System.Drawing.Image)(resources.GetObject("clearValueButton.Image")));
+      this.clearValueButton.Location = new System.Drawing.Point(36, 19);
+      this.clearValueButton.Name = "clearValueButton";
+      this.clearValueButton.Size = new System.Drawing.Size(24, 24);
+      this.clearValueButton.TabIndex = 1;
+      this.clearValueButton.UseVisualStyleBackColor = true;
+      this.clearValueButton.Click += new System.EventHandler(this.clearValueButton_Click);
+      // 
+      // setValueButton
+      // 
+      this.setValueButton.Image = ((System.Drawing.Image)(resources.GetObject("setValueButton.Image")));
+      this.setValueButton.Location = new System.Drawing.Point(6, 19);
+      this.setValueButton.Name = "setValueButton";
+      this.setValueButton.Size = new System.Drawing.Size(24, 24);
+      this.setValueButton.TabIndex = 0;
+      this.setValueButton.UseVisualStyleBackColor = true;
+      this.setValueButton.Click += new System.EventHandler(this.setValueButton_Click);
+      // 
+      // ValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.valueGroupBox);
+      this.Name = "ValueView";
+      this.Size = new System.Drawing.Size(482, 274);
+      this.valueGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected MainForm.WindowsForms.ViewHost valueViewHost;
+    protected System.Windows.Forms.Button clearValueButton;
+    protected System.Windows.Forms.Button setValueButton;
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.cs	(revision 15740)
@@ -0,0 +1,68 @@
+﻿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.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters.Views;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("Value View")]
+  [Content(typeof(ConstrainedValue), true)]
+  public partial class ValueView : ItemView {
+
+    public new ConstrainedValue Content {
+      get { return (ConstrainedValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ValueView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        valueViewHost.Content = Content.Value;
+      } else {
+        valueViewHost.Content = null;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content != null) {
+        clearValueButton.Enabled = Content.Value != null && Content.IsNullable; // IsNullable ist in diesem fall nicht richtig gesetzt
+        setValueButton.Enabled = Content.ValueDataType != null;
+      }
+    }
+
+    private void setValueButton_Click(object sender, EventArgs e) {
+      var withoutNullValue = Content.ValidValues.Where(x => x != null && !(x is NullValue));
+      var objectSelectorDialog = new ObjectSelectorDialog<IItem>(withoutNullValue.GroupBy(x => ApplicationManager.Manager.GetDeclaringPlugin(x.GetType()).Name));
+      if (objectSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.Value = objectSelectorDialog.Item;
+          valueViewHost.Content = Content.Value;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      SetEnabledStateOfControls();
+    }
+
+    private void clearValueButton_Click(object sender, EventArgs e) {
+      Content.Value = null;
+      valueViewHost.Content = null;
+      SetEnabledStateOfControls();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.resx
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.resx	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.resx	(revision 15740)
@@ -0,0 +1,190 @@
+﻿<?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.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="clearValueButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH
+        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp
+        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE
+        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs
+        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4
+        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR
+        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd
+        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF
+        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX
+        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF
+        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55
+        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ
+        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB
+        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC
+        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE
+        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I
+        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9
+        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG
+        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp
+        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ
+        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC
+        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln
+        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v
+        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp
+        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L
+        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA
+        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z
+        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW
+        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s
+        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6
+        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw
+        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR
+        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm
+        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl
+        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2
+        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8
+        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za
+        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v
+        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb
+        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/
+        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h
+        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr
+        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS
+        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+
+        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/
+        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDQAACw0B7QfALAAAAbVJREFUOE+lk7lLA0EU
+        xuMRcdeYyIBRQcmxURTiEXE8ECQqpAkpJJVNihSKjVjbW1lJChuxtBGUNGKRwj9AvA9QEMRGS01M4YYZ
+        v9nN5twgavGDt/tmvn3HtxbOueU/6JcpGQEpMAfqfyMoLjeAZbYU5iw2ryJe0N6ZVUZJI3JesGrkhYB4
+        GQdHLB7iIId4vUqEkmZRIYvNiY/sFAX0FrrApCYSHeNscZojToKWfIsSm/UkkROXN4GtXMAol5ImJNdY
+        qFcVQoj3wBBI5EUTiB2l7VVvgJI6HBoA51pLkaEvkMbzAZAqZ1N7hZQEWZSqLDIoKnkCxGyw5gKUuHHh
+        CrBsoI2nA3Yh8vCzgPAAJS5wy6c7c69+u/DGmBjum18TWQF1tWdASSefcp5nZt381ic/prqsQW0TOtsX
+        Xkm9ViRMt+jeYgtiz1Md+yBz5pE+Tl3N0cJB3QP2lwHb450iHyfbG3qMgZYKhLMTTn7plfi1Ih8WPFBc
+        sWjPd9Jt/UR144g1yxv/gtj/xnO/jd8o8j3iPuNA2eBg8fdhxy5ytFxAd+Mo2AIzoLVyWCXtCOvL5k78
+        w6/9DUORY3pvwx7IAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="setValueButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABA0lEQVQ4T2P4//8/AyWYJM2H
+        6jI81+bE/QfhPZWpBiCLiTZg/bwKJ5DG1/Mb/18ogxhCtAEgzbs31P5fs+PU/4utxWDNE0xNiTMApHnn
+        muL/7x70/L95JOd/W1stWHOzpb4fQReANG9flgrWfH1/0v9Nszz/iwnx/U8L1QD7H68ByDYjay5N0rVG
+        jjWsgYjLZnTNWF0A0rx1QTiGs4GaNbGlFxQXgDRvnuNLtGYMF8yYu/j/8e0d/x+dK4EHWJCLqga+lAp3
+        AVBzGciAf//+/l85ORAc2ricjTUQGRgYyvIKS/8HhoQD0yfDf0I2Y0QjUNMDkCFAAzJIyVxE5wVchlJs
+        AACPTsHYUxl3NQAAAABJRU5ErkJggg==
+</value>
+  </data>
+</root>
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs	(revision 15740)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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 HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public static class AlgorithmExtensions {
+    public static void StartSync(this IExecutable executable, CancellationToken cancellationToken) {
+      var executor = new AlgorithmExecutor(executable, cancellationToken);
+      executor.StartSync();
+    }
+  }
+
+  /// <summary>
+  /// Can execute an algorithm synchronously
+  /// </summary>
+  internal class AlgorithmExecutor {
+    private IExecutable executable;
+    private AutoResetEvent waitHandle = new AutoResetEvent(false);
+    private CancellationToken cancellationToken;
+
+    public AlgorithmExecutor(IExecutable executable, CancellationToken cancellationToken) {
+      this.executable = executable;
+      this.cancellationToken = cancellationToken;
+    }
+
+    public void StartSync() {
+      executable.Stopped += new EventHandler(algorithm_Stopped);
+      executable.Paused += new EventHandler(algorithm_Paused);
+
+      using (CancellationTokenRegistration registration = cancellationToken.Register(new Action(cancellationToken_Canceled))) {
+        executable.Start();
+        waitHandle.WaitOne();
+        waitHandle.Dispose();
+      }
+
+      executable.Stopped -= new EventHandler(algorithm_Stopped);
+      executable.Paused -= new EventHandler(algorithm_Paused);
+      if (executable.ExecutionState == Core.ExecutionState.Started) {
+        executable.Pause();
+      }
+      cancellationToken.ThrowIfCancellationRequested();
+    }
+
+    private void algorithm_Paused(object sender, EventArgs e) {
+      waitHandle.Set();
+    }
+
+    private void algorithm_Stopped(object sender, EventArgs e) {
+      waitHandle.Set();
+    }
+
+    private void cancellationToken_Canceled() {
+      waitHandle.Set();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 15740)
@@ -0,0 +1,122 @@
+﻿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;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO 
+  /// </summary>
+  [Item("BestParameterConfigurationAnalyzer", "")]
+  [StorableClass]
+  public sealed class BestParameterConfigurationAnalyzer : SingleSuccessorOperator, IAnalyzer {
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    public ScopeTreeLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ScopeTreeLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<IRun> BestSolutionParameter {
+      get { return (LookupParameter<IRun>)Parameters["BestSolution"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+    public LookupParameter<IRun> BestKnownSolutionParameter {
+      get { return (LookupParameter<IRun>)Parameters["BestKnownSolution"]; }
+    }
+    public LookupParameter<RunCollection> PopulationParameter {
+      get { return (LookupParameter<RunCollection>)Parameters["Population"]; }
+    }
+    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    public BestParameterConfigurationAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
+      Parameters.Add(new LookupParameter<IRun>("BestSolution", ""));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
+      Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", ""));
+      Parameters.Add(new LookupParameter<IRun>("BestKnownSolution", ""));
+      Parameters.Add(new LookupParameter<RunCollection>("Population", ""));
+      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
+    }
+
+    [StorableConstructor]
+    private BestParameterConfigurationAnalyzer(bool deserializing) : base(deserializing) { }
+    private BestParameterConfigurationAnalyzer(BestParameterConfigurationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestParameterConfigurationAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+      DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
+      ItemArray<ParameterConfigurationTree> parameterTrees = ParameterConfigurationParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+
+      int idxBest;
+      if (maximization)
+        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
+      else
+        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+
+      ParameterConfigurationTree best = (ParameterConfigurationTree)parameterTrees[idxBest];
+      IRun bestRun = new Run();
+      best.CollectResultValues(bestRun.Results);
+      best.CollectParameterValues(bestRun.Parameters);
+
+      if (bestKnownQuality == null ||
+        (!maximization && (qualities[idxBest].Value < bestKnownQuality.Value) ||
+        (maximization && (qualities[idxBest].Value > bestKnownQuality.Value)))) {
+        BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[idxBest].Value);
+
+        BestKnownSolutionParameter.ActualValue = bestRun;
+      }
+
+      if (BestSolutionParameter.ActualValue == null) {
+        BestSolutionParameter.ActualValue = bestRun;
+        results.Add(new Result("Best Parameter Settings", bestRun));
+      } else {
+        BestSolutionParameter.ActualValue = bestRun;
+        results["Best Parameter Settings"].Value = bestRun;
+      }
+
+      // population (TODO: extract into PopulationAnalyzer)
+      int i = 0;
+      RunCollection rc = new RunCollection();
+      foreach (ParameterConfigurationTree pt in (maximization ? parameterTrees.OrderByDescending(x => x.Quality) : parameterTrees.OrderBy(x => x.Quality))) {
+        rc.Add(pt.ToRun(string.Format("Individual {0} ({1})", i, pt.ParameterInfoString), true));
+        i++;
+      }
+      if (PopulationParameter.ActualValue == null) {
+        PopulationParameter.ActualValue = rc;
+        results.Add(new Result("Population", rc));
+      } else {
+        PopulationParameter.ActualValue = rc;
+        results["Population"].Value = rc;
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOBestSolutionHistoryAnalyzer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOBestSolutionHistoryAnalyzer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOBestSolutionHistoryAnalyzer.cs	(revision 15740)
@@ -0,0 +1,91 @@
+﻿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;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO 
+  /// </summary>
+  [Item("PMOBestSolutionHistoryAnalyzer", "")]
+  [StorableClass]
+  public sealed class PMOBestSolutionHistoryAnalyzer : SingleSuccessorOperator, IAnalyzer {
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    public ScopeTreeLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ScopeTreeLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public LookupParameter<IntValue> GenerationsParameter {
+      get { return (LookupParameter<IntValue>)Parameters["Generations"]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    public PMOBestSolutionHistoryAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
+      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName));
+      Parameters.Add(new LookupParameter<IntValue>("Generations", ""));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
+    }
+
+    [StorableConstructor]
+    private PMOBestSolutionHistoryAnalyzer(bool deserializing) : base(deserializing) { }
+    private PMOBestSolutionHistoryAnalyzer(PMOBestSolutionHistoryAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PMOBestSolutionHistoryAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+      ItemArray<ParameterConfigurationTree> parameterTrees = ParameterConfigurationParameter.ActualValue;
+      int currentGeneration = GenerationsParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+
+      int idxBest;
+      if (maximization)
+        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
+      else
+        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+
+      ParameterConfigurationTree best = parameterTrees[idxBest];
+
+      string key = "BestSolutionHistory";
+      RunCollection bestSolutionHistory;
+      if (!results.ContainsKey(key)) {
+        bestSolutionHistory = new RunCollection();
+        results.Add(new Result(key, bestSolutionHistory));
+      } else {
+        bestSolutionHistory = results[key].Value as RunCollection;
+      }
+      if (bestSolutionHistory.Count == 0 || best.ParameterInfoString != ((StringValue)bestSolutionHistory.Last().Results["Meta-ParameterInfoString"]).Value) {
+        IRun run = best.ToRun(string.Format("{0}: {1}", currentGeneration, best.ParameterInfoString), false);
+        run.Results.Add("Meta-Generation", new IntValue(currentGeneration));
+        run.Results.Add("Meta-ParameterInfoString", new StringValue(best.ParameterInfoString));
+        bestSolutionHistory.Add(run);
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs	(revision 15740)
@@ -0,0 +1,44 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Analysis;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An operator for analyzing the diversity of solutions of Traveling Salesman Problems given in path representation.
+  /// </summary>
+  [Item("PMOPopulationDiversityAnalyzer", "An operator for analyzing the diversity of solutions of Parameter Meta-Optimization.")]
+  [StorableClass]
+  public sealed class PMOPopulationDiversityAnalyzer : PopulationDiversityAnalyzer<ParameterConfigurationTree> {
+    [StorableConstructor]
+    private PMOPopulationDiversityAnalyzer(bool deserializing) : base(deserializing) { }
+    private PMOPopulationDiversityAnalyzer(PMOPopulationDiversityAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public PMOPopulationDiversityAnalyzer() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PMOPopulationDiversityAnalyzer(this, cloner);
+    }
+
+    protected override double[,] CalculateSimilarities(ParameterConfigurationTree[] solutions) {
+      int count = solutions.Length;
+      double[,] similarities = new double[count, count];
+
+      for (int i = 0; i < count; i++) {
+        similarities[i, i] = 1;
+        for (int j = i + 1; j < count; j++) {
+          similarities[i, j] = CalculateSimilarity(solutions[i], solutions[j]);
+          similarities[j, i] = similarities[i, j];
+        }
+      }
+      return similarities;
+    }
+
+    private double CalculateSimilarity(ParameterConfigurationTree pca, ParameterConfigurationTree pcb) {
+      return pca.CalculateSimilarity(pcb);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOProblemQualitiesAnalyzer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOProblemQualitiesAnalyzer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOProblemQualitiesAnalyzer.cs	(revision 15740)
@@ -0,0 +1,117 @@
+﻿using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO 
+  /// </summary>
+  [Item("PMOProblemQualitiesAnalyzer", "")]
+  [StorableClass]
+  public sealed class PMOProblemQualitiesAnalyzer : SingleSuccessorOperator, IAnalyzer {
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    public ScopeTreeLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ScopeTreeLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    public PMOProblemQualitiesAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
+      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
+    }
+
+    [StorableConstructor]
+    private PMOProblemQualitiesAnalyzer(bool deserializing) : base(deserializing) { }
+    private PMOProblemQualitiesAnalyzer(PMOProblemQualitiesAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PMOProblemQualitiesAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ResultCollection results = ResultsParameter.ActualValue;
+      ItemArray<ParameterConfigurationTree> parameterTrees = ParameterConfigurationParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+
+      int idxBest;
+      int idxWorst;
+      if (maximization) {
+        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
+        idxWorst = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+      } else {
+        idxBest = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+        idxWorst = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).Last().index;
+      }
+
+      int problemCount = ProblemsParameter.ActualValue.Count;
+
+      double[][] problemQualities = GetProblemQualities(parameterTrees, problemCount);
+
+      for (int i = 0; i < problemCount; i++) {
+        DataTable problemQualitiesDataTable;
+        string resultKey = "Problem." + i;
+        if (!results.ContainsKey(resultKey)) {
+          problemQualitiesDataTable = new DataTable();
+          problemQualitiesDataTable.Name = resultKey + " Qualities";
+          results.Add(new Result(resultKey, problemQualitiesDataTable));
+        } else {
+          problemQualitiesDataTable = results[resultKey].Value as DataTable;
+        }
+
+        AddValue(problemQualitiesDataTable, parameterTrees[idxBest].AverageQualities[i], "BestQuality", "BestQuality");
+        AddValue(problemQualitiesDataTable, problemQualities[i].Average(), "AverageQuality", "BestQuality");
+        AddValue(problemQualitiesDataTable, parameterTrees[idxWorst].AverageQualities[i], "WorstQuality", "BestQuality");
+      }
+
+      return base.Apply();
+    }
+
+    private static double[][] GetProblemQualities(ItemArray<ParameterConfigurationTree> parameterTrees, int problemCount) {
+      double[][] problemQualities = new double[problemCount][];
+      for (int i = 0; i < problemCount; i++) {
+        problemQualities[i] = new double[parameterTrees.Length];
+        for (int j = 0; j < parameterTrees.Length; j++) {
+          problemQualities[i][j] = parameterTrees[j].AverageQualities[i];
+        }
+      }
+      return problemQualities;
+    }
+
+    private static void AddValue(DataTable table, double data, string name, string description) {
+      DataRow row;
+      table.Rows.TryGetValue(name, out row);
+      if (row == null) {
+        row = new DataRow(name, description);
+        row.Values.Add(data);
+        table.Rows.Add(row);
+      } else {
+        row.Values.Add(data);
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs	(revision 15740)
@@ -0,0 +1,168 @@
+﻿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;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO
+  /// </summary>
+  [Item("ReferenceQualityAnalyzer", "")]
+  [StorableClass]
+  public sealed class ReferenceQualityAnalyzer : SingleSuccessorOperator, IAnalyzer {
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public ScopeTreeLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ScopeTreeLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<DoubleArray> ReferenceQualityAveragesParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceQualityAverages"]; }
+    }
+    public LookupParameter<DoubleArray> ReferenceQualityDeviationsParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceQualityDeviations"]; }
+    }
+    public LookupParameter<DoubleArray> ReferenceEvaluatedSolutionAveragesParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceEvaluatedSolutionAverages"]; }
+    }
+    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    public LookupParameter<DoubleValue> QualityWeightParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters[MetaOptimizationProblem.QualityWeightParameterName]; }
+    }
+    public LookupParameter<DoubleValue> StandardDeviationWeightParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters[MetaOptimizationProblem.StandardDeviationWeightParameterName]; }
+    }
+    public LookupParameter<DoubleValue> EvaluatedSolutionsWeightParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters[MetaOptimizationProblem.EvaluatedSolutionsWeightParameterName]; }
+    }
+
+    public ReferenceQualityAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceQualityAverages", ""));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceQualityDeviations", ""));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceEvaluatedSolutionAverages", ""));
+      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
+      Parameters.Add(new LookupParameter<DoubleValue>(MetaOptimizationProblem.QualityWeightParameterName));
+      Parameters.Add(new LookupParameter<DoubleValue>(MetaOptimizationProblem.StandardDeviationWeightParameterName));
+      Parameters.Add(new LookupParameter<DoubleValue>(MetaOptimizationProblem.EvaluatedSolutionsWeightParameterName));
+    }
+
+    [StorableConstructor]
+    private ReferenceQualityAnalyzer(bool deserializing) : base(deserializing) { }
+    private ReferenceQualityAnalyzer(ReferenceQualityAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ReferenceQualityAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      ItemArray<ParameterConfigurationTree> solutions = ParameterConfigurationParameter.ActualValue;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      double qualityWeight = QualityWeightParameter.ActualValue.Value;
+      double standardDeviationWeight = StandardDeviationWeightParameter.ActualValue.Value;
+      double evaluatedSolutionsWeight = EvaluatedSolutionsWeightParameter.ActualValue.Value;
+
+      if (ReferenceQualityAveragesParameter.ActualValue == null) {
+        // this is generation zero. calculate the reference values and apply them on population. in future generations `AlgorithmRunsAnalyzer` will do the nomalization
+        DoubleArray referenceQualityAverages = CalculateReferenceQualityAverages(solutions, maximization);
+        DoubleArray referenceQualityDeviations = CalculateReferenceQualityDeviations(solutions, maximization);
+        DoubleArray referenceEvaluatedSolutionAverages = CalculateReferenceEvaluatedSolutionAverages(solutions, maximization);
+
+        ReferenceQualityAveragesParameter.ActualValue = referenceQualityAverages;
+        ReferenceQualityDeviationsParameter.ActualValue = referenceQualityDeviations;
+        ReferenceEvaluatedSolutionAveragesParameter.ActualValue = referenceEvaluatedSolutionAverages;
+
+        NormalizePopulation(solutions, qualities, referenceQualityAverages, referenceQualityDeviations, referenceEvaluatedSolutionAverages, qualityWeight, standardDeviationWeight, evaluatedSolutionsWeight, maximization);
+
+        results.Add(new Result("ReferenceQualities", referenceQualityAverages));
+        results.Add(new Result("ReferenceQualityDeviations", referenceQualityDeviations));
+        results.Add(new Result("ReferenceEvaluatedSolutionAverages", referenceEvaluatedSolutionAverages));
+      }
+
+      return base.Apply();
+    }
+
+    private DoubleArray CalculateReferenceQualityAverages(ItemArray<ParameterConfigurationTree> solutions, bool maximization) {
+      DoubleArray references = new DoubleArray(ProblemsParameter.ActualValue.Count);
+      for (int pi = 0; pi < ProblemsParameter.ActualValue.Count; pi++) {
+        if (maximization)
+          references[pi] = solutions.Where(x => x.AverageQualities != null).Select(x => x.AverageQualities[pi]).Max();
+        else
+          references[pi] = solutions.Where(x => x.AverageQualities != null).Select(x => x.AverageQualities[pi]).Min();
+      }
+      return references;
+    }
+
+    private DoubleArray CalculateReferenceQualityDeviations(ItemArray<ParameterConfigurationTree> solutions, bool maximization) {
+      DoubleArray references = new DoubleArray(ProblemsParameter.ActualValue.Count);
+      for (int pi = 0; pi < ProblemsParameter.ActualValue.Count; pi++) {
+        if (maximization)
+          references[pi] = solutions.Where(x => x.QualityStandardDeviations != null).Select(x => x.QualityStandardDeviations[pi]).Max();
+        else
+          references[pi] = solutions.Where(x => x.QualityStandardDeviations != null).Select(x => x.QualityStandardDeviations[pi]).Min();
+      }
+      return references;
+    }
+
+    private DoubleArray CalculateReferenceEvaluatedSolutionAverages(ItemArray<ParameterConfigurationTree> solutions, bool maximization) {
+      DoubleArray references = new DoubleArray(ProblemsParameter.ActualValue.Count);
+      for (int pi = 0; pi < ProblemsParameter.ActualValue.Count; pi++) {
+        if (maximization)
+          references[pi] = solutions.Where(x => x.AverageEvaluatedSolutions != null).Select(x => x.AverageEvaluatedSolutions[pi]).Max();
+        else
+          references[pi] = solutions.Where(x => x.AverageEvaluatedSolutions != null).Select(x => x.AverageEvaluatedSolutions[pi]).Min();
+      }
+      return references;
+    }
+
+    private void NormalizePopulation(ItemArray<ParameterConfigurationTree> solutions, ItemArray<DoubleValue> qualities,
+          DoubleArray referenceQualityAverages,
+          DoubleArray referenceQualityDeviations,
+          DoubleArray referenceEvaluatedSolutionAverages,
+          double qualityAveragesWeight,
+          double qualityDeviationsWeight,
+          double evaluatedSolutionsWeight,
+          bool maximization) {
+      for (int i = 0; i < solutions.Length; i++) {
+        if (solutions[i].AverageQualities == null || solutions[i].QualityStandardDeviations == null || solutions[i].AverageEvaluatedSolutions == null) {
+          // this parameterConfigurationTree has not been evaluated correctly (due to a faulty configuration, which led to an exception)
+          // since we are in generation zero, there is no WorstQuality available for a penalty value
+          double penaltyValue = maximization ? double.MinValue : double.MaxValue;
+          qualities[i].Value = penaltyValue;
+        } else {
+          qualities[i].Value = MetaOptimizationUtil.Normalize(solutions[i],
+            referenceQualityAverages.ToArray(),
+            referenceQualityDeviations.ToArray(),
+            referenceEvaluatedSolutionAverages.ToArray(),
+            qualityAveragesWeight,
+            qualityDeviationsWeight,
+            evaluatedSolutionsWeight,
+            maximization);
+        }
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/SolutionCacheAnalyzer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/SolutionCacheAnalyzer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/SolutionCacheAnalyzer.cs	(revision 15740)
@@ -0,0 +1,95 @@
+﻿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;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO
+  /// </summary>
+  [Item("SolutionCacheAnalyzer", "")]
+  [StorableClass]
+  public sealed class SolutionCacheAnalyzer : SingleSuccessorOperator, IAnalyzer {
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public ScopeTreeLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ScopeTreeLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (LookupParameter<ConstrainedItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public LookupParameter<IntValue> GenerationsParameter {
+      get { return (LookupParameter<IntValue>)Parameters["Generations"]; }
+    }
+    public ValueParameter<BoolValue> StoreAllRunsParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["StoreAllRuns"]; }
+    }
+
+    public SolutionCacheAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new LookupParameter<ConstrainedItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
+      Parameters.Add(new LookupParameter<IntValue>("Generations", ""));
+      Parameters.Add(new ValueParameter<BoolValue>("StoreAllRuns", "If true all runs ever executed are stored. Otherwise only the runs from the latest generateion are stored for caching purposes.", new BoolValue(false)));
+    }
+
+    [StorableConstructor]
+    private SolutionCacheAnalyzer(bool deserializing) : base(deserializing) { }
+    private SolutionCacheAnalyzer(SolutionCacheAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SolutionCacheAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      ItemArray<ParameterConfigurationTree> solutions = ParameterConfigurationParameter.ActualValue;
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      ItemDictionary<StringValue, RunCollection> allRuns = ResultsParameter.ActualValue.ContainsKey("SolutionCache") ? (ItemDictionary<StringValue, RunCollection>)ResultsParameter.ActualValue["SolutionCache"].Value : new ItemDictionary<StringValue, RunCollection>();
+      bool storeAllRuns = ((BoolValue)StoreAllRunsParameter.ActualValue).Value;
+
+      if (!storeAllRuns) {
+        allRuns.Clear();
+      }
+
+      foreach (var solution in solutions) {
+        string key = solution.ParameterInfoString;
+        bool first = false;
+        if (allRuns.Count(x => x.Key.Value == key) == 0) {
+          allRuns.Add(new StringValue(key), new RunCollection());
+          first = true; // no other runs yet
+        }
+
+        if (solution.Runs != null) { // Runs is null when a base-level algorithm exception happened due to invalid parameters
+          var runCollection = allRuns.Single(x => x.Key.Value == key).Value;
+          foreach (var run in solution.Runs) {
+            if (!((BoolValue)run.Results["Meta-FromCache"]).Value || first) {
+              run.Results["Meta-FromCache"] = new BoolValue(true);
+              runCollection.Add(run);
+            }
+          }
+        }
+      }
+
+      if (!results.ContainsKey("SolutionCache")) {
+        results.Add(new Result("SolutionCache", allRuns));
+      }
+
+      return base.Apply();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs	(revision 15740)
@@ -0,0 +1,37 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class ConstrainedItemList<T> : ItemList<T> where T : class, IItem {
+    [Storable]
+    private Type type;
+    public Type Type {
+      get { return type; }
+      set {
+        if (type != value) {
+          type = value;
+          this.RemoveAll(x => x.GetType() != type);
+        }
+      }
+    }
+
+    public ConstrainedItemList() {
+      Type = typeof(T);
+    }
+    [StorableConstructor]
+    protected ConstrainedItemList(bool deserializing) : base(deserializing) { }
+    protected ConstrainedItemList(ConstrainedItemList<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.Type = original.Type;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedItemList<T>(this, cloner);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs	(revision 15740)
@@ -0,0 +1,76 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [Item("ConstrainedTypeValue", "Represents a type with constraints.")]
+  [StorableClass]
+  public class ConstrainedTypeValue : TypeValue {
+
+    private IEnumerable<Type> validTypes;
+    public IEnumerable<Type> ValidTypes {
+      get { return validTypes; }
+      set { validTypes = value; }
+    }
+
+    public override Type Value {
+      set {
+        if (!ValidTypes.Contains(value)) throw new NotSupportedException("Value cannot be set. Type is not enlisted in ValidTypes");
+        base.Value = value;
+      }
+    }
+
+    public ConstrainedTypeValue()
+      : base() {
+      this.readOnly = false;
+    }
+    public ConstrainedTypeValue(Type value)
+      : this() {
+      this.Value = value;
+    }
+
+    [StorableConstructor]
+    protected ConstrainedTypeValue(bool deserializing) : base(deserializing) { }
+    protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.validTypes != null)
+        this.validTypes = new List<Type>(original.validTypes);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedTypeValue(this, cloner);
+    }
+  }
+
+  [Item("ConstrainedTypeValue<>", "Represents a type with constraints.")]
+  [StorableClass]
+  public class ConstrainedTypeValue<T> : ConstrainedTypeValue where T : class, IItem {
+
+    public ConstrainedTypeValue()
+      : base() {
+      this.ValidTypes = ApplicationManager.Manager.GetTypes(typeof(T), true).ToList();
+      this.Value = ValidTypes.First();
+    }
+    public ConstrainedTypeValue(Type value)
+      : base() {
+      this.ValidTypes = ApplicationManager.Manager.GetTypes(typeof(T), true).ToList();
+      this.Value = value;
+    }
+
+    [StorableConstructor]
+    protected ConstrainedTypeValue(bool deserializing)
+      : base(deserializing) {
+      if (deserializing) {
+        this.ValidTypes = ApplicationManager.Manager.GetTypes(typeof(T), true).ToList();
+      }
+    }
+
+    protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedTypeValue<T>(this, cloner);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs	(revision 15740)
@@ -0,0 +1,48 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An operator which creates a new random permutation of integer values.
+  /// </summary>
+  [Item("RandomParameterVectorCreator", "An operator which creates a new set of parameters TODO.")]
+  [StorableClass]
+  public sealed class RandomParameterConfigurationCreator : SingleSuccessorOperator, IStochasticOperator, IParameterConfigurationCreator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ParameterConfigurationTree> InitialParameterConfigurationParameter {
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters[MetaOptimizationProblem.ParameterConfigurationTreeParameterName]; }
+    }
+
+    public IValueLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (IValueLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTreeSolutionCandidate"]; }
+    }
+
+    [StorableConstructor]
+    private RandomParameterConfigurationCreator(bool deserializing) : base(deserializing) { }
+    private RandomParameterConfigurationCreator(RandomParameterConfigurationCreator original, Cloner cloner) : base(original, cloner) { }
+    public RandomParameterConfigurationCreator() : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used to initialize the new random permutation."));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>(MetaOptimizationProblem.ParameterConfigurationTreeParameterName, "The parameter configuration tree on which the new solution will be based on."));
+      Parameters.Add(new ValueLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTreeSolutionCandidate", "The new random parameter set."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomParameterConfigurationCreator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ParameterConfigurationParameter.ActualValue = (ParameterConfigurationTree)InitialParameterConfigurationParameter.ActualValue.Clone();
+      ParameterConfigurationParameter.ActualValue.Randomize(RandomParameter.ActualValue);
+      return base.Apply();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/AlgorithmProblemItem.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/AlgorithmProblemItem.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/AlgorithmProblemItem.cs	(revision 15740)
@@ -0,0 +1,34 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class AlgorithmProblemItem : ParameterizedNamedItem {
+    #region Parameter Properties
+    public IValueParameter<IAlgorithm> AlgorithmParameter {
+      get { return (ValueParameter<IAlgorithm>)Parameters["Algorithm"]; }
+    }
+    public IValueParameter<IProblem> ProblemParameter {
+      get { return (ValueParameter<IProblem>)Parameters["Problem"]; }
+    }
+    #endregion
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected AlgorithmProblemItem(bool deserializing) : base(deserializing) { }
+    public AlgorithmProblemItem() {
+      this.Parameters.Add(new ValueParameter<IAlgorithm>("Algorithm"));
+      this.Parameters.Add(new ValueParameter<IProblem>("Problem"));
+    }
+    protected AlgorithmProblemItem(AlgorithmProblemItem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmProblemItem(this, cloner);
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Crossovers/ParameterConfigurationCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Crossovers/ParameterConfigurationCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Crossovers/ParameterConfigurationCrossover.cs	(revision 15740)
@@ -0,0 +1,130 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// 
+  /// </summary>
+  [Item("ParameterConfigurationCrossover", "TODO")]
+  [StorableClass]
+  public class ParameterConfigurationCrossover : SingleSuccessorOperator, IParameterConfigurationOperator, IParameterConfigurationCrossover {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemArray<ParameterConfigurationTree>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<ParameterConfigurationTree>)Parameters["Parents"]; }
+    }
+    public ILookupParameter<ParameterConfigurationTree> ChildParameter {
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["Child"]; }
+    }
+
+    public IValueLookupParameter<IIntValueCrossover> IntValueCrossoverParameter {
+      get { return (IValueLookupParameter<IIntValueCrossover>)Parameters[MetaOptimizationProblem.IntValueCrossoverParameterName]; }
+    }
+    public IValueLookupParameter<IDoubleValueCrossover> DoubleValueCrossoverParameter {
+      get { return (IValueLookupParameter<IDoubleValueCrossover>)Parameters[MetaOptimizationProblem.DoubleValueCrossoverParameterName]; }
+    }
+
+    /// <summary>
+    /// Whether the problem is a maximization or minimization problem.
+    /// </summary>
+    public ValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    /// <summary>
+    /// The quality of the parents.
+    /// </summary>
+    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    [StorableConstructor]
+    protected ParameterConfigurationCrossover(bool deserializing) : base(deserializing) { }
+    protected ParameterConfigurationCrossover(ParameterConfigurationCrossover original, Cloner cloner) : base(original, cloner) { }
+    public ParameterConfigurationCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("Parents", "The parent vectors which should be crossed."));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("Child", "The child vector resulting from the crossover."));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "Whether the problem is a maximization problem or not."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The quality values of the parents."));
+      Parameters.Add(new ValueLookupParameter<IIntValueCrossover>(MetaOptimizationProblem.IntValueCrossoverParameterName, ""));
+      Parameters.Add(new ValueLookupParameter<IDoubleValueCrossover>(MetaOptimizationProblem.DoubleValueCrossoverParameterName, ""));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfigurationCrossover(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      if (MaximizationParameter.ActualValue == null) throw new InvalidOperationException("HeuristicCrossover: Parameter " + MaximizationParameter.ActualName + " could not be found.");
+      if (QualityParameter.ActualValue == null || QualityParameter.ActualValue.Length != 2) throw new InvalidOperationException("ParameterConfigurationCrossover: Parameter " + QualityParameter.ActualName + " could not be found, or not in the same quantity as there are parents.");
+      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+
+      ParameterConfigurationTree child1; 
+      ParameterConfigurationTree child2; 
+
+      if (maximization && qualities[0].Value >= qualities[1].Value || !maximization && qualities[0].Value <= qualities[1].Value) {
+        child1 = (ParameterConfigurationTree)ParentsParameter.ActualValue[0].Clone();
+        child2 = (ParameterConfigurationTree)ParentsParameter.ActualValue[1];
+      } else {
+        child1 = (ParameterConfigurationTree)ParentsParameter.ActualValue[1].Clone();
+        child2 = (ParameterConfigurationTree)ParentsParameter.ActualValue[0];
+      }
+
+      child1.Cross(RandomParameter.ActualValue, child2, Cross, IntValueCrossoverParameter.ActualValue, DoubleValueCrossoverParameter.ActualValue);
+      this.ChildParameter.ActualValue = child1;
+
+      return base.Apply();
+    }
+
+    public static void Apply(IRandom random, IOptimizable configuartion, IOptimizable other, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover) {
+      configuartion.Cross(random, other, Cross, intValueCrossover, doubleValueCrossover);
+    }
+
+    public static void Cross(IRandom random, IOptimizable configuration, IOptimizable other, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover) {
+      var vc = configuration as RangeValueConfiguration;
+      var pc = configuration as IParameterConfiguration;
+      if (vc != null) {
+        var value = vc.ActualValue.Value;
+        var range = vc.RangeConstraint;
+
+        if (value is IntValue) {
+          intValueCrossover.Apply(random, (IntValue)value, (IntValue)((IValueConfiguration)other).ActualValue.Value, (IntValueRange)range);
+        } else if (value is PercentValue) {
+          doubleValueCrossover.Apply(random, (PercentValue)value, (DoubleValue)((IValueConfiguration)other).ActualValue.Value, ((PercentValueRange)range).AsDoubleValueRange());
+        } else if (value is DoubleValue) {
+          doubleValueCrossover.Apply(random, (DoubleValue)value, (DoubleValue)((IValueConfiguration)other).ActualValue.Value, (DoubleValueRange)range);
+        }
+      } else if (pc != null) {
+        if (random.NextDouble() > 0.5) {
+          pc.ActualValueConfigurationIndex = ((ParameterConfiguration)other).ActualValueConfigurationIndex;
+        }
+        pc.ActualValue = pc.ValueConfigurations[pc.ActualValueConfigurationIndex].ActualValue;
+      }
+    }
+
+    private IntValue CrossInteger(IParameterConfiguration parameter1, IParameterConfiguration parameter2) {
+      IntegerVector integerChild = HeuristicLab.Encodings.IntegerVectorEncoding.DiscreteCrossover.Apply(
+        RandomParameter.ActualValue,
+        new ItemArray<IntegerVector>(
+          new IntegerVector[] {
+            new IntegerVector(new IntArray(new int[] { ((IntValue)parameter1.ActualValue.Value).Value })),
+            new IntegerVector(new IntArray(new int[] { ((IntValue)parameter2.ActualValue.Value).Value }))
+          }));
+      return new IntValue(integerChild[0]);
+    }
+
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationAllPositionsManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationAllPositionsManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationAllPositionsManipulator.cs	(revision 15740)
@@ -0,0 +1,29 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  // todo: item name/descr...
+  [StorableClass]
+  public class ParameterConfigurationAllPositionsManipulator : ParameterConfigurationManipulator {
+
+    public ParameterConfigurationAllPositionsManipulator() { }
+    [StorableConstructor]
+    protected ParameterConfigurationAllPositionsManipulator(bool deserializing) : base(deserializing) { }
+    protected ParameterConfigurationAllPositionsManipulator(ParameterConfigurationAllPositionsManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfigurationAllPositionsManipulator(this, cloner);
+    }
+
+    public sealed override IOperation Apply() {
+      Apply(RandomParameter.ActualValue, ParameterConfigurationTreeParameter.ActualValue, IntValueManipulatorParameter.ActualValue, DoubleValueManipulatorParameter.ActualValue);
+      return base.Apply();
+    }
+
+    public static new void Apply(IRandom random, IValueConfiguration configuration, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) {
+      configuration.Mutate(random, Mutate, intValueManipulator, doubleValueManipulator);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationManipulator.cs	(revision 15740)
@@ -0,0 +1,75 @@
+﻿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;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  // todo: item name/descr...
+  [StorableClass]
+  public abstract class ParameterConfigurationManipulator : SingleSuccessorOperator, IParameterConfigurationManipulator, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<ParameterConfigurationTree> ParameterConfigurationTreeParameter {
+      get { return (IValueLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+
+    public IValueLookupParameter<IIntValueManipulator> IntValueManipulatorParameter {
+      get { return (IValueLookupParameter<IIntValueManipulator>)Parameters[MetaOptimizationProblem.IntValueManipulatorParameterName]; }
+    }
+    public IValueLookupParameter<IDoubleValueManipulator> DoubleValueManipulatorParameter {
+      get { return (IValueLookupParameter<IDoubleValueManipulator>)Parameters[MetaOptimizationProblem.DoubleValueManipulatorParameterName]; }
+    }
+
+    public ParameterConfigurationManipulator() {
+      Parameters.Add(new ValueLookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new ValueLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", "The parameter configuration which should be manipulated."));
+
+      Parameters.Add(new ValueLookupParameter<IIntValueManipulator>(MetaOptimizationProblem.IntValueManipulatorParameterName, ""));
+      Parameters.Add(new ValueLookupParameter<IDoubleValueManipulator>(MetaOptimizationProblem.DoubleValueManipulatorParameterName, ""));
+    }
+    [StorableConstructor]
+    protected ParameterConfigurationManipulator(bool deserializing) : base(deserializing) { }
+    protected ParameterConfigurationManipulator(ParameterConfigurationManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IOperation Apply() {
+      Apply(RandomParameter.ActualValue, ParameterConfigurationTreeParameter.ActualValue, IntValueManipulatorParameter.ActualValue, DoubleValueManipulatorParameter.ActualValue);
+      return base.Apply();
+    }
+
+    public static void Apply(IRandom random, IValueConfiguration configuration, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) {
+      configuration.Mutate(random, Mutate, intValueManipulator, doubleValueManipulator);
+    }
+
+    public static void Mutate(IRandom random, IOptimizable configuration, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) {
+      var vc = configuration as RangeValueConfiguration;
+      var pc = configuration as IParameterConfiguration;
+
+      if (vc != null) {
+        var value = vc.ActualValue.Value;
+        var range = vc.RangeConstraint;
+        if (value is IntValue) {
+          intValueManipulator.Apply(random, (IntValue)value, (IntValueRange)range);
+        } else if (value is PercentValue) {
+          doubleValueManipulator.Apply(random, (PercentValue)value, ((PercentValueRange)range).AsDoubleValueRange());
+        } else if (value is DoubleValue) {
+          doubleValueManipulator.Apply(random, (DoubleValue)value, (DoubleValueRange)range);
+        }
+      } else if (pc != null) {
+        do {
+          pc.ActualValueConfigurationIndex = random.Next(pc.ValueConfigurations.Count());
+        } while (!pc.ValueConfigurations.ItemChecked(pc.ValueConfigurations[pc.ActualValueConfigurationIndex]));
+        pc.ActualValue = pc.ValueConfigurations[pc.ActualValueConfigurationIndex].ActualValue;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationOnePositionsManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationOnePositionsManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/Manipulators/ParameterConfigurationOnePositionsManipulator.cs	(revision 15740)
@@ -0,0 +1,38 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  // todo: item name/descr...
+  [StorableClass]
+  public class ParameterConfigurationOnePositionsManipulator : ParameterConfigurationManipulator {
+
+    public ParameterConfigurationOnePositionsManipulator() { }
+    [StorableConstructor]
+    protected ParameterConfigurationOnePositionsManipulator(bool deserializing) : base(deserializing) { }
+    protected ParameterConfigurationOnePositionsManipulator(ParameterConfigurationOnePositionsManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfigurationOnePositionsManipulator(this, cloner);
+    }
+
+    public sealed override IOperation Apply() {
+      Apply(RandomParameter.ActualValue, ParameterConfigurationTreeParameter.ActualValue, IntValueManipulatorParameter.ActualValue, DoubleValueManipulatorParameter.ActualValue);
+      return base.Apply();
+    }
+
+    public static void Apply(IRandom random, ParameterConfigurationTree configuration, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) {
+      IOptimizable optimizable = configuration.GetRandomOptimizable(random);
+      Mutate(random, optimizable, intValueManipulator, doubleValueManipulator);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/NullValue.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/NullValue.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/NullValue.cs	(revision 15740)
@@ -0,0 +1,23 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NullValue : ValueTypeValue<int> {
+
+    public NullValue() { }
+    [StorableConstructor]
+    protected NullValue(bool deserializing) : base(deserializing) { }
+    protected NullValue(NullValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NullValue(this, cloner);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs	(revision 15740)
@@ -0,0 +1,161 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public class ParameterCombinationsEnumerator : IEnumerator<IOptimizable> {
+    private IOptimizable node;
+    private List<IEnumerator> enumerators;
+    private EnumeratorCollectionEnumerator<IItem> valueEnumerator;
+    private bool initialized = false;
+
+    public ParameterCombinationsEnumerator(IOptimizable node) {
+      this.node = node;
+      this.enumerators = new List<IEnumerator>();
+    }
+
+    public IOptimizable Current {
+      get { return node; }
+    }
+    object IEnumerator.Current {
+      get {
+        if (!initialized)
+          throw new InvalidOperationException("Enumeration not started. Call MoveNext!");
+        return Current;
+      }
+    }
+
+    public void Dispose() { }
+
+    public bool MoveNext() {
+      if (!initialized) {
+        foreach (var enu in enumerators) {
+          enu.Reset();
+          if (!enu.MoveNext())
+            return false;
+        }
+        initialized = true;
+      } else {
+        int i = 0;
+        bool ok = false;
+        while (!ok && i < enumerators.Count) {
+          if (enumerators[i].MoveNext()) {
+            ok = true;
+          } else {
+            i++;
+          }
+        }
+
+        if (ok) {
+          for (int k = i - 1; k >= 0; k--) {
+            enumerators[k].Reset();
+            enumerators[k].MoveNext();
+          }
+        } else {
+          return false;
+        }
+      }
+
+      var pc = node as IParameterConfiguration;
+      if (pc != null && valueEnumerator != null) {
+        pc.ActualValue = ((IValueConfiguration)valueEnumerator.Current).ActualValue;
+        pc.UpdateActualValueIndexToItem((IValueConfiguration)valueEnumerator.Current);
+      }
+      var vc = node as IValueConfiguration;
+      if (vc != null && valueEnumerator != null) {
+        vc.ActualValue.Value = (IItem)valueEnumerator.Current;
+      }
+      return true;
+    }
+
+    public void Reset() {
+      enumerators.Clear();
+      valueEnumerator = null;
+      initialized = false;
+
+      var pc = node as IParameterConfiguration;
+      if (pc != null) {
+        valueEnumerator = new EnumeratorCollectionEnumerator<IItem>();
+
+        foreach (var valueConfiguration in pc.ValueConfigurations.CheckedItems) {
+          if (valueConfiguration.Value.Optimize) {
+            var enumerator = new ParameterCombinationsEnumerator(valueConfiguration.Value);
+            enumerator.Reset();
+            valueEnumerator.AddEnumerator(enumerator);
+          } else {
+            valueEnumerator.AddEnumerator(new List<IItem> { valueConfiguration.Value }.GetEnumerator());
+          }
+        }
+        valueEnumerator.Reset();
+        enumerators.Add(valueEnumerator);
+      }
+
+      var rangeVc = node as RangeValueConfiguration;
+      if (rangeVc != null) {
+        valueEnumerator = new EnumeratorCollectionEnumerator<IItem>();
+        valueEnumerator.AddEnumerator(rangeVc.RangeConstraint.GetCombinations().GetEnumerator());
+        valueEnumerator.Reset();
+        enumerators.Add(valueEnumerator);
+      }
+
+      var parameterizedVc = node as ParameterizedValueConfiguration;
+      if (parameterizedVc != null) {
+        foreach (var parameterConfiguration in parameterizedVc.ParameterConfigurations) {
+          if (parameterConfiguration.Optimize) {
+            var enumerator = new ParameterCombinationsEnumerator(parameterConfiguration);
+            enumerator.Reset();
+            enumerators.Add(enumerator);
+          }
+        }
+        enumerators.Reverse(); // this makes the list of combinations better readable
+      }
+    }
+  }
+
+  /// <summary>
+  /// Enumerator which can enumerate all elements of a list of enumerators
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  public class EnumeratorCollectionEnumerator<T> : IEnumerator<T> {
+    private List<IEnumerator<T>> enumerators = new List<IEnumerator<T>>();
+    private IEnumerator<IEnumerator<T>> currentEnumerator;
+
+    public EnumeratorCollectionEnumerator() { }
+
+    public void AddEnumerator(IEnumerator<T> enumerator) {
+      enumerators.Add(enumerator);
+    }
+
+    public void Dispose() { }
+
+    public T Current {
+      get { return currentEnumerator.Current.Current; }
+    }
+
+    object IEnumerator.Current {
+      get { return this.Current; }
+    }
+
+    public bool MoveNext() {
+      bool ok = currentEnumerator.Current.MoveNext();
+      if (!ok) {
+        ok = currentEnumerator.MoveNext();
+        if (!ok)
+          return false;
+        else
+          return this.MoveNext();
+      }
+      return true;
+    }
+
+    public void Reset() {
+      foreach (var enu in enumerators) {
+        enu.Reset();
+      }
+      currentEnumerator = enumerators.GetEnumerator();
+      currentEnumerator.Reset();
+      currentEnumerator.MoveNext();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 15740)
@@ -0,0 +1,338 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  // todo: storable, name, descr, ...
+  [StorableClass]
+  public class ParameterConfigurationTree : ParameterizedValueConfiguration, IEnumerable {
+
+    [Storable]
+    private DoubleValue quality;
+    public DoubleValue Quality {
+      get { return quality; }
+      set {
+        if (quality != value) {
+          quality = value;
+          OnQualityChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray normalizedQualityAverages;
+    public DoubleArray NormalizedQualityAverages {
+      get { return normalizedQualityAverages; }
+      set {
+        if (normalizedQualityAverages != value) {
+          normalizedQualityAverages = value;
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray normalizedQualityDeviations;
+    public DoubleArray NormalizedQualityDeviations {
+      get { return normalizedQualityDeviations; }
+      set {
+        if (normalizedQualityDeviations != value) {
+          normalizedQualityDeviations = value;
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray normalizedEvaluatedSolutions;
+    public DoubleArray NormalizedEvaluatedSolutions {
+      get { return normalizedEvaluatedSolutions; }
+      set {
+        if (normalizedEvaluatedSolutions != value) {
+          normalizedEvaluatedSolutions = value;
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray bestQualities;
+    public DoubleArray BestQualities {
+      get { return bestQualities; }
+      set {
+        if (bestQualities != value) {
+          bestQualities = value;
+        }
+      }
+    }
+
+    [Storable]
+    private DoubleArray averageQualities;
+    public DoubleArray AverageQualities {
+      get { return averageQualities; }
+      set { averageQualities = value; }
+    }
+
+    [Storable]
+    private DoubleArray worstQualities;
+    public DoubleArray WorstQualities {
+      get { return worstQualities; }
+      set { worstQualities = value; }
+    }
+
+    [Storable]
+    private DoubleArray qualityVariances;
+    public DoubleArray QualityVariances {
+      get { return qualityVariances; }
+      set { qualityVariances = value; }
+    }
+
+    [Storable]
+    private DoubleArray qualityStandardDeviations;
+    public DoubleArray QualityStandardDeviations {
+      get { return qualityStandardDeviations; }
+      set { qualityStandardDeviations = value; }
+    }
+
+    [Storable]
+    private ItemList<TimeSpanValue> averageExecutionTimes;
+    public ItemList<TimeSpanValue> AverageExecutionTimes {
+      get { return averageExecutionTimes; }
+      set { averageExecutionTimes = value; }
+    }
+
+    [Storable]
+    private DoubleArray averageEvaluatedSolutions;
+    public DoubleArray AverageEvaluatedSolutions {
+      get { return averageEvaluatedSolutions; }
+      set { averageEvaluatedSolutions = value; }
+    }
+
+    [Storable]
+    private IntValue repetitions;
+    public IntValue Repetitions {
+      get { return repetitions; }
+      set { repetitions = value; }
+    }
+
+    [Storable]
+    protected RunCollection runs;
+    public RunCollection Runs {
+      get { return runs; }
+      set { runs = value; }
+    }
+
+    [Storable]
+    protected IDictionary<string, IItem> parameters;
+    public IDictionary<string, IItem> Parameters {
+      get { return parameters; }
+      set { parameters = value; }
+    }
+
+    public ParameterizedValueConfiguration AlgorithmConfiguration {
+      get {
+        return this.ParameterConfigurations.ElementAt(0).ValueConfigurations.First() as ParameterizedValueConfiguration;
+      }
+    }
+
+    public ParameterizedValueConfiguration ProblemConfiguration {
+      get {
+        return this.ParameterConfigurations.ElementAt(1).ValueConfigurations.First() as ParameterizedValueConfiguration;
+      }
+    }
+
+    #region constructors and cloning
+    public ParameterConfigurationTree(IAlgorithm algorithm, IProblem problem)
+      : base(null, algorithm.GetType(), false) {
+      this.Optimize = false;
+      this.IsOptimizable = false;
+      this.parameters = new Dictionary<string, IItem>();
+      this.Name = algorithm.ItemName;
+
+      var algproblemitem = new AlgorithmProblemItem();
+      algproblemitem.AlgorithmParameter.Value = algorithm;
+      algproblemitem.ProblemParameter.Value = problem;
+      this.discoverValidValues = false;
+
+      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Algorithm", algproblemitem.AlgorithmParameter));
+      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Problem", algproblemitem.ProblemParameter));
+
+      // problems can be modified in the list of problem instances, so the parameters which are not Optimize=true, 
+      // must not be modifiable in the parameter configuration tree. otherwise the parameter values would be ambiguous
+      ProblemConfiguration.ValuesReadOnly = true;
+    }
+
+    [StorableConstructor]
+    protected ParameterConfigurationTree(bool deserializing) : base(deserializing) { }
+    protected ParameterConfigurationTree(ParameterConfigurationTree original, Cloner cloner)
+      : base(original, cloner) {
+      this.quality = cloner.Clone(original.quality);
+      this.normalizedQualityAverages = cloner.Clone(original.normalizedQualityAverages);
+      this.normalizedQualityDeviations = cloner.Clone(original.normalizedQualityDeviations);
+      this.normalizedEvaluatedSolutions = cloner.Clone(original.normalizedEvaluatedSolutions);
+      this.bestQualities = cloner.Clone(original.BestQualities);
+      this.averageQualities = cloner.Clone(original.averageQualities);
+      this.worstQualities = cloner.Clone(original.worstQualities);
+      this.qualityStandardDeviations = cloner.Clone(original.qualityStandardDeviations);
+      this.qualityVariances = cloner.Clone(original.qualityVariances);
+      this.averageExecutionTimes = cloner.Clone(original.averageExecutionTimes);
+      this.averageEvaluatedSolutions = cloner.Clone(original.averageEvaluatedSolutions);
+      this.repetitions = cloner.Clone(original.repetitions);
+      this.runs = cloner.Clone(original.runs);
+      this.parameters = new Dictionary<string, IItem>();
+      if (original.parameters != null) {
+        foreach (var p in original.parameters) {
+          this.parameters.Add(p.Key, cloner.Clone(p.Value));
+        }
+      }
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfigurationTree(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (ProblemConfiguration != null) ProblemConfiguration.ValuesReadOnly = true;
+    }
+    #endregion
+
+    public virtual void CollectResultValues(IDictionary<string, IItem> values) {
+      values.Add("RunsAverageExecutionTimes", AverageExecutionTimes);
+      values.Add("RunsAverageEvaluatedSolutions", AverageEvaluatedSolutions);
+      values.Add("Repetitions", Repetitions);
+      values.Add("RunsBestQualities", BestQualities);
+      values.Add("RunsAverageQualities", AverageQualities);
+      values.Add("RunsWorstQualities", WorstQualities);
+      values.Add("RunsQualityVariances", QualityVariances);
+      values.Add("RunsQualityStandardDeviations", QualityStandardDeviations);
+      values.Add("QualitiesNormalized", NormalizedQualityAverages);
+      values.Add("AverageQualityNormalized", Quality);
+      values.Add("Runs", Runs);
+    }
+
+    public virtual void CollectParameterValues(IDictionary<string, IItem> values) {
+      foreach (var p in parameters) {
+        values.Add(p);
+      }
+    }
+
+    #region Events
+    public event EventHandler QualityChanged;
+    private void OnQualityChanged() {
+      var handler = QualityChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    private void Quality_ValueChanged(object sender, EventArgs e) {
+      OnQualityChanged();
+    }
+    #endregion
+
+    public override void Parameterize(IParameterizedItem item) {
+      this.parameters.Clear();
+      var algorithm = item as IAlgorithm;
+      var problem = algorithm.Problem;
+
+      ProblemConfiguration.Parameterize(problem);
+      AlgorithmConfiguration.Parameterize(algorithm);
+
+      algorithm.CollectParameterValues(this.Parameters);
+    }
+
+    public Experiment GenerateExperiment(IAlgorithm algorithm, bool createBatchRuns, int repetitions) {
+      Experiment experiment = new Experiment();
+      foreach (ParameterizedValueConfiguration combination in this) {
+        IAlgorithm clonedAlg = (IAlgorithm)algorithm.Clone();
+        clonedAlg.Name = combination.ParameterInfoString;
+        combination.Parameterize(clonedAlg);
+        clonedAlg.StoreAlgorithmInEachRun = false;
+        if (createBatchRuns) {
+          BatchRun batchRun = new BatchRun(string.Format("BatchRun: {0}", combination.ParameterInfoString));
+          batchRun.Optimizer = clonedAlg;
+          batchRun.Repetitions = repetitions;
+          experiment.Optimizers.Add(batchRun);
+        } else {
+          experiment.Optimizers.Add(clonedAlg);
+        }
+      }
+      return experiment;
+    }
+
+    public Experiment GenerateExperiment(IAlgorithm algorithm) {
+      return GenerateExperiment(algorithm, false, 0);
+    }
+
+    public IEnumerator GetEnumerator() {
+      IEnumerator enumerator = new ParameterCombinationsEnumerator(this);
+      enumerator.Reset();
+      return enumerator;
+    }
+
+    /// <summary>
+    /// returns the number of possible parameter combinations
+    /// </summary>
+    /// <param name="max">algorithm stops counting when max is reached. zero for infinite counting</param>
+    /// <returns></returns>
+    public long GetCombinationCount(long max) {
+      long cnt = 0;
+      foreach (var c in this) {
+        cnt++;
+        if (max > 0 && cnt >= max) {
+          return cnt;
+        }
+      }
+      return cnt;
+    }
+
+    public IOptimizable GetRandomOptimizable(IRandom random) {
+      List<IOptimizable> allOptimizables = GetAllOptimizables();
+      return allOptimizables[random.Next(allOptimizables.Count)];
+    }
+
+    public override string ToString() {
+      return this.Name;
+    }
+
+    public IRun ToRun(bool clearParameters) {
+      return ToRun(this.ParameterInfoString, clearParameters);
+    }
+
+    public IRun ToRun(string name, bool clearParameters) {
+      IRun run = new Run();
+      run.Name = name;
+      this.CollectResultValues(run.Results);
+      this.CollectParameterValues(run.Parameters);
+      if (clearParameters) MetaOptimizationUtil.ClearParameters(run, this.GetOptimizedParameterNames());
+      return run;
+    }
+
+    public override string ParameterInfoString {
+      get {
+        string algorithmInfo = this.AlgorithmConfiguration.ParameterInfoString;
+        string problemInfo = this.ProblemConfiguration.ParameterInfoString;
+        var sb = new StringBuilder();
+        if (!string.IsNullOrEmpty(algorithmInfo)) {
+          sb.Append("Algorithm (");
+          sb.Append(algorithmInfo);
+          sb.Append(")");
+        }
+        if (!string.IsNullOrEmpty(problemInfo)) {
+          if (sb.Length > 0)
+            sb.Append(", ");
+          sb.Append("Problem( ");
+          sb.Append(problemInfo);
+          sb.Append(")");
+        }
+        return sb.ToString();
+      }
+    }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) {
+      AlgorithmConfiguration.CollectOptimizedParameterNames(parameterNames, string.Empty);
+      ProblemConfiguration.CollectOptimizedParameterNames(parameterNames, string.Empty);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 15740)
@@ -0,0 +1,650 @@
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class ParameterConfiguration : Item, IParameterConfiguration, IStorableContent {
+    public bool IsOptimizable {
+      get { return true; }
+    }
+
+    public string Filename { get; set; }
+
+    [Storable]
+    protected bool optimize;
+    public virtual bool Optimize {
+      get { return optimize; }
+      set {
+        if (optimize != value) {
+          optimize = value;
+          if (optimize) {
+            PopulateValueConfigurations();
+          } else {
+            ClearValueConfigurations();
+          }
+          OnOptimizeChanged();
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected Image itemImage;
+    public override Image ItemImage {
+      get { return itemImage ?? base.ItemImage; }
+    }
+
+    [Storable]
+    protected string parameterName;
+    public string ParameterName {
+      get { return parameterName; }
+      set {
+        if (parameterName != value) {
+          parameterName = value;
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected Type parameterDataType;
+    public Type ParameterDataType {
+      get { return this.parameterDataType; }
+    }
+
+    protected Type[] validTypes;
+    public Type[] ValidTypes {
+      get { return validTypes; }
+      protected set {
+        if (this.validTypes != value) {
+          this.validTypes = value;
+        }
+      }
+    }
+
+    [Storable]
+    protected Type valueDataType;
+    public Type ValueDataType {
+      get { return valueDataType; }
+      protected set { this.valueDataType = value; }
+    }
+
+    [Storable]
+    protected ICheckedValueConfigurationList valueConfigurations;
+    public ICheckedValueConfigurationList ValueConfigurations {
+      get { return this.valueConfigurations; }
+      protected set {
+        if (this.valueConfigurations != value) {
+          if (this.valueConfigurations != null) DeregisterValueConfigurationEvents();
+          this.valueConfigurations = value;
+          KeepActualValueConfigurationIndexConsistent();
+          if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
+        }
+      }
+    }
+
+    [Storable]
+    private int actualValueConfigurationIndex = 0;
+    public int ActualValueConfigurationIndex {
+      get { return actualValueConfigurationIndex; }
+      set { actualValueConfigurationIndex = value; }
+    }
+
+    [Storable]
+    protected ConstrainedValue actualValue;
+    public ConstrainedValue ActualValue {
+      get { return actualValue; }
+      set {
+        if (actualValue != value) {
+          DeregisterActualValueEvents();
+          actualValue = value;
+          RegisterActualValueEvents();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool isNullable;
+    public bool IsNullable {
+      get { return isNullable; }
+      protected set {
+        if (this.isNullable != value) {
+          this.isNullable = value;
+        }
+      }
+    }
+
+    [Storable]
+    protected bool discoverValidValues;
+    public bool DiscoverValidValues {
+      get { return discoverValidValues; }
+      set { discoverValidValues = value; }
+    }
+
+    protected IItemSet<IItem> validValues;
+
+    [Storable]
+    private bool autoPopulateValueConfigurations = true;
+    public bool AutoPopulateValueConfigurations {
+      get { return autoPopulateValueConfigurations; }
+      set { autoPopulateValueConfigurations = value; }
+    }
+
+    [Storable]
+    protected bool valuesReadOnly = false;
+    public virtual bool ValuesReadOnly {
+      get { return valuesReadOnly; }
+      set {
+        if (value != this.valuesReadOnly) {
+          this.valuesReadOnly = value;
+          foreach (var vc in this.valueConfigurations) {
+            vc.ValuesReadOnly = value;
+          }
+        }
+      }
+    }
+
+    #region Constructors and Cloning
+    public ParameterConfiguration(string parameterName, IValueParameter valueParameter, bool discoverValidValues) {
+      this.AutoPopulateValueConfigurations = true;
+      this.ParameterName = parameterName;
+      this.parameterDataType = valueParameter.GetType();
+      this.valueDataType = valueParameter.DataType;
+      this.discoverValidValues = discoverValidValues;
+      this.validValues = discoverValidValues ? GetValidValues(valueParameter) : new ItemSet<IItem> { valueParameter.Value };
+      this.validTypes = GetValidTypes(valueParameter).ToArray();
+      this.IsNullable = valueParameter.ItemName.StartsWith("Optional");
+      this.itemImage = valueParameter.ItemImage;
+      if (IsNullable) {
+        validTypes = new List<Type>(validTypes) { typeof(NullValue) }.ToArray();
+      }
+      this.ValueConfigurations = new CheckedValueConfigurationList(this.validValues ?? CreateValidValues());
+      this.ActualValue = new ConstrainedValue(
+        valueParameter.Value != null ? valueParameter.Value : null, // don't clone here; otherwise settings of a non-optimized ValueParameter will not be synchronized with the ConstrainedValue
+        valueParameter.DataType,
+        this.validValues != null ? new ItemSet<IItem>(this.validValues) : CreateValidValues(),
+        this.IsNullable);
+      if (Optimize) {
+        PopulateValueConfigurations();
+      }
+    }
+    public ParameterConfiguration(string parameterName, Type type, IItem actualValue, IEnumerable<IValueConfiguration> valueConfigurations) {
+      this.AutoPopulateValueConfigurations = false;
+      this.ParameterName = parameterName;
+      this.parameterDataType = type;
+      this.valueDataType = type;
+      this.discoverValidValues = false;
+      this.validValues = null; // maybe use values from valueConfigurations
+      this.validTypes = new Type[] { type };
+      this.IsNullable = false;
+      this.itemImage = valueConfigurations.Count() > 0 ? valueConfigurations.FirstOrDefault().ItemImage : null;
+      this.ValueConfigurations = new CheckedValueConfigurationList(valueConfigurations);
+      this.ActualValue = new ConstrainedValue(actualValue, type, CreateValidValues(), this.IsNullable);
+    }
+    public ParameterConfiguration(string parameterName, Type type, IItem actualValue) {
+      this.AutoPopulateValueConfigurations = true;
+      this.ParameterName = parameterName;
+      this.parameterDataType = type;
+      this.valueDataType = type;
+      this.discoverValidValues = false;
+      this.validValues = null;
+      this.validTypes = new Type[] { type };
+      this.IsNullable = false;
+      this.itemImage = actualValue.ItemImage;
+      this.ValueConfigurations = new CheckedValueConfigurationList();
+      this.ActualValue = new ConstrainedValue(actualValue, type, CreateValidValues(), this.IsNullable);
+      if (Optimize) {
+        PopulateValueConfigurations();
+      }
+    }
+    protected ParameterConfiguration() { }
+    [StorableConstructor]
+    protected ParameterConfiguration(bool deserializing) { }
+
+    protected ParameterConfiguration(ParameterConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.parameterName = original.ParameterName;
+      this.parameterDataType = original.parameterDataType;
+      this.valueDataType = original.ValueDataType;
+      this.validValues = cloner.Clone(original.validValues);
+      this.validTypes = original.validTypes.ToArray();
+      this.valueConfigurations = cloner.Clone(original.ValueConfigurations);
+      if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
+      this.actualValue = cloner.Clone(original.actualValue);
+      if (this.actualValue != null) RegisterActualValueEvents();
+      this.optimize = original.optimize;
+      this.actualValueConfigurationIndex = original.actualValueConfigurationIndex;
+      this.isNullable = original.isNullable;
+      this.itemImage = original.itemImage;
+      this.discoverValidValues = original.discoverValidValues;
+      this.AutoPopulateValueConfigurations = original.AutoPopulateValueConfigurations;
+      this.valuesReadOnly = original.valuesReadOnly;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfiguration(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    protected virtual void AfterDeserialization() {
+      this.validTypes = GetValidTypes(parameterDataType).ToArray();
+
+      if (IsNullable) {
+        validTypes = new List<Type>(validTypes) { typeof(NullValue) }.ToArray();
+      }
+      this.validValues = CreateValidValues();
+
+      if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
+      if (this.actualValue != null) RegisterActualValueEvents();
+    }
+    #endregion
+
+    private void RegisterValueConfigurationEvents() {
+      this.ValueConfigurations.CheckedItemsChanged += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_CheckedItemsChanged);
+      this.ValueConfigurations.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_ItemsAdded);
+      this.ValueConfigurations.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_ItemsRemoved);
+    }
+
+    private void DeregisterValueConfigurationEvents() {
+      this.ValueConfigurations.CheckedItemsChanged -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_CheckedItemsChanged);
+      this.ValueConfigurations.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_ItemsAdded);
+      this.ValueConfigurations.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(ValueConfigurations_ItemsRemoved);
+    }
+
+    private void RegisterActualValueEvents() {
+      if (this.ActualValue != null) this.ActualValue.ToStringChanged += new EventHandler(ActualValue_ToStringChanged);
+    }
+    private void DeregisterActualValueEvents() {
+      if (this.ActualValue != null) this.ActualValue.ToStringChanged -= new EventHandler(ActualValue_ToStringChanged);
+    }
+
+    protected virtual void PopulateValueConfigurations() {
+      if (!this.AutoPopulateValueConfigurations)
+        return;
+
+      foreach (Type t in this.validTypes) {
+        if (t == typeof(NullValue)) {
+          this.ValueConfigurations.Add(new NullValueConfiguration());
+        } else {
+          IItem val;
+          if (ActualValue.Value != null && ActualValue.Value.GetType() == t) {
+            val = (IItem)ActualValue.Value.Clone(); // use existing value for that type (if available)
+          } else {
+            val = CreateItem(t);
+          }
+          if (val != null) { // val can be null when ValidValues does not contain the type (this can happen when discoverValidValues=false)
+            IValueConfiguration valueConfiguration;
+            if (val is IParameterizedItem) {
+              valueConfiguration = new ParameterizedValueConfiguration(val, val.GetType(), true);
+            } else {
+              if (val is ISymbolicExpressionGrammar) {
+                valueConfiguration = new SymbolicExpressionGrammarValueConfiguration((ISymbolicExpressionGrammar)val);
+              } else {
+                valueConfiguration = new RangeValueConfiguration(val, val.GetType());
+              }
+            }
+            this.ValueConfigurations.Add(valueConfiguration, true);
+          }
+        }
+      }
+    }
+
+    protected virtual void ClearValueConfigurations() {
+      if (!this.AutoPopulateValueConfigurations)
+        return;
+
+      this.ValueConfigurations.Clear();
+    }
+
+    private static IEnumerable<Type> GetValidTypes(IValueParameter parameter) {
+      // in case of IOperator return empty list, otherwise hundreds of types would be returned. this mostly occurs for Successor which will never be optimized
+      if (parameter.DataType == typeof(IOperator))
+        return new List<Type>();
+
+      // return only one type for ValueTypeValues<> (Int, Double, Percent, Bool). Otherwise 2 types would be returned for DoubleValue (PercentValue which is derived)
+      if (IsSubclassOfRawGeneric(typeof(ValueTypeValue<>), parameter.DataType))
+        return new List<Type> { parameter.DataType };
+
+      if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        // use existing validvalues if known
+        var parameterValidValues = (IEnumerable)parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
+        return parameterValidValues.Cast<object>().Select(x => x.GetType());
+      } else {
+        // otherwise use all assignable types
+        return ApplicationManager.Manager.GetTypes(parameter.DataType, true);
+      }
+    }
+
+    private static IEnumerable<Type> GetValidTypes(Type parameter) {
+      // in case of IOperator return empty list, otherwise hundreds of types would be returned. this mostly occurs for Successor which will never be optimized
+      if (parameter == typeof(IOperator))
+        return new List<Type>();
+
+      // return only one type for ValueTypeValues<> (Int, Double, Percent, Bool). Otherwise 2 types would be returned for DoubleValue (PercentValue which is derived)
+      if (IsSubclassOfRawGeneric(typeof(ValueTypeValue<>), parameter))
+        return new List<Type> { parameter };
+
+      //TODO: not sure if this if makes sense; maybe only leave else branch here
+      if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        // use existing validvalues if known
+        var parameterValidValues = (IEnumerable)parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
+        return parameterValidValues.Cast<object>().Select(x => x.GetType());
+      } else {
+        // otherwise use all assignable types
+        return ApplicationManager.Manager.GetTypes(parameter, true);
+      }
+    }
+
+    private IItemSet<IItem> GetValidValues(IValueParameter parameter) {
+      if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        var x = (IEnumerable)parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
+        return new ItemSet<IItem>(x.Cast<IItem>().Select(y => (IItem)y.Clone())); // cloning actually saves memory, because references to event-subscribers are removed
+      } else {
+        return null;
+      }
+    }
+
+    public IItem CreateItem(Type type) {
+      // no valid values; just instantiate
+      try {
+        if (validValues == null)
+          return (IItem)Activator.CreateInstance(type);
+      }
+      catch (MissingMemberException) {
+        return null; // can happen, when ApplicationManager.Manager.GetTypes(type, OnlyInstantiable=true) returns objects which have no default constructor
+      }
+
+      if (type == typeof(NullValue))
+        return new NullValue();
+
+      // copy value from ValidValues; this ensures that previously set ActualNames for a type are kept
+      IItem value = this.validValues.Where(v => v.GetType() == type).SingleOrDefault();
+      if (value != null)
+        return value;
+
+      return null;
+    }
+
+    private IItemSet<IItem> CreateValidValues() {
+      var validValues = new ItemSet<IItem>();
+      foreach (Type t in this.validTypes) {
+        try {
+          var val = CreateItem(t);
+          if (val != null) validValues.Add(val);
+        }
+        catch (MissingMethodException) { /* Constructor is missing, don't use those types */ }
+      }
+      return validValues;
+    }
+
+    public static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) {
+      while (toCheck != typeof(object)) {
+        var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
+        if (generic == cur) {
+          return true;
+        }
+        toCheck = toCheck.BaseType; // baseType is null when toCheck is an Interface
+        if (toCheck == null)
+          return false;
+      }
+      return false;
+    }
+
+    private void ValueConfigurations_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      OnToStringChanged();
+      KeepActualValueConfigurationIndexConsistent();
+    }
+
+    private void ValueConfigurations_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      OnToStringChanged();
+      KeepActualValueConfigurationIndexConsistent();
+    }
+    private void ValueConfigurations_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      OnToStringChanged();
+      KeepActualValueConfigurationIndexConsistent();
+    }
+
+    #region INamedItem Properties
+    public virtual string Name {
+      get { return ParameterName; }
+      set { throw new NotSupportedException(); }
+    }
+    public virtual string Description {
+      get { return base.ItemDescription; }
+      set { throw new NotSupportedException(); }
+    }
+    public virtual bool CanChangeDescription {
+      get { return false; }
+    }
+    public virtual bool CanChangeName {
+      get { return false; }
+    }
+    public override string ItemDescription {
+      get { return base.ItemDescription; }
+    }
+    public override string ItemName {
+      get { return base.ItemName; }
+    }
+    #endregion
+
+    #region Events
+    protected virtual void ActualValue_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+
+    #region Event Handler
+    public virtual event EventHandler NameChanged;
+    protected virtual void OnNameChanged(object sender, EventArgs e) {
+      var handler = NameChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public virtual event EventHandler<CancelEventArgs<string>> NameChanging;
+    protected virtual void OnNameChanging(object sender, CancelEventArgs<string> e) {
+      var handler = NameChanging;
+      if (handler != null) handler(sender, e);
+    }
+
+    public virtual event EventHandler DescriptionChanged;
+    protected virtual void OnDescriptionChanged(object sender, EventArgs e) {
+      var handler = DescriptionChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public virtual event EventHandler IsOptimizableChanged;
+    private void OnIsOptimizableChanged() {
+      var handler = IsOptimizableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public virtual event EventHandler OptimizeChanged;
+    protected virtual void OnOptimizeChanged() {
+      var handler = OptimizeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public override string ToString() {
+      if (Optimize) {
+        return string.Format("{0}: (Optimize: {1})", ParameterName, ValueConfigurations.CheckedItems.Count());
+      } else {
+        return string.Format("{0}: {1}", ParameterName, ActualValue.Value);
+      }
+    }
+
+    public virtual string ParameterInfoString {
+      get {
+        StringBuilder sb = new StringBuilder();
+        if (this.Optimize) {
+          var vc = this.ValueConfigurations[actualValueConfigurationIndex];
+          if (vc.ActualValue == null || vc.ActualValue.Value == null) {
+            sb.Append(string.Format("{0}: null", parameterName));
+          } else if (IsSubclassOfRawGeneric(typeof(ValueTypeValue<>), vc.ActualValue.Value.GetType())) {
+            // for int, double, bool use the value directly
+            sb.Append(string.Format("{0}: {1}", parameterName, this.ActualValue.Value.ToString()));
+          } else {
+            // for other types use NumberedName (this also uses the Number-Property for otherwise ambiguous ValueConfigurations)
+            sb.Append(string.Format("{0}: {1}", parameterName, vc.NumberedName));
+          }
+
+          if (this.ValueConfigurations[actualValueConfigurationIndex] is ParameterizedValueConfiguration) {
+            string subParams = this.ValueConfigurations[actualValueConfigurationIndex].ParameterInfoString;
+            if (!string.IsNullOrEmpty(subParams)) {
+              sb.Append(" (");
+              sb.Append(subParams);
+              sb.Append(")");
+            }
+          }
+        }
+        return sb.ToString();
+      }
+    }
+
+    public static IParameterConfiguration Create(IParameterizedNamedItem parent, IParameter parameter, bool discoverValidValues) {
+      if (parameter is IValueParameter) {
+        IValueParameter valueParameter = parameter as IValueParameter;
+        return new ParameterConfiguration(parameter.Name, valueParameter, discoverValidValues);
+      }
+      return null;
+    }
+
+    public void Parameterize(IValueParameter parameter) {
+      if (!Optimize && ValuesReadOnly)
+        return;
+
+      if (Optimize) {
+        if (this.ActualValue.Value is IParameterizedItem) {
+          ((ParameterizedValueConfiguration)this.ValueConfigurations[actualValueConfigurationIndex]).Parameterize((IParameterizedItem)this.ActualValue.Value);
+        }
+        if (this.ActualValue.Value is ISymbolicExpressionGrammar) {
+          ((SymbolicExpressionGrammarValueConfiguration)this.ValueConfigurations[actualValueConfigurationIndex]).Parameterize((ISymbolicExpressionGrammar)this.ActualValue.Value);
+        }
+      }
+      var clonedValue = this.ActualValue.Value != null ? (IItem)this.ActualValue.Value.Clone() : null;
+      if (clonedValue != null) AdaptValidValues(parameter, clonedValue);
+      parameter.Value = clonedValue;
+    }
+
+    /// <summary>
+    /// Adds value to the ValidValues of the parameter if they don't contain the value
+    /// </summary>
+    private void AdaptValidValues(IValueParameter parameter, IItem value) {
+      // this requires some tricky reflection, because the type is unknown at runtime so parameter.ValidValues cannot be casted to Collection<?>
+      if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
+        var validValues = parameter.GetType().GetProperty("ValidValues").GetValue(parameter, new object[] { });
+        Type validValuesType = validValues.GetType();
+
+        var containsMethod = validValuesType.GetMethod("Contains");
+        if (!(bool)containsMethod.Invoke(validValues, new object[] { value })) {
+          var addMethod = validValuesType.GetMethod("Add");
+          addMethod.Invoke(validValues, new object[] { value });
+        }
+      }
+    }
+
+    public void Randomize(IRandom random) {
+      if (Optimize) {
+        foreach (var vc in this.ValueConfigurations) {
+          if (this.ValueConfigurations.ItemChecked(vc)) {
+            if (vc.Optimize) vc.Randomize(random);
+          }
+        }
+        do {
+          actualValueConfigurationIndex = random.Next(ValueConfigurations.Count());
+        } while (!this.ValueConfigurations.ItemChecked(this.ValueConfigurations[actualValueConfigurationIndex]));
+        this.ActualValue = this.ValueConfigurations[actualValueConfigurationIndex].ActualValue;
+      }
+    }
+
+    public void Mutate(IRandom random, MutateDelegate mutate, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) {
+      if (Optimize) {
+        foreach (var vc in this.ValueConfigurations) {
+          if (this.ValueConfigurations.ItemChecked(vc)) {
+            if (vc.Optimize) vc.Mutate(random, mutate, intValueManipulator, doubleValueManipulator);
+          }
+        }
+        mutate(random, this, intValueManipulator, doubleValueManipulator);
+      }
+    }
+
+    public void Cross(IRandom random, IOptimizable other, CrossDelegate cross, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover) {
+      if (Optimize) {
+        IParameterConfiguration otherPc = (IParameterConfiguration)other;
+        for (int i = 0; i < this.ValueConfigurations.Count; i++) {
+          if (this.ValueConfigurations.ItemChecked(this.ValueConfigurations[i])) {
+            if (this.ValueConfigurations[i].Optimize) this.ValueConfigurations[i].Cross(random, otherPc.ValueConfigurations[i], cross, intValueCrossover, doubleValueCrossover);
+          }
+        }
+        cross(random, this, other, intValueCrossover, doubleValueCrossover);
+      }
+    }
+
+    public void UpdateActualValueIndexToItem(IValueConfiguration vc) {
+      for (int i = 0; i < this.ValueConfigurations.Count(); i++) {
+        if (this.ValueConfigurations.ElementAt(i) == vc) {
+          this.actualValueConfigurationIndex = i;
+          return;
+        }
+      }
+    }
+
+    public List<IOptimizable> GetAllOptimizables() {
+      var list = new List<IOptimizable>();
+      foreach (var vc in ValueConfigurations) {
+        if (vc.Optimize) {
+          list.Add(vc);
+          list.AddRange(vc.GetAllOptimizables());
+        }
+      }
+      return list;
+    }
+
+    public void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) {
+      foreach (var vc in ValueConfigurations) {
+        if (vc.Optimize) {
+          vc.CollectOptimizedParameterNames(parameterNames, prefix);
+        }
+      }
+    }
+
+    public double CalculateSimilarity(IOptimizable optimizable) {
+      var other = (IParameterConfiguration)optimizable;
+      if (this.ActualValueConfigurationIndex == other.ActualValueConfigurationIndex) {
+        return this.ValueConfigurations[this.ActualValueConfigurationIndex].CalculateSimilarity(other.ValueConfigurations[other.ActualValueConfigurationIndex]);
+      } else {
+        return 0.0;
+      }
+    }
+
+    /// <summary>
+    /// Ensures that the ActualValueConfigurationIndex has a valid value
+    /// Only indices of items which are checked are allowed
+    /// </summary>
+    private void KeepActualValueConfigurationIndexConsistent() {
+      if (this.valueConfigurations != null && this.valueConfigurations.CheckedItems.Count() > 0) {
+        if (this.valueConfigurations.Count <= this.actualValueConfigurationIndex &&
+           this.valueConfigurations.CheckedItems.Count(x => x.Index == this.actualValueConfigurationIndex) == 1) {
+          // everything is ok; do nothing
+        } else {
+          // current index is invalid, set new one
+          this.ActualValueConfigurationIndex = this.valueConfigurations.CheckedItems.First().Index;
+        }
+      } else {
+        // no checked valueConfiguration is available; cannot be used
+        this.ActualValueConfigurationIndex = -1;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/SingleValuedParameterConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/SingleValuedParameterConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/SingleValuedParameterConfiguration.cs	(revision 15740)
@@ -0,0 +1,82 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class SingleValuedParameterConfiguration : ParameterConfiguration {
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SingleValuedParameterConfiguration(bool deserializing) : base(deserializing) { }
+    public SingleValuedParameterConfiguration(string parameterName, IValueParameter valueParameter)
+      : base(parameterName, valueParameter, false) {
+      this.Optimize = true;
+      base.PopulateValueConfigurations();
+      this.ValueConfigurations.Single().Optimize = true;
+    }
+    public SingleValuedParameterConfiguration(string parameterName, IValueConfiguration valueConfiguration)
+      : base() {
+      this.ParameterName = parameterName;
+      this.parameterDataType = valueConfiguration.ActualValue.ValueDataType;
+      this.valueDataType = valueConfiguration.ActualValue.ValueDataType;
+      this.discoverValidValues = false;
+      this.validValues = new ItemSet<IItem> { valueConfiguration.ActualValue.Value };
+      this.validTypes = new Type[] { valueConfiguration.ActualValue.ValueDataType };
+      this.isNullable = false;
+      this.itemImage = valueConfiguration.ItemImage;
+      this.ValueConfigurations = new CheckedValueConfigurationList { valueConfiguration };
+      this.ValueConfigurations.Single().Optimize = true;
+      valueConfiguration.ToStringChanged += new EventHandler(valueConfiguration_ToStringChanged);
+      this.ActualValue = new ConstrainedValue(
+        valueConfiguration.ActualValue.Value,
+        valueConfiguration.ActualValue.ValueDataType,
+        this.validValues,
+        this.IsNullable);
+    }
+    protected SingleValuedParameterConfiguration(SingleValuedParameterConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleValuedParameterConfiguration(this, cloner);
+    }
+    #endregion
+
+    protected override void PopulateValueConfigurations() {
+      // don't change valueconfigurations, since it only contains the one element specified in constructor
+    }
+
+    protected override void ClearValueConfigurations() {
+      // do nothing
+    }
+
+    public override string ToString() {
+      if (this.valueConfigurations.Single() is SymbolValueConfiguration) {
+        var syVc = (SymbolValueConfiguration)this.valueConfigurations.Single();
+        if (this.Optimize) {
+          return syVc.ToString() + " (Optimize)";
+        } else {
+          return ActualValue.ToString();
+        }
+      } else {
+        return base.ToString();
+      }
+    }
+
+    protected virtual void valueConfiguration_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    public override string ParameterInfoString {
+      get {
+        if (this.Optimize) {
+          return string.Format("{0} ({1})", this.Name, this.ValueConfigurations.Single().ParameterInfoString);
+        } else {
+          return string.Empty;
+        }
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/ConstrainedValue.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/ConstrainedValue.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/ConstrainedValue.cs	(revision 15740)
@@ -0,0 +1,107 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class ConstrainedValue : Item {
+    [Storable]
+    protected Type valueDataType;
+    public Type ValueDataType {
+      get { return this.valueDataType; }
+      protected set { this.valueDataType = value; }
+    }
+
+    [Storable]
+    protected IItem value;
+    public IItem Value {
+      get { return value; }
+      set {
+        if (this.value != value) {
+          if(this.value != null) DeregisterEvents();
+          this.value = value;
+          if(this.value != null) RegisterEvents();
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected IItemSet<IItem> validValues;
+    public IItemSet<IItem> ValidValues {
+      get { return validValues; }
+      protected set {
+        if (this.validValues != value) {
+          this.validValues = value;
+        }
+      }
+    }
+
+    [Storable]
+    protected bool isNullable;
+    public bool IsNullable {
+      get { return isNullable; }
+      protected set {
+        if (this.isNullable != value) {
+          this.isNullable = value;
+        }
+      }
+    }
+
+    private void RegisterEvents() {
+      this.value.ToStringChanged += new EventHandler(value_ToStringChanged);
+      if (this.value is Symbol) {
+        ((Symbol)this.value).Changed += new EventHandler(ConstrainedValue_Changed);
+      }
+    }
+
+    private void DeregisterEvents() {
+      this.value.ToStringChanged -= new EventHandler(value_ToStringChanged);
+      if (this.value is Symbol) {
+        ((Symbol)this.value).Changed -= new EventHandler(ConstrainedValue_Changed);
+      }
+    }
+
+    #region constructors and cloning
+    public ConstrainedValue() { }
+    [StorableConstructor]
+    protected ConstrainedValue(bool deserializing) : base(deserializing) { }
+    public ConstrainedValue(IItem value, Type valueDataType, IItemSet<IItem> validValues, bool isNullable) {
+      this.Value = value;
+      this.ValueDataType = valueDataType;
+      this.ValidValues = validValues;
+      this.isNullable = isNullable;
+    }
+    protected ConstrainedValue(ConstrainedValue original, Cloner cloner) : base(original, cloner) {
+      this.valueDataType = original.valueDataType;
+      this.Value = cloner.Clone(original.value);
+      if(original.ValidValues != null) this.ValidValues = cloner.Clone(original.ValidValues);
+      this.isNullable = original.isNullable;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedValue(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (this.value != null) RegisterEvents();
+    }
+    #endregion
+
+    private void value_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    private void ConstrainedValue_Changed(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    public override string ToString() {
+      if (this.value is Symbol) {
+        return string.Format("{0}: {1}", this.value, ((Symbol)this.value).InitialFrequency);
+      }
+      return value != null ? value.ToString() : base.ToString();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs	(revision 15740)
@@ -0,0 +1,63 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class DoubleValueRange : Range<DoubleValue> {
+
+    public override DoubleValue LowerBound {
+      get {
+        return base.LowerBound;
+      }
+      set {
+        base.LowerBound = value;
+      }
+    }
+
+    public DoubleValueRange(DoubleValue lowerBound, DoubleValue upperBound, DoubleValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    [StorableConstructor]
+    protected DoubleValueRange(bool deserializing) : base(deserializing) { }
+    protected DoubleValueRange(DoubleValueRange original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DoubleValueRange(this, cloner);
+    }
+
+    protected override DoubleValue GetRandomSample(IRandom random) {
+      double val;
+      do {
+        val = Math.Round((random.NextDouble() * (UpperBound.Value - LowerBound.Value) + LowerBound.Value) / StepSize.Value, 0) * StepSize.Value;
+      } while (!IsInRange(val));
+      return new DoubleValue(val);
+    }
+
+    public double ApplyStepSize(double value) {
+      return (Math.Round(value / this.StepSize.Value, 0)) * this.StepSize.Value;
+    }
+
+    public bool IsInRange(double value) {
+      return value <= this.UpperBound.Value && value >= this.LowerBound.Value;
+    }
+
+    public override IEnumerable<DoubleValue> GetCombinations() {
+      var solutions = new List<DoubleValue>();
+      double value = LowerBound.Value;
+
+      while (value <= UpperBound.Value) {
+        solutions.Add(new DoubleValue(value));
+        value += StepSize.Value;
+        value = ApplyStepSize(value);
+      }
+      return solutions;
+    }
+
+    protected override double CalculateSimilarityValue(DoubleValue a, DoubleValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs	(revision 15740)
@@ -0,0 +1,53 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class IntValueRange : Range<IntValue> {
+
+    public IntValueRange(IntValue lowerBound, IntValue upperBound, IntValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    [StorableConstructor]
+    protected IntValueRange(bool deserializing) : base(deserializing) { }
+    protected IntValueRange(IntValueRange original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntValueRange(this, cloner);
+    }
+
+    protected override IntValue GetRandomSample(IRandom random) {
+      int val;
+      do {
+        val = random.Next(LowerBound.Value / StepSize.Value, UpperBound.Value / StepSize.Value + 1) * StepSize.Value;
+      } while (!IsInRange(val));
+      return new IntValue(val);
+    }
+
+    public int ApplyStepSize(int value) {
+      return ((int)Math.Round(value / (double)this.StepSize.Value, 0)) * this.StepSize.Value;
+    }
+
+    public bool IsInRange(int value) {
+      return value <= this.UpperBound.Value && value >= this.LowerBound.Value;
+    }
+
+    public override IEnumerable<IntValue> GetCombinations() {
+      var solutions = new List<IntValue>();
+      int value = this.LowerBound.Value;
+
+      while (value <= this.UpperBound.Value) {
+        solutions.Add(new IntValue(value));
+        value += this.StepSize.Value;
+      }
+      return solutions;
+    }
+
+    protected override double CalculateSimilarityValue(IntValue a, IntValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs	(revision 15740)
@@ -0,0 +1,58 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class PercentValueRange : Range<PercentValue> {
+
+    public PercentValueRange(PercentValue lowerBound, PercentValue upperBound, PercentValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    [StorableConstructor]
+    protected PercentValueRange(bool deserializing) : base(deserializing) { }
+    protected PercentValueRange(PercentValueRange original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PercentValueRange(this, cloner);
+    }
+
+    protected override PercentValue GetRandomSample(IRandom random) {
+      double val;
+      do {
+        val = Math.Round((random.NextDouble() * (UpperBound.Value - LowerBound.Value) + LowerBound.Value) / StepSize.Value, 0) * StepSize.Value;
+      } while (!IsInRange(val));
+      return new PercentValue(val);
+    }
+
+    public DoubleValueRange AsDoubleValueRange() {
+      return new DoubleValueRange(LowerBound, UpperBound, StepSize);
+    }
+
+    public double ApplyStepSize(double value) {
+      return ((int)Math.Round(value / this.StepSize.Value, 0)) * this.StepSize.Value;
+    }
+
+    public bool IsInRange(double value) {
+      return value <= this.UpperBound.Value && value >= this.LowerBound.Value;
+    }
+
+    public override IEnumerable<PercentValue> GetCombinations() {
+      var solutions = new List<PercentValue>();
+      double value = LowerBound.Value;
+
+      while (value <= UpperBound.Value) {
+        solutions.Add(new PercentValue(value));
+        value += StepSize.Value;
+        value = ApplyStepSize(value);
+      }
+      return solutions;
+    }
+
+    protected override double CalculateSimilarityValue(PercentValue a, PercentValue b) {
+      double range = UpperBound.Value - LowerBound.Value;
+      double diff = Math.Abs(a.Value - b.Value);
+      return Math.Max(0, (range - (diff * 2)) / range);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs	(revision 15740)
@@ -0,0 +1,226 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public abstract class Range<T> : Item, IRange<T> where T : class, IItem, IStringConvertibleValue, IDeepCloneable {
+    [Storable]
+    private T lowerBound;
+    public virtual T LowerBound {
+      get { return lowerBound; }
+      set {
+        if (lowerBound != value) {
+          if (lowerBound != null) {
+            lowerBound.ValueChanged -= new EventHandler(lowerBound_ToStringChanged);
+          }
+          lowerBound = value;
+          if (lowerBound != null) {
+            lowerBound.ValueChanged += new EventHandler(lowerBound_ToStringChanged);
+          }
+          OnLowerBoundChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T upperBound;
+    public virtual T UpperBound {
+      get { return upperBound; }
+      set {
+        if (upperBound != value) {
+          if (upperBound != null) {
+            upperBound.ValueChanged -= new EventHandler(upperBound_ToStringChanged);
+          }
+          upperBound = value;
+          if (upperBound != null) {
+            upperBound.ValueChanged += new EventHandler(upperBound_ToStringChanged);
+          }
+          OnUpperBoundChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T stepSize;
+    public virtual T StepSize {
+      get { return stepSize; }
+      set {
+        if (stepSize != value) {
+          if (stepSize != null) {
+            stepSize.ValueChanged -= new EventHandler(stepSize_ToStringChanged);
+          }
+          stepSize = value;
+          if (stepSize != null) {
+            stepSize.ValueChanged += new EventHandler(stepSize_ToStringChanged);
+          }
+          OnStepSizeChanged();
+        }
+      }
+    }
+
+    #region IRange Members
+    object IRange.LowerBound {
+      get { return lowerBound; }
+      set { lowerBound = (T)value; }
+    }
+    object IRange.UpperBound {
+      get { return upperBound; }
+      set { upperBound = (T)value; }
+    }
+    object IRange.StepSize {
+      get { return stepSize; }
+      set { stepSize = (T)value; }
+    }
+    #endregion
+
+    #region Constructors and Cloning
+    public Range(T lowerBound, T upperBound, T stepSize) {
+      this.LowerBound = lowerBound;
+      this.UpperBound = upperBound;
+      this.StepSize = stepSize;
+    }
+
+    [StorableConstructor]
+    protected Range(bool deserializing) : base(deserializing) { }
+    protected Range(Range<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.LowerBound = cloner.Clone(original.LowerBound);
+      this.UpperBound = cloner.Clone(original.UpperBound);
+      this.StepSize = cloner.Clone(original.StepSize);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (lowerBound != null) {
+        lowerBound.ValueChanged += new EventHandler(lowerBound_ToStringChanged);
+      }
+      if (upperBound != null) {
+        upperBound.ValueChanged += new EventHandler(upperBound_ToStringChanged);
+      }
+      if (stepSize != null) {
+        stepSize.ValueChanged += new EventHandler(stepSize_ToStringChanged);
+      }
+    }
+    #endregion
+
+    #region Events
+    private void lowerBound_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    private void upperBound_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    private void stepSize_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+
+    #region Eventhandler
+    public event EventHandler LowerBoundChanged;
+    private void OnLowerBoundChanged() {
+      var handler = LowerBoundChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler UpperBoundChanged;
+    private void OnUpperBoundChanged() {
+      var handler = UpperBoundChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler StepSizeChanged;
+    private void OnStepSizeChanged() {
+      var handler = StepSizeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler ValueChanged;
+    private void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public override string ToString() {
+      return string.Format("{0},{1}:{2}", LowerBound.ToString(), UpperBound.ToString(), StepSize.ToString());
+    }
+
+    #region IStringConvertibleValue Members
+
+    public string GetValue() {
+      return this.ToString();
+    }
+    public bool ReadOnly {
+      get { return false; }
+    }
+    public bool SetValue(string value) {
+      var parts1 = value.Split(':');
+      if (parts1.Length != 2) return false;
+      var parts2 = parts1[0].Split(',');
+      if (parts2.Length != 2) return false;
+
+      return
+        lowerBound.SetValue(parts2[0]) &&
+        upperBound.SetValue(parts2[1]) &&
+        stepSize.SetValue(parts1[1]);
+    }
+    public bool Validate(string value, out string errorMessage) {
+      // TODO: check that upper is larger than lower and that stepsize < upper-lower
+      T lower = (T)lowerBound.Clone();
+      T upper = (T)upperBound.Clone();
+      T step = (T)stepSize.Clone();
+
+      var parts1 = value.Split(':');
+      if (parts1.Length != 2) {
+        errorMessage = "Could not parse range."; return false;
+      }
+      var parts2 = parts1[0].Split(',');
+      if (parts2.Length != 2) {
+        errorMessage = "Could not parse range."; return false;
+      }
+
+      if (lowerBound.SetValue(parts2[0]) &&
+          upperBound.SetValue(parts2[1]) &&
+          stepSize.SetValue(parts1[1])) {
+        errorMessage = string.Empty; return true;
+      } else {
+        errorMessage = "Could not parse range."; return false;
+      }
+    }
+
+    #endregion
+
+    public T GetRandomValue(IRandom random) {
+      // by a chance return the extreme values of this range to intensify search in those regions
+      if (random.NextDouble() < 0.1) {
+        if (random.NextDouble() < 0.5) {
+          return (T)LowerBound.Clone();
+        } else {
+          return (T)UpperBound.Clone();
+        }
+      }
+
+      // otherwise sample a random value from the range
+      return GetRandomSample(random);
+    }
+
+    protected abstract T GetRandomSample(IRandom random);
+
+    IItem IRange.GetRandomValue(IRandom random) {
+      return GetRandomValue(random);
+    }
+
+    public abstract IEnumerable<T> GetCombinations();
+    IEnumerable<IItem> IRange.GetCombinations() {
+      return GetCombinations().Cast<IItem>().ToArray();
+    }
+
+    public virtual double CalculateSimilarity(IItem a, IItem b) {
+      return CalculateSimilarityValue((T)a, (T)b);
+    }
+
+    protected abstract double CalculateSimilarityValue(T a, T b);
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicExpressionGrammar/SymbolValueConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicExpressionGrammar/SymbolValueConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicExpressionGrammar/SymbolValueConfiguration.cs	(revision 15740)
@@ -0,0 +1,139 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class SymbolValueConfiguration : ParameterizedValueConfiguration {
+    [Storable]
+    private IOptimizable parentOptimizable;
+    public IOptimizable ParentOptimizable {
+      get { return parentOptimizable; }
+      set { this.parentOptimizable = value; }
+    }
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SymbolValueConfiguration(bool deserializing) : base(deserializing) { }
+    public SymbolValueConfiguration(Symbol symbol)
+      : base() {
+      this.IsOptimizable = true;
+      this.Optimize = false;
+      this.Name = symbol.Name;
+      this.ActualValue = new ConstrainedValue(symbol, symbol.GetType(), new ItemSet<IItem> { symbol }, false);
+    }
+    protected SymbolValueConfiguration(SymbolValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterInitialFrequencyEvents();
+      this.parentOptimizable = cloner.Clone(original.parentOptimizable);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolValueConfiguration(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterInitialFrequencyEvents();
+    }
+    #endregion
+
+    protected override void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      this.ClearParameterConfigurations();
+      var symbol = (Symbol)item;
+
+      var initialFrequencyValueConfigurations = new List<IValueConfiguration>();
+      initialFrequencyValueConfigurations.Add(new RangeValueConfiguration(new DoubleValue(0), typeof(DoubleValue)));
+      initialFrequencyValueConfigurations.Add(new RangeValueConfiguration(new DoubleValue(1), typeof(DoubleValue)));
+      var initialFrequencyParameterConfiguration = new ParameterConfiguration("InitialFrequency", typeof(Symbol), new DoubleValue(symbol.InitialFrequency), initialFrequencyValueConfigurations);
+      this.parameterConfigurations.Add(initialFrequencyParameterConfiguration);
+      RegisterInitialFrequencyEvents();
+
+      var constant = symbol as Constant;
+      if (constant != null) {
+        var minValueParameterConfiguration = new ParameterConfiguration("MinValue", typeof(DoubleValue), new DoubleValue(constant.MinValue));
+        var maxValueParameterConfiguration = new ParameterConfiguration("MaxValue", typeof(DoubleValue), new DoubleValue(constant.MaxValue));
+        var manipulatorMuParameterConfiguration = new ParameterConfiguration("ManipulatorMu", typeof(DoubleValue), new DoubleValue(constant.ManipulatorMu));
+        var manipulatorSigmaParameterConfiguration = new ParameterConfiguration("ManipulatorSigma", typeof(DoubleValue), new DoubleValue(constant.ManipulatorSigma));
+        var multiplicativeManipulatorSigmaParameterConfiguration = new ParameterConfiguration("MultiplicativeManipulatorSigma", typeof(DoubleValue), new DoubleValue(constant.MultiplicativeManipulatorSigma));
+
+        this.parameterConfigurations.Add(minValueParameterConfiguration);
+        this.parameterConfigurations.Add(maxValueParameterConfiguration);
+        this.parameterConfigurations.Add(manipulatorMuParameterConfiguration);
+        this.parameterConfigurations.Add(manipulatorSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(multiplicativeManipulatorSigmaParameterConfiguration);
+      }
+
+      var variable = symbol as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
+      if (variable != null) {
+        var weightMuParameterConfiguration = new ParameterConfiguration("WeightMu", typeof(DoubleValue), new DoubleValue(variable.WeightMu));
+        var weightSigmaParameterConfiguration = new ParameterConfiguration("WeightSigma", typeof(DoubleValue), new DoubleValue(variable.WeightSigma));
+        var weightManipulatorMuParameterConfiguration = new ParameterConfiguration("WeightManipulatorMu", typeof(DoubleValue), new DoubleValue(variable.WeightManipulatorMu));
+        var weightManipulatorSigmaParameterConfiguration = new ParameterConfiguration("WeightManipulatorSigma", typeof(DoubleValue), new DoubleValue(variable.WeightManipulatorSigma));
+        var multiplicativeWeightManipulatorSigmaParameterConfiguration = new ParameterConfiguration("MultiplicativeWeightManipulatorSigma", typeof(DoubleValue), new DoubleValue(variable.MultiplicativeWeightManipulatorSigma));
+
+        this.parameterConfigurations.Add(weightMuParameterConfiguration);
+        this.parameterConfigurations.Add(weightSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(weightManipulatorMuParameterConfiguration);
+        this.parameterConfigurations.Add(weightManipulatorSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(multiplicativeWeightManipulatorSigmaParameterConfiguration);
+      }
+    }
+
+    public virtual void Parameterize(Symbol symbol) {
+      var actualValueSymbol = this.ActualValue.Value as Symbol;
+      symbol.InitialFrequency = parentOptimizable.Optimize ? GetDoubleValue("InitialFrequency") : actualValueSymbol.InitialFrequency;
+
+      var constant = symbol as Constant;
+      if (constant != null) {
+        var actualValueConstant = this.ActualValue.Value as Constant;
+        constant.MinValue = parentOptimizable.Optimize ? GetDoubleValue("MinValue") : actualValueConstant.MinValue;
+        constant.MaxValue = parentOptimizable.Optimize ? GetDoubleValue("MaxValue") : actualValueConstant.MaxValue;
+        constant.ManipulatorMu = parentOptimizable.Optimize ? GetDoubleValue("ManipulatorMu") : actualValueConstant.ManipulatorMu;
+        constant.ManipulatorSigma = parentOptimizable.Optimize ? GetDoubleValue("ManipulatorSigma") : actualValueConstant.ManipulatorSigma;
+        constant.MultiplicativeManipulatorSigma = parentOptimizable.Optimize ? GetDoubleValue("MultiplicativeManipulatorSigma") : actualValueConstant.MultiplicativeManipulatorSigma;
+      }
+
+      var variable = symbol as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
+      if (variable != null) {
+        var actualValueVariable = this.ActualValue.Value as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
+        variable.WeightMu = parentOptimizable.Optimize ? GetDoubleValue("WeightMu") : actualValueVariable.WeightMu;
+        variable.WeightSigma = parentOptimizable.Optimize ? GetDoubleValue("WeightSigma") : actualValueVariable.WeightSigma;
+        variable.WeightManipulatorMu = parentOptimizable.Optimize ? GetDoubleValue("WeightManipulatorMu") : actualValueVariable.WeightManipulatorMu;
+        variable.WeightManipulatorSigma = parentOptimizable.Optimize ? GetDoubleValue("WeightManipulatorSigma") : actualValueVariable.WeightManipulatorSigma;
+        variable.MultiplicativeWeightManipulatorSigma = parentOptimizable.Optimize ? GetDoubleValue("MultiplicativeWeightManipulatorSigma") : actualValueVariable.MultiplicativeWeightManipulatorSigma;
+      }
+    }
+
+    private double GetDoubleValue(string name) {
+      return ((DoubleValue)ParameterConfigurations.Single(x => x.Name == name).ActualValue.Value).Value;
+    }
+
+    private void RegisterInitialFrequencyEvents() {
+      this.parameterConfigurations.Single(x => x.Name == "InitialFrequency").ToStringChanged += new EventHandler(initialFrequencyParameterConfiguration_ToStringChanged);
+    }
+    private void DeregisterInitialFrequencyEvents() {
+      this.parameterConfigurations.Single(x => x.Name == "InitialFrequency").ToStringChanged -= new EventHandler(initialFrequencyParameterConfiguration_ToStringChanged);
+    }
+
+    protected virtual void initialFrequencyParameterConfiguration_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    public override string ToString() {
+      return string.Format("{0}: {1}", this.Name, parameterConfigurations.Single(pc => pc.Name == "InitialFrequency").ActualValue.Value);
+    }
+
+    public override void Mutate(IRandom random, MutateDelegate mutate, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) {
+      base.Mutate(random, mutate, intValueManipulator, doubleValueManipulator);
+    }
+
+    public override void Cross(IRandom random, IOptimizable other, CrossDelegate cross, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover) {
+      base.Cross(random, other, cross, intValueCrossover, doubleValueCrossover);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs	(revision 15740)
@@ -0,0 +1,58 @@
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class SymbolicExpressionGrammarValueConfiguration : ParameterizedValueConfiguration {
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SymbolicExpressionGrammarValueConfiguration(bool deserializing) : base(deserializing) { }
+    public SymbolicExpressionGrammarValueConfiguration(ISymbolicExpressionGrammar grammar) {
+      this.IsOptimizable = true;
+      this.ActualValue = new ConstrainedValue(grammar, grammar.GetType(), new ItemSet<IItem> { grammar }, false);
+      this.Name = grammar.ItemName;
+    }
+    protected SymbolicExpressionGrammarValueConfiguration(SymbolicExpressionGrammarValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionGrammarValueConfiguration(this, cloner);
+    }
+    #endregion
+
+    protected override void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      var grammar = (ISymbolicExpressionGrammar)item;
+      foreach (Symbol symbol in grammar.Symbols) {
+        var svc = new SymbolValueConfiguration(symbol);
+        var pc = new SingleValuedParameterConfiguration(symbol.Name, svc);
+        svc.ParentOptimizable = pc;
+        SetOptimizeIfOnlyOneValueConfiguration(pc);
+        this.parameterConfigurations.Add(pc);
+      }
+    }
+
+    public virtual void Parameterize(ISymbolicExpressionGrammar grammar) {
+      foreach (Symbol symbol in grammar.Symbols) {
+        var symbolValueConfiguration = (SymbolValueConfiguration)this.parameterConfigurations.Single(pc => pc.Name == symbol.Name).ValueConfigurations.First();
+        symbolValueConfiguration.Parameterize(symbol);
+      }
+    }
+
+    /// <summary>
+    /// If only 1 parameter exists (usually this is InitialFrequency), then set it to Optimize=true,
+    /// because this is what the user usually wants to do. avoids additional click.
+    /// </summary>
+    private static void SetOptimizeIfOnlyOneValueConfiguration(SingleValuedParameterConfiguration pc) {
+      var vc = pc.ValueConfigurations[0] as ParameterizedValueConfiguration;
+      if (vc != null) {
+        if (vc.ParameterConfigurations.Count == 1) {
+          vc.ParameterConfigurations.Single().Optimize = true;
+        }
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/CheckedValueConfigurationCollection.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 15740)
@@ -0,0 +1,90 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  // todo: check that at least 1 elements needs to be selected
+  // todo: control creatable item types
+  [StorableClass]
+  public class CheckedValueConfigurationList : CheckedItemList<IValueConfiguration>, ICheckedValueConfigurationList {
+    [Storable]
+    private int minItemCount = 1;
+    public int MinItemCount {
+      get { return minItemCount; }
+    }
+
+    [Storable]
+    protected IItemSet<IItem> validValues;
+    public IItemSet<IItem> ValidValues {
+      get { return validValues; }
+    }
+
+    public CheckedValueConfigurationList(IItemSet<IItem> validValues) {
+      this.validValues = validValues;
+      RegisterEvents();
+    }
+    public CheckedValueConfigurationList(IEnumerable<IValueConfiguration> collection)
+      : base(collection) {
+      validValues = null;
+      // event wiring not needed
+    }
+    public CheckedValueConfigurationList() {
+      RegisterEvents();
+    }
+    [StorableConstructor]
+    protected CheckedValueConfigurationList(bool deserializing)
+      : base(deserializing) {
+      RegisterEvents();
+    }
+    protected CheckedValueConfigurationList(CheckedValueConfigurationList original, Cloner cloner)
+      : base(original, cloner) {
+      this.minItemCount = original.MinItemCount;
+      this.validValues = cloner.Clone(original.validValues);
+      RegisterEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CheckedValueConfigurationList(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      this.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsAdded);
+      this.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsRemoved);
+    }
+
+    private void DeregisterEvents() {
+      this.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsRemoved);
+      this.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsAdded);
+    }
+
+    private void CheckedValueConfigurationList_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      foreach (var item in e.Items) {
+        var matchingItems = this.Where(x => x != item.Value && x.ActualValue.ValueDataType == item.Value.ActualValue.ValueDataType);
+        if (matchingItems.Count() > 0) {
+          int maxNumber = matchingItems.Select(x => x.Number).Max();
+          item.Value.Number = maxNumber + 1;
+        }
+      }
+    }
+
+    private void CheckedValueConfigurationList_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+      // auch collectionreset gehört berücksichtigt
+      // funktioniert so nicht ganz, weil die view das hinzufügen nicht mitkriegt
+      //if (this.Count < minItemCount) {
+      //  foreach (var item in e.Items) {
+      //    if (this.Count >= minItemCount)
+      //      break;
+      //    this.Add(item);
+      //  }
+      //}
+    }
+
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/NullValueConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/NullValueConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/NullValueConfiguration.cs	(revision 15740)
@@ -0,0 +1,48 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NullValueConfiguration : ValueConfiguration {
+    public NullValueConfiguration()
+      : base() {
+      ActualValue = new ConstrainedValue(null, null, null, true);
+      IsOptimizable = false;
+      Name = "NullValueConfiguration";
+    }
+    [StorableConstructor]
+    protected NullValueConfiguration(bool deserializing) : base(deserializing) { }
+    protected NullValueConfiguration(NullValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NullValueConfiguration(this, cloner);
+    }
+
+    public override string ToString() {
+      return "null";
+    }
+
+    public override void Randomize(IRandom random) { }
+
+    public override void Mutate(IRandom random, MutateDelegate mutate, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) { }
+
+    public override void Cross(IRandom random, IOptimizable other, CrossDelegate cross, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover) { }
+
+    public override double CalculateSimilarity(IOptimizable optimizable) {
+      return 1.0;
+    }
+
+    public override string ParameterInfoString {
+      get { return "null"; }
+    }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) { }
+
+    public override List<IOptimizable> GetAllOptimizables() {
+      return new List<IOptimizable>();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ParameterizedValueConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 15740)
@@ -0,0 +1,189 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class ParameterizedValueConfiguration : ValueConfiguration {
+    [Storable]
+    protected IItemCollection<IParameterConfiguration> parameterConfigurations = new ItemCollection<IParameterConfiguration>();
+    public virtual IItemCollection<IParameterConfiguration> ParameterConfigurations {
+      get { return new ReadOnlyItemCollection<IParameterConfiguration>(this.parameterConfigurations); }
+      protected set { this.parameterConfigurations = value; }
+    }
+
+    public override bool Optimize {
+      get { return base.Optimize; }
+      set {
+        if (this.optimize != value) {
+          base.Optimize = value;
+          if (optimize) {
+            ClearParameterConfigurations();
+            PopulateParameterConfigurations(this.actualValue.Value, this.discoverValidValues);
+          } else {
+            ClearParameterConfigurations();
+          }
+        }
+      }
+    }
+
+    public override ConstrainedValue ActualValue {
+      get { return base.ActualValue; }
+      set {
+        ClearParameterConfigurations();
+        base.ActualValue = value;
+        if (this.Optimize && this.actualValue.Value != null) PopulateParameterConfigurations(this.actualValue.Value, this.discoverValidValues);
+      }
+    }
+
+    [Storable]
+    protected bool discoverValidValues;
+    public bool DiscoverValidValues {
+      get { return discoverValidValues; }
+      set { discoverValidValues = value; }
+    }
+
+    public override bool ValuesReadOnly {
+      set {
+        if (value != this.valuesReadOnly) {
+          this.valuesReadOnly = value;
+          foreach (var pc in this.parameterConfigurations) {
+            pc.ValuesReadOnly = value;
+          }
+        }
+      }
+    }
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected ParameterizedValueConfiguration(bool deserializing) : base(deserializing) { }
+    protected ParameterizedValueConfiguration()
+      : base() {
+      this.ParameterConfigurations = new ItemList<IParameterConfiguration>();
+    }
+    public ParameterizedValueConfiguration(IItem value, Type valueDataType, bool discoverValidValues)
+      : base(value, valueDataType) {
+      this.discoverValidValues = discoverValidValues;
+    }
+    protected ParameterizedValueConfiguration(ParameterizedValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.discoverValidValues = original.discoverValidValues;
+      this.ParameterConfigurations = cloner.Clone(original.parameterConfigurations);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterizedValueConfiguration(this, cloner);
+    }
+    #endregion
+
+    protected virtual void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      var parameterizedItem = item as IParameterizedItem;
+      if (parameterizedItem != null) {
+        foreach (var childParameter in parameterizedItem.Parameters) {
+          IValueParameter valueParameter = childParameter as IValueParameter;
+          if (valueParameter != null) {
+            var pc = new ParameterConfiguration(valueParameter.Name, valueParameter, discoverValidValues);
+            this.parameterConfigurations.Add(pc);
+          }
+        }
+      }
+    }
+
+    protected virtual void ClearParameterConfigurations() {
+      parameterConfigurations.Clear();
+    }
+
+    public override string ParameterInfoString {
+      get {
+        StringBuilder sb = new StringBuilder();
+        if ((this.Optimize) && this.ParameterConfigurations.Count > 0) {
+          var parameterInfos = new List<string>();
+          foreach (var pc in this.ParameterConfigurations) {
+            if (pc.Optimize) parameterInfos.Add(pc.ParameterInfoString);
+          }
+          sb.Append(string.Join(", ", parameterInfos.ToArray()));
+        }
+        return sb.ToString();
+      }
+    }
+
+    public override string ToString() {
+      if (ActualValue != null && ActualValue.Value != null) {
+        if (Optimize) {
+          return string.Format("{0} (Optimize)", NumberedName);
+        } else {
+          return string.Format("{0}", NumberedName);
+        }
+      } else {
+        return base.ToString();
+      }
+    }
+
+    public override List<IOptimizable> GetAllOptimizables() {
+      var list = new List<IOptimizable>();
+      foreach (var pc in ParameterConfigurations) {
+        if (pc.Optimize) {
+          if (pc.ValueConfigurations.CheckedItems.Count() > 1) list.Add(pc); // only add if there are more than 1 choices. otherwise it makes no sense to optimize which VC is selected
+          list.AddRange(pc.GetAllOptimizables());
+        }
+      }
+      return list;
+    }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) {
+      foreach (var pc in ParameterConfigurations) {
+        if (pc.Optimize) {
+          parameterNames.Add(prefix + pc.ParameterName);
+          pc.CollectOptimizedParameterNames(parameterNames, prefix + pc.ParameterName + ".");
+        }
+      }
+    }
+
+    public virtual IEnumerable<string> GetOptimizedParameterNames() {
+      var list = new List<string>();
+      this.CollectOptimizedParameterNames(list, string.Empty);
+      return list;
+    }
+
+    public virtual void Parameterize(IParameterizedItem item) {
+      foreach (IParameterConfiguration pc in this.ParameterConfigurations) {
+        pc.Parameterize((IValueParameter)item.Parameters[pc.ParameterName]);
+      }
+    }
+
+    public override void Randomize(IRandom random) {
+      foreach (IParameterConfiguration pc in this.ParameterConfigurations) {
+        pc.Randomize(random);
+      }
+    }
+
+    public override void Mutate(IRandom random, MutateDelegate mutate, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) {
+      foreach (IParameterConfiguration pc in this.ParameterConfigurations) {
+        pc.Mutate(random, mutate, intValueManipulator, doubleValueManipulator);
+      }
+    }
+
+    public override void Cross(IRandom random, IOptimizable other, CrossDelegate cross, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover) {
+      var otherVc = (ParameterizedValueConfiguration)other;
+      for (int i = 0; i < this.ParameterConfigurations.Count; i++) {
+        this.ParameterConfigurations.ElementAt(i).Cross(random, otherVc.ParameterConfigurations.ElementAt(i), cross, intValueCrossover, doubleValueCrossover);
+      }
+    }
+
+    public override double CalculateSimilarity(IOptimizable optimizable) {
+      var other = (ParameterizedValueConfiguration)optimizable;
+      double sum = 0;
+      int count = 0;
+      for (int i = 0; i < ParameterConfigurations.Count; i++) {
+        if (this.ParameterConfigurations.ElementAt(i).Optimize) {
+          sum += this.ParameterConfigurations.ElementAt(i).CalculateSimilarity(other.ParameterConfigurations.ElementAt(i));
+          count++;
+        }
+      }
+      return count == 0 ? 1.0 : sum / (double)count;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/RangeValueConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/RangeValueConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/RangeValueConfiguration.cs	(revision 15740)
@@ -0,0 +1,108 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class RangeValueConfiguration : ValueConfiguration {
+    [Storable]
+    protected IRange rangeConstraint;
+    public IRange RangeConstraint {
+      get { return rangeConstraint; }
+      private set {
+        if (rangeConstraint != value) {
+          DeregisterRangeConstraintEvents();
+          rangeConstraint = value;
+          RegisterRangeConstraintEvents();
+        }
+      }
+    }
+
+    #region Constructor and Cloning
+    [StorableConstructor]
+    protected RangeValueConfiguration(bool deserializing) : base(deserializing) { }
+    protected RangeValueConfiguration(RangeValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.rangeConstraint = cloner.Clone(original.RangeConstraint);
+      RegisterRangeConstraintEvents();
+    }
+    public RangeValueConfiguration(IItem value, Type valueDataType)
+      : base(value, valueDataType) {
+      this.Name = value.ItemName;
+      if (actualValue.ValueDataType == typeof(IntValue)) {
+        RangeConstraint = new IntValueRange(new IntValue(0), (IntValue)value.Clone(), new IntValue(1));
+      } else if (actualValue.ValueDataType == typeof(DoubleValue)) {
+        RangeConstraint = new DoubleValueRange(new DoubleValue(0), (DoubleValue)value.Clone(), new DoubleValue(0.01));
+      } else if (actualValue.ValueDataType == typeof(PercentValue)) {
+        RangeConstraint = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(0.01));
+      } else if (actualValue.ValueDataType == typeof(BoolValue)) {
+        this.IsOptimizable = false; // there is nothing to configure for bools
+      } else {
+        RangeConstraint = null;
+      }
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RangeValueConfiguration(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterRangeConstraintEvents();
+    }
+    #endregion
+
+    private void RegisterRangeConstraintEvents() {
+      if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged += new EventHandler(RangeConstraint_ToStringChanged);
+    }
+    private void DeregisterRangeConstraintEvents() {
+      if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged -= new EventHandler(RangeConstraint_ToStringChanged);
+    }
+
+    public override string ToString() {
+      if (ActualValue != null && ActualValue.Value != null) {
+        if (Optimize) {
+          return string.Format("{0} (Optimize: {1})", NumberedName, RangeConstraint);
+        } else {
+          return string.Format("{0}: {1}", NumberedName, ActualValue.Value);
+        }
+      } else {
+        return base.ToString();
+      }
+    }
+
+    public override void Randomize(IRandom random) {
+      this.actualValue.Value = rangeConstraint.GetRandomValue(random);
+    }
+
+    public override void Mutate(IRandom random, MutateDelegate mutate, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) {
+      mutate(random, this, intValueManipulator, doubleValueManipulator);
+    }
+
+    public override void Cross(IRandom random, IOptimizable other, CrossDelegate cross, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover) {
+      cross(random, this, other, intValueCrossover, doubleValueCrossover);
+    }
+
+    public override double CalculateSimilarity(IOptimizable optimizable) {
+      var other = (IValueConfiguration)optimizable;
+      return this.RangeConstraint.CalculateSimilarity(this.ActualValue.Value, other.ActualValue.Value);
+    }
+
+    public override string ParameterInfoString {
+      get { return string.Empty; }
+    }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) { }
+
+    public override List<IOptimizable> GetAllOptimizables() {
+      return new List<IOptimizable>();
+    }
+
+    #region Events
+    private void RangeConstraint_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 15740)
@@ -0,0 +1,164 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  // TODO: ItemName/Descr, storability
+  [StorableClass]
+  public abstract class ValueConfiguration : NamedItem, IValueConfiguration {
+    [Storable]
+    protected bool isOptimizable;
+    public virtual bool IsOptimizable {
+      get { return isOptimizable; }
+      set {
+        if (this.isOptimizable != value) {
+          this.isOptimizable = value;
+          OnIsOptimizableChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool optimize;
+    public virtual bool Optimize {
+      get { return optimize; }
+      set {
+        if (optimize != value) {
+          if (value == true && !this.IsOptimizable)
+            throw new NotSupportedException("This value is not optimizable.");
+
+          optimize = value;
+          OnOptimizeChanged();
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected ConstrainedValue actualValue;
+    public virtual ConstrainedValue ActualValue {
+      get { return actualValue; }
+      set {
+        if (this.actualValue != value) {
+          DeregisterActualValueEvents();
+          this.actualValue = value;
+          OnValueChanged();
+          OnToStringChanged();
+          RegisterActualValueEvents();
+        }
+      }
+    }
+
+    [Storable]
+    protected int number = 0;
+    public int Number {
+      get { return number; }
+      set {
+        if (value != number) {
+          number = value;
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool valuesReadOnly = false;
+    public virtual bool ValuesReadOnly {
+      get { return valuesReadOnly; }
+      set {
+        if (value != this.valuesReadOnly) {
+          this.valuesReadOnly = value;
+        }
+      }
+    }
+
+    #region Constructors and Cloning
+    protected ValueConfiguration(IItem value, Type valueDataType) {
+      this.ActualValue = new ConstrainedValue(value, valueDataType, new ItemSet<IItem> { value }, false);
+      this.IsOptimizable = true;
+      this.Name = value == null ? "ValueConfiguration" : value.ItemName;
+    }
+
+    protected ValueConfiguration() { }
+    [StorableConstructor]
+    protected ValueConfiguration(bool deserializing) { }
+    protected ValueConfiguration(ValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.actualValue = cloner.Clone(original.ActualValue);
+      this.isOptimizable = original.isOptimizable;
+      this.optimize = original.optimize;
+      this.number = original.number;
+      this.valuesReadOnly = original.valuesReadOnly;
+      RegisterActualValueEvents();
+    }
+    #endregion
+
+    private void RegisterActualValueEvents() {
+      if (this.actualValue != null) this.actualValue.ToStringChanged += new EventHandler(actualValue_ToStringChanged);
+    }
+    private void DeregisterActualValueEvents() {
+      if (this.actualValue != null) this.actualValue.ToStringChanged -= new EventHandler(actualValue_ToStringChanged);
+    }
+
+    #region Events
+    private void actualValue_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+
+    #region IItem Members
+    public override string ItemDescription {
+      get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemDescription : base.ItemDescription; }
+    }
+
+    public override Image ItemImage {
+      get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemImage : base.ItemImage; }
+    }
+
+    public override string ItemName {
+      get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemDescription : base.ItemName; }
+    }
+    #endregion
+
+    #region Event Handlers
+    public virtual event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public virtual event EventHandler IsOptimizableChanged;
+    private void OnIsOptimizableChanged() {
+      var handler = IsOptimizableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public virtual event EventHandler OptimizeChanged;
+    protected virtual void OnOptimizeChanged() {
+      var handler = OptimizeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public string NumberedName {
+      get {
+        if (this.number == 0) {
+          return (ActualValue != null && ActualValue.Value != null) ? ActualValue.Value.ItemName : base.ToString();
+        } else {
+          return string.Format("{0} {1}", ActualValue.Value.ItemName, number);
+        }
+      }
+    }
+
+    public abstract void Randomize(IRandom random);
+    public abstract void Mutate(IRandom random, MutateDelegate mutate, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator);
+    public abstract void Cross(IRandom random, IOptimizable other, CrossDelegate cross, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover);
+    public abstract double CalculateSimilarity(IOptimizable optimizable);
+    public abstract string ParameterInfoString { get; }
+    public abstract void CollectOptimizedParameterNames(List<string> parameterNames, string prefix);
+    public abstract List<IOptimizable> GetAllOptimizables();
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs	(revision 15740)
@@ -0,0 +1,75 @@
+﻿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;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [Item("AlgorithmEvaluator", "")]
+  [StorableClass]
+  public class AlgorithmEvaluator : SingleSuccessorOperator {
+
+    #region Parameter properties
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<IAlgorithm> AlgorithmParameter {
+      get { return (LookupParameter<IAlgorithm>)Parameters["Algorithm"]; }
+    }
+    public ILookupParameter<IntValue> ProblemIndexParameter {
+      get { return (LookupParameter<IntValue>)Parameters["ProblemIndex"]; }
+    }
+    public ILookupParameter<IntValue> RepetitionIndexParameter {
+      get { return (LookupParameter<IntValue>)Parameters["RepetitionIndex"]; }
+    }
+    public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    //public IValueParameter<IItemList<IRun>> RunsParameter {
+    //  get { return (IValueParameter<IItemList<IRun>>)Parameters["Runs"]; }
+    //}
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected AlgorithmEvaluator(bool deserializing) : base(deserializing) { }
+    public AlgorithmEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used to initialize the new random permutation."));
+      Parameters.Add(new LookupParameter<IAlgorithm>("Algorithm", ""));
+      Parameters.Add(new LookupParameter<IntValue>("ProblemIndex", ""));
+      Parameters.Add(new LookupParameter<IntValue>("RepetitionIndex", ""));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", ""));
+    }
+    protected AlgorithmEvaluator(AlgorithmEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmEvaluator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      bool isValidScope = RepetitionIndexParameter.ActualValue != null; // this is a workaround for OSGA, where the PMOEvaluator is executed on scopes which happen to contain additional subscopes which collide with the subscopes created for the repetitions/problems in PMOEvaluator
+      if (!isValidScope) return base.Apply();
+
+      ItemDictionary<StringValue, RunCollection> solutionCache =
+        ResultsParameter.ActualValue.ContainsKey("SolutionCache") ?
+        (ItemDictionary<StringValue, RunCollection>)ResultsParameter.ActualValue["SolutionCache"].Value :
+        null;
+      ParameterConfigurationTree parameterConfiguration = ParameterConfigurationParameter.ActualValue;
+      IAlgorithm algorithm = AlgorithmParameter.ActualValue;
+      int repetitionIndex = RepetitionIndexParameter.ActualValue.Value;
+
+      if (solutionCache != null && solutionCache.Count(x => x.Key.Value == parameterConfiguration.ParameterInfoString) > 0) {
+        algorithm.Runs.Add(solutionCache.Single(x => x.Key.Value == parameterConfiguration.ParameterInfoString).Value.ElementAt(repetitionIndex));
+      } else {
+        algorithm.StartSync(CancellationToken);
+      }
+      return base.Apply();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs	(revision 15740)
@@ -0,0 +1,257 @@
+﻿using System;
+using System.Collections.Generic;
+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;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [Item("AlgorithmRunsAnalyzer", "")]
+  [StorableClass]
+  public class AlgorithmRunsAnalyzer : SingleSuccessorOperator {
+
+    #region Parameter properties
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public LookupParameter<IntValue> GenerationsParameter {
+      get { return (LookupParameter<IntValue>)Parameters["Generations"]; }
+    }
+    public LookupParameter<IntValue> RepetitionsParameter {
+      get { return (LookupParameter<IntValue>)Parameters[MetaOptimizationProblem.RepetitionsParameterName]; }
+    }
+    public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public ILookupParameter<IItemList<IProblem>> ProblemsParameter {
+      get { return (ILookupParameter<IItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public LookupParameter<DoubleArray> ReferenceQualityAveragesParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceQualityAverages"]; }
+    }
+    public LookupParameter<DoubleArray> ReferenceQualityDeviationsParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceQualityDeviations"]; }
+    }
+    public LookupParameter<DoubleArray> ReferenceEvaluatedSolutionAveragesParameter {
+      get { return (LookupParameter<DoubleArray>)Parameters["ReferenceEvaluatedSolutionAverages"]; }
+    }
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public ScopeTreeLookupParameter<IAlgorithm> AlgorithmParameter {
+      get { return (ScopeTreeLookupParameter<IAlgorithm>)Parameters["Algorithm"]; }
+    }
+    public ScopeTreeLookupParameter<IntValue> ProblemIndexParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["ProblemIndex"]; }
+    }
+    public ScopeTreeLookupParameter<IntValue> RepetitionIndexParameter {
+      get { return (ScopeTreeLookupParameter<IntValue>)Parameters["RepetitionIndex"]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public LookupParameter<DoubleValue> QualityWeightParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters[MetaOptimizationProblem.QualityWeightParameterName]; }
+    }
+    public LookupParameter<DoubleValue> StandardDeviationWeightParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters[MetaOptimizationProblem.StandardDeviationWeightParameterName]; }
+    }
+    public LookupParameter<DoubleValue> EvaluatedSolutionsWeightParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters[MetaOptimizationProblem.EvaluatedSolutionsWeightParameterName]; }
+    }
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+    public LookupParameter<StringValue> QualityMeasureNameParameter {
+      get { return (LookupParameter<StringValue>)Parameters[MetaOptimizationProblem.QualityMeasureNameName]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected AlgorithmRunsAnalyzer(bool deserializing) : base(deserializing) { }
+    public AlgorithmRunsAnalyzer()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used to initialize the new random permutation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the ParameterVector."));
+      Parameters.Add(new LookupParameter<IntValue>("Generations", ""));
+      Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new LookupParameter<IItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceQualityAverages", ""));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceQualityDeviations", ""));
+      Parameters.Add(new LookupParameter<DoubleArray>("ReferenceEvaluatedSolutionAverages", ""));
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<IAlgorithm>("Algorithm", "The finished algorithms containing Runs."));
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("ProblemIndex", "The index of the problem an algorithm was executed with."));
+      Parameters.Add(new ScopeTreeLookupParameter<IntValue>("RepetitionIndex", "The index of the repetition"));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
+      Parameters.Add(new LookupParameter<DoubleValue>(MetaOptimizationProblem.QualityWeightParameterName));
+      Parameters.Add(new LookupParameter<DoubleValue>(MetaOptimizationProblem.StandardDeviationWeightParameterName));
+      Parameters.Add(new LookupParameter<DoubleValue>(MetaOptimizationProblem.EvaluatedSolutionsWeightParameterName));
+      Parameters.Add(new LookupParameter<StringValue>(MetaOptimizationProblem.QualityMeasureNameName));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose sub-scopes represent the parents."));
+    }
+    protected AlgorithmRunsAnalyzer(AlgorithmRunsAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmRunsAnalyzer(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (!Parameters.ContainsKey("CurrentScope")) Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose sub-scopes represent the parents.")); // backwards compatibility
+      if (!Parameters.ContainsKey(MetaOptimizationProblem.QualityMeasureNameName)) Parameters.Add(new LookupParameter<StringValue>(MetaOptimizationProblem.QualityMeasureNameName)); // backwards compatibility
+    }
+
+    public override IOperation Apply() {
+      ParameterConfigurationTree parameterConfiguration = ParameterConfigurationParameter.ActualValue;
+      ItemArray<IAlgorithm> algorithms = AlgorithmParameter.ActualValue;
+      ItemArray<IntValue> problemIndices = ProblemIndexParameter.ActualValue;
+      ItemArray<IntValue> repetitionIndices = RepetitionIndexParameter.ActualValue;
+      IEnumerable<string> parameterNames = parameterConfiguration.GetOptimizedParameterNames();
+      IItemList<IProblem> problems = ProblemsParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      int repetitions = RepetitionsParameter.ActualValue.Value;
+      double qualityWeight = QualityWeightParameter.ActualValue.Value;
+      double standardDeviationWeight = StandardDeviationWeightParameter.ActualValue.Value;
+      double evaluatedSolutionsWeight = EvaluatedSolutionsWeightParameter.ActualValue.Value;
+      string qualityMeasureName = QualityMeasureNameParameter.ActualValue.Value;
+      var resultNames = new List<string> { qualityMeasureName, "Execution Time", "EvaluatedSolutions" };
+      int currentGeneration = GenerationsParameter.ActualValue != null ? GenerationsParameter.ActualValue.Value : 0;
+      double[] referenceQualityAverages;
+      double[] referenceQualityDeviations;
+      double[] referenceEvaluatedSolutionAverages;
+      GetReferenceValues(problems.Count, out referenceQualityAverages, out referenceQualityDeviations, out referenceEvaluatedSolutionAverages);
+
+      ResultCollection results = ResultsParameter.ActualValue;
+
+      if (algorithms.All(x => x.Runs.Count == 1)) {
+        var runs = new RunCollection();
+        var qualities = new double[problems.Count][];
+        var executionTimes = new TimeSpan[problems.Count][];
+        var evaluatedSolutions = new int[problems.Count][];
+
+        for (int i = 0; i < problems.Count; i++) {
+          qualities[i] = new double[repetitions];
+          evaluatedSolutions[i] = new int[repetitions];
+          executionTimes[i] = new TimeSpan[repetitions];
+        }
+
+        for (int i = 0; i < algorithms.Length; i++) {
+          int problemIndex = problemIndices[i].Value;
+          int repetitionIndex = repetitionIndices[i].Value;
+
+          IRun run = (IRun)algorithms[i].Runs.Single().Clone();
+          MetaOptimizationUtil.ClearResults(run, resultNames);
+          MetaOptimizationUtil.ClearParameters(run, parameterNames);
+          run.Results.Add("Meta-FromCache", new BoolValue(false));
+          run.Results.Add("Meta-Generation", new IntValue(currentGeneration));
+          run.Results.Add("Meta-ProblemIndex", new IntValue(problemIndex));
+          run.Name = string.Format("{0} Problem {1} Run {2}", parameterConfiguration.ParameterInfoString, problemIndex, repetitionIndex);
+
+          qualities[problemIndex][repetitionIndex] = GetResultValue<DoubleValue>(run.Results, qualityMeasureName).Value;
+          executionTimes[problemIndex][repetitionIndex] = (((TimeSpanValue)run.Results["Execution Time"]).Value);
+          if (run.Results.ContainsKey("EvaluatedSolutions")) {
+            evaluatedSolutions[problemIndex][repetitionIndex] = (((IntValue)run.Results["EvaluatedSolutions"]).Value);
+          } else {
+            evaluatedSolutions[problemIndex][repetitionIndex] = 1;
+          }
+          runs.Add(run);
+        }
+
+        parameterConfiguration.AverageExecutionTimes = new ItemList<TimeSpanValue>(executionTimes.Select(t => new TimeSpanValue(TimeSpan.FromMilliseconds(t.Average(ts => ts.TotalMilliseconds)))));
+        parameterConfiguration.AverageEvaluatedSolutions = new DoubleArray(evaluatedSolutions.Select(x => x.Average()).ToArray());
+        parameterConfiguration.Repetitions = new IntValue(repetitions);
+        parameterConfiguration.AverageQualities = new DoubleArray(qualities.Select(q => q.Average()).ToArray());
+
+        if (maximization)
+          parameterConfiguration.BestQualities = new DoubleArray(qualities.Select(q => q.Max()).ToArray());
+        else
+          parameterConfiguration.BestQualities = new DoubleArray(qualities.Select(q => q.Min()).ToArray());
+
+        if (maximization)
+          parameterConfiguration.WorstQualities = new DoubleArray(qualities.Select(q => q.Min()).ToArray());
+        else
+          parameterConfiguration.WorstQualities = new DoubleArray(qualities.Select(q => q.Max()).ToArray());
+
+        parameterConfiguration.QualityVariances = new DoubleArray(qualities.Select(q => q.Variance()).ToArray());
+        parameterConfiguration.QualityStandardDeviations = new DoubleArray(qualities.Select(q => q.StandardDeviation()).ToArray());
+        parameterConfiguration.Runs = runs;
+
+        this.QualityParameter.ActualValue = new DoubleValue(MetaOptimizationUtil.Normalize(parameterConfiguration, referenceQualityAverages, referenceQualityDeviations, referenceEvaluatedSolutionAverages, qualityWeight, standardDeviationWeight, evaluatedSolutionsWeight, maximization));
+      } else {
+        // something terrible happened -> most probably due to invalid parameters.
+        // penalty with worst quality from latest generation!
+        double penaltyValue;
+        if (maximization)
+          penaltyValue = results.ContainsKey("CurrentWorstQuality") ? ((DoubleValue)results["CurrentWorstQuality"].Value).Value : referenceQualityAverages.Min();
+        else
+          penaltyValue = results.ContainsKey("CurrentWorstQuality") ? ((DoubleValue)results["CurrentWorstQuality"].Value).Value : referenceQualityAverages.Max();
+
+        this.QualityParameter.ActualValue = new DoubleValue(penaltyValue);
+        parameterConfiguration.Quality = new DoubleValue(penaltyValue);
+
+        parameterConfiguration.AverageExecutionTimes = new ItemList<TimeSpanValue>(Enumerable.Repeat(new TimeSpanValue(TimeSpan.Zero), problems.Count));
+        parameterConfiguration.AverageEvaluatedSolutions = new DoubleArray(Enumerable.Repeat(0.0, problems.Count).ToArray());
+        parameterConfiguration.Repetitions = new IntValue(repetitions);
+        parameterConfiguration.AverageQualities = new DoubleArray(Enumerable.Repeat(0.0, problems.Count).ToArray());
+        parameterConfiguration.BestQualities = new DoubleArray(Enumerable.Repeat(0.0, problems.Count).ToArray());
+        parameterConfiguration.WorstQualities = new DoubleArray(Enumerable.Repeat(0.0, problems.Count).ToArray());
+        parameterConfiguration.QualityVariances = new DoubleArray(Enumerable.Repeat(0.0, problems.Count).ToArray());
+        parameterConfiguration.QualityStandardDeviations = new DoubleArray(Enumerable.Repeat(0.0, problems.Count).ToArray());
+        parameterConfiguration.Runs = null;
+      }
+
+      // in OSGA there are more subscopes, so be careful which to delete
+      CurrentScope.SubScopes.RemoveAll(x => x.Variables.Count((v) => (v.Name == "RepetitionCount")) == 1);
+
+      return base.Apply();
+    }
+
+    private T1 GetResultValue<T1>(IDictionary<string, IItem> results, string resultName) {
+      return (T1)results[resultName];
+
+      //string separator = ".";
+      //string[] tokens = resultName.Split(separator.ToCharArray());
+
+      //IDictionary<string, IItem> currentResults = results;
+      //IItem currentResult = null;
+      //for (int i = 0; i < tokens.Length; i++) {
+      //  if(currentResults == null)
+      //    throw new KeyNotFoundException("Result value " + resultName + " was not found");
+      //  if (currentResults.ContainsKey(tokens[i])) {
+      //    currentResult = currentResults[tokens[i]];
+      //    currentResults = currentResult as IDictionary<string, IItem>;
+      //  } else {
+      //    throw new KeyNotFoundException("Result value " + resultName + " was not found");
+      //  }
+      //}
+      //return (T1)currentResult;
+    }
+
+    private void GetReferenceValues(int problemsCount, out double[] referenceQualityAverages, out double[] referenceQualityDeviations, out double[] referenceEvaluatedSolutionAverages) {
+      if (ReferenceQualityAveragesParameter.ActualValue == null) {
+        // this is generation zero. no reference qualities for normalization have been calculated yet. in this special case the ReferenceQualityAnalyzer will do the normalization
+        referenceQualityAverages = new double[problemsCount];
+        referenceQualityDeviations = new double[problemsCount];
+        referenceEvaluatedSolutionAverages = new double[problemsCount];
+        for (int i = 0; i < referenceQualityAverages.Length; i++) {
+          referenceQualityAverages[i] = 1;
+          referenceQualityDeviations[i] = 1;
+          referenceEvaluatedSolutionAverages[i] = 1;
+        }
+      } else {
+        referenceQualityAverages = ReferenceQualityAveragesParameter.ActualValue.ToArray();
+        referenceQualityDeviations = ReferenceQualityDeviationsParameter.ActualValue.ToArray();
+        referenceEvaluatedSolutionAverages = ReferenceEvaluatedSolutionAveragesParameter.ActualValue.ToArray();
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs	(revision 15740)
@@ -0,0 +1,71 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [Item("AlgorithmSubScopesCreator", "An operator which ...")]
+  [StorableClass]
+  public class AlgorithmSubScopesCreator : SingleSuccessorOperator {
+    #region Parameter properties
+    public ILookupParameter<TypeValue> AlgorithmTypeParameter {
+      get { return (ILookupParameter<TypeValue>)Parameters[MetaOptimizationProblem.AlgorithmTypeParameterName]; }
+    }
+    public ILookupParameter<IItemList<IProblem>> ProblemsParameter {
+      get { return (ILookupParameter<IItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public LookupParameter<IntValue> RepetitionsParameter {
+      get { return (LookupParameter<IntValue>)Parameters[MetaOptimizationProblem.RepetitionsParameterName]; }
+    }
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected AlgorithmSubScopesCreator(bool deserializing) : base(deserializing) { }
+    public AlgorithmSubScopesCreator()
+      : base() {
+      Parameters.Add(new LookupParameter<TypeValue>(MetaOptimizationProblem.AlgorithmTypeParameterName, ""));
+      Parameters.Add(new LookupParameter<IItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose sub-scopes represent the parents."));
+    }
+    protected AlgorithmSubScopesCreator(AlgorithmSubScopesCreator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmSubScopesCreator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ParameterConfigurationTree parameterConfiguration = ParameterConfigurationParameter.ActualValue;
+      IItemList<IProblem> problems = ProblemsParameter.ActualValue;
+      int repetitions = RepetitionsParameter.ActualValue.Value;
+      Type algorithmType = AlgorithmTypeParameter.ActualValue.Value;
+
+      for (int i = 0; i < repetitions; i++) {
+        for (int j = 0; j < problems.Count; j++) {
+          IScope child = new Scope(string.Format("Problem {0}, Repetition {1}", j, i));
+          var algorithm = MetaOptimizationUtil.CreateParameterizedAlgorithmInstance(parameterConfiguration, algorithmType, (IProblem)problems[j].Clone());
+          child.Variables.Add(new Variable("Algorithm", algorithm));
+          child.Variables.Add(new Variable("ProblemIndex", new IntValue(j)));
+          child.Variables.Add(new Variable("RepetitionIndex", new IntValue(i)));
+          CurrentScope.SubScopes.Add(child);
+        }
+      }
+      return base.Apply();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/PMOEvaluator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/PMOEvaluator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/PMOEvaluator.cs	(revision 15740)
@@ -0,0 +1,89 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [Item("PMOEvaluator", "An operator which represents the main loop of a genetic algorithm.")]
+  [StorableClass]
+  public class PMOEvaluator : AlgorithmOperator, IParameterConfigurationEvaluator {
+
+    #region Parameter properties
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<TypeValue> AlgorithmTypeParameter {
+      get { return (ILookupParameter<TypeValue>)Parameters[MetaOptimizationProblem.AlgorithmTypeParameterName]; }
+    }
+    public ILookupParameter<IItemList<IProblem>> ProblemsParameter {
+      get { return (ILookupParameter<IItemList<IProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public LookupParameter<IntValue> RepetitionsParameter {
+      get { return (LookupParameter<IntValue>)Parameters[MetaOptimizationProblem.RepetitionsParameterName]; }
+    }
+    public LookupParameter<IntValue> GenerationsParameter {
+      get { return (LookupParameter<IntValue>)Parameters["Generations"]; }
+    }
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    private ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+    public IScope CurrentScope {
+      get { return CurrentScopeParameter.ActualValue; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected PMOEvaluator(bool deserializing) : base(deserializing) { }
+    public PMOEvaluator() {
+      Initialize();
+    }
+    protected PMOEvaluator(PMOEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PMOEvaluator(this, cloner);
+    }
+
+    private void Initialize() {
+      #region Create parameters
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used to initialize the new random permutation."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the ParameterVector."));
+      Parameters.Add(new LookupParameter<TypeValue>(MetaOptimizationProblem.AlgorithmTypeParameterName, ""));
+      Parameters.Add(new LookupParameter<IItemList<IProblem>>(MetaOptimizationProblem.ProblemsParameterName, ""));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
+      Parameters.Add(new LookupParameter<IntValue>("Generations", ""));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope which represents a population of solutions on which the genetic algorithm should be applied."));
+      #endregion
+      
+      var algorithmSubScopesCreator = new AlgorithmSubScopesCreator();
+      var uniformSubScopesProcessor = new UniformSubScopesProcessor();
+      var algorithmEvaluator = new AlgorithmEvaluator();
+      var algorithmRunsAnalyzer = new AlgorithmRunsAnalyzer();
+
+      uniformSubScopesProcessor.Parallel.Value = true;
+      
+      this.OperatorGraph.InitialOperator = algorithmSubScopesCreator;
+      algorithmSubScopesCreator.Successor = uniformSubScopesProcessor;
+      uniformSubScopesProcessor.Operator = algorithmEvaluator;
+      uniformSubScopesProcessor.Successor = algorithmRunsAnalyzer;
+      algorithmRunsAnalyzer.Successor = null;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      ///// only for debug reasons - remove later (set this in stored algs)
+      ((UniformSubScopesProcessor)((AlgorithmSubScopesCreator)this.OperatorGraph.InitialOperator).Successor).Parallel.Value = true;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 15740)
@@ -0,0 +1,284 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{ABBC1DF6-FCC6-4F86-AB75-B6B3A72E7D17}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.MetaOptimization</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.MetaOptimization-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Problems.MetaOptimization-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Problems.MetaOptimization-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Selection-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.SequentialEngine-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.SequentialEngine-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="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Analyzers\BestParameterConfigurationAnalyzer.cs" />
+    <Compile Include="Analyzers\PMOBestSolutionHistoryAnalyzer.cs" />
+    <Compile Include="Analyzers\PMOProblemQualitiesAnalyzer.cs" />
+    <Compile Include="Analyzers\PMOPopulationDiversityAnalyzer.cs" />
+    <Compile Include="ConstrainedTypeValue.cs" />
+    <Compile Include="Encoding\AlgorithmProblemItem.cs" />
+    <Compile Include="Encoding\ParameterConfigurations\SingleValuedParameterConfiguration.cs" />
+    <Compile Include="Encoding\SymbolicExpressionGrammar\SymbolValueConfiguration.cs" />
+    <Compile Include="Encoding\SymbolicExpressionGrammar\SymbolicExpressionGrammarValueConfiguration.cs" />
+    <Compile Include="Encoding\ValueConfigurations\RangeValueConfiguration.cs" />
+    <Compile Include="Encoding\ValueConfigurations\ParameterizedValueConfiguration.cs" />
+    <Compile Include="Evaluators\AlgorithmEvaluator.cs" />
+    <Compile Include="Evaluators\AlgorithmRunsAnalyzer.cs" />
+    <Compile Include="Evaluators\AlgorithmSubScopesCreator.cs" />
+    <Compile Include="Evaluators\PMOEvaluator.cs" />
+    <Compile Include="MetaOptimizationUtil.cs" />
+    <Compile Include="Operators\Crossovers\IntValue\MultiIntValueCrossover.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="TypeValue.cs" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Analyzers\SolutionCacheAnalyzer.cs" />
+    <Compile Include="Analyzers\ReferenceQualityAnalyzer.cs" />
+    <Compile Include="ConstrainedItemList.cs" />
+    <Compile Include="Encoding\Manipulators\ParameterConfigurationManipulator.cs" />
+    <Compile Include="Encoding\Manipulators\ParameterConfigurationOnePositionsManipulator.cs" />
+    <Compile Include="Encoding\NullValue.cs" />
+    <Compile Include="Encoding\ParameterCombinationsEnumerator.cs" />
+    <Compile Include="Encoding\RangeConstraints\PercentValueRange.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Encoding\ValueConfigurations\NullValueConfiguration.cs" />
+    <Compile Include="Encoding\RangeConstraints\ConstrainedValue.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Encoding\RangeConstraints\DoubleValueRange.cs" />
+    <Compile Include="Encoding\RangeConstraints\IntValueRange.cs" />
+    <Compile Include="Encoding\ParameterConfigurationTree.cs" />
+    <Compile Include="Encoding\ValueConfigurations\ValueConfiguration.cs" />
+    <Compile Include="Encoding\ValueConfigurations\CheckedValueConfigurationCollection.cs" />
+    <Compile Include="AlgorithmExecutor.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationCrossover.cs" />
+    <Compile Include="Interfaces\ICheckedValueConfigurationCollection.cs" />
+    <Compile Include="Operators\Crossovers\DoubleValue\AverageDoubleValueCrossover.cs" />
+    <Compile Include="Operators\Crossovers\IntValue\AverageIntValueCrossover.cs" />
+    <Compile Include="Operators\Crossovers\IntValue\NormalIntValueCrossover.cs" />
+    <Compile Include="Operators\Crossovers\DoubleValue\NormalDoubleValueCrossover.cs" />
+    <Compile Include="Operators\Crossovers\DoubleValue\DiscreteDoubleValueCrossover.cs" />
+    <Compile Include="Operators\Crossovers\IntValue\DiscreteIntValueCrossover.cs" />
+    <Compile Include="Operators\Interfaces\IDoubleValueCrossover.cs" />
+    <Compile Include="Operators\Interfaces\IDoubleValueManipulator.cs" />
+    <Compile Include="Operators\Interfaces\IIntValueManipulator.cs" />
+    <Compile Include="Interfaces\IOptimizable.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationCreator.cs" />
+    <Compile Include="Creators\RandomParameterConfigurationCreator.cs" />
+    <Compile Include="Encoding\Crossovers\ParameterConfigurationCrossover.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationOperator.cs" />
+    <Compile Include="Interfaces\IRange.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationEvaluator.cs" />
+    <Compile Include="Interfaces\IParameterConfiguration.cs" />
+    <Compile Include="Encoding\ParameterConfigurations\ParameterConfiguration.cs" />
+    <Compile Include="Interfaces\IValueConfiguration.cs" />
+    <Compile Include="Encoding\RangeConstraints\Range.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationManipulator.cs" />
+    <Compile Include="Encoding\Manipulators\ParameterConfigurationAllPositionsManipulator.cs" />
+    <Compile Include="Operators\Interfaces\IIntValueCrossover.cs" />
+    <Compile Include="Operators\Interfaces\IValueManipulator.cs" />
+    <Compile Include="Operators\Manipulators\IntValue\NormalIntValueManipulator.cs" />
+    <Compile Include="Operators\Manipulators\IntValue\UniformIntValueManipulator.cs" />
+    <Compile Include="Operators\Manipulators\DoubleValue\UniformDoubleValueManipulator.cs" />
+    <Compile Include="Operators\Manipulators\DoubleValue\NormalDoubleValueManipulator.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="MetaOptimizationProblem.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Operators\Crossovers\SymbolicExpressionGrammar\" />
+  </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>
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </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: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/ICheckedValueConfigurationCollection.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/ICheckedValueConfigurationCollection.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/ICheckedValueConfigurationCollection.cs	(revision 15740)
@@ -0,0 +1,12 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface ICheckedValueConfigurationList : ICheckedItemList<IValueConfiguration> {
+    int MinItemCount { get; }
+    IItemSet<IItem> ValidValues { get; }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 15740)
@@ -0,0 +1,34 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public delegate void MutateDelegate(IRandom random, IOptimizable configuartion, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator);
+  public delegate void CrossDelegate(IRandom random, IOptimizable configuartion, IOptimizable other, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover);
+
+  public interface IOptimizable : IItem {
+    bool IsOptimizable { get; }
+    bool Optimize { get; set; }
+    ConstrainedValue ActualValue { get; set; }
+    
+    void Randomize(IRandom random);
+    void Mutate(IRandom random, MutateDelegate mutate, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator);
+    void Cross(IRandom random, IOptimizable other, CrossDelegate cross, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover);
+    string ParameterInfoString { get; }
+    void CollectOptimizedParameterNames(List<string> parameterNames, string prefix);
+    double CalculateSimilarity(IOptimizable optimizable);
+
+    /// <summary>
+    /// Recursively gets all optimizables which have Optimize=true
+    /// </summary>
+    List<IOptimizable> GetAllOptimizables();
+
+    event EventHandler IsOptimizableChanged;
+    event EventHandler OptimizeChanged;
+
+    /// <summary>
+    /// indicates if the actualvalues are modifiable
+    /// </summary>
+    bool ValuesReadOnly { get; set; }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 15740)
@@ -0,0 +1,18 @@
+﻿using System;
+using HeuristicLab.Core;
+using System.Collections.Generic;
+using HeuristicLab.Data;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IParameterConfiguration : IOptimizable, INamedItem {
+    string ParameterName { get; set; }
+    Type ParameterDataType { get; }
+    ICheckedValueConfigurationList ValueConfigurations { get; }
+    Type[] ValidTypes { get; }
+    int ActualValueConfigurationIndex { get; set; }
+
+    void Parameterize(IValueParameter parameter);
+    void UpdateActualValueIndexToItem(IValueConfiguration vc);
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs	(revision 15740)
@@ -0,0 +1,6 @@
+﻿using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IParameterConfigurationCreator : ISolutionCreator, IParameterConfigurationOperator {
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCrossover.cs	(revision 15740)
@@ -0,0 +1,9 @@
+﻿using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IParameterConfigurationCrossover : ICrossover, IParameterConfigurationOperator {
+    ILookupParameter<ItemArray<ParameterConfigurationTree>> ParentsParameter { get; }
+    ILookupParameter<ParameterConfigurationTree> ChildParameter { get; }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs	(revision 15740)
@@ -0,0 +1,8 @@
+﻿using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An interface which represents an evaluation operator for Meta Optimization Problems.
+  /// </summary>
+  public interface IParameterConfigurationEvaluator : ISingleObjectiveEvaluator, IParameterConfigurationOperator { }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationManipulator.cs	(revision 15740)
@@ -0,0 +1,12 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IParameterConfigurationManipulator : IParameterConfigurationOperator, IManipulator {
+    IValueLookupParameter<ParameterConfigurationTree> ParameterConfigurationTreeParameter { get; }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs	(revision 15740)
@@ -0,0 +1,8 @@
+﻿using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An interface which represents an operator dealing with parameter sets.
+  /// </summary>
+  public interface IParameterConfigurationOperator : IOperator { }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 15740)
@@ -0,0 +1,31 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IRange : IItem, IStringConvertibleValue {
+    object LowerBound { get; set; }
+    object UpperBound { get; set; }
+    object StepSize { get; set; }
+
+    event EventHandler LowerBoundChanged;
+    event EventHandler UpperBoundChanged;
+    event EventHandler StepSizeChanged;
+
+    IItem GetRandomValue(IRandom random);
+
+    IEnumerable<IItem> GetCombinations();
+
+    double CalculateSimilarity(IItem a, IItem b);
+  }
+
+  public interface IRange<T> : IRange, IItem where T : class {
+    new T LowerBound { get; set; }
+    new T UpperBound { get; set; }
+    new T StepSize { get; set; }
+    new T GetRandomValue(IRandom random);
+    new IEnumerable<T> GetCombinations();
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs	(revision 15740)
@@ -0,0 +1,13 @@
+﻿using System;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IValueConfiguration : IOptimizable, IItem {
+    int Number { get; set; } // if larger than 0 it will be visible in the name. this can be used when multiple ValueConfiguration with the same name exist in a list
+    string NumberedName { get; }
+
+    event EventHandler ValueChanged;
+    
+    //void Parameterize(IParameterizedItem item);
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 15740)
@@ -0,0 +1,334 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.Collections;
+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.DataAnalysis;
+using HeuristicLab.Problems.TestFunctions;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [Item("Meta Optimization Problem", "Represents a Meta Optimization Problem.")]
+  [Creatable("Problems")]
+  [StorableClass]
+  public sealed class MetaOptimizationProblem : SingleObjectiveHeuristicOptimizationProblem<IParameterConfigurationEvaluator, IParameterConfigurationCreator>, IStorableContent {
+    public string Filename { get; set; }
+
+    public const string AlgorithmTypeParameterName = "AlgorithmType";
+    public const string ProblemTypeParameterName = "ProblemType";
+    public const string ProblemsParameterName = "Problems";
+    public const string ParameterConfigurationTreeParameterName = "ParameterConfiguration";
+    public const string RepetitionsParameterName = "Repetitions";
+    public const string QualityMeasureNameName = "QualityMeasureName";
+
+    public const string IntValueManipulatorParameterName = "IntValueManipulator";
+    public const string DoubleValueManipulatorParameterName = "DoubleValueManipulator";
+    public const string IntValueCrossoverParameterName = "IntValueCrossover";
+    public const string DoubleValueCrossoverParameterName = "DoubleValueCrossover";
+    public const string QualityWeightParameterName = "QualityWeight";
+    public const string StandardDeviationWeightParameterName = "StandardDeviationWeight";
+    public const string EvaluatedSolutionsWeightParameterName = "EvaluatedSolutionsWeight";
+
+
+    #region Parameter Properties
+    public IValueParameter<ConstrainedTypeValue<IAlgorithm>> AlgorithmTypeParameter {
+      get { return (ValueParameter<ConstrainedTypeValue<IAlgorithm>>)Parameters[AlgorithmTypeParameterName]; }
+    }
+    public IValueParameter<ConstrainedTypeValue<IProblem>> ProblemTypeParameter {
+      get { return (ValueParameter<ConstrainedTypeValue<IProblem>>)Parameters[ProblemTypeParameterName]; }
+    }
+    public IValueParameter<ConstrainedItemList<IProblem>> ProblemsParameter {
+      get { return (ValueParameter<ConstrainedItemList<IProblem>>)Parameters[ProblemsParameterName]; }
+    }
+    public IValueParameter<ParameterConfigurationTree> ParameterConfigurationTreeParameter {
+      get { return (OptionalValueParameter<ParameterConfigurationTree>)Parameters[ParameterConfigurationTreeParameterName]; }
+    }
+    public IValueParameter<IntValue> RepetitionsParameter {
+      get { return (ValueParameter<IntValue>)Parameters[RepetitionsParameterName]; }
+    }
+    public IConstrainedValueParameter<IIntValueManipulator> IntValueManipulatorParameter {
+      get { return (ConstrainedValueParameter<IIntValueManipulator>)Parameters[IntValueManipulatorParameterName]; }
+    }
+    public IConstrainedValueParameter<IDoubleValueManipulator> DoubleValueManipulatorParameter {
+      get { return (ConstrainedValueParameter<IDoubleValueManipulator>)Parameters[DoubleValueManipulatorParameterName]; }
+    }
+    public IValueParameter<StringValue> QualityMeasureNameParameter {
+      get { return (ValueParameter<StringValue>)Parameters[QualityMeasureNameName]; }
+    }
+    public IConstrainedValueParameter<IIntValueCrossover> IntValueCrossoverParameter {
+      get { return (ConstrainedValueParameter<IIntValueCrossover>)Parameters[IntValueCrossoverParameterName]; }
+    }
+    public IConstrainedValueParameter<IDoubleValueCrossover> DoubleValueCrossoverParameter {
+      get { return (ConstrainedValueParameter<IDoubleValueCrossover>)Parameters[DoubleValueCrossoverParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public IAlgorithm Algorithm {
+      get { return CreateAlgorithm(AlgorithmType.Value, Problems.FirstOrDefault()); }
+    }
+    public ConstrainedTypeValue<IAlgorithm> AlgorithmType {
+      get { return AlgorithmTypeParameter.Value; }
+      set { AlgorithmTypeParameter.Value = value; }
+    }
+    public ConstrainedTypeValue<IProblem> ProblemType {
+      get { return ProblemTypeParameter.Value; }
+      set { ProblemTypeParameter.Value = value; }
+    }
+    public ConstrainedItemList<IProblem> Problems {
+      get { return ProblemsParameter.Value; }
+      set { ProblemsParameter.Value = value; }
+    }
+    public ParameterConfigurationTree ParameterConfigurationTree {
+      get { return ParameterConfigurationTreeParameter.Value; }
+      set { ParameterConfigurationTreeParameter.Value = value; }
+    }
+    public IntValue Repetitions {
+      get { return RepetitionsParameter.Value; }
+      set { RepetitionsParameter.Value = value; }
+    }
+    private BestParameterConfigurationAnalyzer BestParameterConfigurationAnalyzer {
+      get { return Operators.OfType<BestParameterConfigurationAnalyzer>().FirstOrDefault(); }
+    }
+    private ReferenceQualityAnalyzer ReferenceQualityAnalyzer {
+      get { return Operators.OfType<ReferenceQualityAnalyzer>().FirstOrDefault(); }
+    }
+    private SolutionCacheAnalyzer RunsAnalyzer {
+      get { return Operators.OfType<SolutionCacheAnalyzer>().FirstOrDefault(); }
+    }
+    private PMOPopulationDiversityAnalyzer PMOPopulationDiversityAnalyzer {
+      get { return Operators.OfType<PMOPopulationDiversityAnalyzer>().FirstOrDefault(); }
+    }
+    private PMOProblemQualitiesAnalyzer PMOProblemQualitiesAnalyzer {
+      get { return Operators.OfType<PMOProblemQualitiesAnalyzer>().FirstOrDefault(); }
+    }
+    private PMOBestSolutionHistoryAnalyzer PMOBestSolutionHistoryAnalyzer {
+      get { return Operators.OfType<PMOBestSolutionHistoryAnalyzer>().FirstOrDefault(); }
+    }
+    #endregion
+
+    public MetaOptimizationProblem()
+      : base() {
+      Parameters.Add(new ValueParameter<ConstrainedTypeValue<IAlgorithm>>(AlgorithmTypeParameterName, "The algorithm which's parameters should be optimized.", new ConstrainedTypeValue<IAlgorithm>(typeof(GeneticAlgorithm))));
+      Parameters.Add(new ValueParameter<ConstrainedTypeValue<IProblem>>(ProblemTypeParameterName, "The problem type.", new ConstrainedTypeValue<IProblem>()));
+      Parameters.Add(new ValueParameter<ConstrainedItemList<IProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ConstrainedItemList<IProblem>()));
+      Parameters.Add(new OptionalValueParameter<ParameterConfigurationTree>(ParameterConfigurationTreeParameterName, "Tree of algorithm parameters that should be optimized.")); // needs to be optional, when last problem is removed from list, it must be set null
+      Parameters.Add(new ValueParameter<IntValue>(RepetitionsParameterName, "The number of evaluations for each problem.", new IntValue(3)));
+      Parameters.Add(new ValueParameter<StringValue>(QualityMeasureNameName, "The name of the quality result of the base-level algorithm. Subresults can be accessed by dot separator.", new StringValue("BestQuality")));
+
+      var validIntManipulators = new ItemSet<IIntValueManipulator>(ApplicationManager.Manager.GetInstances<IIntValueManipulator>());
+      var validDoubleManipulators = new ItemSet<IDoubleValueManipulator>(ApplicationManager.Manager.GetInstances<IDoubleValueManipulator>());
+      var validIntCrossovers = new ItemSet<IIntValueCrossover>(ApplicationManager.Manager.GetInstances<IIntValueCrossover>());
+      var validDoubleCrossovers = new ItemSet<IDoubleValueCrossover>(ApplicationManager.Manager.GetInstances<IDoubleValueCrossover>());
+      Parameters.Add(new ConstrainedValueParameter<IIntValueManipulator>(IntValueManipulatorParameterName, validIntManipulators, validIntManipulators.Where(x => x.GetType() == typeof(NormalIntValueManipulator)).SingleOrDefault()));
+      Parameters.Add(new ConstrainedValueParameter<IDoubleValueManipulator>(DoubleValueManipulatorParameterName, validDoubleManipulators, validDoubleManipulators.Where(x => x.GetType() == typeof(NormalDoubleValueManipulator)).SingleOrDefault()));
+      Parameters.Add(new ConstrainedValueParameter<IIntValueCrossover>(IntValueCrossoverParameterName, validIntCrossovers, validIntCrossovers.Where(x => x.GetType() == typeof(NormalIntValueCrossover)).SingleOrDefault()));
+      Parameters.Add(new ConstrainedValueParameter<IDoubleValueCrossover>(DoubleValueCrossoverParameterName, validDoubleCrossovers, validDoubleCrossovers.Where(x => x.GetType() == typeof(NormalDoubleValueCrossover)).SingleOrDefault()));
+
+      Parameters.Add(new ValueParameter<DoubleValue>(QualityWeightParameterName, new DoubleValue(1)));
+      Parameters.Add(new ValueParameter<DoubleValue>(StandardDeviationWeightParameterName, new DoubleValue(0.01)));
+      Parameters.Add(new ValueParameter<DoubleValue>(EvaluatedSolutionsWeightParameterName, new DoubleValue(0.0005)));
+
+      Maximization = new BoolValue(false);
+      SolutionCreator = new RandomParameterConfigurationCreator();
+      Evaluator = new PMOEvaluator();
+
+      InitializeOperators();
+      RegisterParameterEvents();
+      ParameterizeAnalyzer();
+      ParameterizeSolutionCreator();
+      ParameterizeEvaluator();
+      ParameterizeOperators();
+
+      AlgorithmTypeParameter_ValueChanged(this, EventArgs.Empty);
+    }
+
+    [StorableConstructor]
+    private MetaOptimizationProblem(bool deserializing) : base(deserializing) { }
+    private MetaOptimizationProblem(MetaOptimizationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      this.RegisterParameterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MetaOptimizationProblem(this, cloner);
+    }
+
+    #region Helpers
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      if (!Parameters.ContainsKey(QualityMeasureNameName)) Parameters.Add(new ValueParameter<StringValue>(QualityMeasureNameName, "The name of the quality result of the base-level algorithm. Subresults can be accessed by dot separator.", new StringValue("BestQuality"))); // backwards compatibility
+      RegisterParameterEvents();
+    }
+    private void RegisterParameterEvents() {
+      SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
+      EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      AlgorithmTypeParameter.ValueChanged += new EventHandler(AlgorithmTypeParameter_ValueChanged);
+      AlgorithmType.ValueChanged += new EventHandler(AlgorithmType_ValueChanged);
+      ProblemTypeParameter.ValueChanged += new EventHandler(ProblemTypeParameter_ValueChanged);
+      ProblemType.ValueChanged += new EventHandler(ProblemType_ValueChanged);
+      Problems.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<IProblem>>(Problems_ItemsAdded);
+      Problems.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<IProblem>>(Problems_ItemsRemoved);
+    }
+
+    private void InitializeOperators() {
+      Operators.AddRange(ApplicationManager.Manager.GetInstances<IParameterConfigurationOperator>().Cast<IOperator>());
+      Operators.Add(new ReferenceQualityAnalyzer());
+      Operators.Add(new BestParameterConfigurationAnalyzer());
+      Operators.Add(new SolutionCacheAnalyzer());
+      Operators.Add(new PMOPopulationDiversityAnalyzer());
+      Operators.Add(new PMOProblemQualitiesAnalyzer());
+      Operators.Add(new PMOBestSolutionHistoryAnalyzer());
+    }
+    private void ParameterizeSolutionCreator() {
+    }
+    private void ParameterizeEvaluator() {
+      ((PMOEvaluator)Evaluator).ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+    }
+    private void ParameterizeAnalyzer() {
+      if (BestParameterConfigurationAnalyzer != null) {
+        BestParameterConfigurationAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
+      if (ReferenceQualityAnalyzer != null) {
+        ReferenceQualityAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
+      if (RunsAnalyzer != null) {
+        RunsAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
+      if (PMOPopulationDiversityAnalyzer != null) {
+        PMOPopulationDiversityAnalyzer.SolutionParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+        PMOPopulationDiversityAnalyzer.StoreHistoryParameter.Value.Value = true;
+      }
+      if (PMOProblemQualitiesAnalyzer != null) {
+        PMOProblemQualitiesAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
+      if (PMOBestSolutionHistoryAnalyzer != null) {
+        PMOBestSolutionHistoryAnalyzer.ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
+    }
+    private void ParameterizeOperators() {
+      foreach (IParameterConfigurationCrossover op in Operators.OfType<IParameterConfigurationCrossover>()) {
+        op.ParentsParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+        op.ChildParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
+      foreach (IParameterConfigurationManipulator op in Operators.OfType<IParameterConfigurationManipulator>()) {
+        op.ParameterConfigurationTreeParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      }
+    }
+
+    #endregion
+
+    #region Events
+
+    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
+      ParameterizeSolutionCreator();
+      ParameterizeEvaluator();
+      ParameterizeAnalyzer();
+      ParameterizeOperators();
+      OnSolutionCreatorChanged();
+    }
+    private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      ParameterizeEvaluator();
+      ParameterizeAnalyzer();
+      OnEvaluatorChanged();
+    }
+    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeAnalyzer();
+    }
+    private void AlgorithmTypeParameter_ValueChanged(object sender, EventArgs e) {
+      AlgorithmType_ValueChanged(sender, e);
+    }
+
+    private void AlgorithmType_ValueChanged(object sender, EventArgs e) {
+      IAlgorithm instance = (IAlgorithm)Activator.CreateInstance(AlgorithmType.Value);
+      this.ProblemType.ValidTypes = ApplicationManager.Manager.GetTypes(instance.ProblemType, true).ToList();
+      var newProblemType = this.ProblemType.ValidTypes.SingleOrDefault(t => t == typeof(SingleObjectiveTestFunctionProblem)) ?? this.ProblemType.ValidTypes.Where(t => t != typeof(MetaOptimizationProblem)).FirstOrDefault();
+      if (this.ProblemType.Value != newProblemType)
+        this.ProblemType.Value = newProblemType; // ProblemType_ValueChanged will add one problem and create ParameterConfigurationTree
+      else
+        ProblemType_ValueChanged(this, EventArgs.Empty); // call explicitly
+    }
+
+    private void ProblemTypeParameter_ValueChanged(object sender, EventArgs e) {
+      ProblemType_ValueChanged(sender, e);
+    }
+
+    private void ProblemType_ValueChanged(object sender, EventArgs e) {
+      Problems.Clear();
+      Problems.Type = ProblemType.Value;
+      Problems.Add((IProblem)Activator.CreateInstance(this.ProblemType.Value));
+    }
+
+    private void Problems_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IProblem>> e) {
+      // the first problem in the list is always the instance for the algorithm - this way some basic wiring between problem and algorithm can be sustained
+      if (e.Items.Single().Index == 0) {
+        ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, e.Items.Single().Value), e.Items.Single().Value);
+
+        // special for DataAnalysisProblem: Because of wiring between algorithm and problem, ParameterConfigurationTree needs to be recreated on Reset event
+        var dap = e.Items.Single().Value as IDataAnalysisProblem;
+        if (dap != null) {
+          dap.Reset += new EventHandler(DataAnalysisProblem_Reset);
+        }
+      }
+    }
+
+    private void Problems_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IProblem>> e) {
+      if (e.Items.Single().Index == 0) {
+        ParameterConfigurationTreeParameter.ActualValue = null;
+
+        var dap = e.Items.Single().Value as IDataAnalysisProblem;
+        if (dap != null) {
+          dap.Reset -= new EventHandler(DataAnalysisProblem_Reset);
+        }
+      }
+    }
+
+    private void DataAnalysisProblem_Reset(object sender, EventArgs e) {
+      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, Problems.First()), Problems.First());
+    }
+    #endregion
+
+    private IAlgorithm CreateAlgorithm(Type algorithmType, IProblem problem) {
+      IAlgorithm algorithm = (IAlgorithm)Activator.CreateInstance(algorithmType);
+      algorithm.Problem = problem;
+      return algorithm;
+    }
+
+    public void ImportAlgorithm(IAlgorithm algorithm) {
+      AlgorithmType.Value = algorithm.GetType();
+      if (algorithm.Problem != null) ProblemType.Value = algorithm.Problem.GetType();
+      if (algorithm.Problem != null) {
+        Problems.Clear();
+        Problems.Add((IProblem)algorithm.Problem);
+      }
+      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(algorithm, Problems.First());
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs	(revision 15740)
@@ -0,0 +1,94 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public static class MetaOptimizationUtil {
+    /// <summary>
+    /// Removes those results from the run which are not declared in resultsToKeep
+    /// </summary>
+    public static void ClearResults(IRun run, IEnumerable<string> resultsToKeep) {
+      var resultsToRemove = new List<string>();
+      foreach (var result in run.Results) {
+        if (!resultsToKeep.Contains(result.Key))
+          resultsToRemove.Add(result.Key);
+      }
+      foreach (var result in resultsToRemove)
+        run.Results.Remove(result);
+    }
+
+    /// <summary>
+    /// Removes those parameters from the run which are not declared in parametersToKeep
+    /// </summary>
+    public static void ClearParameters(IRun run, IEnumerable<string> parametersToKeep) {
+      var parametersToRemove = new List<string>();
+      foreach (var parameter in run.Parameters) {
+        if (!parametersToKeep.Contains(parameter.Key))
+          parametersToRemove.Add(parameter.Key);
+      }
+      foreach (var parameter in parametersToRemove)
+        run.Parameters.Remove(parameter);
+    }
+
+    public static double Normalize(
+          ParameterConfigurationTree parameterConfigurationTree,
+          double[] referenceQualityAverages,
+          double[] referenceQualityDeviations,
+          double[] referenceEvaluatedSolutionAverages,
+          double qualityAveragesWeight,
+          double qualityDeviationsWeight,
+          double evaluatedSolutionsWeight,
+          bool maximization) {
+
+      double[] qualityAveragesNormalized = new double[referenceQualityAverages.Length];
+      double[] qualityDeviationsNormalized = new double[referenceQualityDeviations.Length];
+      double[] evaluatedSolutionAveragesNormalized = new double[referenceEvaluatedSolutionAverages.Length];
+
+      for (int i = 0; i < referenceQualityAverages.Length; i++) {
+        qualityAveragesNormalized[i] = parameterConfigurationTree.AverageQualities[i] / referenceQualityAverages[i];
+        qualityDeviationsNormalized[i] = parameterConfigurationTree.QualityStandardDeviations[i] / referenceQualityDeviations[i];
+        evaluatedSolutionAveragesNormalized[i] = parameterConfigurationTree.AverageEvaluatedSolutions[i] / referenceEvaluatedSolutionAverages[i];
+      }
+      parameterConfigurationTree.NormalizedQualityAverages = new DoubleArray(qualityAveragesNormalized);
+      parameterConfigurationTree.NormalizedQualityDeviations = new DoubleArray(qualityDeviationsNormalized);
+      parameterConfigurationTree.NormalizedEvaluatedSolutions = new DoubleArray(evaluatedSolutionAveragesNormalized);
+
+      double qualityAveragesNormalizedValue = qualityAveragesNormalized.Average();
+      double qualityDeviationsNormalizedValue = qualityDeviationsNormalized.Average();
+      double evaluatedSolutionAveragesNormalizedValue = evaluatedSolutionAveragesNormalized.Average();
+
+      // deviation and evaluatedSolutions are always minimization problems. so if maximization=true, flip the values around 1.0 (e.g. 1.15 -> 0.85)
+      if (maximization) {
+        qualityDeviationsNormalizedValue -= (qualityDeviationsNormalizedValue - 1) * 2;
+        evaluatedSolutionAveragesNormalizedValue -= (evaluatedSolutionAveragesNormalizedValue - 1) * 2;
+      }
+
+      // apply weights
+      qualityAveragesNormalizedValue *= qualityAveragesWeight;
+      qualityDeviationsNormalizedValue *= qualityDeviationsWeight;
+      evaluatedSolutionAveragesNormalizedValue *= evaluatedSolutionsWeight;
+
+      double weightSum = qualityAveragesWeight + qualityDeviationsWeight + evaluatedSolutionsWeight;
+      parameterConfigurationTree.Quality = new DoubleValue((qualityAveragesNormalizedValue + qualityDeviationsNormalizedValue + evaluatedSolutionAveragesNormalizedValue) / weightSum);
+
+      return parameterConfigurationTree.Quality.Value;
+    }
+
+    /// <summary>
+    /// Creates a new instance of algorithmType, sets the given problem and parameterizes it with the given configuration
+    /// </summary>
+    public static IAlgorithm CreateParameterizedAlgorithmInstance(ParameterConfigurationTree parameterConfigurationTree, Type algorithmType, IProblem problem, bool randomize = false, IRandom random = null) {
+      var algorithm = (IAlgorithm)Activator.CreateInstance(algorithmType);
+      algorithm.Problem = problem;
+      if (algorithm is EngineAlgorithm) {
+        ((EngineAlgorithm)algorithm).Engine = new SequentialEngine.SequentialEngine();
+      }
+      if (randomize) parameterConfigurationTree.Randomize(random);
+      parameterConfigurationTree.Parameterize(algorithm);
+      return algorithm;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/AverageDoubleValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/AverageDoubleValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/AverageDoubleValueCrossover.cs	(revision 15740)
@@ -0,0 +1,39 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class AverageDoubleValueCrossover : SingleSuccessorOperator, IDoubleValueCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public AverageDoubleValueCrossover() { }
+    [StorableConstructor]
+    protected AverageDoubleValueCrossover(bool deserializing) : base(deserializing) { }
+    protected AverageDoubleValueCrossover(AverageDoubleValueCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AverageDoubleValueCrossover(this, cloner);
+    }
+
+    public void Apply(IRandom random, DoubleValue value, DoubleValue other, DoubleValueRange range) {
+      ApplyStatic(random, value, other, range);
+    }
+
+    public static void ApplyStatic(IRandom random, DoubleValue value, DoubleValue other, DoubleValueRange range) {
+      value.Value = (value.Value + other.Value) / 2;
+      value.Value = range.ApplyStepSize(value.Value);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/DiscreteDoubleValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/DiscreteDoubleValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/DiscreteDoubleValueCrossover.cs	(revision 15740)
@@ -0,0 +1,40 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class DiscreteDoubleValueCrossover : SingleSuccessorOperator, IDoubleValueCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public DiscreteDoubleValueCrossover() { }
+    [StorableConstructor]
+    protected DiscreteDoubleValueCrossover(bool deserializing) : base(deserializing) { }
+    protected DiscreteDoubleValueCrossover(DiscreteDoubleValueCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DiscreteDoubleValueCrossover(this, cloner);
+    }
+
+    public void Apply(IRandom random, DoubleValue value, DoubleValue other, DoubleValueRange range) {
+      ApplyStatic(random, value, other, range);
+    }
+
+    public static void ApplyStatic(IRandom random, DoubleValue value, DoubleValue other, DoubleValueRange range) {
+      if (random.NextDouble() > 0.5) {
+        value.Value = other.Value;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/NormalDoubleValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/NormalDoubleValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DoubleValue/NormalDoubleValueCrossover.cs	(revision 15740)
@@ -0,0 +1,45 @@
+﻿using System;
+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.Random;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NormalDoubleValueCrossover : SingleSuccessorOperator, IDoubleValueCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public NormalDoubleValueCrossover()
+      : base() {
+    }
+    [StorableConstructor]
+    protected NormalDoubleValueCrossover(bool deserializing) : base(deserializing) { }
+    protected NormalDoubleValueCrossover(NormalDoubleValueCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NormalDoubleValueCrossover(this, cloner);
+    }
+
+    public void Apply(IRandom random, DoubleValue value, DoubleValue other, DoubleValueRange range) {
+      value.Value = ApplyStatic(random, value, other, range).Value;
+    }
+
+    public static DoubleValue ApplyStatic(IRandom random, DoubleValue better, DoubleValue worse, DoubleValueRange range) {
+      NormalDistributedRandom N = new NormalDistributedRandom(random, better.Value, Math.Abs(better.Value - worse.Value) / 3);
+      var offspring = new DoubleValue();
+      do {
+        offspring.Value = N.NextDouble();
+        offspring.Value = range.ApplyStepSize(offspring.Value);
+      } while (!range.IsInRange(offspring.Value));
+
+      return offspring;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/AverageIntValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/AverageIntValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/AverageIntValueCrossover.cs	(revision 15740)
@@ -0,0 +1,38 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class AverageIntValueCrossover : SingleSuccessorOperator, IIntValueCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public AverageIntValueCrossover() { }
+    [StorableConstructor]
+    protected AverageIntValueCrossover(bool deserializing) : base(deserializing) { }
+    protected AverageIntValueCrossover(AverageIntValueCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AverageIntValueCrossover(this, cloner);
+    }
+
+    public void Apply(IRandom random, IntValue value, IntValue other, IntValueRange range) {
+      ApplyStatic(random, value, other, range);
+    }
+
+    public static void ApplyStatic(IRandom random, IntValue value, IntValue other, IntValueRange range) {
+      value.Value = (value.Value + other.Value) / 2;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/DiscreteIntValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/DiscreteIntValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/DiscreteIntValueCrossover.cs	(revision 15740)
@@ -0,0 +1,40 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class DiscreteIntValueCrossover : SingleSuccessorOperator, IIntValueCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public DiscreteIntValueCrossover() { }
+    [StorableConstructor]
+    protected DiscreteIntValueCrossover(bool deserializing) : base(deserializing) { }
+    protected DiscreteIntValueCrossover(DiscreteIntValueCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DiscreteIntValueCrossover(this, cloner);
+    }
+
+    public void Apply(IRandom random, IntValue value, IntValue other, IntValueRange range) {
+      ApplyStatic(random, value, other, range);
+    }
+
+    public static void ApplyStatic(IRandom random, IntValue value, IntValue other, IntValueRange range) {
+      if (random.NextDouble() > 0.5) {
+        value.Value = other.Value;
+      }
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/MultiIntValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/MultiIntValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/MultiIntValueCrossover.cs	(revision 15740)
@@ -0,0 +1,46 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization.Operators.Crossovers {
+  [Item("MultiIntValueCrossover", "Randomly selects and applies one of its crossovers every time it is called.")]
+  [StorableClass]
+  public class MultiIntValueCrossover : StochasticMultiBranch<IIntValueCrossover>, IIntValueCrossover, IStochasticOperator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    protected override bool CreateChildOperation {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    protected MultiIntValueCrossover(bool deserializing) : base(deserializing) { }
+    public MultiIntValueCrossover() {
+      foreach (Type type in ApplicationManager.Manager.GetTypes(typeof(IIntValueCrossover)).OrderBy(op => op.Name)) {
+        if (!typeof(MultiOperator<IIntValueCrossover>).IsAssignableFrom(type))
+          Operators.Add((IIntValueCrossover)Activator.CreateInstance(type), true);
+      }
+    }
+    protected MultiIntValueCrossover(MultiIntValueCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiIntValueCrossover(this, cloner);
+    }
+
+    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();
+    }
+
+    public void Apply(IRandom random, IntValue value, IntValue other, IntValueRange range) {
+
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/NormalIntValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/NormalIntValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/IntValue/NormalIntValueCrossover.cs	(revision 15740)
@@ -0,0 +1,42 @@
+﻿using System;
+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.Random;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NormalIntValueCrossover : SingleSuccessorOperator, IIntValueCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public NormalIntValueCrossover() { }
+    [StorableConstructor]
+    protected NormalIntValueCrossover(bool deserializing) : base(deserializing) { }
+    protected NormalIntValueCrossover(NormalIntValueCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NormalIntValueCrossover(this, cloner);
+    }
+
+    public void Apply(IRandom random, IntValue value, IntValue other, IntValueRange range) {
+      value.Value = ApplyStatic(random, value, other, range).Value;
+    }
+
+    public static IntValue ApplyStatic(IRandom random, IntValue better, IntValue worse, IntValueRange range) {
+      NormalDistributedRandom N = new NormalDistributedRandom(random, better.Value, Math.Abs(better.Value - worse.Value) / 3);
+      var offspring = new IntValue();
+      do {
+        offspring.Value = (int)N.NextDouble();
+        offspring.Value = range.ApplyStepSize(offspring.Value);
+      } while (!range.IsInRange(offspring.Value));
+      return offspring;
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/SymbolicExpressionGrammar/SymbolicExpressionGrammarCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/SymbolicExpressionGrammar/SymbolicExpressionGrammarCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/SymbolicExpressionGrammar/SymbolicExpressionGrammarCrossover.cs	(revision 15740)
@@ -0,0 +1,35 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class SymbolicExpressionGrammarCrossover : SingleSuccessorOperator, IDoubleValueCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public SymbolicExpressionGrammarCrossover() { }
+    [StorableConstructor]
+    protected SymbolicExpressionGrammarCrossover(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionGrammarCrossover(SymbolicExpressionGrammarCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionGrammarCrossover(this, cloner);
+    }
+
+    public void Apply(IRandom random, ISymbolicExpressionGrammar value, ISymbolicExpressionGrammar other) {
+      ApplyStatic(random, value, other, range);
+    }
+
+    public static void ApplyStatic(IRandom random, ISymbolicExpressionGrammar value, ISymbolicExpressionGrammar other) {
+      value.Value = (value.Value + other.Value) / 2;
+      value.Value = range.ApplyStepSize(value.Value);
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueCrossover.cs	(revision 15740)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IDoubleValueCrossover : ICrossover {
+    void Apply(IRandom random, DoubleValue value, DoubleValue other, DoubleValueRange range);
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueManipulator.cs	(revision 15740)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IDoubleValueManipulator : IValueManipulator {
+    void Apply(IRandom random, DoubleValue value, DoubleValueRange range);
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueCrossover.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueCrossover.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueCrossover.cs	(revision 15740)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IIntValueCrossover : ICrossover {
+    void Apply(IRandom random, IntValue value, IntValue other, IntValueRange range);
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueManipulator.cs	(revision 15740)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IIntValueManipulator : IValueManipulator {
+    void Apply(IRandom random, IntValue value, IntValueRange range);
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IValueManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IValueManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IValueManipulator.cs	(revision 15740)
@@ -0,0 +1,10 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IValueManipulator : IManipulator {
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/DoubleValue/NormalDoubleValueManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/DoubleValue/NormalDoubleValueManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/DoubleValue/NormalDoubleValueManipulator.cs	(revision 15740)
@@ -0,0 +1,46 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NormalDoubleValueManipulator : SingleSuccessorOperator, IDoubleValueManipulator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public NormalDoubleValueManipulator() { }
+    [StorableConstructor]
+    protected NormalDoubleValueManipulator(bool deserializing) : base(deserializing) { }
+    protected NormalDoubleValueManipulator(NormalDoubleValueManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NormalDoubleValueManipulator(this, cloner);
+    }
+    
+    // todo: override apply
+    public void Apply(IRandom random, DoubleValue value, DoubleValueRange range) {
+      ApplyStatic(random, value, range);
+    }
+
+    public static void ApplyStatic(IRandom random, DoubleValue value, DoubleValueRange range) {
+      var strategy = new RealVector(new double[] { (range.UpperBound.Value - range.LowerBound.Value) / 10}); // todo: add strategy parameter
+      var vector = new RealVector(1);
+      double val = value.Value;
+      
+      do { 
+        vector[0] = val;
+        NormalAllPositionsManipulator.Apply(random, vector, strategy);
+        value.Value = vector[0];
+        value.Value = range.ApplyStepSize(value.Value);
+      } while(!range.IsInRange(value.Value));
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/DoubleValue/UniformDoubleValueManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/DoubleValue/UniformDoubleValueManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/DoubleValue/UniformDoubleValueManipulator.cs	(revision 15740)
@@ -0,0 +1,48 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class UniformDoubleValueManipulator : SingleSuccessorOperator, IDoubleValueManipulator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public UniformDoubleValueManipulator() { }
+    [StorableConstructor]
+    protected UniformDoubleValueManipulator(bool deserializing) : base(deserializing) { }
+    protected UniformDoubleValueManipulator(UniformDoubleValueManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UniformDoubleValueManipulator(this, cloner);
+    }
+
+    // todo: override apply
+    public void Apply(IRandom random, DoubleValue value, DoubleValueRange range) {
+      ApplyStatic(random, value, range);
+    }
+
+    public static void ApplyStatic(IRandom random, DoubleValue value, DoubleValueRange range) {
+      var vector = new RealVector(1);
+      var bounds = new DoubleMatrix(1, 2);
+      bounds[0, 0] = range.LowerBound.Value;
+      bounds[0, 1] = range.UpperBound.Value;
+      double val = value.Value;
+
+      do {
+        vector[0] = val;
+        UniformOnePositionManipulator.Apply(random, vector, bounds);
+        value.Value = vector[0];
+        value.Value = range.ApplyStepSize(value.Value);
+      } while (!range.IsInRange(value.Value));
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/IntValue/NormalIntValueManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/IntValue/NormalIntValueManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/IntValue/NormalIntValueManipulator.cs	(revision 15740)
@@ -0,0 +1,47 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NormalIntValueManipulator : SingleSuccessorOperator, IIntValueManipulator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    
+    public NormalIntValueManipulator() { }
+    [StorableConstructor]
+    protected NormalIntValueManipulator(bool deserializing) : base(deserializing) { }
+    protected NormalIntValueManipulator(NormalIntValueManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NormalIntValueManipulator(this, cloner);
+    }
+
+    // todo: override apply
+    
+    public void Apply(IRandom random, IntValue value, IntValueRange range) {
+      ApplyStatic(random, value, range);
+    }
+
+    public static void ApplyStatic(IRandom random, IntValue value, IntValueRange range) {
+      var strategy = new RealVector(new double[] { (range.UpperBound.Value - range.LowerBound.Value) / 10 }); // todo: add strategy parameter
+      var vector = new RealVector(new double[] { value.Value });
+      int val = value.Value;
+
+      do {
+        vector[0] = val;
+        NormalAllPositionsManipulator.Apply(random, vector, strategy);
+        value.Value = (int)vector[0];
+        value.Value = range.ApplyStepSize(value.Value);
+      } while (!range.IsInRange(value.Value));
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/IntValue/UniformIntValueManipulator.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/IntValue/UniformIntValueManipulator.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/IntValue/UniformIntValueManipulator.cs	(revision 15740)
@@ -0,0 +1,46 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class UniformIntValueManipulator : SingleSuccessorOperator, IIntValueManipulator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public UniformIntValueManipulator() { }
+    [StorableConstructor]
+    protected UniformIntValueManipulator(bool deserializing) : base(deserializing) { }
+    protected UniformIntValueManipulator(UniformIntValueManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UniformIntValueManipulator(this, cloner);
+    }
+
+    // todo: override apply
+    
+    public void Apply(IRandom random, IntValue value, IntValueRange range) {
+      ApplyStatic(random, value, range);
+    }
+
+    public static void ApplyStatic(IRandom random, IntValue value, IntValueRange range) {
+      var vector = new IntegerVector(new int[] { value.Value });
+      int val = value.Value;
+
+      do {
+        vector[0] = val;
+        UniformOnePositionManipulator.Apply(random, vector, new IntMatrix(new int[,] { { range.LowerBound.Value, range.UpperBound.Value } } ));
+        value.Value = vector[0];
+        value.Value = range.ApplyStepSize(value.Value);
+      } while (!range.IsInRange(value.Value));
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Plugin.cs.frame
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Plugin.cs.frame	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Plugin.cs.frame	(revision 15740)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.MetaOptimization {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.MetaOptimization plugin
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.MetaOptimization", "3.3.2.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.MetaOptimization-3.3.dll", PluginFileType.Assembly)]
+ [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.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.TestFunctions", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.SequentialEngine", "3.3")]
+  public class HeuristicLabProblemsMetaOptimizationPlugin : PluginBase {
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs.frame	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs.frame	(revision 15740)
@@ -0,0 +1,35 @@
+﻿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.MetaOptimization")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 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("99313b3e-2734-4d09-a35d-4eb1db88a88e")]
+
+// 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.2.0")]
+[assembly: AssemblyFileVersion("3.3.2.$WCREV$")]
Index: addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/TypeValue.cs
===================================================================
--- addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/TypeValue.cs	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/TypeValue.cs	(revision 15740)
@@ -0,0 +1,72 @@
+﻿using System;
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [Item("TypeValue", "Represents a type.")]
+  [StorableClass]
+  public class TypeValue : Item {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Field; }
+    }
+
+    [Storable]
+    protected Type value;
+    public virtual Type Value {
+      get { return value; }
+      set {
+        if (ReadOnly) throw new NotSupportedException("Value cannot be set. TypeValue is read-only.");
+        if (!value.Equals(this.value)) {
+          this.value = value;
+          OnValueChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool readOnly;
+    public virtual bool ReadOnly {
+      get { return readOnly; }
+    }
+
+    public TypeValue()
+      : base() {
+      this.readOnly = false;
+    }
+    public TypeValue(Type value)
+      : base() {
+      this.Value = value;
+      this.readOnly = false;
+    }
+    [StorableConstructor]
+    protected TypeValue(bool deserializing) : base(deserializing) { }
+    protected TypeValue(TypeValue original, Cloner cloner)
+      : base(original, cloner) {
+      this.value = original.value;
+      this.readOnly = original.readOnly;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TypeValue(this, cloner);
+    }
+
+    public virtual TypeValue AsReadOnly() {
+      TypeValue readOnlyValueTypeValue = (TypeValue)this.Clone();
+      readOnlyValueTypeValue.readOnly = true;
+      return readOnlyValueTypeValue;
+    }
+
+    public override string ToString() {
+      if (value == null) return "No Type information";
+      return value.Name;
+    }
+
+    public event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      if (ValueChanged != null)
+        ValueChanged(this, EventArgs.Empty);
+      OnToStringChanged();
+    }
+  }
+}
Index: addons/HeuristicLab.MetaOptimization/MergeConfigs.cmd
===================================================================
--- addons/HeuristicLab.MetaOptimization/MergeConfigs.cmd	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/MergeConfigs.cmd	(revision 15740)
@@ -0,0 +1,2 @@
+ConfigMerger "%SolutionDir%\ServiceClient.config" "C:\Program Files\HeuristicLab 3.0\HeuristicLab.exe.config"
+
Index: addons/HeuristicLab.MetaOptimization/PreBuildEvent.cmd
===================================================================
--- addons/HeuristicLab.MetaOptimization/PreBuildEvent.cmd	(revision 15740)
+++ addons/HeuristicLab.MetaOptimization/PreBuildEvent.cmd	(revision 15740)
@@ -0,0 +1,2 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
