Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Analyzers/BestParameterConfigurationAnalyzer.cs	(revision 4839)
@@ -1,13 +1,10 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Core;
-using HeuristicLab.Parameters;
-using HeuristicLab.Data;
-using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.MetaOptimization {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Creators/RandomParameterConfigurationCreator.cs	(revision 4839)
@@ -1,12 +1,8 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+﻿using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Common;
-using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Problems.MetaOptimization {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterConfigurationCrossover.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterConfigurationCrossover.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/Crossovers/ParameterConfigurationCrossover.cs	(revision 4839)
@@ -1,17 +1,11 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 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 {
@@ -79,6 +73,6 @@
       IntegerVector integerChild = HeuristicLab.Encodings.IntegerVectorEncoding.DiscreteCrossover.Apply(
         RandomParameter.ActualValue,
-        new IntegerVector(new IntArray(new int[] { ((IntValue)parameter1.Value).Value })),
-        new IntegerVector(new IntArray(new int[] { ((IntValue)parameter2.Value).Value })));
+        new IntegerVector(new IntArray(new int[] { ((IntValue)parameter1.ActualValueConfiguration).Value })),
+        new IntegerVector(new IntArray(new int[] { ((IntValue)parameter2.ActualValueConfiguration).Value })));
       return new IntValue(integerChild[0]);
     }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/IntValueParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/IntValueParameterConfiguration.cs	(revision 4832)
+++ 	(revision )
@@ -1,25 +1,0 @@
-﻿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, IValueParameter valueParameter) : base(parentConfiguration, parameterName, valueParameter) {
-    }
-
-    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/ParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfiguration.cs	(revision 4832)
+++ 	(revision )
@@ -1,228 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Core;
-using HeuristicLab.Common;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  [StorableClass]
-  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 Type parameterType;
-    public Type ParameterType {
-      get { return this.parameterType; }
-    }
-
-    protected Type valueType;
-    public Type ValueType {
-      get { return this.valueType; }
-    }
-
-    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();
-        }
-      }
-    }
-
-    // store parameter reference only for name/description/image/...
-    private IValueParameter parameter;
-
-    public ParameterConfiguration(ParameterConfiguration parentConfiguration, string parameterName, IValueParameter valueParameter) {
-      this.parentConfiguration = parentConfiguration;
-      this.ParameterName = parameterName;
-      this.Value = valueParameter.Value;
-      this.parameterType = valueParameter.GetType();
-      this.valueType = valueParameter.DataType;
-
-      this.parameter = valueParameter;
-    }
-
-    public ParameterConfiguration() { }
-    [StorableConstructor]
-    protected ParameterConfiguration(bool deserializing) { }
-    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 ParameterName; }
-      set { throw new NotSupportedException(); }
-    }
-    public virtual string Description {
-      get { return parameter.Description; }
-      set { throw new NotSupportedException(); }
-    }
-    public virtual bool CanChangeDescription {
-      get { return false; }
-    }
-    public virtual bool CanChangeName {
-      get { return false; }
-    }
-    public virtual string ItemDescription {
-      get { return parameter.Description; }
-    }
-    public virtual System.Drawing.Image ItemImage {
-      get { return parameter.ItemImage; }
-    }
-    public virtual string ItemName {
-      get { return parameter.ItemName; }
-    }
-    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 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
-
-    public override string ToString() {
-      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);
-        } else if (typeof(IParameterizedItem).IsAssignableFrom(parameter.DataType)) {
-          return new ParameterConfiguration(parentConfiguration, parameter.Name, valueParameter);
-        } else {
-          // todo
-          return new IntValueParameterConfiguration(parentConfiguration, parameter.Name, valueParameter);
-        }
-      }
-      return null;
-    }
-
-    public void Parameterize(IParameterizedItem parameterizedItem) {
-      throw new NotImplementedException();
-    }
-
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs	(revision 4839)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs	(revision 4839)
@@ -0,0 +1,221 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class ParameterConfiguration : DeepCloneable, IParameterConfiguration, IStorableContent {
+    [Storable]
+    public string Filename { get; set; }
+
+    [Storable]
+    protected bool optimizationEnabled;
+    public bool OptimizationEnabled {
+      get { return optimizationEnabled; }
+      set {
+        if (optimizationEnabled != value) {
+          optimizationEnabled = value;
+          if (optimizationEnabled) {
+            PopulateValueConfigurations();
+          } else {
+            this.ValueConfigurations.Clear();
+          }
+          OnOptimizationEnabledChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected string parameterName;
+    public string ParameterName {
+      get { return parameterName; }
+      set {
+        if (parameterName != value) {
+          parameterName = value;
+        }
+      }
+    }
+
+    protected Type parameterDataType;
+    public Type ParameterDataType {
+      get { return this.parameterDataType; }
+    }
+
+    protected IEnumerable<IItem> validValues;
+    public IEnumerable<IItem> ValidValues {
+      get { return validValues; }
+      protected set {
+        if (this.validValues != value) {
+          this.validValues = value;
+        }
+      }
+    }
+
+    protected Type valueDataType;
+    public Type ValueDataType {
+      get { return valueDataType; }
+      protected set { this.valueDataType = value; }
+    }
+
+    protected ICheckedItemList<IValueConfiguration> valueConfigurations;
+    public ICheckedItemList<IValueConfiguration> ValueConfigurations {
+      get { return this.valueConfigurations; }
+      protected set { this.valueConfigurations = value; }
+    }
+
+    // todo: chooses one of the parameter configurations as actual value
+    protected IValueConfiguration actualValueConfiguration;
+    public IValueConfiguration ActualValueConfiguration {
+      get { return this.actualValueConfiguration; }
+      set { this.actualValueConfiguration = value; }
+    }
+
+    // store parameter reference only for name/description/image/...
+    private IValueParameter parameter;
+
+    public ParameterConfiguration(string parameterName, IValueParameter valueParameter) {
+      this.ParameterName = parameterName;
+      this.parameterDataType = valueParameter.GetType();
+      this.parameter = valueParameter;
+      this.valueDataType = valueParameter.DataType;
+      this.validValues = GetValidValues();
+      this.ValueConfigurations = new CheckedItemList<IValueConfiguration>();
+      this.ActualValueConfiguration = new ValueConfiguration(valueParameter.Value, valueParameter.DataType);
+      if (OptimizationEnabled) {
+        PopulateValueConfigurations();
+      }
+    }
+
+    public ParameterConfiguration() { }
+    [StorableConstructor]
+    protected ParameterConfiguration(bool deserializing) { }
+    protected ParameterConfiguration(ParameterConfiguration original, Cloner cloner) : base(original, cloner) {
+      this.ParameterName = original.ParameterName;
+      this.parameterDataType = original.parameterDataType;
+      this.parameter = cloner.Clone(original.parameter);
+      this.ValueDataType = original.ValueDataType;
+      this.ValidValues = original.ValidValues.Select(x => cloner.Clone(x));
+      this.ValueConfigurations = cloner.Clone(original.ValueConfigurations);
+      this.ActualValueConfiguration = cloner.Clone(original.ActualValueConfiguration);
+      this.OptimizationEnabled = original.optimizationEnabled;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfiguration(this, cloner);
+    }
+
+    private void PopulateValueConfigurations() {
+      foreach (IItem item in this.validValues) {
+        this.ValueConfigurations.Add(new ValueConfiguration(item, item.GetType()), false);
+      }
+    }
+
+    private IEnumerable<IItem> GetValidValues() {
+      return ApplicationManager.Manager.GetInstances(valueDataType).Select(x => (IItem)x).OrderBy(x => x.ItemName).ToArray();
+    }
+
+    void ValidValues_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<IItem>> e) {
+      var oldItems = e.OldItems.Select(x => x.Value);
+      var newItems = e.Items.Select(x => x.Value);
+      var intersection = oldItems.Intersect(newItems);
+      var removedItems = oldItems.Where(x => !intersection.Contains(x));
+      var addedItems = newItems.Where(x => !intersection.Contains(x));
+
+      foreach (var item in removedItems) {
+        RemoveValueConfiguration(item);
+      }
+      foreach (var item in addedItems) {
+        this.ValueConfigurations.Add(new ValueConfiguration(item, item.GetType()));
+      }
+    }
+
+    private void RemoveValueConfiguration(IItem item) {
+      IValueConfiguration vc = this.ValueConfigurations.Single(x => x.ValueDataType == item.GetType());
+      this.ValueConfigurations.Remove(vc);
+    }
+
+    #region INamedItem Properties
+    public virtual string Name {
+      get { return ParameterName; }
+      set { throw new NotSupportedException(); }
+    }
+    public virtual string Description {
+      get { return parameter.Description; }
+      set { throw new NotSupportedException(); }
+    }
+    public virtual bool CanChangeDescription {
+      get { return false; }
+    }
+    public virtual bool CanChangeName {
+      get { return false; }
+    }
+    public virtual string ItemDescription {
+      get { return parameter.Description; }
+    }
+    public virtual System.Drawing.Image ItemImage {
+      get { return parameter.ItemImage; }
+    }
+    public virtual string ItemName {
+      get { return parameter.ItemName; }
+    }
+    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 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);
+    }
+    #endregion
+
+    public override string ToString() {
+      return string.Format("{0}", ParameterName);
+    }
+
+    public static IParameterConfiguration Create(IParameterizedNamedItem parent, IParameter parameter) {
+      if (parameter is IValueParameter) {
+        IValueParameter valueParameter = parameter as IValueParameter;
+
+        return new ParameterConfiguration(parameter.Name, valueParameter);
+      }
+      return null;
+    }
+
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RootParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/RootParameterConfiguration.cs	(revision 4832)
+++ 	(revision )
@@ -1,69 +1,0 @@
-﻿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/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs	(revision 4839)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs	(revision 4839)
@@ -0,0 +1,105 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class ValueConfiguration : DeepCloneable, IValueConfiguration {
+    [Storable]
+    protected IItemList<IParameterConfiguration> parameterConfigurations = new ItemList<IParameterConfiguration>();
+    public IItemList<IParameterConfiguration> ParameterConfigurations {
+      get { return this.parameterConfigurations; }
+      protected set { this.parameterConfigurations = value; }
+    }
+
+    protected IItem value;
+    public IItem Value {
+      get { return value; }
+      set {
+        if (this.value != value) {
+          ClearChildParameterConfigurations();
+          this.value = value;
+          if (this.value is IParameterizedNamedItem) AddChildParameterConfigurations(this.value as IParameterizedNamedItem);
+          OnValueChanged();
+        }
+      }
+    }
+
+    protected Type valueDataType;
+    public Type ValueDataType {
+      get { return this.valueDataType; }
+      protected set { this.valueDataType = value; }
+    }
+
+    public ValueConfiguration(IItem value, Type valueDataType) {
+      this.Value = value;
+      this.ValueDataType = valueDataType;
+    }
+
+    public ValueConfiguration() { }
+    [StorableConstructor]
+    protected ValueConfiguration(bool deserializing) { }
+    protected ValueConfiguration(ValueConfiguration original, Cloner cloner) : base(original, cloner) {
+      this.ParameterConfigurations = cloner.Clone(original.ParameterConfigurations);
+      this.Value = cloner.Clone(original.Value);
+      this.ValueDataType = original.ValueDataType;
+
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ValueConfiguration(this, cloner);
+    }
+
+    protected virtual void AddChildParameterConfigurations(IParameterizedNamedItem parameterizedItem) {
+      foreach (var childParameter in parameterizedItem.Parameters) {
+        var pc = ParameterConfiguration.Create(parameterizedItem, childParameter);
+        if (pc != null) this.ParameterConfigurations.Add(pc);
+      }
+    }
+    protected virtual void ClearChildParameterConfigurations() {
+      ParameterConfigurations.Clear();
+    }
+    
+    #region IItem Members
+    public string ItemDescription {
+      get { return value.ItemDescription; }
+    }
+
+    public System.Drawing.Image ItemImage {
+      get { return value.ItemImage; }
+    }
+
+    public string ItemName {
+      get { return value.ItemDescription; }
+    }
+
+    public Version ItemVersion {
+      get { return value.ItemVersion; }
+    }
+    #endregion
+
+    #region Events
+    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 OnStringChanged(object sender, EventArgs e) {
+      var handler = ToStringChanged;
+      if (handler != null) handler(this, e); // important to set 'this' as sender
+    }
+
+    public virtual event EventHandler ValueChanged;
+    protected virtual void OnValueChanged() {
+      var handler = ValueChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public override string ToString() {
+      return value.ItemName;
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueTypeParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueTypeParameterConfiguration.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueTypeParameterConfiguration.cs	(revision 4839)
@@ -18,5 +18,5 @@
     }
 
-    public ValueTypeParameterConfiguration(ParameterConfiguration parentConfiguration, string parameterName, IValueParameter valueParameter) : base(parentConfiguration, parameterName, valueParameter) {
+    public ValueTypeParameterConfiguration(string parameterName, IValueParameter valueParameter) : base(parameterName, valueParameter) {
       this.ranges = new ItemList<IRange<T>>();
       this.ranges.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IRange<T>>>(ranges_ItemsAdded);
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 4839)
@@ -1,14 +1,11 @@
 ﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Operators;
-using HeuristicLab.Data;
-using HeuristicLab.Parameters;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Optimization;
 using System.Threading;
 using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -65,5 +62,5 @@
       AlgorithmParameter.ActualValue.Prepare();
       //ParameterizeAlgorithm();
-      ParameterConfigurationParameter.ActualValue.Parameterize(AlgorithmParameter.ActualValue);
+      //ParameterConfigurationParameter.ActualValue.Parameterize(AlgorithmParameter.ActualValue);
       algorithmStopped = false;
       AlgorithmParameter.ActualValue.Stopped += new EventHandler(ActualValue_Stopped);
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 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 4839)
@@ -88,12 +88,8 @@
   <ItemGroup>
     <Compile Include="Analyzers\BestParameterConfigurationAnalyzer.cs" />
+    <Compile Include="Encodings\ValueConfigurations\ValueConfiguration.cs" />
     <Compile Include="Interfaces\IParameterConfigurationCreator.cs" />
     <Compile Include="Creators\RandomParameterConfigurationCreator.cs" />
     <Compile Include="Encodings\Crossovers\ParameterConfigurationCrossover.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" />
@@ -101,5 +97,6 @@
     <Compile Include="Interfaces\IMetaOptimizationEvaluator.cs" />
     <Compile Include="Interfaces\IParameterConfiguration.cs" />
-    <Compile Include="Encodings\ParameterConfiguration.cs" />
+    <Compile Include="Encodings\ParameterConfigurations\ParameterConfiguration.cs" />
+    <Compile Include="Interfaces\IValueConfiguration.cs" />
     <Compile Include="Range.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IMetaOptimizationEvaluator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IMetaOptimizationEvaluator.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IMetaOptimizationEvaluator.cs	(revision 4839)
@@ -1,7 +1,3 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Optimization;
+﻿using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Problems.MetaOptimization {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 4839)
@@ -1,7 +1,5 @@
 ﻿using System;
+using HeuristicLab.Core;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Core;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -9,15 +7,11 @@
     bool OptimizationEnabled { get; set; }
     string ParameterName { get; set; }
-    //IParameter Parameter { get; }
-    Type ParameterType { get; }
-    Type ValueType { get; }
-    IItem Value { get; set; }
-    IItemList<IParameterConfiguration> ChildParameterConfigurations { get; }
-
-    void Parameterize(IParameterizedItem parameterizedItem);
+    Type ParameterDataType { get; }
+    ICheckedItemList<IValueConfiguration> ValueConfigurations { get; }
+    IValueConfiguration ActualValueConfiguration { get; set; }
+    Type ValueDataType { get; }
+    IEnumerable<IItem> ValidValues { get; }
 
     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 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationCreator.cs	(revision 4839)
@@ -1,7 +1,3 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Optimization;
+﻿using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Problems.MetaOptimization {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationOperator.cs	(revision 4839)
@@ -1,7 +1,3 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Core;
+﻿using HeuristicLab.Core;
 
 namespace HeuristicLab.Problems.MetaOptimization {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 4839)
@@ -1,9 +1,6 @@
 ﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 using HeuristicLab.Common;
+using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Core;
 
 namespace HeuristicLab.Problems.MetaOptimization {
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs	(revision 4839)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs	(revision 4839)
@@ -0,0 +1,12 @@
+﻿using System;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IValueConfiguration : IItem {
+    IItem Value { get; set; }
+    Type ValueDataType { get; }
+    IItemList<IParameterConfiguration> ParameterConfigurations { get; }
+
+    event EventHandler ValueChanged;
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 4839)
@@ -21,13 +21,11 @@
 
 using System;
-using System.Collections.Generic;
 using System.Linq;
-using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.Common;
-using HeuristicLab.Parameters;
-using HeuristicLab.Data;
 using HeuristicLab.PluginInfrastructure;
 
@@ -49,6 +47,6 @@
       get { return (ValueParameter<IItemList<ISingleObjectiveProblem>>)Parameters[ProblemsParameterName]; }
     }
-    public ValueParameter<IParameterConfiguration> AlgorithmParameterConfigurationParameter {
-      get { return (ValueParameter<IParameterConfiguration>)Parameters[AlgorithmParameterConfigurationParameterName]; }
+    public ValueParameter<IValueConfiguration> AlgorithmParameterConfigurationParameter {
+      get { return (ValueParameter<IValueConfiguration>)Parameters[AlgorithmParameterConfigurationParameterName]; }
     }
     //public ValueParameter<IItemList<IParameterConfiguration>> ProblemParametersConfigurationParameter {
@@ -66,5 +64,5 @@
       set { ProblemsParameter.Value = value; }
     }
-    public IParameterConfiguration AlgorithmParameterConfiguration {
+    public IValueConfiguration AlgorithmParameterConfiguration {
       get { return AlgorithmParameterConfigurationParameter.Value; }
       set { AlgorithmParameterConfigurationParameter.Value = value; }
@@ -80,5 +78,5 @@
       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<IValueConfiguration>(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>()));
       
@@ -155,5 +153,5 @@
       if (Algorithm != null) {
         Algorithm.ProblemChanged += new EventHandler(BaseLevelAlgorithm_ProblemChanged);
-        AlgorithmParameterConfiguration = ParameterConfiguration.Create(Algorithm);
+        AlgorithmParameterConfiguration = new ValueConfiguration(Algorithm, Algorithm.GetType());
       }
       BaseLevelAlgorithm_ProblemChanged(sender, e);
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Properties/AssemblyInfo.cs	(revision 4839)
@@ -1,4 +1,3 @@
 ﻿using System.Reflection;
-using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Range.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Range.cs	(revision 4832)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Range.cs	(revision 4839)
@@ -1,10 +1,7 @@
 ﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Common;
 
 namespace HeuristicLab.Problems.MetaOptimization {
