Index: branches/HeuristicLab.MetaOptimization (trunk integration)/Build.cmd
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/Build.cmd	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/Build.cmd	(revision 8576)
@@ -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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.MetaOptimization.sln
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.MetaOptimization.sln	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.MetaOptimization.sln	(revision 8576)
@@ -0,0 +1,54 @@
+﻿
+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("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F96C8DD1-9B68-4F2D-AD4F-1A174F596041}"
+	ProjectSection(SolutionItems) = preProject
+		PreBuildEvent.cmd = PreBuildEvent.cmd
+	EndProjectSection
+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
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs	(revision 8576)
@@ -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.Inherit;
+      this.Text = "ConstrainedItemListView";
+    }
+
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs	(revision 8576)
@@ -0,0 +1,41 @@
+﻿using System;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.MainForm;
+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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.Designer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.Designer.cs	(revision 8576)
@@ -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.Inherit;
+      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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedTypeValueView.cs	(revision 8576)
@@ -0,0 +1,67 @@
+﻿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.Encodings.ParameterConfigurationEncoding;
+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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 8576)
@@ -0,0 +1,224 @@
+﻿<?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.0</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>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <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>
+  </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>
+  </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.Encodings.ParameterConfigurationEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.ParameterConfigurationEncoding.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <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="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>
+    <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="ItemDictionaryView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemDictionaryView.Designer.cs">
+      <DependentUpon>ItemDictionaryView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MetaOptimizationProblemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MetaOptimizationProblemView.Designer.cs">
+      <DependentUpon>MetaOptimizationProblemView.cs</DependentUpon>
+    </Compile>
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <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="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.Designer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.Designer.cs	(revision 8576)
@@ -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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ItemDictionaryView.cs	(revision 8576)
@@ -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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs	(revision 8576)
@@ -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);
+      // 
+      // ProblemInstanceConsumerViewHost
+      // 
+      this.ProblemInstanceConsumerViewHost.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.Inherit;
+      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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs	(revision 8576)
@@ -0,0 +1,89 @@
+﻿using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding.Views;
+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() {
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+    }
+
+    #region Event Handlers (Content)
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+      } else {
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    #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) {
+          using (CreateExperimentDialogV2 dialog = new CreateExperimentDialogV2((IAlgorithm)Content.Algorithm.Clone(), ApplicationManager.Manager.GetInstances<IEngine>())) {
+            if (dialog.ShowDialog() == DialogResult.OK) MainFormManager.MainForm.ShowContent(dialog.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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/Plugin.cs.frame
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/Plugin.cs.frame	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/Plugin.cs.frame	(revision 8576)
@@ -0,0 +1,48 @@
+#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.Views {
+  /// <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.Encodings.ParameterConfigurationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ParameterConfigurationEncoding.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.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.MetaOptimization", "3.3")]
+  public class HeuristicLabProblemsMetaOptimizationPlugin : PluginBase {
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 8576)
@@ -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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.Designer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.Designer.cs	(revision 8576)
@@ -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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionDictionaryView.cs	(revision 8576)
@@ -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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.Designer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.Designer.cs	(revision 8576)
@@ -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.Inherit;
+      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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/RunCollectionItemDictionaryView.cs	(revision 8576)
@@ -0,0 +1,62 @@
+﻿using System.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+
+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() {
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+    }
+
+    #region Event Handlers (Content)
+    #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();
+    }
+
+    #region Event Handlers (child controls)
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.Designer.cs	(revision 8576)
@@ -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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemCollectionView.cs	(revision 8576)
@@ -0,0 +1,70 @@
+﻿using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+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;
+      this.typeSelectorDialog = new TypeSelectorDialog();
+    }
+
+    #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() {
+      typeSelectorDialog.Caption = "Select Item";
+      typeSelectorDialog.TypeSelector.Caption = "Available Items";
+      typeSelectorDialog.TypeSelector.Configure(Content.ValidValues.Select(x => x.GetType()), false, false, false);
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          IItem value = (IItem)Content.ValidValues.Single(x => x.GetType() == typeSelectorDialog.TypeSelector.SelectedType).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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/AlgorithmExecutor.cs	(revision 8576)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 8576)
@@ -0,0 +1,141 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An analyzer that records the best parameter configuration.
+  /// </summary>
+  [Item("BestParameterConfigurationAnalyzer", "An analyzer that records the best parameter configuration.")]
+  [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<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    #region Constructors and Cloning
+    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<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);
+    }
+    #endregion
+
+    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 = 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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOBestSolutionHistoryAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOBestSolutionHistoryAnalyzer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOBestSolutionHistoryAnalyzer.cs	(revision 8576)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An analyzer that tracks the history of best parameter configurations.
+  /// </summary>
+  [Item("PMOBestSolutionHistoryAnalyzer", "An analyzer that tracks the history of best solutions.")]
+  [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<IntValue> GenerationsParameter {
+      get { return (LookupParameter<IntValue>)Parameters["Generations"]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    #region Constructors and Cloning
+    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<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);
+    }
+    #endregion
+
+    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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOPopulationDiversityAnalyzer.cs	(revision 8576)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An operator for analyzing the diversity of solutions of parameter meta-optimization.
+  /// </summary>
+  [Item("PMOPopulationDiversityAnalyzer", "An operator for analyzing the diversity of solutions of parameter meta-optimization.")]
+  [StorableClass]
+  public sealed class PMOPopulationDiversityAnalyzer : PopulationDiversityAnalyzer<ParameterConfigurationTree> {
+    #region Constructors and Cloning
+    public PMOPopulationDiversityAnalyzer() : base() { }
+
+    [StorableConstructor]
+    private PMOPopulationDiversityAnalyzer(bool deserializing) : base(deserializing) { }
+    private PMOPopulationDiversityAnalyzer(PMOPopulationDiversityAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PMOPopulationDiversityAnalyzer(this, cloner);
+    }
+    #endregion
+
+    protected override double[,] CalculateSimilarities(ParameterConfigurationTree[] solutions) {
+      // TODO: consider implementing a similarity calculator
+      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 left, ParameterConfigurationTree right) {
+      return left.CalculateSimilarity(right);
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOProblemQualitiesAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOProblemQualitiesAnalyzer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PMOProblemQualitiesAnalyzer.cs	(revision 8576)
@@ -0,0 +1,141 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An analyzer for the qualities of each defined problem.
+  /// </summary>
+  [Item("PMOProblemQualitiesAnalyzer", "An analyzer for the qualities of each defined problem.")]
+  [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"]; }
+    }
+
+    #region Constructors and Cloning
+    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);
+    }
+    #endregion
+
+    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;
+      var sortedQualities = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value);
+      if (maximization) {
+        idxBest = sortedQualities.Last().index;
+        idxWorst = sortedQualities.First().index;
+      } else {
+        idxBest = sortedQualities.First().index;
+        idxWorst = sortedQualities.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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PopulationAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PopulationAnalyzer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/PopulationAnalyzer.cs	(revision 8576)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An analyzer that records the best parameter configuration.
+  /// </summary>
+  [Item("PopulationAnalyzer", "An analyzer that records the best parameter configuration.")]
+  [StorableClass]
+  public sealed class PopulationAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    public ScopeTreeLookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ScopeTreeLookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public ValueLookupParameter<ResultCollection> ResultsParameter {
+      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    public LookupParameter<RunCollection> PopulationParameter {
+      get { return (LookupParameter<RunCollection>)Parameters["Population"]; }
+    }
+    public LookupParameter<BoolValue> MaximizationParameter {
+      get { return (LookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    #region Constructors and Cloning
+    public PopulationAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
+      Parameters.Add(new LookupParameter<RunCollection>("Population", ""));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized."));
+    }
+
+    [StorableConstructor]
+    private PopulationAnalyzer(bool deserializing) : base(deserializing) { }
+    private PopulationAnalyzer(PopulationAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PopulationAnalyzer(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      ResultCollection results = ResultsParameter.ActualValue;
+      ItemArray<ParameterConfigurationTree> parameterTrees = ParameterConfigurationParameter.ActualValue;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+
+      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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/ReferenceQualityAnalyzer.cs	(revision 8576)
@@ -0,0 +1,190 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO
+  /// </summary>
+  [Item("ReferenceQualityAnalyzer", "TODO")]
+  [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]; }
+    }
+
+    #region Constructors and Cloning
+    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);
+    }
+    #endregion
+
+    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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/SolutionCacheAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/SolutionCacheAnalyzer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/SolutionCacheAnalyzer.cs	(revision 8576)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO
+  /// </summary>
+  [Item("SolutionCacheAnalyzer", "TODO")]
+  [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 ValueParameter<BoolValue> StoreAllRunsParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["StoreAllRuns"]; }
+    }
+
+    #region Constructors and Cloning
+    public SolutionCacheAnalyzer()
+      : base() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", ""));
+      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", ""));
+      Parameters.Add(new ScopeTreeLookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", ""));
+      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);
+    }
+    #endregion
+
+    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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs	(revision 8576)
@@ -0,0 +1,58 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.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);
+        }
+      }
+    }
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected ConstrainedItemList(bool deserializing) : base(deserializing) { }
+    protected ConstrainedItemList(ConstrainedItemList<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.Type = original.Type;
+    }
+    public ConstrainedItemList()
+      : base() {
+      Type = typeof(T);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedItemList<T>(this, cloner);
+    }
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedTypeValue.cs	(revision 8576)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+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;
+      }
+    }
+
+    #region Constructors and Cloning
+    [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 ConstrainedTypeValue()
+      : base() {
+      this.readOnly = false;
+    }
+    public ConstrainedTypeValue(Type value)
+      : this() {
+      this.Value = value;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedTypeValue(this, cloner);
+    }
+    #endregion
+  }
+
+  [Item("ConstrainedTypeValue<>", "Represents a type with constraints.")]
+  [StorableClass]
+  public class ConstrainedTypeValue<T> : ConstrainedTypeValue where T : class, IItem {
+    [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 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;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedTypeValue<T>(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmEvaluator.cs	(revision 8576)
@@ -0,0 +1,99 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO
+  /// </summary>
+  [Item("AlgorithmEvaluator", "TODO")]
+  [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 LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Constructors and Cloning
+    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", ""));
+    }
+
+    [StorableConstructor]
+    protected AlgorithmEvaluator(bool deserializing) : base(deserializing) { }
+    protected AlgorithmEvaluator(AlgorithmEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmEvaluator(this, cloner);
+    }
+    #endregion
+
+    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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs	(revision 8576)
@@ -0,0 +1,282 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO
+  /// </summary>
+  [Item("AlgorithmRunsAnalyzer", "TODO")]
+  [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
+
+    #region Constructors and Cloning
+    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."));
+    }
+
+    [StorableConstructor]
+    protected AlgorithmRunsAnalyzer(bool deserializing) : base(deserializing) { }
+    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
+    }
+    #endregion
+
+    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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs	(revision 8576)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO
+  /// </summary>
+  [Item("AlgorithmSubScopesCreator", "TODO")]
+  [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
+
+    #region Constructors and Cloning
+    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."));
+    }
+
+    [StorableConstructor]
+    protected AlgorithmSubScopesCreator(bool deserializing) : base(deserializing) { }
+    protected AlgorithmSubScopesCreator(AlgorithmSubScopesCreator original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmSubScopesCreator(this, cloner);
+    }
+    #endregion
+
+    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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/PMOEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/PMOEvaluator.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/PMOEvaluator.cs	(revision 8576)
@@ -0,0 +1,117 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// TODO
+  /// </summary>
+  [Item("PMOEvaluator", "TODO")]
+  [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
+
+    #region Constructors and Cloning
+    public PMOEvaluator()
+      : base() {
+      Initialize();
+    }
+
+    [StorableConstructor]
+    protected PMOEvaluator(bool deserializing) : base(deserializing) { }
+    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() {
+      ///// TODO: only for debug reasons - remove later (set this in stored algs)
+      ((UniformSubScopesProcessor)((AlgorithmSubScopesCreator)this.OperatorGraph.InitialOperator).Successor).Parallel.Value = true;
+    }
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 8576)
@@ -0,0 +1,223 @@
+﻿<?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.0</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>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <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>
+  </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>
+  </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, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <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.ParameterConfigurationEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <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.TestFunctions-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <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\PopulationAnalyzer.cs" />
+    <Compile Include="Analyzers\PMOBestSolutionHistoryAnalyzer.cs" />
+    <Compile Include="Analyzers\PMOProblemQualitiesAnalyzer.cs" />
+    <Compile Include="Analyzers\PMOPopulationDiversityAnalyzer.cs" />
+    <Compile Include="ConstrainedItemList.cs" />
+    <Compile Include="ConstrainedTypeValue.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="Plugin.cs" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Analyzers\SolutionCacheAnalyzer.cs" />
+    <Compile Include="Analyzers\ReferenceQualityAnalyzer.cs" />
+    <Compile Include="AlgorithmExecutor.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="MetaOptimizationProblem.cs" />
+  </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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 8576)
@@ -0,0 +1,341 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.Encodings.ParameterConfigurationEncoding;
+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 {
+  /// <summary>
+  /// 
+  /// </summary>
+  [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
+
+    #region Constructors and Cloning
+    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);
+    }
+    #endregion
+
+    #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());
+      Operators.Add(new PopulationAnalyzer());
+    }
+    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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs	(revision 8576)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.ParameterConfigurationEncoding;
+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: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Plugin.cs.frame
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Plugin.cs.frame	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Plugin.cs.frame	(revision 8576)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should 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.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ParameterConfigurationEncoding", "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.DataAnalysis.Symbolic.Regression", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.TestFunctions", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.SequentialEngine", "3.3")]
+  public class HeuristicLabProblemsMetaOptimizationPlugin : PluginBase {
+  }
+}
Index: branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs.frame	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs.frame	(revision 8576)
@@ -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: branches/HeuristicLab.MetaOptimization (trunk integration)/PreBuildEvent.cmd
===================================================================
--- branches/HeuristicLab.MetaOptimization (trunk integration)/PreBuildEvent.cmd	(revision 8576)
+++ branches/HeuristicLab.MetaOptimization (trunk integration)/PreBuildEvent.cmd	(revision 8576)
@@ -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"
