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 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 4830)
@@ -83,4 +83,10 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="RootParameterConfigurationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RootParameterConfigurationView.Designer.cs">
+      <DependentUpon>RootParameterConfigurationView.cs</DependentUpon>
+    </Compile>
     <Compile Include="NumericRangeView.cs">
       <SubType>UserControl</SubType>
@@ -101,10 +107,4 @@
       <DependentUpon>ParameterConfigurationListView.cs</DependentUpon>
     </Compile>
-    <Compile Include="NumericParameterConfigurationView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="NumericParameterConfigurationView.Designer.cs">
-      <DependentUpon>NumericParameterConfigurationView.cs</DependentUpon>
-    </Compile>
     <Compile Include="HeuristicLabProblemsMetaOptimizationViewsPlugin.cs" />
     <Compile Include="ParameterConfigurationView.cs">
@@ -115,4 +115,10 @@
     </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ValueView.Designer.cs">
+      <DependentUpon>ValueView.cs</DependentUpon>
+    </Compile>
   </ItemGroup>
   <ItemGroup>
@@ -127,4 +133,7 @@
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="RootParameterConfigurationView.resx">
+      <DependentUpon>RootParameterConfigurationView.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="NumericRangeView.resx">
       <DependentUpon>NumericRangeView.cs</DependentUpon>
@@ -136,9 +145,9 @@
       <DependentUpon>ParameterConfigurationListView.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="NumericParameterConfigurationView.resx">
-      <DependentUpon>NumericParameterConfigurationView.cs</DependentUpon>
-    </EmbeddedResource>
     <EmbeddedResource Include="ParameterConfigurationView.resx">
       <DependentUpon>ParameterConfigurationView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ValueView.resx">
+      <DependentUpon>ValueView.cs</DependentUpon>
     </EmbeddedResource>
   </ItemGroup>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericParameterConfigurationView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericParameterConfigurationView.Designer.cs	(revision 4539)
+++ 	(revision )
@@ -1,75 +1,0 @@
-﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
-  partial class NumericParameterConfigurationView {
-    /// <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.itemListView = new HeuristicLab.Core.Views.ItemCollectionView<INumericRange>();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // nameTextBox
-      // 
-      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(657, 20);
-      // 
-      // descriptionTextBox
-      // 
-      this.descriptionTextBox.Size = new System.Drawing.Size(657, 20);
-      // 
-      // itemListView
-      // 
-      this.itemListView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right | System.Windows.Forms.AnchorStyles.Bottom)));
-      this.itemListView.Caption = "Ranges";
-      this.itemListView.Content = null;
-      this.itemListView.Location = new System.Drawing.Point(0, 56);
-      this.itemListView.Name = "itemListView";
-      this.itemListView.ReadOnly = false;
-      this.itemListView.Size = new System.Drawing.Size(729, 425);
-      this.itemListView.TabIndex = 4;
-      // 
-      // NumericParameterConfigurationView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.itemListView);
-      this.Name = "NumericParameterConfigurationView";
-      this.Size = new System.Drawing.Size(729, 481);
-      this.Controls.SetChildIndex(this.itemListView, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionLabel, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private Core.Views.ItemCollectionView<INumericRange> itemListView;
-
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericParameterConfigurationView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericParameterConfigurationView.cs	(revision 4539)
+++ 	(revision )
@@ -1,48 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-using HeuristicLab.MainForm;
-using HeuristicLab.Core.Views;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MetaOptimization.Views {
-  /// <summary>
-  /// The visual representation of a <see cref="ParameterConfiguration"/>.
-  /// </summary>
-  [View("NumericParameterConfiguration View")]
-  [Content(typeof(NumericParameterConfiguration), true)]
-  public partial class NumericParameterConfigurationView : NamedItemView {
-    /// <summary>
-    /// Gets or sets the variable to represent visually.
-    /// </summary>
-    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
-    /// No own data storage present.</remarks>
-    public new NumericParameterConfiguration Content {
-      get { return (NumericParameterConfiguration)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public NumericParameterConfigurationView() {
-      InitializeComponent();
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content != null) {
-        itemListView.Content = Content.Ranges;
-      } else {
-        itemListView.Content = null;
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-    }
-
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericParameterConfigurationView.resx
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericParameterConfigurationView.resx	(revision 4539)
+++ 	(revision )
@@ -1,126 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>107, 17</value>
-  </metadata>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericRangeView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericRangeView.Designer.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericRangeView.Designer.cs	(revision 4830)
@@ -1,4 +1,4 @@
 ﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
-  partial class NumericRangeView {
+  partial class IntValueRangeView {
     /// <summary> 
     /// Required designer variable.
@@ -56,4 +56,5 @@
       this.lowerValueView.Caption = "StringConvertibleValue View";
       this.lowerValueView.Content = null;
+      this.lowerValueView.LabelVisible = true;
       this.lowerValueView.Location = new System.Drawing.Point(38, 0);
       this.lowerValueView.Name = "lowerValueView";
@@ -68,4 +69,5 @@
       this.upperValueView.Caption = "StringConvertibleValue View";
       this.upperValueView.Content = null;
+      this.upperValueView.LabelVisible = true;
       this.upperValueView.Location = new System.Drawing.Point(38, 29);
       this.upperValueView.Name = "upperValueView";
@@ -89,4 +91,5 @@
       this.stepSizeValueView.Caption = "StringConvertibleValue View";
       this.stepSizeValueView.Content = null;
+      this.stepSizeValueView.LabelVisible = true;
       this.stepSizeValueView.Location = new System.Drawing.Point(38, 58);
       this.stepSizeValueView.Name = "stepSizeValueView";
@@ -95,5 +98,5 @@
       this.stepSizeValueView.TabIndex = 5;
       // 
-      // NumericRangeView
+      // IntValueRangeView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -105,6 +108,6 @@
       this.Controls.Add(this.upperValueView);
       this.Controls.Add(this.lowerValueView);
-      this.Name = "NumericRangeView";
-      this.Size = new System.Drawing.Size(434, 145);
+      this.Name = "IntValueRangeView";
+      this.Size = new System.Drawing.Size(434, 85);
       this.ResumeLayout(false);
       this.PerformLayout();
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericRangeView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericRangeView.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/NumericRangeView.cs	(revision 4830)
@@ -14,9 +14,9 @@
 namespace HeuristicLab.Problems.MetaOptimization.Views {
   /// <summary>
-  /// The visual representation of a <see cref="INumericRange"/>.
+  /// The visual representation of a <see cref="IIntegerRange"/>.
   /// </summary>
   [View("NumericRange View")]
-  [Content(typeof(INumericRange), true)]
-  public partial class NumericRangeView : ItemView {
+  [Content(typeof(IRange<IntValue>), true)]
+  public partial class IntValueRangeView : ItemView {
     /// <summary>
     /// Gets or sets the variable to represent visually.
@@ -24,10 +24,10 @@
     /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
     /// No own data storage present.</remarks>
-    public new INumericRange Content {
-      get { return (INumericRange)base.Content; }
+    public new IRange<IntValue> Content {
+      get { return (IRange<IntValue>)base.Content; }
       set { base.Content = value; }
     }
 
-    public NumericRangeView() {
+    public IntValueRangeView() {
       InitializeComponent();
     }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ObjectSelectorDialog.cs	(revision 4830)
@@ -13,5 +13,5 @@
     private bool initialized;
     private List<IItem> items;
-    private IEnumerable<IGrouping<string, T>> selectableItems;
+    private IEnumerable<IGrouping<Type, T>> selectableItems;
 
     private T item;
@@ -20,5 +20,5 @@
     }
 
-    public ObjectSelectorDialog(IEnumerable<IGrouping<string, T>> selectableItems) {
+    public ObjectSelectorDialog(IEnumerable<IGrouping<Type, T>> selectableItems) {
       this.initialized = false;
       this.items = new List<IItem>();
@@ -32,14 +32,14 @@
         itemsListView.SmallImageList = new ImageList();
 
-        foreach (IGrouping<string, T> category in selectableItems) {
-          ListViewGroup group = new ListViewGroup(category.Key);
+        foreach (IGrouping<Type, T> item in selectableItems) {
+          ListViewGroup group = new ListViewGroup(item.Key.Name);
           itemsListView.Groups.Add(group);
-          foreach (T i in category) {
+          foreach (T i in item) {
             items.Add(i);
-            ListViewItem item = new ListViewItem(new string[] { i.Name, i.Description, i.ItemName }, group);
+            ListViewItem value = new ListViewItem(new string[] { i.Name, i.Description, i.ItemName }, group);
             itemsListView.SmallImageList.Images.Add(i.ItemImage);
-            item.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
-            item.Tag = i;
-            itemsListView.Items.Add(item);
+            value.ImageIndex = itemsListView.SmallImageList.Images.Count - 1;
+            value.Tag = i;
+            itemsListView.Items.Add(value);
           }
         }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationListView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationListView.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationListView.cs	(revision 4830)
@@ -11,4 +11,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Collections;
 
 namespace HeuristicLab.Problems.MetaOptimization.Views {
@@ -17,5 +18,5 @@
   /// </summary>
   [View("ParameterConfigurationList View")]
-  [Content(typeof(ParameterConfigurationList), true)]
+  [Content(typeof(IItemList<IParameterConfiguration>), true)]
   public partial class ParameterConfigurationListView : ItemCollectionView<IParameterConfiguration> {
     /// <summary>
@@ -24,6 +25,6 @@
     /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
     /// No own data storage present.</remarks>
-    public new ParameterConfigurationList Content {
-      get { return (ParameterConfigurationList)base.Content; }
+    public new IItemList<IParameterConfiguration> Content {
+      get { return (IItemList<IParameterConfiguration>)base.Content; }
       set { base.Content = value; }
     }
@@ -35,9 +36,7 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.CheckedItemsChanged += new Collections.CollectionItemsChangedEventHandler<IParameterConfiguration>(Content_CheckedItemsChanged);
     }
 
     protected override void DeregisterContentEvents() {
-      Content.CheckedItemsChanged -= new Collections.CollectionItemsChangedEventHandler<IParameterConfiguration>(Content_CheckedItemsChanged);
       base.DeregisterContentEvents();
     }
@@ -45,59 +44,5 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      while (itemsListView.Items.Count > 0) RemoveListViewItem(itemsListView.Items[0]);
-      viewHost.Content = null;
-      if (Content != null) {
-        Caption += " (" + Content.GetType().Name + ")";
-        foreach (IParameterConfiguration item in Content.CheckedItems)
-          AddListViewItem(CreateListViewItem(item));
-        AdjustListViewColumnSizes();
-        SortItemsListView(SortOrder.Ascending);
-      }
     }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-    }
-
-    protected override void addButton_Click(object sender, EventArgs e) {
-      var selectorDialog = new ObjectSelectorDialog<IParameterConfiguration>(from c in Content
-                                                                             where !Content.ItemChecked(c)
-                                                                             group c by c.Category);
-      if (selectorDialog.ShowDialog() == DialogResult.OK) {
-        Content.SetItemCheckedState(selectorDialog.Item, true);
-      }
-    }
-
-    protected override void removeButton_Click(object sender, EventArgs e) {
-      if (itemsListView.SelectedItems.Count > 0) {
-        foreach (ListViewItem item in itemsListView.SelectedItems)
-          Content.SetItemCheckedState((IParameterConfiguration)item.Tag, false);
-        itemsListView.SelectedItems.Clear();
-      }
-    }
-
-    private void Content_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IParameterConfiguration> e) {
-      foreach (IParameterConfiguration item in e.Items) {
-        if (!Content.ItemChecked(item)) {
-          ListViewItem found = FindListViewItem(item);
-          if(found != null)
-            RemoveListViewItem(found);
-        } else {
-          ListViewItem found = FindListViewItem(item);
-          if (found == null)
-            AddListViewItem(CreateListViewItem(item));
-        }
-      }
-    }
-
-    #region Helpers
-    private ListViewItem FindListViewItem(IParameterConfiguration tag) {
-      foreach (ListViewItem item in itemsListView.Items) {
-        if (item.Tag == tag)
-          return item;
-      }
-      return null;
-    }
-    #endregion
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationView.Designer.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationView.Designer.cs	(revision 4830)
@@ -25,5 +25,15 @@
     private void InitializeComponent() {
       this.optimizeCheckBox = new System.Windows.Forms.CheckBox();
-      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.valueTabPage = new System.Windows.Forms.TabPage();
+      this.valueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.configurationtabPage = new System.Windows.Forms.TabPage();
+      this.configurationViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.childParameterTabPage = new System.Windows.Forms.TabPage();
+      this.childParameterConfigurationListView = new HeuristicLab.Problems.MetaOptimization.Views.ParameterConfigurationListView();
+      this.tabControl.SuspendLayout();
+      this.valueTabPage.SuspendLayout();
+      this.configurationtabPage.SuspendLayout();
+      this.childParameterTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -39,17 +49,92 @@
       this.optimizeCheckBox.CheckedChanged += new System.EventHandler(this.optimizeCheckBox_CheckedChanged);
       // 
-      // viewHost
+      // tabControl
       // 
-      this.viewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+      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.viewHost.Caption = "View";
-      this.viewHost.Content = null;
-      this.viewHost.Location = new System.Drawing.Point(0, 26);
-      this.viewHost.Name = "viewHost";
-      this.viewHost.ReadOnly = false;
-      this.viewHost.Size = new System.Drawing.Size(729, 455);
-      this.viewHost.TabIndex = 7;
-      this.viewHost.ViewType = null;
+      this.tabControl.Controls.Add(this.valueTabPage);
+      this.tabControl.Controls.Add(this.configurationtabPage);
+      this.tabControl.Controls.Add(this.childParameterTabPage);
+      this.tabControl.Location = new System.Drawing.Point(3, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(553, 447);
+      this.tabControl.TabIndex = 5;
+      // 
+      // valueTabPage
+      // 
+      this.valueTabPage.Controls.Add(this.valueViewHost);
+      this.valueTabPage.Location = new System.Drawing.Point(4, 22);
+      this.valueTabPage.Name = "valueTabPage";
+      this.valueTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.valueTabPage.Size = new System.Drawing.Size(545, 421);
+      this.valueTabPage.TabIndex = 0;
+      this.valueTabPage.Text = "Value";
+      this.valueTabPage.UseVisualStyleBackColor = true;
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueViewHost.Caption = "Value";
+      this.valueViewHost.Content = null;
+      this.valueViewHost.Enabled = false;
+      this.valueViewHost.Location = new System.Drawing.Point(3, 3);
+      this.valueViewHost.Name = "valueViewHost";
+      this.valueViewHost.ReadOnly = false;
+      this.valueViewHost.Size = new System.Drawing.Size(539, 415);
+      this.valueViewHost.TabIndex = 0;
+      this.valueViewHost.ViewType = null;
+      // 
+      // configurationtabPage
+      // 
+      this.configurationtabPage.Controls.Add(this.configurationViewHost);
+      this.configurationtabPage.Location = new System.Drawing.Point(4, 22);
+      this.configurationtabPage.Name = "configurationtabPage";
+      this.configurationtabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.configurationtabPage.Size = new System.Drawing.Size(545, 421);
+      this.configurationtabPage.TabIndex = 1;
+      this.configurationtabPage.Text = "Configuration";
+      this.configurationtabPage.UseVisualStyleBackColor = true;
+      // 
+      // configurationViewHost
+      // 
+      this.configurationViewHost.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.configurationViewHost.Caption = "Configuration";
+      this.configurationViewHost.Content = null;
+      this.configurationViewHost.Enabled = false;
+      this.configurationViewHost.Location = new System.Drawing.Point(4, 4);
+      this.configurationViewHost.Name = "configurationViewHost";
+      this.configurationViewHost.ReadOnly = false;
+      this.configurationViewHost.Size = new System.Drawing.Size(538, 414);
+      this.configurationViewHost.TabIndex = 0;
+      this.configurationViewHost.ViewType = null;
+      // 
+      // childParameterTabPage
+      // 
+      this.childParameterTabPage.Controls.Add(this.childParameterConfigurationListView);
+      this.childParameterTabPage.Location = new System.Drawing.Point(4, 22);
+      this.childParameterTabPage.Name = "childParameterTabPage";
+      this.childParameterTabPage.Size = new System.Drawing.Size(545, 421);
+      this.childParameterTabPage.TabIndex = 2;
+      this.childParameterTabPage.Text = "Child Parameters";
+      this.childParameterTabPage.UseVisualStyleBackColor = true;
+      // 
+      // childParameterConfigurationListView
+      // 
+      this.childParameterConfigurationListView.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.childParameterConfigurationListView.Caption = "Parameter Configuration";
+      this.childParameterConfigurationListView.Content = null;
+      this.childParameterConfigurationListView.Location = new System.Drawing.Point(4, 4);
+      this.childParameterConfigurationListView.Name = "childParameterConfigurationListView";
+      this.childParameterConfigurationListView.ReadOnly = false;
+      this.childParameterConfigurationListView.Size = new System.Drawing.Size(538, 414);
+      this.childParameterConfigurationListView.TabIndex = 0;
       // 
       // ParameterConfigurationView
@@ -57,8 +142,12 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.viewHost);
+      this.Controls.Add(this.tabControl);
       this.Controls.Add(this.optimizeCheckBox);
       this.Name = "ParameterConfigurationView";
-      this.Size = new System.Drawing.Size(729, 481);
+      this.Size = new System.Drawing.Size(556, 473);
+      this.tabControl.ResumeLayout(false);
+      this.valueTabPage.ResumeLayout(false);
+      this.configurationtabPage.ResumeLayout(false);
+      this.childParameterTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -69,5 +158,11 @@
 
     private System.Windows.Forms.CheckBox optimizeCheckBox;
-    private MainForm.WindowsForms.ViewHost viewHost;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage valueTabPage;
+    private MainForm.WindowsForms.ViewHost valueViewHost;
+    private System.Windows.Forms.TabPage configurationtabPage;
+    private MainForm.WindowsForms.ViewHost configurationViewHost;
+    private System.Windows.Forms.TabPage childParameterTabPage;
+    private ParameterConfigurationListView childParameterConfigurationListView;
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationView.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationView.cs	(revision 4830)
@@ -10,4 +10,5 @@
 using HeuristicLab.Core.Views;
 using HeuristicLab.Core;
+using HeuristicLab.Collections;
 
 namespace HeuristicLab.Problems.MetaOptimization.Views {
@@ -16,5 +17,6 @@
   /// </summary>
   [View("ParameterConfiguration View")]
-  [Content(typeof(IParameterConfiguration), true)]
+  [Content(typeof(IParameterConfiguration), false)]
+  [Content(typeof(ParameterConfiguration), true)]
   public partial class ParameterConfigurationView : ItemView {
     /// <summary>
@@ -35,16 +37,72 @@
       base.OnContentChanged();
       if (Content != null) {
-        viewHost.Content = Content.Parameter;
+        optimizeCheckBox.Checked = Content.OptimizationEnabled;
+        valueViewHost.ViewType = typeof(ValueView);
+        valueViewHost.Content = Content;
+        if (Content is IntValueParameterConfiguration) {
+          configurationViewHost.Content = ((IntValueParameterConfiguration)Content).Ranges;
+        } else {
+          configurationViewHost.Content = null;
+        }
+
+        childParameterConfigurationListView.Content = ((ParameterConfiguration)Content).ChildParameterConfigurations;
       } else {
-        viewHost.Content = null;
+        valueViewHost.Content = null;
+        configurationViewHost.Content = null;
+        childParameterConfigurationListView.Content = null;
       }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ChildParameterConfigurations.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IParameterConfiguration>>(ChildParameterConfigurations_ItemsAdded);
+      Content.ChildParameterConfigurations.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IParameterConfiguration>>(ChildParameterConfigurations_ItemsRemoved);
+    }
+    protected override void DeregisterContentEvents() {
+      Content.ChildParameterConfigurations.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IParameterConfiguration>>(ChildParameterConfigurations_ItemsAdded);
+      Content.ChildParameterConfigurations.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IParameterConfiguration>>(ChildParameterConfigurations_ItemsRemoved);
+      base.DeregisterContentEvents();
+    }
+
+    void ChildParameterConfigurations_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<IParameterConfiguration>> e) {
+      SetEnabledStateOfControls();
+    }
+    
+    void ChildParameterConfigurations_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<IParameterConfiguration>> e) {
+      SetEnabledStateOfControls();
     }
 
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
+      this.SuspendLayout();
+      if (optimizeCheckBox.Checked) {
+        DisableTabPage(valueTabPage);
+        EnableTabPage(configurationtabPage);
+        if (Content.ChildParameterConfigurations.Count > 0)
+          EnableTabPage(childParameterTabPage);
+      } else {
+        DisableTabPage(configurationtabPage);
+        DisableTabPage(childParameterTabPage);
+        EnableTabPage(valueTabPage);
+      }
+      this.ResumeLayout();
     }
 
     private void optimizeCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.OptimizationEnabled = optimizeCheckBox.Checked;
+      SetEnabledStateOfControls();
+    }
 
+    protected void EnableTabPage(TabPage tabPage) {
+      if (!tabControl.TabPages.Contains(tabPage)) {
+        tabControl.TabPages.Add(tabPage);
+      }
+    }
+
+    protected void DisableTabPage(TabPage tabPage) {
+      if (tabControl.TabPages.Contains(tabPage)) {
+        tabControl.TabPages.Remove(tabPage);
+      }
     }
   }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.Designer.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.Designer.cs	(revision 4830)
@@ -0,0 +1,58 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class RootParameterConfigurationView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.listView = new HeuristicLab.Problems.MetaOptimization.Views.ParameterConfigurationListView();
+      this.SuspendLayout();
+      // 
+      // listView
+      // 
+      this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.listView.Caption = "ParameterConfigurationList View";
+      this.listView.Content = null;
+      this.listView.Location = new System.Drawing.Point(0, 0);
+      this.listView.Name = "listView";
+      this.listView.ReadOnly = false;
+      this.listView.Size = new System.Drawing.Size(556, 473);
+      this.listView.TabIndex = 0;
+      // 
+      // RootParameterConfigurationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.listView);
+      this.Name = "RootParameterConfigurationView";
+      this.Size = new System.Drawing.Size(556, 473);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private ParameterConfigurationListView listView;
+
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.cs	(revision 4830)
@@ -0,0 +1,50 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="ParameterConfiguration"/>.
+  /// </summary>
+  [View("ParameterConfiguration View")]
+  [Content(typeof(RootParameterConfiguration), true)]
+  public partial class RootParameterConfigurationView : ItemView {
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new RootParameterConfiguration Content {
+      get { return (RootParameterConfiguration)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public RootParameterConfigurationView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        listView.Content = new ItemList<IParameterConfiguration>(Content.ChildParameterConfigurations);
+      } else {
+        listView.Content = null;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.resx
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.resx	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootParameterConfigurationView.resx	(revision 4830)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.Designer.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.Designer.cs	(revision 4830)
@@ -0,0 +1,106 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ValueView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ValueView));
+      this.valueGroupBox = new System.Windows.Forms.GroupBox();
+      this.valueViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.clearValueButton = new System.Windows.Forms.Button();
+      this.setValueButton = new System.Windows.Forms.Button();
+      this.valueGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.AllowDrop = true;
+      this.valueGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueGroupBox.Controls.Add(this.valueViewHost);
+      this.valueGroupBox.Controls.Add(this.clearValueButton);
+      this.valueGroupBox.Controls.Add(this.setValueButton);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.valueGroupBox.Name = "valueGroupBox";
+      this.valueGroupBox.Size = new System.Drawing.Size(482, 274);
+      this.valueGroupBox.TabIndex = 7;
+      this.valueGroupBox.TabStop = false;
+      this.valueGroupBox.Text = "Value";
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.AllowDrop = true;
+      this.valueViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueViewHost.Caption = "View";
+      this.valueViewHost.Content = null;
+      this.valueViewHost.Enabled = false;
+      this.valueViewHost.Location = new System.Drawing.Point(6, 49);
+      this.valueViewHost.Name = "valueViewHost";
+      this.valueViewHost.ReadOnly = false;
+      this.valueViewHost.Size = new System.Drawing.Size(470, 219);
+      this.valueViewHost.TabIndex = 3;
+      this.valueViewHost.ViewType = null;
+      // 
+      // clearValueButton
+      // 
+      this.clearValueButton.Enabled = false;
+      this.clearValueButton.Image = ((System.Drawing.Image)(resources.GetObject("clearValueButton.Image")));
+      this.clearValueButton.Location = new System.Drawing.Point(36, 19);
+      this.clearValueButton.Name = "clearValueButton";
+      this.clearValueButton.Size = new System.Drawing.Size(24, 24);
+      this.clearValueButton.TabIndex = 1;
+      this.clearValueButton.UseVisualStyleBackColor = true;
+      this.clearValueButton.Click += new System.EventHandler(this.clearValueButton_Click);
+      // 
+      // setValueButton
+      // 
+      this.setValueButton.Image = ((System.Drawing.Image)(resources.GetObject("setValueButton.Image")));
+      this.setValueButton.Location = new System.Drawing.Point(6, 19);
+      this.setValueButton.Name = "setValueButton";
+      this.setValueButton.Size = new System.Drawing.Size(24, 24);
+      this.setValueButton.TabIndex = 0;
+      this.setValueButton.UseVisualStyleBackColor = true;
+      this.setValueButton.Click += new System.EventHandler(this.setValueButton_Click);
+      // 
+      // ValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.valueGroupBox);
+      this.Name = "ValueView";
+      this.Size = new System.Drawing.Size(482, 274);
+      this.valueGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox valueGroupBox;
+    protected MainForm.WindowsForms.ViewHost valueViewHost;
+    protected System.Windows.Forms.Button clearValueButton;
+    protected System.Windows.Forms.Button setValueButton;
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.cs	(revision 4830)
@@ -0,0 +1,55 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters.Views;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("Value View")]
+  [Content(typeof(IParameterConfiguration), false)]
+  public partial class ValueView : ItemView {
+
+    public new IParameterConfiguration Content {
+      get { return (IParameterConfiguration)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ValueView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      valueViewHost.Content = Content.Value;
+    }
+
+    private void setValueButton_Click(object sender, EventArgs e) {
+      var typeSelectorDialog = new TypeSelectorDialog();
+      typeSelectorDialog.Caption = "Select Value";
+      typeSelectorDialog.TypeSelector.Configure(Content.Parameter.DataType, false, true);
+
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.Value = (IItem)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          valueViewHost.Content = Content.Value;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+
+    private void clearValueButton_Click(object sender, EventArgs e) {
+      Content.Value = null;
+      valueViewHost.Content = null;
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.resx
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.resx	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ValueView.resx	(revision 4830)
@@ -0,0 +1,190 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="clearValueButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH
+        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp
+        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE
+        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs
+        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4
+        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR
+        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd
+        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF
+        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX
+        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF
+        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55
+        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ
+        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB
+        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC
+        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE
+        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I
+        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9
+        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG
+        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp
+        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ
+        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC
+        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln
+        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v
+        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp
+        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L
+        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA
+        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z
+        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW
+        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s
+        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6
+        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw
+        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR
+        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm
+        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl
+        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2
+        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8
+        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za
+        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v
+        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb
+        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/
+        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h
+        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr
+        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS
+        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+
+        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/
+        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDgAACw4BQL7hQQAAAbVJREFUOE+lk7lLA0EU
+        xuMRcdeYyIBRQcmxURTiEXE8ECQqpAkpJJVNihSKjVjbW1lJChuxtBGUNGKRwj9AvA9QEMRGS01M4YYZ
+        v9nN5twgavGDt/tmvn3HtxbOueU/6JcpGQEpMAfqfyMoLjeAZbYU5iw2ryJe0N6ZVUZJI3JesGrkhYB4
+        GQdHLB7iIId4vUqEkmZRIYvNiY/sFAX0FrrApCYSHeNscZojToKWfIsSm/UkkROXN4GtXMAol5ImJNdY
+        qFcVQoj3wBBI5EUTiB2l7VVvgJI6HBoA51pLkaEvkMbzAZAqZ1N7hZQEWZSqLDIoKnkCxGyw5gKUuHHh
+        CrBsoI2nA3Yh8vCzgPAAJS5wy6c7c69+u/DGmBjum18TWQF1tWdASSefcp5nZt381ic/prqsQW0TOtsX
+        Xkm9ViRMt+jeYgtiz1Md+yBz5pE+Tl3N0cJB3QP2lwHb450iHyfbG3qMgZYKhLMTTn7plfi1Ih8WPFBc
+        sWjPd9Jt/UR144g1yxv/gtj/xnO/jd8o8j3iPuNA2eBg8fdhxy5ytFxAd+Mo2AIzoLVyWCXtCOvL5k78
+        w6/9DUORY3pvwx7IAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="setValueButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABA0lEQVQ4T2P4//8/AyWYJM2H
+        6jI81+bE/QfhPZWpBiCLiTZg/bwKJ5DG1/Mb/18ogxhCtAEgzbs31P5fs+PU/4utxWDNE0xNiTMApHnn
+        muL/7x70/L95JOd/W1stWHOzpb4fQReANG9flgrWfH1/0v9Nszz/iwnx/U8L1QD7H68ByDYjay5N0rVG
+        jjWsgYjLZnTNWF0A0rx1QTiGs4GaNbGlFxQXgDRvnuNLtGYMF8yYu/j/8e0d/x+dK4EHWJCLqga+lAp3
+        AVBzGciAf//+/l85ORAc2ricjTUQGRgYyvIKS/8HhoQD0yfDf0I2Y0QjUNMDkCFAAzJIyVxE5wVchlJs
+        AACPTsHYUxl3NQAAAABJRU5ErkJggg==
+</value>
+  </data>
+</root>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestQualityAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestQualityAnalyzer.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestQualityAnalyzer.cs	(revision 4830)
@@ -9,4 +9,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Data;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -16,14 +17,15 @@
   [Item("BestQualityAnalyzer", "TODO An operator for analyzing the best solution of Traveling Salesman Problems given in path representation using city coordinates.")]
   [StorableClass]
-  public sealed class BestQualityAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public sealed class BestParameterConfigurationAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    // Wagner: Spezielle View für die Lösungen (ParameterConfigurations): So wie bei Runs: die zu Optimierenden Parameter(-werte) der besten solution anzeigen
 
-    public ScopeTreeLookupParameter<IParameterSet> ParameterSetParameter {
-      get { return (ScopeTreeLookupParameter<IParameterSet>)Parameters["ParameterSet"]; }
+    public ScopeTreeLookupParameter<IParameterConfiguration> ParameterVectorParameter {
+      get { return (ScopeTreeLookupParameter<IParameterConfiguration>)Parameters["ParameterConfiguration"]; }
     }
     public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
       get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public LookupParameter<IParameterSet> BestSolutionParameter {
-      get { return (LookupParameter<IParameterSet>)Parameters["BestSolution"]; }
+    public LookupParameter<IParameterConfiguration> BestSolutionParameter {
+      get { return (LookupParameter<IParameterConfiguration>)Parameters["BestSolution"]; }
     }
     public ValueLookupParameter<ResultCollection> ResultsParameter {
@@ -33,16 +35,23 @@
       get { return (LookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
     }
-    public LookupParameter<IParameterSet> BestKnownSolutionParameter {
-      get { return (LookupParameter<IParameterSet>)Parameters["BestKnownSolution"]; }
+    public LookupParameter<IParameterConfiguration> BestKnownSolutionParameter {
+      get { return (LookupParameter<IParameterConfiguration>)Parameters["BestKnownSolution"]; }
     }
 
-    public BestQualityAnalyzer()
+    public BestParameterConfigurationAnalyzer()
       : base() {
-      Parameters.Add(new ScopeTreeLookupParameter<IParameterSet>("ParameterSet", "TODO The TSP solutions given in path representation from which the best solution should be analyzed."));
+      Parameters.Add(new ScopeTreeLookupParameter<IParameterConfiguration>("ParameterConfiguration", "TODO The TSP solutions given in path representation from which the best solution should be analyzed."));
       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "TODO The qualities of the TSP solutions which should be analyzed."));
-      Parameters.Add(new LookupParameter<IParameterSet>("BestSolution", "TODO The best TSP solution."));
+      Parameters.Add(new LookupParameter<IParameterConfiguration>("BestSolution", "TODO The best TSP solution."));
       Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "TODO The result collection where the best TSP solution should be stored."));
       Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "TODO The quality of the best known solution of this TSP instance."));
-      Parameters.Add(new LookupParameter<IParameterSet>("BestKnownSolution", "TODO The best known solution of this TSP instance."));
+      Parameters.Add(new LookupParameter<IParameterConfiguration>("BestKnownSolution", "TODO The best known solution of this TSP instance."));
+    }
+
+    [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);
     }
 
@@ -51,5 +60,5 @@
       ResultCollection results = ResultsParameter.ActualValue;
       DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
-      ItemArray<IParameterSet> parameterSets = ParameterSetParameter.ActualValue;
+      ItemArray<IParameterConfiguration> parameterVectors = ParameterVectorParameter.ActualValue;
 
       int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
@@ -57,5 +66,5 @@
       if (bestKnownQuality == null || qualities[i].Value < bestKnownQuality.Value) {
         BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
-        BestKnownSolutionParameter.ActualValue = (IParameterSet)parameterSets[i].Clone();
+        BestKnownSolutionParameter.ActualValue = (IParameterConfiguration)parameterVectors[i].Clone();
       }
 
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs	(revision 4830)
@@ -0,0 +1,52 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An operator which creates a new random permutation of integer values.
+  /// </summary>
+  [Item("RandomParameterVectorCreator", "An operator which creates a new set of parameters TODO.")]
+  [StorableClass]
+  public sealed class RandomParameterConfigurationCreator : SingleSuccessorOperator, IStochasticOperator, IParameterConfigurationCreator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<IParameterConfiguration> ParameterConfigurationParameter {
+      get { return (ILookupParameter<IParameterConfiguration>)Parameters["ParameterConfiguration"]; }
+    }
+
+    public ILookupParameter<IParameterConfiguration> NewParameterConfigurationParameter {
+      get { return (ILookupParameter<IParameterConfiguration>)Parameters["NewParameterConfiguration"]; }
+    }
+
+    [StorableConstructor]
+    private RandomParameterConfigurationCreator(bool deserializing) : base(deserializing) { }
+    private RandomParameterConfigurationCreator(RandomParameterConfigurationCreator original, Cloner cloner) : base(original, cloner) { }
+    public RandomParameterConfigurationCreator()
+      : base() {
+        Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used to initialize the new random permutation."));
+        Parameters.Add(new LookupParameter<IParameterConfiguration>("ParameterConfiguration", "The new random parameter set."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomParameterConfigurationCreator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      NewParameterConfigurationParameter.ActualValue = (IParameterConfiguration)ParameterConfigurationParameter.ActualValue.Clone();
+      //NewParameterConfigurationParameter.ActualValue.Randomize();
+      return base.Apply();
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterSetCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterSetCreator.cs	(revision 4539)
+++ 	(revision )
@@ -1,55 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Common;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  /// <summary>
-  /// An operator which creates a new random permutation of integer values.
-  /// </summary>
-  [Item("RandomParameterSetCreator", "An operator which creates a new set of parameters TODO.")]
-  [StorableClass]
-  public sealed class RandomParameterSetCreator : SingleSuccessorOperator, IParameterSetCreator {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    public ILookupParameter<IParameterSet> ParameterSetParameter {
-      get { return (ILookupParameter<IParameterSet>)Parameters["ParameterSet"]; }
-    }
-
-    [Storable]
-    private ParameterConfigurationList parametersToOptimize;
-    public ParameterConfigurationList ParametersToOptimize {
-      get { return parametersToOptimize; }
-      set { parametersToOptimize = value; }
-    }
-
-    public RandomParameterSetCreator()
-      : 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<IParameterSet>("ParameterSet", "The new random parameter set."));
-    }
-
-    public override IOperation Apply() {
-      ParameterSetParameter.ActualValue = new ParameterSet(ParametersToOptimize, RandomParameter.ActualValue);
-      return base.Apply();
-    }
-
-    #region Cloning
-    public override IDeepCloneable Clone(Cloner cloner) {
-      RandomParameterSetCreator clone = (RandomParameterSetCreator) base.Clone(cloner);
-      clone.parametersToOptimize = (ParameterConfigurationList)this.parametersToOptimize.Clone();
-      return clone;
-    }
-    #endregion
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/BooleanParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/BooleanParameterConfiguration.cs	(revision 4539)
+++ 	(revision )
@@ -1,9 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  public class BooleanParameterConfiguration {
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterSetCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterSetCrossover.cs	(revision 4539)
+++ 	(revision )
@@ -1,88 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Operators;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Core;
-using HeuristicLab.Parameters;
-using HeuristicLab.Encodings.RealVectorEncoding;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Collections;
-using HeuristicLab.Data;
-using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.MetaOptimization.Encodings.Crossovers {
-  /// <summary>
-  /// 
-  /// </summary>
-  [Item("ParameterSetCrossover", "TODO")]
-  [StorableClass]
-  public class ParameterSetCrossover : SingleSuccessorOperator, IParameterSetOperator, ICrossover {
-    public override bool CanChangeName {
-      get { return false; }
-    }
-
-    public ILookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    public ILookupParameter<ItemArray<IParameterSet>> ParentsParameter {
-      get { return (ScopeTreeLookupParameter<IParameterSet>)Parameters["Parents"]; }
-    }
-    public ILookupParameter<IParameterSet> ChildParameter {
-      get { return (ILookupParameter<IParameterSet>)Parameters["Child"]; }
-    }
-
-    public IValueParameter<IBinaryVectorCrossover> BinaryVectorCrossoverParameter {
-      get { return (IValueParameter<IBinaryVectorCrossover>)Parameters["BinaryVectorCrossover"]; }
-    }
-    public IValueParameter<IIntegerVectorCrossover> IntegerVectorCrossoverParameter {
-      get { return (IValueParameter<IIntegerVectorCrossover>)Parameters["IntegerVectorCrossover"]; }
-    }
-    public IValueParameter<IRealVectorCrossover> RealVectorCrossoverParameter {
-      get { return (IValueParameter<IRealVectorCrossover>)Parameters["RealVectorCrossover"]; }
-    }
-    public ParameterSetCrossover()
-      : base() {
-      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
-      Parameters.Add(new ScopeTreeLookupParameter<IParameterSet>("Parents", "The parent vectors which should be crossed."));
-      ParentsParameter.ActualName = "ParameterSet";
-      Parameters.Add(new LookupParameter<IParameterSet>("Child", "The child vector resulting from the crossover."));
-      ChildParameter.ActualName = "ParameterSet";
-      Parameters.Add(new ValueParameter<IRealVectorCrossover>("BinaryVectorCrossover", "Crossover operator used for crossing binary parameters"));
-      Parameters.Add(new ValueParameter<IRealVectorCrossover>("IntegerVectorCrossover", "Crossover operator used for crossing integer parameters"));
-      Parameters.Add(new ValueParameter<IRealVectorCrossover>("RealVectorCrossover", "Crossover operator used for crossing real parameters"));
-    }
-    public override IOperation Apply() {
-      IEnumerable<IndexedItem<IParameterConfiguration>> integerParameters1 = GetIntegerParameters(ParentsParameter.ActualValue[0]);
-      IEnumerable<IndexedItem<IParameterConfiguration>> integerParameters2 = GetIntegerParameters(ParentsParameter.ActualValue[1]);
-      IParameterSet child = (IParameterSet)ParentsParameter.ActualValue[0].Clone();
-      
-      // TODO: use specific crossover operators to do the crossing
-      // for now: just swap the int-values
-      foreach (var par in integerParameters1) {
-        ParentsParameter.ActualValue[1].Parameters.ElementAt(par.Index).Parameter.ActualValue = par.Value.Parameter.ActualValue;
-      }
-      foreach (var par in integerParameters2) {
-        ParentsParameter.ActualValue[0].Parameters.ElementAt(par.Index).Parameter.ActualValue = par.Value.Parameter.ActualValue;
-      }
-
-      ChildParameter.ActualValue = child;
-      return base.Apply();
-    }
-
-    private IEnumerable<IndexedItem<IParameterConfiguration>> GetIntegerParameters(IParameterSet parameterSet) {
-      List<IndexedItem<IParameterConfiguration>> integerParameters = new List<IndexedItem<IParameterConfiguration>>();
-      int i = 0;
-      foreach (var item in parameterSet.Parameters) {
-        if (item.Parameter.DataType == typeof(IntValue)) {
-          integerParameters.Add(new IndexedItem<IParameterConfiguration>(i, (IParameterConfiguration)item.Clone()));
-        }
-        i++;
-      }
-      return integerParameters;
-    }
-
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterVectorCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterVectorCrossover.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterVectorCrossover.cs	(revision 4830)
@@ -0,0 +1,87 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Collections;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization.Encodings.Crossovers {
+  /// <summary>
+  /// 
+  /// </summary>
+  [Item("ParameterVectorCrossover", "TODO")]
+  [StorableClass]
+  public class ParameterVectorCrossover : SingleSuccessorOperator, IParameterConfigurationOperator, ICrossover {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemArray<IParameterConfiguration>> ParentsParameter {
+      get { return (ScopeTreeLookupParameter<IParameterConfiguration>)Parameters["Parents"]; }
+    }
+    public ILookupParameter<IParameterConfiguration> ChildParameter {
+      get { return (ILookupParameter<IParameterConfiguration>)Parameters["Child"]; }
+    }
+
+    private IIntegerVectorCrossover integerVectorCrossover;
+    public IIntegerVectorCrossover IntegerVectorCrossover {
+      get { return integerVectorCrossover; }
+      set { integerVectorCrossover = value; }
+    }
+    private IRealVectorCrossover realVectorCrossover;
+    public IRealVectorCrossover RealVectorCrossover {
+      get { return realVectorCrossover; }
+      set { realVectorCrossover = value; }
+    }
+
+    [StorableConstructor]
+    protected ParameterVectorCrossover(bool deserializing) : base(deserializing) { }
+    protected ParameterVectorCrossover(ParameterVectorCrossover original, Cloner cloner) : base(original, cloner) { }
+    public ParameterVectorCrossover()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
+      Parameters.Add(new ScopeTreeLookupParameter<IParameterConfiguration>("Parents", "The parent vectors which should be crossed."));
+      ParentsParameter.ActualName = "ParameterConfiguration";
+      Parameters.Add(new LookupParameter<IParameterConfiguration>("Child", "The child vector resulting from the crossover."));
+      ChildParameter.ActualName = "ParameterConfiguration";
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterVectorCrossover(this, cloner);
+    }
+
+    public override IOperation Apply() {
+
+      IParameterConfiguration child = (IParameterConfiguration)ParentsParameter.ActualValue[0].Clone();
+      // todo
+      //for (int i = 0; i < child.Parameters.Count; i++) {
+      //  if (child.Parameters[i].Parameter.DataType == typeof(IntValue)) {
+      //    child.Parameters[i].Parameter.ActualValue = CrossInteger(ParentsParameter.ActualValue[0].Parameters[i], ParentsParameter.ActualValue[1].Parameters[i]);
+      //  }
+      //}
+
+      this.ChildParameter.ActualValue = child;
+      return base.Apply();
+    }
+
+    private IntValue CrossInteger(IParameterConfiguration parameter1, IParameterConfiguration parameter2) {
+      IntegerVector integerChild = HeuristicLab.Encodings.IntegerVectorEncoding.DiscreteCrossover.Apply(
+        RandomParameter.ActualValue,
+        new IntegerVector(new IntArray(new int[] { ((IntValue)parameter1.Parameter.ActualValue).Value })),
+        new IntegerVector(new IntArray(new int[] { ((IntValue)parameter2.Parameter.ActualValue).Value })));
+      return new IntValue(integerChild[0]);
+    }
+
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/EnumerableParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/EnumerableParameterConfiguration.cs	(revision 4539)
+++ 	(revision )
@@ -1,9 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  public class EnumerableParameterConfiguration {
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/IntValueParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/IntValueParameterConfiguration.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/IntValueParameterConfiguration.cs	(revision 4830)
@@ -0,0 +1,25 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class IntValueParameterConfiguration : ValueTypeParameterConfiguration<IntValue> {
+
+    public IntValueParameterConfiguration(ParameterConfiguration parentConfiguration, string parameterName, IItem value) : base(parentConfiguration, parameterName, value) {
+    }
+
+    protected IntValueParameterConfiguration() { }
+    [StorableConstructor]
+    protected IntValueParameterConfiguration(bool deserializing) : base(deserializing) { }
+    protected IntValueParameterConfiguration(IntValueParameterConfiguration original, Cloner cloner) : base(original, cloner) {    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntValueParameterConfiguration(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/NumericParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/NumericParameterConfiguration.cs	(revision 4539)
+++ 	(revision )
@@ -1,91 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Data;
-using HeuristicLab.Core;
-using HeuristicLab.Collections;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  [StorableClass]
-  public class NumericParameterConfiguration : ParameterConfiguration {
-    [Storable]
-    private NumericRangeList ranges;
-    public NumericRangeList Ranges {
-      get { return ranges; }
-    }
-
-    protected NumericParameterConfiguration() { }
-    
-    [StorableConstructor]
-    protected NumericParameterConfiguration(bool deserializing) : base(deserializing) { }
-
-    public NumericParameterConfiguration(IParameter parameter, string category)
-      : base(parameter, category) {
-      this.ranges = new NumericRangeList();
-      this.ranges.ItemsAdded += new CollectionItemsChangedEventHandler<INumericRange>(ranges_ItemsAdded);
-      this.ranges.ItemsRemoved += new CollectionItemsChangedEventHandler<INumericRange>(ranges_ItemsRemoved);
-      this.ranges.CollectionReset += new CollectionItemsChangedEventHandler<INumericRange>(ranges_CollectionReset);
-    }
-
-
-
-    void ranges_CollectionReset(object sender, CollectionItemsChangedEventArgs<INumericRange> e) {
-      foreach (var i in e.Items) {
-        DeregisterItemEvents(i);
-      }
-      OnToStringChanged();
-    }
-
-    void ranges_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<INumericRange> e) {
-      foreach (var i in e.Items) {
-        DeregisterItemEvents(i);
-      }
-      OnToStringChanged();
-    }
-
-    void ranges_ItemsAdded(object sender, CollectionItemsChangedEventArgs<INumericRange> e) {
-      foreach (var i in e.Items) {
-        RegisterItemEvents(i);
-      }
-      OnToStringChanged();
-    }
-
-    private void DeregisterItemEvents(INumericRange range) {
-      range.ToStringChanged -= new EventHandler(range_ToStringChanged);
-    }
-    private void RegisterItemEvents(INumericRange range) {
-      range.ToStringChanged += new EventHandler(range_ToStringChanged);
-    }
-
-    public IntValue GetRandomValue() {
-      return new IntValue(0);
-    }
-
-    #region Cloning
-    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
-      NumericParameterConfiguration clone = (NumericParameterConfiguration)base.Clone(cloner);
-      clone.ranges = new NumericRangeList();
-      foreach (INumericRange range in this.ranges) {
-        clone.ranges.Add(range);
-      }
-      return clone;
-    }
-    #endregion
-
-    void range_ToStringChanged(object sender, EventArgs e) {
-      OnToStringChanged();
-    }
-
-    public override string ToString() {
-      return string.Format("{0}: ({1})", base.ToString(), string.Join(",", ranges.Select(r => r.ToString()).ToArray()));
-    }
-
-    public override void SetParameterWithRandomValue(IRandom random) {
-      int rangeIndex = random.Next(ranges.Count);
-      int value = random.Next(ranges.ElementAt(rangeIndex).LowerBound.Value, ranges.ElementAt(rangeIndex).UpperBound.Value); // TODO: respect StepSize parameter
-      this.Parameter.ActualValue = new IntValue(value);
-    }
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfiguration.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfiguration.cs	(revision 4830)
@@ -6,94 +6,204 @@
 using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Problems.MetaOptimization {
   [StorableClass]
-  public abstract class ParameterConfiguration : IParameterConfiguration {
-    [Storable]
-    public IParameter Parameter { get; set; }
-
-    [Storable]
-    public string Category { get; set; }
+  public class ParameterConfiguration : DeepCloneable, IParameterConfiguration, IStorableContent {
+    protected ParameterConfiguration parentConfiguration;
+
+    [Storable]
+    public string Filename { get; set; }
+
+    [Storable]
+    protected bool optimizationEnabled;
+    public bool OptimizationEnabled {
+      get { return optimizationEnabled; }
+      set {
+        if (optimizationEnabled != value) {
+          optimizationEnabled = value;
+          OnOptimizationEnabledChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected string parameterName;
+    public string ParameterName {
+      get { return parameterName; }
+      set {
+        if (parameterName != value) {
+          parameterName = value;
+        }
+      }
+    }
+
+    [Storable]
+    protected IItemList<IParameterConfiguration> childParameterConfigurations = new ItemList<IParameterConfiguration>();
+    public IItemList<IParameterConfiguration> ChildParameterConfigurations {
+      get { return childParameterConfigurations; }
+    }
+
+    public virtual IParameter Parameter {
+      get {
+        return parentConfiguration.GetChildParameter(this.parameterName);
+      }
+    }
+
+    protected IItem value;
+    public IItem Value {
+      get { return value; }
+      set {
+        if (this.value != value) {
+          ClearChildParameterConfigurations();
+          OnValueChanging();
+          this.value = value;
+          if(this.value is IParameterizedNamedItem) AddChildParameterConfigurations(this.value as IParameterizedNamedItem);
+          OnValueChanged();
+        }
+      }
+    }
+
+    public ParameterConfiguration(ParameterConfiguration parentConfiguration, string parameterName, IItem value) {
+      this.parentConfiguration = parentConfiguration;
+      this.ParameterName = parameterName;
+      this.Value = value;
+    }
 
     public ParameterConfiguration() { }
-    
     [StorableConstructor]
     protected ParameterConfiguration(bool deserializing) { }
-
-    public ParameterConfiguration(IParameter parameter, string category) {
-      this.Parameter = parameter;
-      this.Category = category;
-      Parameter.NameChanged += this.NameChanged;
-      Parameter.NameChanging += this.NameChanging;
-      Parameter.DescriptionChanged += this.DescriptionChanged;
-      Parameter.ItemImageChanged += this.ItemImageChanged;
-      parameter.ToStringChanged += this.ToStringChanged;
-    }
-
-    public bool CanChangeDescription {
-      get { return false; }
-    }
-
-    public bool CanChangeName {
-      get { return false; }
-    }
-
-    public string Description {
+    protected ParameterConfiguration(ParameterConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.OptimizationEnabled = original.optimizationEnabled;
+      this.ParameterName = original.parameterName;
+      this.Value = cloner.Clone(original.Value);
+      this.childParameterConfigurations = cloner.Clone(original.childParameterConfigurations);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfiguration(this, cloner);
+    }
+
+    protected virtual IValueParameter GetChildParameter(string childParameterName) {
+      return (IValueParameter)((IParameterizedItem)Value).Parameters[childParameterName];
+    }
+
+    protected virtual void AddChildParameterConfigurations(IParameterizedNamedItem parameterizedItem) {
+      foreach (var childParameter in parameterizedItem.Parameters) {
+        var pc = ParameterConfiguration.Create(this, parameterizedItem, childParameter);
+        if (pc != null) this.childParameterConfigurations.Add(pc);
+      }
+    }
+    protected virtual void ClearChildParameterConfigurations() {
+      childParameterConfigurations.Clear();
+    }
+
+    #region INamedItem Properties
+    public virtual string Name {
+      get { return Parameter.Name; }
+      set { throw new NotSupportedException(); }
+    }
+    public virtual string Description {
       get { return Parameter.Description; }
       set { throw new NotSupportedException(); }
     }
-    public string Name {
-      get { return Parameter.Name; }
-      set { throw new NotSupportedException(); }
-    }
-
-    public string ItemDescription {
+    public virtual bool CanChangeDescription {
+      get { return false; }
+    }
+    public virtual bool CanChangeName {
+      get { return false; }
+    }
+    public virtual string ItemDescription {
       get { return Parameter.ItemDescription; }
     }
-
-    public System.Drawing.Image ItemImage {
+    public virtual System.Drawing.Image ItemImage {
       get { return Parameter.ItemImage; }
     }
-
-    public string ItemName {
+    public virtual string ItemName {
       get { return Parameter.ItemName; }
     }
-
-    public Version ItemVersion {
+    public virtual Version ItemVersion {
       get { return Parameter.ItemVersion; }
     }
+    #endregion
 
     #region Events
     public virtual event EventHandler NameChanged;
+    protected virtual void OnNameChanged(object sender, EventArgs e) {
+      var handler = NameChanged;
+      if (handler != null) handler(sender, e);
+    }
+
     public virtual event EventHandler<CancelEventArgs<string>> NameChanging;
+    protected virtual void OnNameChanging(object sender, CancelEventArgs<string> e) {
+      var handler = NameChanging;
+      if (handler != null) handler(sender, e);
+    }
+
     public virtual event EventHandler DescriptionChanged;
+    protected virtual void OnDescriptionChanged(object sender, EventArgs e) {
+      var handler = DescriptionChanged;
+      if (handler != null) handler(sender, e);
+    }
+
     public virtual event EventHandler ItemImageChanged;
+    protected virtual void OnItemImageChanged(object sender, EventArgs e) {
+      var handler = ItemImageChanged;
+      if (handler != null) handler(sender, e);
+    }
+
     public virtual event EventHandler ToStringChanged;
-
-    protected virtual void OnToStringChanged() {
+    protected virtual void OnStringChanged(object sender, EventArgs e) {
       var handler = ToStringChanged;
+      if (handler != null) handler(this, e); // important to set 'this' as sender
+    }
+
+    public virtual event EventHandler OptimizationEnabledChanged;
+    protected virtual void OnOptimizationEnabledChanged() {
+      var handler = OptimizationEnabledChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
+
+    public virtual event EventHandler ValueChanging;
+    protected virtual void OnValueChanging() {
+      var handler = ValueChanging;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public virtual event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     #endregion
 
-    #region Cloning
-    public virtual IDeepCloneable Clone(Cloner cloner) {
-      ParameterConfiguration clone = (ParameterConfiguration)Activator.CreateInstance(this.GetType(), true);
-      cloner.RegisterClonedObject(this, clone);
-      clone.Parameter = (IParameter)cloner.Clone(this.Parameter);
-      clone.Category = this.Category;
-      return clone;
-    }
-
-    public object Clone() {
-      return Clone(new Cloner());
-    }
-    #endregion
-
     public override string ToString() {
-      return string.Format("{0}.{1}", Category, Parameter.Name);
-    }
-    
-    public abstract void SetParameterWithRandomValue(IRandom random);
+      return string.Format("{0} ({1})", ParameterName, Value);
+    }
+
+    public static IParameterConfiguration Create(IParameterizedNamedItem parent) {
+      return new RootParameterConfiguration(parent);
+    }
+
+    public static IParameterConfiguration Create(ParameterConfiguration parentConfiguration, IParameterizedNamedItem parent, IParameter parameter) {
+      if (parameter is IValueParameter) {
+        IValueParameter valueParameter = parameter as IValueParameter;
+
+        if (typeof(IntValue).IsAssignableFrom(parameter.DataType)) {
+          return new IntValueParameterConfiguration(parentConfiguration, parameter.Name, valueParameter.Value);
+        } else if (typeof(IParameterizedItem).IsAssignableFrom(parameter.DataType)) {
+          return new ParameterConfiguration(parentConfiguration, parameter.Name, valueParameter.Value);
+        } else {
+          // todo
+          return new IntValueParameterConfiguration(parentConfiguration, parameter.Name, valueParameter.Value);
+        }
+      }
+      return null;
+    }
+
+    public void Parameterize(IParameterizedItem parameterizedItem) {
+      throw new NotImplementedException();
+    }
 
   }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurationList.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurationList.cs	(revision 4539)
+++ 	(revision )
@@ -1,18 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  [StorableClass]
-  [Item("ParameterOptimizationInfoList", "Represents a list of parameter configurations.")]
-  public class ParameterConfigurationList : CheckedItemCollection<IParameterConfiguration> {
-    public ParameterConfigurationList() : base() { }
-    public ParameterConfigurationList(IEnumerable<IParameterConfiguration> collection) : base(collection) { }
-    [StorableConstructor]
-    protected ParameterConfigurationList(bool deserializing) : base(deserializing) { }
-    
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterSet.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterSet.cs	(revision 4539)
+++ 	(revision )
@@ -1,44 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  [StorableClass]
-  public class ParameterSet : Item, IParameterSet {
-    [Storable]
-    private List<IParameterConfiguration> parameters;
-    public IEnumerable<IParameterConfiguration> Parameters {
-      get { return parameters; }
-    }
-
-    public ParameterSet() {
-      this.parameters = new List<IParameterConfiguration>();
-    }
-
-    [StorableConstructor]
-    protected ParameterSet(bool deserializing) : base(deserializing) { }
-
-    public ParameterSet(ParameterConfigurationList parametersToOptimize, IRandom random)
-      : this() {
-      foreach (IParameterConfiguration config in parametersToOptimize.CheckedItems) {
-        IParameterConfiguration clone = (IParameterConfiguration)config.Clone();
-        clone.SetParameterWithRandomValue(random);
-        parameters.Add(clone);
-      }
-    }
-
-    #region Cloning
-    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
-      ParameterSet clone = (ParameterSet)base.Clone(cloner);
-      clone.parameters = new List<IParameterConfiguration>();
-      foreach (var param in this.parameters) {
-        clone.parameters.Add((IParameterConfiguration)param.Clone(cloner));
-      }
-      return clone;
-    }
-    #endregion
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RootParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RootParameterConfiguration.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RootParameterConfiguration.cs	(revision 4830)
@@ -0,0 +1,69 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// This class does not have a ParameterName, because its the root element of the ParameterConfiguration-Tree
+  /// It only deals with child-ParameterConfigurations
+  /// </summary>
+  [StorableClass]
+  public class RootParameterConfiguration : ParameterConfiguration {
+
+    public new IParameterizedNamedItem Value {
+      get { return (IParameterizedNamedItem)base.Value; }
+      set { base.Value = value; }
+    }
+
+    public RootParameterConfiguration(IParameterizedNamedItem rootItem) {
+      this.OptimizationEnabled = true;
+      this.Value = rootItem;
+    }
+
+    public RootParameterConfiguration() { }
+    [StorableConstructor]
+    protected RootParameterConfiguration(bool deserializing) { }
+    protected RootParameterConfiguration(RootParameterConfiguration original, Cloner cloner) : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RootParameterConfiguration(this, cloner);
+    }
+
+    public override IParameter Parameter {
+      get { return null; }
+    }
+
+    #region INamedItem Properties
+    public override string Name {
+      get { return Value.Name; }
+      set { throw new NotSupportedException(); }
+    }
+    public override string Description {
+      get { return Value.Description; }
+      set { throw new NotSupportedException(); }
+    }
+    public override bool CanChangeDescription {
+      get { return false; }
+    }
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public override string ItemDescription {
+      get { return Value.ItemDescription; }
+    }
+    public override System.Drawing.Image ItemImage {
+      get { return Value.ItemImage; }
+    }
+    public override string ItemName {
+      get { return Value.ItemName; }
+    }
+    public override Version ItemVersion {
+      get { return Value.ItemVersion; }
+    }
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueTypeParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueTypeParameterConfiguration.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueTypeParameterConfiguration.cs	(revision 4830)
@@ -0,0 +1,80 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Data;
+using HeuristicLab.Core;
+using HeuristicLab.Collections;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public abstract class ValueTypeParameterConfiguration<T> : ParameterConfiguration where T : class, IItem, IStringConvertibleValue, IDeepCloneable {
+    [Storable]
+    private IItemList<IRange<T>> ranges;
+    public IItemList<IRange<T>> Ranges {
+      get { return ranges; }
+    }
+
+    public ValueTypeParameterConfiguration(ParameterConfiguration parentConfiguration, string parameterName, IItem value) : base(parentConfiguration, parameterName, value) {
+      this.ranges = new ItemList<IRange<T>>();
+      this.ranges.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IRange<T>>>(ranges_ItemsAdded);
+      this.ranges.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IRange<T>>>(ranges_ItemsRemoved);
+      this.ranges.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IRange<T>>>(ranges_CollectionReset);
+    }
+
+    protected ValueTypeParameterConfiguration() { }
+    [StorableConstructor]
+    protected ValueTypeParameterConfiguration(bool deserializing) : base(deserializing) { }
+    protected ValueTypeParameterConfiguration(ValueTypeParameterConfiguration<T> original, Cloner cloner) : base(original, cloner) {
+      this.ranges = cloner.Clone(original.Ranges);
+    }
+
+    void ranges_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IRange<T>>> e) {
+      foreach (var i in e.Items) {
+        DeregisterItemEvents(i.Value);
+      }
+      OnStringChanged(sender, e);
+    }
+
+    void ranges_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IRange<T>>> e) {
+      foreach (var i in e.Items) {
+        DeregisterItemEvents(i.Value);
+      }
+      OnStringChanged(sender, e);
+    }
+
+    void ranges_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IRange<T>>> e) {
+      foreach (var i in e.Items) {
+        RegisterItemEvents(i.Value);
+      }
+      OnStringChanged(sender, e);
+    }
+
+    private void DeregisterItemEvents(IRange<T> range) {
+      range.ToStringChanged -= new EventHandler(range_ToStringChanged);
+    }
+    private void RegisterItemEvents(IRange<T> range) {
+      range.ToStringChanged += new EventHandler(range_ToStringChanged);
+    }
+
+    public IntValue GetRandomValue() {
+      return new IntValue(0);
+    }
+    
+    void range_ToStringChanged(object sender, EventArgs e) {
+      OnStringChanged(sender, e);
+    }
+
+    public override string ToString() {
+      return string.Format("{0}: ({1})", base.ToString(), string.Join(",", ranges.Select(r => r.ToString()).ToArray()));
+    }
+
+    //public override void SetRandomValue(IRandom random) {
+    //  int rangeIndex = random.Next(ranges.Count);
+    //  int value = random.Next(ranges.ElementAt(rangeIndex).LowerBound.Value, ranges.ElementAt(rangeIndex).UpperBound.Value); // TODO: respect StepSize parameter
+    //  this.Parameter.ActualValue = new IntValue(value);
+    //}
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 4830)
@@ -10,4 +10,5 @@
 using HeuristicLab.Optimization;
 using System.Threading;
+using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -18,4 +19,6 @@
   [StorableClass]
   public class MetaOptimizationEvaluator : SingleSuccessorOperator, IMetaOptimizationEvaluator {
+    private const string RepetitionsParameterName = "Repetitions";
+
     private bool algorithmStopped;
 
@@ -23,30 +26,62 @@
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-
     public ILookupParameter<IAlgorithm> AlgorithmParameter {
       get { return (ILookupParameter<IAlgorithm>)Parameters["Algorithm"]; }
     }
-    public ILookupParameter<IParameterSet> ParameterSetParameter {
-      get { return (ILookupParameter<IParameterSet>)Parameters["ParameterSet"]; }
+    public ILookupParameter<IItemList<IProblem>> ProblemsParameter {
+      get { return (ILookupParameter<IItemList<IProblem>>)Parameters["Problems"]; }
+    }
+    public ILookupParameter<IParameterConfiguration> ParameterConfigurationParameter {
+      get { return (ILookupParameter<IParameterConfiguration>)Parameters["ParameterConfiguration"]; }
+    }
+    public ValueParameter<IntValue> RepetitionsParameter {
+      get { return (ValueParameter<IntValue>)Parameters[RepetitionsParameterName]; }
     }
 
-    public MetaOptimizationEvaluator()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the TSP solution."));
+    public IntValue Repetitions {
+      get { return RepetitionsParameter.Value; }
+      set { RepetitionsParameter.Value = value; }
+    }
+
+    public MetaOptimizationEvaluator() : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the ParameterVector."));
       Parameters.Add(new LookupParameter<IAlgorithm>("Algorithm", "Missing description."));
-      Parameters.Add(new LookupParameter<IParameterSet>("ParameterSet", "Missing description."));
+      Parameters.Add(new LookupParameter<IItemList<IProblem>>("Problems", "Missing description."));
+      Parameters.Add(new LookupParameter<IParameterConfiguration>("ParameterConfiguration", "Missing description."));
+      Parameters.Add(new ValueParameter<IntValue>(RepetitionsParameterName, "Number of evaluations for one individual.", new IntValue(3)));
+    }
+
+    [StorableConstructor]
+    protected MetaOptimizationEvaluator(bool deserializing) : base(deserializing) { }
+    protected MetaOptimizationEvaluator(MetaOptimizationEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+      this.algorithmStopped = original.algorithmStopped;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MetaOptimizationEvaluator(this, cloner);
     }
 
     public override IOperation Apply() {
       AlgorithmParameter.ActualValue.Prepare();
-      ParametrizeAlgorithm();
+      //ParameterizeAlgorithm();
+      ParameterConfigurationParameter.ActualValue.Parameterize(AlgorithmParameter.ActualValue);
       algorithmStopped = false;
       AlgorithmParameter.ActualValue.Stopped += new EventHandler(ActualValue_Stopped);
-      AlgorithmParameter.ActualValue.Start();
-      while (!algorithmStopped) {
-        Thread.Sleep(1000); // wait for algorithm to complete; do not rely on Algorithm.ExecutionState here, because change of ExecutionState happens before Run is added (which causes problems because Algorithm might get cloned when its started already)
+
+      double qualitySum = 0;
+
+      foreach (IProblem problem in ProblemsParameter.ActualValue) {
+        AlgorithmParameter.ActualValue.Problem = problem;
+        AlgorithmParameter.ActualValue.Start();
+        while (!algorithmStopped) {
+          Thread.Sleep(1000); // wait for algorithm to complete; do not rely on Algorithm.ExecutionState here, because change of ExecutionState happens before Run is added (which causes problems because Algorithm might get cloned when its started already)
+        }
+        AlgorithmParameter.ActualValue.Stopped -= new EventHandler(ActualValue_Stopped);
+        qualitySum += ((DoubleValue)AlgorithmParameter.ActualValue.Results["BestQuality"].Value).Value;
       }
-      AlgorithmParameter.ActualValue.Stopped -= new EventHandler(ActualValue_Stopped);
-      this.QualityParameter.ActualValue = (DoubleValue)AlgorithmParameter.ActualValue.Results["BestQuality"].Value;
+
+      double qualityAvg = qualitySum / ProblemsParameter.ActualValue.Count;
+      this.QualityParameter.ActualValue = new DoubleValue(qualityAvg);
+
       return base.Apply();
     }
@@ -56,13 +91,13 @@
     }
 
-    private void ParametrizeAlgorithm() {
-      foreach (IParameterConfiguration parameter in ParameterSetParameter.ActualValue.Parameters) {
-        if (parameter.Category == "Algorithm") {
-          this.AlgorithmParameter.ActualValue.Parameters[parameter.Parameter.Name].ActualValue = parameter.Parameter.ActualValue;
-        } else if (parameter.Category == "Problem") {
-          this.AlgorithmParameter.ActualValue.Problem.Parameters[parameter.Parameter.Name].ActualValue = parameter.Parameter.ActualValue;
-        }
-      }
-    }
+    //private void ParameterizeAlgorithm() {
+    //  foreach (IParameterConfiguration parameter in ParameterVectorParameter.ActualValue) {
+    //    if (typeof(IAlgorithm).IsAssignableFrom(parameter.OperatorType)) {
+    //      this.AlgorithmParameter.ActualValue.Parameters[parameter.Parameter.Name].ActualValue = parameter.Parameter.ActualValue;
+    //    } else if (typeof(IProblem).IsAssignableFrom(parameter.OperatorType)) {
+    //      this.AlgorithmParameter.ActualValue.Problem.Parameters[parameter.Parameter.Name].ActualValue = parameter.Parameter.ActualValue;
+    //    }
+    //  }
+    //}
   }
 }
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 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 4830)
@@ -88,21 +88,19 @@
   <ItemGroup>
     <Compile Include="Analyzers\BestQualityAnalyzer.cs" />
-    <Compile Include="Creators\RandomParameterSetCreator.cs" />
-    <Compile Include="Encodings\BooleanParameterConfiguration.cs" />
-    <Compile Include="Encodings\Crossovers\ParameterSetCrossover.cs" />
-    <Compile Include="Interfaces\IParameterSetOperator.cs" />
-    <Compile Include="NumericRangeList.cs" />
-    <Compile Include="Encodings\EnumerableParameterConfiguration.cs" />
-    <Compile Include="Interfaces\INumericRange.cs" />
-    <Compile Include="Encodings\NumericParameterConfiguration.cs" />
-    <Compile Include="Encodings\ParameterSet.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationCreator.cs" />
+    <Compile Include="Creators\RandomParameterConfigurationCreator.cs" />
+    <Compile Include="Encodings\Crossovers\ParameterVectorCrossover.cs" />
+    <Compile Include="Encodings\IntValueParameterConfiguration.cs" />
+    <Compile Include="Encodings\ValueTypeParameterConfiguration.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Encodings\RootParameterConfiguration.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationOperator.cs" />
+    <Compile Include="Interfaces\IRange.cs" />
     <Compile Include="Evaluators\MetaOptimizationEvaluator.cs" />
     <Compile Include="Interfaces\IMetaOptimizationEvaluator.cs" />
-    <Compile Include="Interfaces\IParameterSet.cs" />
-    <Compile Include="Interfaces\IParameterSetCreator.cs" />
     <Compile Include="Interfaces\IParameterConfiguration.cs" />
     <Compile Include="Encodings\ParameterConfiguration.cs" />
-    <Compile Include="Encodings\ParameterConfigurationList.cs" />
-    <Compile Include="NumericRange.cs" />
+    <Compile Include="Range.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="MetaOptimizationProblem.cs" />
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/INumericRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/INumericRange.cs	(revision 4539)
+++ 	(revision )
@@ -1,19 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Data;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  public interface INumericRange : IItem {
-    IntValue LowerBound { get; set; }
-    IntValue UpperBound { get; set; }
-    IntValue StepSize { get; set; }
-
-    event EventHandler LowerBoundChanged;
-    event EventHandler UpperBoundChanged;
-    event EventHandler StepSizeChanged;
-
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 4830)
@@ -7,8 +7,15 @@
 namespace HeuristicLab.Problems.MetaOptimization {
   public interface IParameterConfiguration : INamedItem {
-    IParameter Parameter { get; set; }
-    string Category { get; set; }
+    bool OptimizationEnabled { get; set; }
+    string ParameterName { get; set; }
+    IParameter Parameter { get; }
+    IItem Value { get; set; }
+    IItemList<IParameterConfiguration> ChildParameterConfigurations { get; }
 
-    void SetParameterWithRandomValue(IRandom random);
+    void Parameterize(IParameterizedItem parameterizedItem);
+
+    event EventHandler OptimizationEnabledChanged;
+    event EventHandler ValueChanging;
+    event EventHandler ValueChanged;
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs	(revision 4830)
@@ -0,0 +1,10 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IParameterConfigurationCreator : ISolutionCreator {
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs	(revision 4830)
@@ -0,0 +1,12 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An interface which represents an operator dealing with parameter sets.
+  /// </summary>
+  public interface IParameterConfigurationOperator : IOperator { }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSet.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSet.cs	(revision 4539)
+++ 	(revision )
@@ -1,11 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  public interface IParameterSet : IItem {
-    IEnumerable<IParameterConfiguration> Parameters { get; }
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSetCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSetCreator.cs	(revision 4539)
+++ 	(revision )
@@ -1,15 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Optimization;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  /// <summary>
-  /// An interface which represents an operator for creating permutations.
-  /// </summary>
-  public interface IParameterSetCreator : ISolutionCreator {
-    ParameterConfigurationList ParametersToOptimize { get; set; }
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSetOperator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterSetOperator.cs	(revision 4539)
+++ 	(revision )
@@ -1,12 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  /// <summary>
-  /// An interface which represents an operator dealing with parameter sets.
-  /// </summary>
-  public interface IParameterSetOperator : IOperator { }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 4830)
@@ -0,0 +1,19 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IRange<T> : IItem where T : class, IItem, IStringConvertibleValue, IDeepCloneable {
+    T LowerBound { get; set; }
+    T UpperBound { get; set; }
+    T StepSize { get; set; }
+
+    event EventHandler LowerBoundChanged;
+    event EventHandler UpperBoundChanged;
+    event EventHandler StepSizeChanged;
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 4539)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 4830)
@@ -36,156 +36,78 @@
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class MetaOptimizationProblem : ParameterizedNamedItem, ISingleObjectiveProblem, IStorableContent {
-    public string Filename { get; set; }
-
-    public override Image ItemImage {
-      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Type; }
-    }
+  public sealed class MetaOptimizationProblem : SingleObjectiveProblem<IMetaOptimizationEvaluator, IParameterConfigurationCreator> {
+    private const string AlgorithmParameterName = "Algorithm";
+    private const string ProblemsParameterName = "Problems";
+    private const string AlgorithmParameterConfigurationParameterName = "AlgorithmParameterConfiguration";
+    private const string ProblemParametersConfigurationParameterName = "ProblemParametersConfiguration";
 
     #region Parameter Properties
-
-    public ValueParameter<IntValue> RepetitionsParameter {
-      get { return (ValueParameter<IntValue>)Parameters["Repetitions"]; }
+    public ValueParameter<IAlgorithm> AlgorithmParameter {
+      get { return (ValueParameter<IAlgorithm>)Parameters[AlgorithmParameterName]; }
     }
-
-    public ValueParameter<IParameterSetCreator> SolutionCreatorParameter {
-      get { return (ValueParameter<IParameterSetCreator>)Parameters["SolutionCreator"]; }
+    public ValueParameter<IItemList<ISingleObjectiveProblem>> ProblemsParameter {
+      get { return (ValueParameter<IItemList<ISingleObjectiveProblem>>)Parameters[ProblemsParameterName]; }
     }
-    IParameter IProblem.SolutionCreatorParameter {
-      get { return SolutionCreatorParameter; }
+    public ValueParameter<IParameterConfiguration> AlgorithmParameterConfigurationParameter {
+      get { return (ValueParameter<IParameterConfiguration>)Parameters[AlgorithmParameterConfigurationParameterName]; }
     }
-
-    public ValueParameter<IMetaOptimizationEvaluator> EvaluatorParameter {
-      get { return (ValueParameter<IMetaOptimizationEvaluator>)Parameters["Evaluator"]; }
-    }
-    IParameter IProblem.EvaluatorParameter {
-      get { return EvaluatorParameter; }
-    }
-
-    public OptionalValueParameter<ParameterSet> BestKnownSolutionParameter {
-      get { return (OptionalValueParameter<ParameterSet>)Parameters["BestKnownSolution"]; }
-    }
-
-    public ValueParameter<BoolValue> MaximizationParameter {
-      get { return (ValueParameter<BoolValue>)Parameters["Maximization"]; }
-    }
-    IParameter ISingleObjectiveProblem.MaximizationParameter {
-      get { return MaximizationParameter; }
-    }
-
-    public OptionalValueParameter<DoubleValue> BestKnownQualityParameter {
-      get { return (OptionalValueParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
-    }
-    IParameter ISingleObjectiveProblem.BestKnownQualityParameter {
-      get { return BestKnownQualityParameter; }
-    }
-
-    public ValueParameter<IAlgorithm> AlgorithmParameter {
-      get { return (ValueParameter<IAlgorithm>)Parameters["Algorithm"]; }
-    }
-    public ValueParameter<ParameterConfigurationList> ParametersToOptimizeParameter {
-      get { return (ValueParameter<ParameterConfigurationList>)Parameters["ParametersToOptimize"]; }
-    }
+    //public ValueParameter<IItemList<IParameterConfiguration>> ProblemParametersConfigurationParameter {
+    //  get { return (ValueParameter<IItemList<IParameterConfiguration>>)Parameters[ProblemParametersConfigurationParameterName]; }
+    //}
     #endregion
 
     #region Properties
-
-    public IntValue Repetitions {
-      get { return RepetitionsParameter.Value; }
-      set { RepetitionsParameter.Value = value; }
-    }
-
-    public IEnumerable<IOperator> Operators {
-      get { return operators; }
-    }
-
-    IEvaluator IProblem.Evaluator {
-      get { return EvaluatorParameter.Value; }
-    }
-    public IMetaOptimizationEvaluator Evaluator {
-      get { return EvaluatorParameter.Value; }
-      set { EvaluatorParameter.Value = value; }
-    }
-
-    ISolutionCreator IProblem.SolutionCreator {
-      get { return SolutionCreatorParameter.Value; }
-    }
-    public IParameterSetCreator SolutionCreator {
-      get { return SolutionCreatorParameter.Value; }
-    }
-
-    ISingleObjectiveEvaluator ISingleObjectiveProblem.Evaluator {
-      get { return this.Evaluator; }
-    }
-
-    public DoubleValue BestKnownQuality {
-      get { return BestKnownQualityParameter.Value; }
-      set { BestKnownQualityParameter.Value = value; }
-    }
-    public ParameterSet BestKnownSolution {
-      get { return BestKnownSolutionParameter.Value; }
-      set { BestKnownSolutionParameter.Value = value; }
-    }
-
     public IAlgorithm Algorithm {
       get { return AlgorithmParameter.Value; }
       set { AlgorithmParameter.Value = value; }
     }
-
-    public ParameterConfigurationList ParametersToOptimize {
-      get { return ParametersToOptimizeParameter.Value; }
-      set { ParametersToOptimizeParameter.Value = value; }
+    public IItemList<ISingleObjectiveProblem> Problems {
+      get { return ProblemsParameter.Value; }
+      set { ProblemsParameter.Value = value; }
     }
-
-    private BestQualityAnalyzer BestQualityAnalyzer {
-      get { return operators.OfType<BestQualityAnalyzer>().FirstOrDefault(); }
+    public IParameterConfiguration AlgorithmParameterConfiguration {
+      get { return AlgorithmParameterConfigurationParameter.Value; }
+      set { AlgorithmParameterConfigurationParameter.Value = value; }
     }
+    //public IItemList<IParameterConfiguration> ProblemParametersConfiguration {
+    //  get { return ProblemParametersConfigurationParameter.Value; }
+    //  set { ProblemParametersConfigurationParameter.Value = value; }
+    //}
     #endregion
 
-    [Storable]
-    private List<IOperator> operators;
+    public MetaOptimizationProblem()
+      : base() {
+      Parameters.Add(new ValueParameter<IAlgorithm>(AlgorithmParameterName, "The algorithm which's parameters should be optimized."));
+      Parameters.Add(new ValueParameter<IItemList<IProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ItemList<IProblem>()));
+      Parameters.Add(new ValueParameter<IParameterConfiguration>(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>()));
+      
+      Maximization = new BoolValue(false);
+      SolutionCreator = new RandomParameterConfigurationCreator();
+      Evaluator = new MetaOptimizationEvaluator();
+
+      InitializeOperators();
+      RegisterParameterEvents();
+      ParameterizeSolutionCreator();
+      ParameterizeEvaluator();
+      ParameterizeOperators();
+    }
 
     [StorableConstructor]
     private MetaOptimizationProblem(bool deserializing) : base(deserializing) { }
-    public MetaOptimizationProblem()
-      : base() {
-
-      IParameterSetCreator creator = new RandomParameterSetCreator();
-      MetaOptimizationEvaluator evaluator = new MetaOptimizationEvaluator();
-      ParameterConfigurationList parametersToOptimize = new ParameterConfigurationList();
-
-      Parameters.Add(new ValueParameter<BoolValue>("Maximization", "Set to false as the Traveling Salesman Problem is a minimization problem.", new BoolValue(false)));
-      Parameters.Add(new ValueParameter<IntValue>("Repetitions", "Number of evaluations for one individual.", new IntValue(3)));
-      Parameters.Add(new ValueParameter<IParameterSetCreator>("SolutionCreator", "The operator which should be used to create new TSP solutions.", creator));
-      Parameters.Add(new ValueParameter<IMetaOptimizationEvaluator>("Evaluator", "The operator which should be used to evaluate TSP solutions.", evaluator));
-      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this TSP instance."));
-      Parameters.Add(new OptionalValueParameter<ParameterSet>("BestKnownSolution", "The best known solution of this TSP instance."));
-
-      Parameters.Add(new ValueParameter<IAlgorithm>("Algorithm", "The algorithm and problem which's parameters should be optimized."));
-      Parameters.Add(new ValueParameter<ParameterConfigurationList>("ParametersToOptimize", "List of parameters that should be optimized.", parametersToOptimize));
-
-      ParameterizeSolutionCreator();
-      ParameterizeEvaluator();
-
-      InitializeOperators();
-      AttachEventHandlers();
+    private MetaOptimizationProblem(MetaOptimizationProblem original, Cloner cloner) : base(original, cloner) {
+      // todo
+      this.RegisterParameterEvents();
     }
-
-    #region Cloning
     public override IDeepCloneable Clone(Cloner cloner) {
-      MetaOptimizationProblem clone = (MetaOptimizationProblem)base.Clone(cloner);
-      clone.operators = operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
-      // todo
-      clone.AttachEventHandlers();
-      return clone;
+      return new MetaOptimizationProblem(this, cloner);
     }
-    #endregion
 
     #region Helpers
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserializationHook() {
-      AttachEventHandlers();
+      RegisterParameterEvents();
     }
-    private void AttachEventHandlers() {
+    private void RegisterParameterEvents() {
       SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
       EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
@@ -194,80 +116,23 @@
     }
     private void InitializeOperators() {
-      operators = new List<IOperator>();
-      operators.Add(new BestQualityAnalyzer());
-      ParameterizeAnalyzer();
-      operators.AddRange(ApplicationManager.Manager.GetInstances<IParameterSetOperator>().Cast<IOperator>());
-      ParameterizeOperators();
-
-      //UpdateMoveEvaluators();
-      //InitializeMoveGenerators();
+      Operators.AddRange(ApplicationManager.Manager.GetInstances<IParameterConfigurationOperator>().Cast<IOperator>());
+      Operators.Add(new BestParameterConfigurationAnalyzer());
     }
     private void ParameterizeSolutionCreator() {
-      SolutionCreator.ParametersToOptimize = this.ParametersToOptimize;
+      //SolutionCreator.ParametersToOptimize = this.ParametersToOptimize;
     }
     private void ParameterizeEvaluator() {
+      ((MetaOptimizationEvaluator)Evaluator).ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
     }
     private void ParameterizeAnalyzer() {
-      BestQualityAnalyzer.ResultsParameter.ActualName = "Results";
+      //BestQualityAnalyzer.ResultsParameter.ActualName = "Results";
     }
     private void ParameterizeOperators() {
+      
     }
 
-    private void AddAlgorithmParameters() {
-      foreach (IParameter parameter in Algorithm.Parameters) {
-        this.ParametersToOptimize.Add(new NumericParameterConfiguration(parameter, "Algorithm"), false);
-      }
-    }
-    private void RemoveAlgorithmParameters() {
-      foreach (IParameter parameter in Algorithm.Parameters) {
-        IParameterConfiguration parameterConfiguration = this.ParametersToOptimize.Single(p => p.Parameter == parameter);
-        if (parameterConfiguration != null) {
-          this.ParametersToOptimize.Remove(parameterConfiguration);
-        }
-      }
-    }
-    private void ClearAlgorithmParameters() {
-      //this.ParametersToOptimize.Clear();
-    }
-
-    private void AddProblemParameters() {
-      foreach (IParameter parameter in Algorithm.Problem.Parameters) {
-        this.ParametersToOptimize.Add(new NumericParameterConfiguration(parameter, "Problem"), false);
-      }
-    }
-    private void RemoveProblemParameters() {
-      foreach (IParameter parameter in Algorithm.Problem.Parameters) {
-        IParameterConfiguration parameterConfiguration = this.ParametersToOptimize.Single(p => p.Parameter == parameter);
-        if (parameterConfiguration != null) {
-          this.ParametersToOptimize.Remove(parameterConfiguration);
-        }
-      }
-    }
-    private void ClearProblemParameters() {
-      //this.ParametersToOptimize.Clear();
-    }
     #endregion
 
     #region Events
-    public event EventHandler SolutionCreatorChanged;
-    private void OnSolutionCreatorChanged() {
-      EventHandler handler = SolutionCreatorChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler EvaluatorChanged;
-    private void OnEvaluatorChanged() {
-      EventHandler handler = EvaluatorChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler OperatorsChanged;
-    private void OnOperatorsChanged() {
-      EventHandler handler = OperatorsChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler Reset;
-    private void OnReset() {
-      EventHandler handler = Reset;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
 
     private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
@@ -288,8 +153,7 @@
     }
     void BaseLevelAlgorithmParameter_ValueChanged(object sender, EventArgs e) {
-      ClearAlgorithmParameters();
       if (Algorithm != null) {
         Algorithm.ProblemChanged += new EventHandler(BaseLevelAlgorithm_ProblemChanged);
-        AddAlgorithmParameters(); // TODO: When to Detach?
+        AlgorithmParameterConfiguration = ParameterConfiguration.Create(Algorithm);
       }
       BaseLevelAlgorithm_ProblemChanged(sender, e);
@@ -297,8 +161,8 @@
 
     void BaseLevelAlgorithm_ProblemChanged(object sender, EventArgs e) {
-      ClearProblemParameters();
-      if (Algorithm.Problem != null) {
-        AddProblemParameters();
-      }
+      //ClearProblemParameters();
+      //if (Algorithm.Problem != null) {
+      //  AddProblemParameters();
+      //}
     }
     #endregion
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/NumericRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/NumericRange.cs	(revision 4539)
+++ 	(revision )
@@ -1,129 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  [StorableClass]
-  public class NumericRange : Item, INumericRange {
-    [Storable]
-    private IntValue lowerBound;
-    public IntValue LowerBound {
-      get { return lowerBound; }
-      set {
-        if (lowerBound != value) {
-          if (lowerBound != null) {
-            lowerBound.ValueChanged -= new EventHandler(lowerBound_ValueChanged);
-          }
-          lowerBound = value;
-          if (lowerBound != null) {
-            lowerBound.ValueChanged += new EventHandler(lowerBound_ValueChanged);
-          }
-          OnLowerBoundChanged();
-        }
-      }
-    }
-
-    [Storable]
-    private IntValue upperBound;
-    public IntValue UpperBound {
-      get { return upperBound; }
-      set {
-        if (upperBound != value) {
-          if (upperBound != null) {
-            upperBound.ValueChanged -= new EventHandler(upperBound_ValueChanged);
-          }
-          upperBound = value;
-          if (upperBound != null) {
-            upperBound.ValueChanged += new EventHandler(upperBound_ValueChanged);
-          }
-          OnUpperBoundChanged();
-        }
-      }
-    }
-
-    [Storable]
-    private IntValue stepSize;
-    public IntValue StepSize {
-      get { return stepSize; }
-      set {
-        if (stepSize != value) {
-          if (stepSize != null) {
-            stepSize.ValueChanged -= new EventHandler(upperBound_ValueChanged);
-          }
-          stepSize = value;
-          if (stepSize != null) {
-            stepSize.ValueChanged += new EventHandler(stepSize_ValueChanged);
-          }
-          OnStepSizeChanged();
-        }
-      }
-    }
-
-    public NumericRange() {
-      LowerBound = new IntValue(0);
-      UpperBound = new IntValue(0);
-      StepSize = new IntValue(1);
-    }
-
-    [StorableConstructor]
-    protected NumericRange(bool deserializing) : base(deserializing) { }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      if (lowerBound != null) {
-        lowerBound.ValueChanged += new EventHandler(lowerBound_ValueChanged);
-      }
-      if (upperBound != null) {
-        upperBound.ValueChanged += new EventHandler(upperBound_ValueChanged);
-      }
-      if (stepSize != null) {
-        stepSize.ValueChanged += new EventHandler(stepSize_ValueChanged);
-      }
-    }
-
-    void lowerBound_ValueChanged(object sender, EventArgs e) {
-      OnToStringChanged();
-    }
-    void upperBound_ValueChanged(object sender, EventArgs e) {
-      OnToStringChanged();
-    }
-    void stepSize_ValueChanged(object sender, EventArgs e) {
-      OnToStringChanged();
-    }
-
-    public event EventHandler LowerBoundChanged;
-    private void OnLowerBoundChanged() {
-      var handler = LowerBoundChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public event EventHandler UpperBoundChanged;
-    private void OnUpperBoundChanged() {
-      var handler = UpperBoundChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler StepSizeChanged;
-    private void OnStepSizeChanged() {
-      var handler = StepSizeChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public override string ToString() {
-      return string.Format("[{0},{1}:{2}]", LowerBound.ToString(), UpperBound.ToString(), StepSize.ToString());
-    }
-
-    #region Cloning
-    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
-      NumericRange clone = (NumericRange)base.Clone(cloner);
-      clone.LowerBound = (IntValue)this.LowerBound.Clone();
-      clone.UpperBound = (IntValue)this.UpperBound.Clone();
-      clone.StepSize = (IntValue)this.StepSize.Clone();
-      return base.Clone(cloner);
-    }
-    #endregion
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/NumericRangeList.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/NumericRangeList.cs	(revision 4539)
+++ 	(revision )
@@ -1,18 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  [StorableClass]
-  [Item("NumericRangeList", "Represents a list of numeric ranges.")]
-  public class NumericRangeList : ItemCollection<INumericRange> {
-    public NumericRangeList() : base() { }
-    public NumericRangeList(IEnumerable<INumericRange> collection) : base(collection) { }
-    [StorableConstructor]
-    protected NumericRangeList(bool deserializing) : base(deserializing) { }
-    
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Range.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Range.cs	(revision 4830)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Range.cs	(revision 4830)
@@ -0,0 +1,128 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class Range<T> : Item, IRange<T> where T : class, IItem, IStringConvertibleValue, IDeepCloneable {
+    [Storable]
+    private T lowerBound;
+    public T LowerBound {
+      get { return lowerBound; }
+      set {
+        if (lowerBound != value) {
+          if (lowerBound != null) {
+            lowerBound.ValueChanged -= new EventHandler(lowerBound_ValueChanged);
+          }
+          lowerBound = value;
+          if (lowerBound != null) {
+            lowerBound.ValueChanged += new EventHandler(lowerBound_ValueChanged);
+          }
+          OnLowerBoundChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T upperBound;
+    public T UpperBound {
+      get { return upperBound; }
+      set {
+        if (upperBound != value) {
+          if (upperBound != null) {
+            upperBound.ValueChanged -= new EventHandler(upperBound_ValueChanged);
+          }
+          upperBound = value;
+          if (upperBound != null) {
+            upperBound.ValueChanged += new EventHandler(upperBound_ValueChanged);
+          }
+          OnUpperBoundChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private T stepSize;
+    public T StepSize {
+      get { return stepSize; }
+      set {
+        if (stepSize != value) {
+          if (stepSize != null) {
+            stepSize.ValueChanged -= new EventHandler(upperBound_ValueChanged);
+          }
+          stepSize = value;
+          if (stepSize != null) {
+            stepSize.ValueChanged += new EventHandler(stepSize_ValueChanged);
+          }
+          OnStepSizeChanged();
+        }
+      }
+    }
+
+    public Range() {
+      LowerBound = Activator.CreateInstance<T>();
+      UpperBound = Activator.CreateInstance<T>();
+      StepSize = Activator.CreateInstance<T>(); // todo: stepsize should be != 0
+    }
+
+    [StorableConstructor]
+    protected Range(bool deserializing) : base(deserializing) { }
+    protected Range(Range<T> original, Cloner cloner) : base(original, cloner) {
+      this.LowerBound = cloner.Clone(original.LowerBound);
+      this.UpperBound = cloner.Clone(original.UpperBound);
+      this.StepSize = cloner.Clone(original.StepSize);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Range<T>(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (lowerBound != null) {
+        lowerBound.ValueChanged += new EventHandler(lowerBound_ValueChanged);
+      }
+      if (upperBound != null) {
+        upperBound.ValueChanged += new EventHandler(upperBound_ValueChanged);
+      }
+      if (stepSize != null) {
+        stepSize.ValueChanged += new EventHandler(stepSize_ValueChanged);
+      }
+    }
+
+    void lowerBound_ValueChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    void upperBound_ValueChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    void stepSize_ValueChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+
+    public event EventHandler LowerBoundChanged;
+    private void OnLowerBoundChanged() {
+      var handler = LowerBoundChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler UpperBoundChanged;
+    private void OnUpperBoundChanged() {
+      var handler = UpperBoundChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler StepSizeChanged;
+    private void OnStepSizeChanged() {
+      var handler = StepSizeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public override string ToString() {
+      return string.Format("[{0},{1}:{2}]", LowerBound.ToString(), UpperBound.ToString(), StepSize.ToString());
+    }
+  }
+}
