Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/HeuristicLab.MetaOptimization.Test.csproj	(revision 5110)
@@ -116,7 +116,4 @@
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data.Views-3.3.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.DebugEngine-3.3">
-      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.DebugEngine-3.3.dll</HintPath>
-    </Reference>
     <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
@@ -320,9 +317,7 @@
       <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\WeifenLuo.WinFormsUI.Docking-2.3.1.dll</HintPath>
     </Reference>
-    <Reference Include="ZedGraph">
-      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\ZedGraph.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="PluginLoader.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/PluginLoader.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/PluginLoader.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/PluginLoader.cs	(revision 5110)
@@ -0,0 +1,27 @@
+﻿
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.MetaOptimization.Test {
+  internal static class PluginLoader {
+    public const string AssemblyExtension = ".dll";
+    public static List<Assembly> pluginAssemblies;
+
+    static PluginLoader() {
+      foreach (string path in Directory.GetFiles(Environment.CurrentDirectory)
+        .Where(s => s.EndsWith(AssemblyExtension)))
+        Assembly.LoadFrom(path);
+
+      pluginAssemblies = AppDomain.CurrentDomain.GetAssemblies().Where(IsPluginAssembly).ToList();
+    }
+
+    private static bool IsPluginAssembly(Assembly assembly) {
+      return assembly.GetExportedTypes()
+        .Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface).Any();
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5110)
@@ -18,12 +18,13 @@
 using HeuristicLab.Selection;
 using HeuristicLab.Algorithms.EvolutionStrategy;
+using HeuristicLab.PluginInfrastructure.Manager;
 
 namespace HeuristicLab.MetaOptimization.Test {
   class Program {
-    private static int metaAlgorithmPopulationSize = 50;
+    private static int metaAlgorithmPopulationSize = 3;
     private static int metaAlgorithmMaxGenerations = 30;
     private static int metaProblemRepetitions = 3;
 
-    private static int baseAlgorithmMaxGenerations = 250;
+    private static int baseAlgorithmMaxGenerations = 3;
 
     static void Main(string[] args) {
@@ -32,9 +33,10 @@
       //TestIntSampling();
       //TestDoubleSampling();
-
+      //TestTypeDiscovery();
+      
       GeneticAlgorithm baseLevelAlgorithm = new GeneticAlgorithm();
 
       MetaOptimizationProblem metaOptimizationProblem = new MetaOptimizationProblem();
-      ((MetaOptimizationEvaluator)metaOptimizationProblem.Evaluator).Repetitions.Value = metaProblemRepetitions;
+      metaOptimizationProblem.Repetitions = new IntValue(metaProblemRepetitions);
       GeneticAlgorithm metaLevelAlgorithm = GetMetaGA(metaOptimizationProblem);
       //EvolutionStrategy metaLevelAlgorithm = GetMetaES(metaOptimizationProblem);
@@ -53,4 +55,14 @@
 
       Console.ReadLine();
+    }
+
+    private static void TestTypeDiscovery() {
+      PluginLoader.pluginAssemblies.Any();
+      
+      var items = ApplicationManager.Manager.GetInstances(typeof(DoubleArray)).ToArray();
+
+      foreach (var item in items) {
+        Console.WriteLine(item.ToString());
+      }
     }
 
@@ -200,5 +212,5 @@
 
       // uncheck multiMutator to avoid Michalewicz issue
-      var multiMutator = mutationOperator.ValueConfigurations.Where(x => x.ActualValue.Value.ItemName.StartsWith("Multi")).SingleOrDefault();
+      var multiMutator = mutationOperator.ValueConfigurations.Where(x => x.ActualValue.Value != null && x.ActualValue.Value.ItemName.StartsWith("Multi")).SingleOrDefault();
       if (multiMutator != null) {
         mutationOperator.ValueConfigurations.SetItemCheckedState(multiMutator, false);
@@ -272,5 +284,4 @@
       string outputPath = Path.Combine(path, string.Format("{0} - Console.txt", id));
 
-
       using (var sw = new StreamWriter(outputPath)) {
         sw.AutoFlush = true;
@@ -301,5 +312,5 @@
                 var orderedRuns = rc.OrderBy(x => x.Results["RunsAverageQuality"]);
 
-                sb.AppendLine("Qual.  PoSi MutRa Eli GrSi MutOp");
+                sb.AppendLine("Qual.  PoSi MutRa Eli SelOp MutOp");
                 foreach (IRun run in orderedRuns) {
                   string selector;
@@ -316,5 +327,5 @@
                     ((IntValue)run.Parameters["Elites"]).Value.ToString().PadLeft(3, ' '),
                     Shorten(selector, 20).PadRight(20, ' '),
-                    run.Parameters["Mutator"].ToString()));
+                    run.Parameters.ContainsKey("Mutator") ? run.Parameters["Mutator"].ToString() : "null"));
                 }
               }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.sln	(revision 5110)
@@ -15,6 +15,4 @@
 		TraceAndTestImpact.testsettings = TraceAndTestImpact.testsettings
 	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.MetaOptimization.Tests", "HeuristicLab.MetaOptimization.Tests\HeuristicLab.MetaOptimization.Tests.csproj", "{7978A3C0-5166-4392-B00F-58AA3C31E107}"
 EndProject
 Global
@@ -35,5 +33,6 @@
 		{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|x86.ActiveCfg = Debug|Any CPU
+		{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
@@ -45,5 +44,6 @@
 		{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|x86.ActiveCfg = Debug|Any CPU
+		{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
@@ -62,14 +62,4 @@
 		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|x86.ActiveCfg = Release|x86
 		{0E232F46-FD0B-4FEA-8C22-AF18DE0D151E}.Release|x86.Build.0 = Release|x86
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Release|Any CPU.Build.0 = Release|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Release|Mixed Platforms.Build.0 = Release|Any CPU
-		{7978A3C0-5166-4392-B00F-58AA3C31E107}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.Designer.cs	(revision 5110)
@@ -0,0 +1,33 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ConstrainedItemListView<T> {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Text = "ConstrainedItemListView";
+    }
+
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ConstrainedItemListView.cs	(revision 5110)
@@ -0,0 +1,46 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("Constrained Item List View")]
+  [Content(typeof(ConstrainedItemList<>), IsDefaultView = true)]
+  public sealed partial class ConstrainedItemListView<T> : ItemListView<T> where T : class, IItem {
+    public new ConstrainedItemList<T> Content {
+      get { return (ConstrainedItemList<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ConstrainedItemListView() {
+      InitializeComponent();
+    }
+
+    protected override T CreateItem() {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Item";
+        typeSelectorDialog.TypeSelector.Caption = "Available Items";
+        typeSelectorDialog.TypeSelector.Configure(Content.Type, false, true);
+      }
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          return (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      return null;
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 5110)
@@ -38,4 +38,37 @@
     <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</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>bin\x86\Release\</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">
@@ -86,4 +119,10 @@
   <ItemGroup>
     <None Include="HeuristicLabProblemsMetaOptimizationViewsPlugin.cs.frame" />
+    <Compile Include="ConstrainedItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedItemListView.Designer.cs">
+      <DependentUpon>ConstrainedItemListView.cs</DependentUpon>
+    </Compile>
     <Compile Include="OptimizableView.cs">
       <SubType>UserControl</SubType>
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.Designer.cs	(revision 5110)
@@ -46,5 +46,5 @@
       this.itemsListView.MultiSelect = false;
       this.itemsListView.Name = "itemsListView";
-      this.itemsListView.Size = new System.Drawing.Size(765, 452);
+      this.itemsListView.Size = new System.Drawing.Size(387, 501);
       this.itemsListView.TabIndex = 2;
       this.itemsListView.UseCompatibleStateImageBehavior = false;
@@ -72,5 +72,5 @@
       this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-      this.cancelButton.Location = new System.Drawing.Point(702, 470);
+      this.cancelButton.Location = new System.Drawing.Point(324, 519);
       this.cancelButton.Name = "cancelButton";
       this.cancelButton.Size = new System.Drawing.Size(75, 23);
@@ -84,5 +84,5 @@
       this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
       this.okButton.Enabled = false;
-      this.okButton.Location = new System.Drawing.Point(621, 470);
+      this.okButton.Location = new System.Drawing.Point(243, 519);
       this.okButton.Name = "okButton";
       this.okButton.Size = new System.Drawing.Size(75, 23);
@@ -98,5 +98,5 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.CancelButton = this.cancelButton;
-      this.ClientSize = new System.Drawing.Size(789, 505);
+      this.ClientSize = new System.Drawing.Size(411, 554);
       this.Controls.Add(this.cancelButton);
       this.Controls.Add(this.okButton);
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs	(revision 5110)
@@ -1,17 +1,13 @@
 ﻿using System;
 using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
 using System.Linq;
-using System.Text;
 using System.Windows.Forms;
 using HeuristicLab.Core;
 
 namespace HeuristicLab.Problems.MetaOptimization.Views {
-  public partial class ObjectSelectorDialog<T> : Form where T : INamedItem {
+  public partial class ObjectSelectorDialog<T> : Form where T : IItem {
     private bool initialized;
     private List<IItem> items;
-    private IEnumerable<IGrouping<Type, T>> selectableItems;
+    private IEnumerable<IGrouping<string, T>> selectableItems;
 
     private T item;
@@ -20,5 +16,5 @@
     }
 
-    public ObjectSelectorDialog(IEnumerable<IGrouping<Type, T>> selectableItems) {
+    public ObjectSelectorDialog(IEnumerable<IGrouping<string, T>> selectableItems) {
       this.initialized = false;
       this.items = new List<IItem>();
@@ -31,11 +27,18 @@
       if (!initialized) {
         itemsListView.SmallImageList = new ImageList();
-
-        foreach (IGrouping<Type, T> item in selectableItems) {
-          ListViewGroup group = new ListViewGroup(item.Key.Name);
+        
+        foreach (IGrouping<string, T> item in selectableItems) {
+          ListViewGroup group = new ListViewGroup(item.Key);
           itemsListView.Groups.Add(group);
           foreach (T i in item) {
             items.Add(i);
-            ListViewItem value = new ListViewItem(new string[] { i.Name, i.Description, i.ItemName }, group);
+            string[] columns;
+            if(i is INamedItem) {
+              INamedItem ni = i as INamedItem;
+              columns = new string[] { ni.Name, ni.Description, ni.GetType().Name };
+            } else {
+              columns = new string[] { i.ItemName, i.ItemDescription, i.GetType().Name };
+            }
+            ListViewItem value = new ListViewItem(columns, group);
             itemsListView.SmallImageList.Images.Add(i.ItemImage);
             value.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemList.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemList.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueConfigurationCheckedItemList.cs	(revision 5110)
@@ -70,14 +70,8 @@
 
     protected override IValueConfiguration CreateItem() {
-      if (typeSelectorDialog == null) {
-        typeSelectorDialog = new TypeSelectorDialog();
-        typeSelectorDialog.Caption = "Select Item";
-        typeSelectorDialog.TypeSelector.Caption = "Available Items";
-        typeSelectorDialog.TypeSelector.Configure(Content.ValueDataType, false, true);
-      }
-
-      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+      var objectSelectorDialog = new ObjectSelectorDialog<IItem>(Content.ValidValues.GroupBy(x => ApplicationManager.Manager.GetDeclaringPlugin(x.GetType()).Name));
+      if (objectSelectorDialog.ShowDialog(this) == DialogResult.OK) {
         try {
-          IItem value = (IItem)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          IItem value = objectSelectorDialog.Item;
           return new ValueConfiguration(value, value.GetType());
         }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueConfigurationViews/ValueView.cs	(revision 5110)
@@ -34,14 +34,21 @@
         valueViewHost.Content = null;
       }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      if (Content != null) {
+        clearValueButton.Enabled = Content.Value != null && Content.IsNullable; // IsNullable ist in diesem fall nicht richtig gesetzt
+        setValueButton.Enabled = Content.ValueDataType != null;
+      }
     }
 
     private void setValueButton_Click(object sender, EventArgs e) {
-      var typeSelectorDialog = new TypeSelectorDialog();
-      typeSelectorDialog.Caption = "Select Value";
-      typeSelectorDialog.TypeSelector.Configure(Content.ValueDataType, false, true);
-
-      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+      var withoutNullValue = Content.ValidValues.Where(x => !(x is NullValue));
+      var objectSelectorDialog = new ObjectSelectorDialog<IItem>(withoutNullValue.GroupBy(x => ApplicationManager.Manager.GetDeclaringPlugin(x.GetType()).Name));
+      if (objectSelectorDialog.ShowDialog(this) == DialogResult.OK) {
         try {
-          Content.Value = (IItem)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          Content.Value = objectSelectorDialog.Item;
           valueViewHost.Content = Content.Value;
         }
@@ -50,4 +57,5 @@
         }
       }
+      SetEnabledStateOfControls();
     }
 
@@ -55,4 +63,5 @@
       Content.Value = null;
       valueViewHost.Content = null;
+      SetEnabledStateOfControls();
     }
   }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ClassDiagram1.cd
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ClassDiagram1.cd	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ClassDiagram1.cd	(revision 5110)
@@ -0,0 +1,44 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IOptimizable">
+    <Position X="3.5" Y="1" Width="2.5" />
+    <Members>
+      <Property Name="IsOptimizable" Hidden="true" />
+      <Event Name="IsOptimizableChanged" Hidden="true" />
+      <Event Name="OptimizeChanged" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAEAAAAAAAAAAAAAACAAMAAAAAACCCAAACAAAA=</HashCode>
+      <FileName>Interfaces\IOptimizable.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IValueConfiguration">
+    <Position X="4.75" Y="3.75" Width="2.25" />
+    <Members>
+      <Method Name="Parameterize" Hidden="true" />
+      <Event Name="ValueChanged" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAQAAAAAAAAAAAAAAAAAAAAAEACAAAAAACAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IValueConfiguration.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IParameterConfiguration">
+    <Position X="2.25" Y="3.75" Width="2.25" />
+    <Members>
+      <Method Name="Parameterize" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAAgEAAAAAAAAAAAAAAAIAAAAAAABAAAACAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IParameterConfiguration.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IRange&lt;T&gt;">
+    <Position X="7.5" Y="3.25" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AACAAAAAAIAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IRange.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ConstrainedItemList.cs	(revision 5110)
@@ -0,0 +1,37 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class ConstrainedItemList<T> : ItemList<T> where T : class, IItem {
+    [Storable]
+    private Type type;
+    public Type Type {
+      get { return type; }
+      set {
+        if (type != value) {
+          type = value;
+          this.RemoveAll(x => x.GetType() != type);
+        }
+      }
+    }
+
+    public ConstrainedItemList() {
+      Type = typeof(T);
+    }
+    [StorableConstructor]
+    protected ConstrainedItemList(bool deserializing) : base(deserializing) { }
+    protected ConstrainedItemList(ConstrainedItemList<T> original, Cloner cloner)
+      : base(original, cloner) {
+      this.Type = original.Type;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedItemList<T>(this, cloner);
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/NullValue.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/NullValue.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/NullValue.cs	(revision 5110)
@@ -0,0 +1,23 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NullValue : ValueTypeValue<int> {
+
+    public NullValue() { }
+    [StorableConstructor]
+    protected NullValue(bool deserializing) : base(deserializing) { }
+    protected NullValue(NullValue original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NullValue(this, cloner);
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs	(revision 5110)
@@ -1,12 +1,12 @@
 ﻿using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Parameters;
-using HeuristicLab.Data;
-using System.Collections;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -94,10 +94,23 @@
     public ConstrainedValue ActualValue {
       get { return actualValue; }
-      set { actualValue = value; }
-    }
-    
-    // store parameter reference only for name/description/image/...
-    //[Storable]
-    //private IValueParameter parameter;
+      set {
+        if (actualValue != value) {
+          DeregisterActualValueEvents();
+          actualValue = value;
+          RegisterActualValueEvents();
+        }
+      }
+    }
+
+    [Storable]
+    protected bool isNullable;
+    public bool IsNullable {
+      get { return isNullable; }
+      protected set {
+        if (this.isNullable != value) {
+          this.isNullable = value;
+        }
+      }
+    }
 
     #region Constructors and Cloning
@@ -105,9 +118,12 @@
       this.ParameterName = parameterName;
       this.parameterDataType = valueParameter.GetType();
-      //this.parameter = valueParameter;
       this.valueDataType = valueParameter.DataType;
       this.validValues = GetValidValues(valueParameter);
-      this.ValueConfigurations = new CheckedValueConfigurationCollection(this.valueDataType);
-      this.ActualValue = new ConstrainedValue(valueParameter.Value, valueParameter.DataType);
+      this.IsNullable = valueParameter.ItemName.StartsWith("Optional");
+      if (IsNullable) {
+        validValues.Add(new NullValue());
+      }
+      this.ValueConfigurations = new CheckedValueConfigurationCollection(this.validValues);
+      this.ActualValue = new ConstrainedValue(valueParameter.Value, valueParameter.DataType, this.ValidValues, this.IsNullable);
       if (Optimize) {
         PopulateValueConfigurations();
@@ -121,5 +137,4 @@
       this.parameterName = original.ParameterName;
       this.parameterDataType = original.parameterDataType;
-      //this.parameter = cloner.Clone(original.parameter);
       this.valueDataType = original.ValueDataType;
       this.validValues = cloner.Clone(original.ValidValues);
@@ -128,4 +143,5 @@
       this.optimize = original.optimize;
       this.actualValueConfigurationIndex = original.actualValueConfigurationIndex;
+      this.isNullable = original.isNullable;
       if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
     }
@@ -151,13 +167,24 @@
     }
 
+    private void RegisterActualValueEvents() {
+      if (this.ActualValue != null) this.ActualValue.ToStringChanged += new EventHandler(ActualValue_ToStringChanged);
+    }
+    private void DeregisterActualValueEvents() {
+      if (this.ActualValue != null) this.ActualValue.ToStringChanged -= new EventHandler(ActualValue_ToStringChanged);
+    }
+
     private void PopulateValueConfigurations() {
       foreach (IItem validValue in this.validValues) {
-        IItem val;
-        if (ActualValue.Value != null && ActualValue.ValueDataType == validValue.GetType()) {
-          val = ActualValue.Value; // use existing value for that type (if available)
+        if (validValue is NullValue) {
+          this.ValueConfigurations.Add(new NullValueConfiguration());
         } else {
-          val = validValue;
-        }
-        this.ValueConfigurations.Add(new ValueConfiguration(val, val.GetType()), true);
+          IItem val;
+          if (ActualValue.Value != null && ActualValue.ValueDataType == validValue.GetType()) {
+            val = ActualValue.Value; // use existing value for that type (if available)
+          } else {
+            val = validValue;
+          }
+          this.ValueConfigurations.Add(new ValueConfiguration(val, val.GetType()), true);
+        }
       }
     }
@@ -223,4 +250,10 @@
 
     #region Events
+    void ActualValue_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
+
+    #region Event Handler
     public virtual event EventHandler NameChanged;
     protected virtual void OnNameChanged(object sender, EventArgs e) {
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/ConstrainedValue.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/ConstrainedValue.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RangeConstraints/ConstrainedValue.cs	(revision 5110)
@@ -32,4 +32,26 @@
     }
 
+    [Storable]
+    protected IItemSet<IItem> validValues;
+    public IItemSet<IItem> ValidValues {
+      get { return validValues; }
+      protected set {
+        if (this.validValues != value) {
+          this.validValues = value;
+        }
+      }
+    }
+
+    [Storable]
+    protected bool isNullable;
+    public bool IsNullable {
+      get { return isNullable; }
+      protected set {
+        if (this.isNullable != value) {
+          this.isNullable = value;
+        }
+      }
+    }
+
     private void RegisterEvents() {
       this.value.ToStringChanged += new EventHandler(value_ToStringChanged);
@@ -43,11 +65,15 @@
     [StorableConstructor]
     protected ConstrainedValue(bool deserializing) : base(deserializing) { }
-    public ConstrainedValue(IItem value, Type valueDataType) {
+    public ConstrainedValue(IItem value, Type valueDataType, IItemSet<IItem> validValues, bool isNullable) {
       this.Value = value;
       this.ValueDataType = valueDataType;
+      this.ValidValues = validValues;
+      this.isNullable = isNullable;
     }
     protected ConstrainedValue(ConstrainedValue original, Cloner cloner) : base(original, cloner) {
       this.valueDataType = original.valueDataType;
       this.Value = cloner.Clone(original.value);
+      this.ValidValues = cloner.Clone(original.ValidValues);
+      this.isNullable = original.isNullable;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/CheckedValueConfigurationCollection.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 5110)
@@ -19,11 +19,11 @@
 
     [Storable]
-    protected Type valueDataType;
-    public Type ValueDataType {
-      get { return valueDataType; }
+    protected IItemSet<IItem> validValues;
+    public IItemSet<IItem> ValidValues {
+      get { return validValues; }
     }
 
-    public CheckedValueConfigurationCollection(Type valueDataType) {
-      this.valueDataType = valueDataType;
+    public CheckedValueConfigurationCollection(IItemSet<IItem> validValues) {
+      this.validValues = validValues;
       RegisterEvents();
     }
@@ -37,5 +37,5 @@
     protected CheckedValueConfigurationCollection(CheckedValueConfigurationCollection original, Cloner cloner) : base(original, cloner) {
       this.minItemCount = original.MinItemCount;
-      this.valueDataType = original.valueDataType;
+      this.validValues = original.validValues;
       RegisterEvents();
     }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/NullValueConfiguration.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/NullValueConfiguration.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/NullValueConfiguration.cs	(revision 5110)
@@ -0,0 +1,31 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NullValueConfiguration : ValueConfiguration {
+
+    public NullValueConfiguration() {
+      this.ParameterConfigurations = new ItemList<IParameterConfiguration>();
+      this.ActualValue = new ConstrainedValue(null, null, null, true);
+      this.IsOptimizable = false;
+    }
+    [StorableConstructor]
+    protected NullValueConfiguration(bool deserializing) : base(deserializing) { }
+    protected NullValueConfiguration(NullValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NullValueConfiguration(this, cloner);
+    }
+
+    public override string ToString() {
+      return "null";
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs	(revision 5110)
@@ -8,4 +8,5 @@
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -57,4 +58,5 @@
       set {
         if (this.actualValue != value) {
+          RegisterActualValueEvents();
           ClearParameterConfigurations();
           this.actualValue = value;
@@ -62,4 +64,5 @@
           OnValueChanged();
           OnToStringChanged();
+          DeregisterActualValueEvents();
         }
       }
@@ -70,4 +73,11 @@
     public IRange RangeConstraint {
       get { return rangeConstraint; }
+      private set {
+        if (rangeConstraint != value) {
+          DeregisterRangeConstraintEvents();
+          rangeConstraint = value;
+          RegisterActualValueEvents();
+        }
+      }
     }
 
@@ -75,5 +85,6 @@
     public ValueConfiguration(IItem value, Type valueDataType) {
       this.ParameterConfigurations = new ItemList<IParameterConfiguration>();
-      this.ActualValue = new ConstrainedValue(value, valueDataType);
+      var validValues = new ItemSet<IItem>(ApplicationManager.Manager.GetInstances(valueDataType).Select(x => (IItem)x).OrderBy(x => x.ItemName));
+      this.ActualValue = new ConstrainedValue(value, valueDataType, validValues, false);
       this.IsOptimizable = true;
       if (actualValue.ValueDataType == typeof(IntValue)) {
@@ -88,5 +99,5 @@
         rangeConstraint = null;
       }
-      RegisterEvents();
+      RegisterRangeConstraintEvents();
     }
 
@@ -101,5 +112,6 @@
       this.isOptimizable = original.isOptimizable;
       this.optimize = original.optimize;
-      RegisterEvents();
+      RegisterActualValueEvents();
+      RegisterRangeConstraintEvents();
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -108,5 +120,5 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      RegisterEvents();
+      RegisterRangeConstraintEvents();
     }
     #endregion
@@ -122,14 +134,19 @@
     }
 
-    private void RegisterEvents() {
+    private void RegisterRangeConstraintEvents() {
       if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged += new EventHandler(RangeConstraint_ToStringChanged);
-      if (this.ActualValue != null) this.ActualValue.ToStringChanged += new EventHandler(ConstrainedValue_ToStringChanged);
-    }
-    private void DeregisterEvents() {
-      if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged += new EventHandler(RangeConstraint_ToStringChanged);
-      if (this.ActualValue != null) this.ActualValue.ToStringChanged += new EventHandler(ConstrainedValue_ToStringChanged);
-    }
-
-    void ConstrainedValue_ToStringChanged(object sender, EventArgs e) {
+    }
+    private void DeregisterRangeConstraintEvents() {
+      if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged -= new EventHandler(RangeConstraint_ToStringChanged);
+    }
+    private void RegisterActualValueEvents() {
+      if (this.actualValue != null) this.actualValue.ToStringChanged += new EventHandler(actualValue_ToStringChanged);
+    }
+    private void DeregisterActualValueEvents() {
+      if (this.actualValue != null) this.actualValue.ToStringChanged -= new EventHandler(actualValue_ToStringChanged);
+    }
+
+    #region Events
+    void actualValue_ToStringChanged(object sender, EventArgs e) {
       OnToStringChanged();
     }
@@ -137,5 +154,6 @@
       OnToStringChanged();
     }
-
+    #endregion
+    
     #region IItem Members
     public override string ItemDescription {
@@ -151,5 +169,5 @@
     }
     #endregion
-
+    
     #region Event Handlers
     public virtual event EventHandler ValueChanged;
@@ -239,6 +257,6 @@
             //this.actualValue.Value = new DoubleValue((((DoubleValue)this.actualValue.Value).Value + ((DoubleValue)other.ActualValue.Value).Value) / 2);
             RealVector[] parents = new RealVector[2];
-            parents[0] = new RealVector( new double[] {((DoubleValue)this.actualValue.Value).Value} );
-            parents[1] = new RealVector( new double[] {((DoubleValue)other.ActualValue.Value).Value} );
+            parents[0] = new RealVector(new double[] { ((DoubleValue)this.actualValue.Value).Value });
+            parents[1] = new RealVector(new double[] { ((DoubleValue)other.ActualValue.Value).Value });
 
             if (random.NextDouble() < 0.5) {
@@ -248,5 +266,5 @@
             }
             //this.actualValue.Value = new DoubleValue(AverageCrossover.Apply(random, new ItemArray<RealVector>(parents)).First());
-            
+
           } else if (this.actualValue.ValueDataType == typeof(PercentValue)) {
             //this.actualValue.Value = new PercentValue((((PercentValue)this.actualValue.Value).Value + ((PercentValue)other.ActualValue.Value).Value) / 2);
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 5110)
@@ -18,6 +18,4 @@
   [StorableClass]
   public class MetaOptimizationEvaluator : SingleSuccessorOperator, IMetaOptimizationEvaluator {
-    private const string RepetitionsParameterName = "Repetitions";
-
     private bool algorithmStopped;
 
@@ -26,19 +24,18 @@
     }
     public ILookupParameter<EngineAlgorithm> AlgorithmParameter {
-      get { return (ILookupParameter<EngineAlgorithm>)Parameters["Algorithm"]; }
+      get { return (ILookupParameter<EngineAlgorithm>)Parameters[MetaOptimizationProblem.AlgorithmTypeParameterName]; }
     }
     public ILookupParameter<IItemList<ISingleObjectiveProblem>> ProblemsParameter {
-      get { return (ILookupParameter<IItemList<ISingleObjectiveProblem>>)Parameters["Problems"]; }
+      get { return (ILookupParameter<IItemList<ISingleObjectiveProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
     }
     public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
       get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
     }
-    public ValueParameter<IntValue> RepetitionsParameter {
-      get { return (ValueParameter<IntValue>)Parameters[RepetitionsParameterName]; }
+    public LookupParameter<IntValue> RepetitionsParameter {
+      get { return (LookupParameter<IntValue>)Parameters[MetaOptimizationProblem.RepetitionsParameterName]; }
     }
 
     public IntValue Repetitions {
-      get { return RepetitionsParameter.Value; }
-      set { RepetitionsParameter.Value = value; }
+      get { return RepetitionsParameter.ActualValue; }
     }
 
@@ -46,8 +43,8 @@
       : base() {
       Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the ParameterVector."));
-      Parameters.Add(new LookupParameter<EngineAlgorithm>("Algorithm", "Missing description."));
-      Parameters.Add(new LookupParameter<IItemList<ISingleObjectiveProblem>>("Problems", "Missing description."));
+      Parameters.Add(new LookupParameter<EngineAlgorithm>(MetaOptimizationProblem.AlgorithmTypeParameterName, "Missing description."));
+      Parameters.Add(new LookupParameter<IItemList<ISingleObjectiveProblem>>(MetaOptimizationProblem.ProblemsParameterName, "Missing description."));
       Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", "Missing description."));
-      Parameters.Add(new ValueParameter<IntValue>(RepetitionsParameterName, "Number of evaluations for one individual.", new IntValue(3)));
+      Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
     }
 
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5110)
@@ -38,5 +38,41 @@
     <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</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>bin\x86\Release\</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>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Collections-3.3">
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
@@ -78,4 +114,7 @@
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.SequentialEngine-3.3">
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
@@ -94,4 +133,7 @@
     <None Include="Properties\AssemblyInfo.cs.frame" />
     <None Include="HeuristicLabProblemsMetaOptimizationPlugin.cs.frame" />
+    <Compile Include="ConstrainedItemList.cs" />
+    <Compile Include="Encodings\NullValue.cs" />
+    <Compile Include="Encodings\ValueConfigurations\NullValueConfiguration.cs" />
     <Compile Include="Encodings\RangeConstraints\ConstrainedValue.cs">
       <SubType>Code</SubType>
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/ICheckedValueConfigurationCollection.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/ICheckedValueConfigurationCollection.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/ICheckedValueConfigurationCollection.cs	(revision 5110)
@@ -8,5 +8,5 @@
   public interface ICheckedValueConfigurationCollection : ICheckedItemCollection<IValueConfiguration> {
     int MinItemCount { get; }
-    Type ValueDataType { get; }
+    IItemSet<IItem> ValidValues { get; }
   }
 }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5109)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5110)
@@ -29,4 +29,6 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Problems.TestFunctions;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -35,49 +37,58 @@
   [StorableClass]
   public sealed class MetaOptimizationProblem : SingleObjectiveProblem<IMetaOptimizationEvaluator, IParameterConfigurationCreator> {
-    private const string AlgorithmParameterName = "Algorithm";
-    private const string ProblemsParameterName = "Problems";
-    private const string AlgorithmParameterConfigurationParameterName = "InitialParameterConfigurationTree";
-    //private const string ProblemParametersConfigurationParameterName = "ProblemParametersConfiguration";
+    public const string AlgorithmTypeParameterName = "AlgorithmType";
+    public const string ProblemTypeParameterName = "ProblemType";
+    public const string ProblemsParameterName = "Problems";
+    public const string ParameterConfigurationParameterName = "InitialParameterConfigurationTree";
+    public const string RepetitionsParameterName = "Repetitions";
 
     #region Parameter Properties
-    public IValueParameter<EngineAlgorithm> AlgorithmParameter {
-      get { return (ValueParameter<EngineAlgorithm>)Parameters[AlgorithmParameterName]; }
+    public IValueParameter<EngineAlgorithm> AlgorithmTypeParameter {
+      get { return (ValueParameter<EngineAlgorithm>)Parameters[AlgorithmTypeParameterName]; }
     }
-    public IValueParameter<IItemList<ISingleObjectiveProblem>> ProblemsParameter {
-      get { return (ValueParameter<IItemList<ISingleObjectiveProblem>>)Parameters[ProblemsParameterName]; }
+    public IValueParameter<ISingleObjectiveProblem> ProblemTypeParameter {
+      get { return (ValueParameter<ISingleObjectiveProblem>)Parameters[ProblemTypeParameterName]; }
     }
-    public IValueParameter<ParameterConfigurationTree> AlgorithmParameterConfigurationParameter {
-      get { return (ValueParameter<ParameterConfigurationTree>)Parameters[AlgorithmParameterConfigurationParameterName]; }
+    public IValueParameter<ConstrainedItemList<ISingleObjectiveProblem>> ProblemsParameter {
+      get { return (ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>)Parameters[ProblemsParameterName]; }
     }
-    //public ValueParameter<IItemList<IParameterConfiguration>> ProblemParametersConfigurationParameter {
-    //  get { return (ValueParameter<IItemList<IParameterConfiguration>>)Parameters[ProblemParametersConfigurationParameterName]; }
-    //}
+    public IValueParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ValueParameter<ParameterConfigurationTree>)Parameters[ParameterConfigurationParameterName]; }
+    }
+    public IValueParameter<IntValue> RepetitionsParameter {
+      get { return (ValueParameter<IntValue>)Parameters[RepetitionsParameterName]; }
+    }
     #endregion
 
     #region Properties
     public EngineAlgorithm Algorithm {
-      get { return AlgorithmParameter.Value; }
-      set { AlgorithmParameter.Value = value; }
+      get { return AlgorithmTypeParameter.Value; }
+      set { AlgorithmTypeParameter.Value = value; }
     }
-    public IItemList<ISingleObjectiveProblem> Problems {
+    public ISingleObjectiveProblem Problem {
+      get { return ProblemTypeParameter.Value; }
+      set { ProblemTypeParameter.Value = value; }
+    }
+    public ConstrainedItemList<ISingleObjectiveProblem> Problems {
       get { return ProblemsParameter.Value; }
       set { ProblemsParameter.Value = value; }
     }
     public ParameterConfigurationTree AlgorithmParameterConfiguration {
-      get { return AlgorithmParameterConfigurationParameter.Value; }
-      set { AlgorithmParameterConfigurationParameter.Value = value; }
+      get { return ParameterConfigurationParameter.Value; }
+      set { ParameterConfigurationParameter.Value = value; }
     }
-    //public IItemList<IParameterConfiguration> ProblemParametersConfiguration {
-    //  get { return ProblemParametersConfigurationParameter.Value; }
-    //  set { ProblemParametersConfigurationParameter.Value = value; }
-    //}
+    public IntValue Repetitions {
+      get { return RepetitionsParameter.Value; }
+      set { RepetitionsParameter.Value = value; }
+    }
     #endregion
 
     public MetaOptimizationProblem() : base() {
-      Parameters.Add(new ValueParameter<EngineAlgorithm>(AlgorithmParameterName, "The algorithm which's parameters should be optimized."));
-      Parameters.Add(new ValueParameter<IItemList<ISingleObjectiveProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ItemList<ISingleObjectiveProblem>()));
-      Parameters.Add(new ValueParameter<ParameterConfigurationTree>(AlgorithmParameterConfigurationParameterName, "List of algorithm parameters that should be optimized."));
-      //Parameters.Add(new ValueParameter<IItemList<IParameterConfiguration>>(ProblemParametersConfigurationParameterName, "List of problem parameters that should be optimized.", new ItemList<IParameterConfiguration>()));
-      
+      Parameters.Add(new ValueParameter<EngineAlgorithm>(AlgorithmTypeParameterName, "The algorithm which's parameters should be optimized.", new GeneticAlgorithm()));
+      Parameters.Add(new ValueParameter<ISingleObjectiveProblem>(ProblemTypeParameterName, "The problem type.", new SingleObjectiveTestFunctionProblem()));
+      Parameters.Add(new ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ConstrainedItemList<ISingleObjectiveProblem>()));
+      Parameters.Add(new ValueParameter<ParameterConfigurationTree>(ParameterConfigurationParameterName, "List of algorithm parameters that should be optimized."));
+      Parameters.Add(new ValueParameter<IntValue>(RepetitionsParameterName, "The number of evaluations for each problem.", new IntValue(3)));
+
       Maximization = new BoolValue(false);
       SolutionCreator = new RandomParameterConfigurationCreator();
@@ -89,4 +100,8 @@
       ParameterizeEvaluator();
       ParameterizeOperators();
+
+      Problems.Type = Problem.GetType();
+      Algorithm.Problem = Problem;
+      ParameterConfigurationParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
     }
 
@@ -110,6 +125,8 @@
       EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
       Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
-      AlgorithmParameter.ValueChanged += new EventHandler(BaseLevelAlgorithmParameter_ValueChanged);
+      AlgorithmTypeParameter.ValueChanged += new EventHandler(AlgorithmTypeParameter_ValueChanged);
+      ProblemTypeParameter.ValueChanged += new EventHandler(ProblemTypeParameter_ValueChanged);
     }
+    
     private void InitializeOperators() {
       Operators.AddRange(ApplicationManager.Manager.GetInstances<IParameterConfigurationOperator>().Cast<IOperator>());
@@ -117,6 +134,4 @@
     }
     private void ParameterizeSolutionCreator() {
-      //SolutionCreator.ParametersToOptimize = this.ParametersToOptimize;
-      
     }
     private void ParameterizeEvaluator() {
@@ -124,5 +139,4 @@
     }
     private void ParameterizeAnalyzer() {
-      //BestQualityAnalyzer.ResultsParameter.ActualName = "Results";
     }
     private void ParameterizeOperators() {
@@ -150,15 +164,12 @@
       ParameterizeAnalyzer();
     }
-    void BaseLevelAlgorithmParameter_ValueChanged(object sender, EventArgs e) {
-      AlgorithmParameterConfiguration = new ParameterConfigurationTree(Algorithm);
-
-      //Algorithm.ProblemChanged += new EventHandler(BaseLevelAlgorithm_ProblemChanged); // when to deregister?
-      //BaseLevelAlgorithm_ProblemChanged(sender, e);
+    void AlgorithmTypeParameter_ValueChanged(object sender, EventArgs e) {
+      Algorithm.Problem = Problem;
+      ParameterConfigurationParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
     }
-
-    void BaseLevelAlgorithm_ProblemChanged(object sender, EventArgs e) {
-      //if (Algorithm != null && Algorithm.Problem != null) {
-      //  AlgorithmParameterConfiguration = new ParameterConfigurationTree(Algorithm);
-      //}
+    void ProblemTypeParameter_ValueChanged(object sender, EventArgs e) {
+      Problems.Type = Problem.GetType();
+      Algorithm.Problem = Problem;
+      ParameterConfigurationParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
     }
     #endregion
