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 4982)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ParameterConfigurations/ParameterConfiguration.cs	(revision 4984)
@@ -9,5 +9,9 @@
 namespace HeuristicLab.Problems.MetaOptimization {
   [StorableClass]
-  public class ParameterConfiguration : DeepCloneable, IParameterConfiguration, IStorableContent {
+  public class ParameterConfiguration : Item, IParameterConfiguration, IStorableContent {
+    public bool IsOptimizable { 
+      get { return true; } 
+    }
+
     [Storable]
     public string Filename { get; set; }
@@ -26,4 +30,5 @@
           }
           OnOptimizeChanged();
+          OnToStringChanged();
         }
       }
@@ -37,4 +42,5 @@
         if (parameterName != value) {
           parameterName = value;
+          OnToStringChanged();
         }
       }
@@ -65,5 +71,11 @@
     public ICheckedValueConfigurationCollection ValueConfigurations {
       get { return this.valueConfigurations; }
-      protected set { this.valueConfigurations = value; }
+      protected set {
+        if (this.valueConfigurations != value) {
+          if (this.valueConfigurations != null) DeregisterValueConfigurationEvents();
+          this.valueConfigurations = value;
+          if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
+        }
+      }
     }
 
@@ -116,4 +128,16 @@
     #endregion
 
+    private void RegisterValueConfigurationEvents() {
+      this.ValueConfigurations.CheckedItemsChanged += new Collections.CollectionItemsChangedEventHandler<IValueConfiguration>(ValueConfigurations_CheckedItemsChanged);
+      this.ValueConfigurations.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<IValueConfiguration>(ValueConfigurations_ItemsAdded);
+      this.ValueConfigurations.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<IValueConfiguration>(ValueConfigurations_ItemsRemoved);
+    }
+
+    private void DeregisterValueConfigurationEvents() {
+      this.ValueConfigurations.CheckedItemsChanged -= new Collections.CollectionItemsChangedEventHandler<IValueConfiguration>(ValueConfigurations_CheckedItemsChanged);
+      this.ValueConfigurations.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler<IValueConfiguration>(ValueConfigurations_ItemsAdded);
+      this.ValueConfigurations.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<IValueConfiguration>(ValueConfigurations_ItemsRemoved);
+    }
+
     private void PopulateValueConfigurations() {
       foreach (IItem validValue in this.validValues) {
@@ -132,23 +156,13 @@
     }
 
-    //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);
-    //}
+    void ValueConfigurations_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IValueConfiguration> e) {
+      OnToStringChanged();
+    }
+    void ValueConfigurations_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IValueConfiguration> e) {
+      OnToStringChanged();
+    }
+    void ValueConfigurations_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IValueConfiguration> e) {
+      OnToStringChanged();
+    }
 
     #region INamedItem Properties
@@ -167,15 +181,12 @@
       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; }
+    public override string ItemDescription {
+      get { return parameter != null ? parameter.Description : base.ItemDescription; }
+    }
+    public override System.Drawing.Image ItemImage {
+      get { return parameter != null ? parameter.ItemImage : base.ItemImage; }
+    }
+    public override string ItemName {
+      get { return parameter != null ?parameter.ItemName : base.ItemName; }
     }
     #endregion
@@ -199,15 +210,9 @@
       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 IsOptimizableChanged;
+    private void OnIsOptimizableChanged() {
+      var handler = IsOptimizableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -220,5 +225,9 @@
 
     public override string ToString() {
-      return string.Format("{0}: {1}", ParameterName, ConstrainedValue.Value);
+      if (Optimize) {
+        return string.Format("{0}: (Optimize: {1})", ParameterName, ValueConfigurations.CheckedItems.Count());
+      } else {
+        return string.Format("{0}: {1}", ParameterName, ConstrainedValue.Value);
+      }
     }
 
@@ -226,5 +235,4 @@
       if (parameter is IValueParameter) {
         IValueParameter valueParameter = parameter as IValueParameter;
-
         return new ParameterConfiguration(parameter.Name, valueParameter);
       }
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 4982)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encodings/ValueConfigurations/ValueConfiguration.cs	(revision 4984)
@@ -10,4 +10,15 @@
   // TODO: ItemName/Descr, storability
   public class ValueConfiguration : Item, IValueConfiguration {
+    protected bool isOptimizable;
+    public bool IsOptimizable {
+      get { return isOptimizable; }
+      set {
+        if (this.isOptimizable != value) {
+          this.isOptimizable = value;
+          OnIsOptimizableChanged();
+        }
+      }
+    }
+
     protected bool optimize;
     public bool Optimize {
@@ -52,13 +63,18 @@
       get { return rangeConstraint; }
     }
-    
+
     #region Constructors and Cloning
     public ValueConfiguration(IItem value, Type valueDataType) {
       this.ParameterConfigurations = new ItemList<IParameterConfiguration>();
       this.ConstrainedValue = new ConstrainedValue(value, valueDataType);
+      this.IsOptimizable = true;
       if (constrainedValue.ValueDataType == typeof(IntValue)) {
         rangeConstraint = new Range<IntValue>(new IntValue(0), (IntValue)value, new IntValue(1));
       } else if (constrainedValue.ValueDataType == typeof(DoubleValue)) {
-        rangeConstraint = new Range<DoubleValue>(new DoubleValue(0), (DoubleValue)value, new DoubleValue(0.1));
+        rangeConstraint = new Range<DoubleValue>(new DoubleValue(0), (DoubleValue)value, new DoubleValue(0.01));
+      } else if (constrainedValue.ValueDataType == typeof(PercentValue)) {
+        rangeConstraint = new Range<PercentValue>(new PercentValue(0), new PercentValue(1), new PercentValue(0.001));
+      } else if (constrainedValue.ValueDataType == typeof(BoolValue)) {
+        this.IsOptimizable = false; // there is nothing to configure for bools
       } else {
         rangeConstraint = null;
@@ -74,4 +90,5 @@
       this.ConstrainedValue = cloner.Clone(original.ConstrainedValue);
       this.rangeConstraint = cloner.Clone(original.RangeConstraint);
+      this.IsOptimizable = original.IsOptimizable;
       RegisterEvents();
     }
@@ -131,4 +148,10 @@
     }
 
+    public virtual event EventHandler IsOptimizableChanged;
+    private void OnIsOptimizableChanged() {
+      var handler = IsOptimizableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
     public virtual event EventHandler OptimizeChanged;
     protected virtual void OnOptimizeChanged() {
@@ -140,13 +163,20 @@
     public override string ToString() {
       if (ConstrainedValue != null && ConstrainedValue.Value != null) {
-        if(Optimize) {
-          return string.Format("{0}: {1}", ConstrainedValue.Value.ItemName, RangeConstraint);
+        if (ConstrainedValue.Value is IParameterizedItem) {
+          if (Optimize) {
+            return string.Format("{0} (Optimize)", ConstrainedValue.Value.ItemName);
+          } else {
+            return string.Format("{0}", ConstrainedValue.Value.ItemName);
+          }
         } else {
-          return string.Format("{0}: {1}", ConstrainedValue.Value.ItemName, ConstrainedValue.Value);
-        }        
+          if (Optimize) {
+            return string.Format("{0} (Optimize: {1})", ConstrainedValue.Value.ItemName, RangeConstraint);
+          } else {
+            return string.Format("{0}: {1}", ConstrainedValue.Value.ItemName, ConstrainedValue.Value);
+          }
+        }
       } else {
         return base.ToString();
       }
-
     }
   }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 4982)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 4984)
@@ -8,6 +8,9 @@
 namespace HeuristicLab.Problems.MetaOptimization {
   public interface IOptimizable : IItem {
+    bool IsOptimizable { get; }
     bool Optimize { get; set; }
     ConstrainedValue ConstrainedValue { get; set; }
+
+    event EventHandler IsOptimizableChanged;
     event EventHandler OptimizeChanged;
   }
