Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/AlgorithmProblemItem.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/AlgorithmProblemItem.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/AlgorithmProblemItem.cs	(revision 8535)
@@ -41,10 +41,9 @@
     [StorableConstructor]
     protected AlgorithmProblemItem(bool deserializing) : base(deserializing) { }
-    public AlgorithmProblemItem() {
+    protected AlgorithmProblemItem(AlgorithmProblemItem original, Cloner cloner) : base(original, cloner) { }
+    public AlgorithmProblemItem()
+      : base() {
       this.Parameters.Add(new ValueParameter<IAlgorithm>("Algorithm"));
       this.Parameters.Add(new ValueParameter<IProblem>("Problem"));
-    }
-    protected AlgorithmProblemItem(AlgorithmProblemItem original, Cloner cloner)
-      : base(original, cloner) {
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedItemList.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedItemList.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedItemList.cs	(revision 8535)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -19,7 +40,5 @@
     }
 
-    public ConstrainedItemList() {
-      Type = typeof(T);
-    }
+    #region Constructors and Cloning
     [StorableConstructor]
     protected ConstrainedItemList(bool deserializing) : base(deserializing) { }
@@ -28,7 +47,12 @@
       this.Type = original.Type;
     }
+    public ConstrainedItemList()
+      : base() {
+      Type = typeof(T);
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new ConstrainedItemList<T>(this, cloner);
     }
+    #endregion
   }
 }
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedTypeValue.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedTypeValue.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ConstrainedTypeValue.cs	(revision 8535)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -11,5 +32,4 @@
   [StorableClass]
   public class ConstrainedTypeValue : TypeValue {
-
     private IEnumerable<Type> validTypes;
     public IEnumerable<Type> ValidTypes {
@@ -25,4 +45,12 @@
     }
 
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected ConstrainedTypeValue(bool deserializing) : base(deserializing) { }
+    protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.validTypes != null)
+        this.validTypes = new List<Type>(original.validTypes);
+    }
     public ConstrainedTypeValue()
       : base() {
@@ -33,15 +61,8 @@
       this.Value = value;
     }
-
-    [StorableConstructor]
-    protected ConstrainedTypeValue(bool deserializing) : base(deserializing) { }
-    protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner)
-      : base(original, cloner) {
-      if (original.validTypes != null)
-        this.validTypes = new List<Type>(original.validTypes);
-    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new ConstrainedTypeValue(this, cloner);
     }
+    #endregion
   }
 
@@ -49,5 +70,12 @@
   [StorableClass]
   public class ConstrainedTypeValue<T> : ConstrainedTypeValue where T : class, IItem {
-
+    [StorableConstructor]
+    protected ConstrainedTypeValue(bool deserializing)
+      : base(deserializing) {
+      if (deserializing) {
+        this.ValidTypes = ApplicationManager.Manager.GetTypes(typeof(T), true).ToList();
+      }
+    }
+    protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner) : base(original, cloner) { }
     public ConstrainedTypeValue()
       : base() {
@@ -60,14 +88,4 @@
       this.Value = value;
     }
-
-    [StorableConstructor]
-    protected ConstrainedTypeValue(bool deserializing)
-      : base(deserializing) {
-      if (deserializing) {
-        this.ValidTypes = ApplicationManager.Manager.GetTypes(typeof(T), true).ToList();
-      }
-    }
-
-    protected ConstrainedTypeValue(ConstrainedTypeValue original, Cloner cloner) : base(original, cloner) { }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new ConstrainedTypeValue<T>(this, cloner);
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IOptimizable.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IOptimizable.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IOptimizable.cs	(revision 8535)
@@ -42,4 +42,5 @@
     event EventHandler IsOptimizableChanged;
     event EventHandler OptimizeChanged;
+    event EventHandler CombinationsCountChanged;
 
     /// <summary>
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IValueConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IValueConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/Interfaces/IValueConfiguration.cs	(revision 8535)
@@ -28,6 +28,4 @@
 
     event EventHandler ValueChanged;
-
-    //void Parameterize(IParameterizedItem item);
   }
 }
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/NullValue.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/NullValue.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/NullValue.cs	(revision 8535)
@@ -27,11 +27,8 @@
   [StorableClass]
   public class NullValue : ValueTypeValue<int> {
-
-    public NullValue() { }
     [StorableConstructor]
     protected NullValue(bool deserializing) : base(deserializing) { }
-    protected NullValue(NullValue original, Cloner cloner)
-      : base(original, cloner) {
-    }
+    protected NullValue(NullValue original, Cloner cloner) : base(original, cloner) { }
+    public NullValue() : base() { }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new NullValue(this, cloner);
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurationTree.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurationTree.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurationTree.cs	(revision 8535)
@@ -37,4 +37,16 @@
   [StorableClass]
   public class ParameterConfigurationTree : ParameterizedValueConfiguration, IEnumerable {
+    [Storable]
+    private long combinationsCount;
+    public long CombinationsCount {
+      get { return combinationsCount; }
+      private set {
+        if (combinationsCount != value) {
+          combinationsCount = value;
+          OnCombinationsCountChanged();
+        }
+      }
+    }
+
     [Storable]
     private DoubleValue quality;
@@ -213,15 +225,23 @@
       this.Name = algorithm.ItemName;
 
-      var algproblemitem = new AlgorithmProblemItem();
-      algproblemitem.AlgorithmParameter.Value = algorithm;
-      algproblemitem.ProblemParameter.Value = problem;
+      var algProblemItem = new AlgorithmProblemItem();
+      algProblemItem.AlgorithmParameter.Value = algorithm;
+      algProblemItem.ProblemParameter.Value = problem;
       this.discoverValidValues = false;
 
-      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Algorithm", algproblemitem.AlgorithmParameter));
-      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Problem", algproblemitem.ProblemParameter));
+      var algConfig = new SingleValuedParameterConfiguration("Algorithm", algProblemItem.AlgorithmParameter);
+      var problemConfig = new SingleValuedParameterConfiguration("Problem", algProblemItem.ProblemParameter);
+
+      algConfig.CombinationsCountChanged += new EventHandler(UpdateConfigurationsCount);
+      problemConfig.CombinationsCountChanged += new EventHandler(UpdateConfigurationsCount);
+
+      this.parameterConfigurations.Add(algConfig);
+      this.parameterConfigurations.Add(problemConfig);
 
       // problems can be modified in the list of problem instances, so the parameters which are not Optimize=true, 
       // must not be modifiable in the parameter configuration tree. otherwise the parameter values would be ambiguous
       ProblemConfiguration.ValuesReadOnly = true;
+
+      CombinationsCount = GetCombinationCount(0);
     }
 
@@ -233,4 +253,5 @@
     private void AfterDeserialization() {
       if (ProblemConfiguration != null) ProblemConfiguration.ValuesReadOnly = true;
+      CombinationsCount = GetCombinationCount(0);
     }
     #endregion
@@ -265,4 +286,8 @@
     private void Quality_ValueChanged(object sender, EventArgs e) {
       OnQualityChanged();
+    }
+
+    private void UpdateConfigurationsCount(object sender, EventArgs e) {
+      CombinationsCount = GetCombinationCount(0);
     }
 
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/ParameterConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/ParameterConfiguration.cs	(revision 8535)
@@ -57,5 +57,18 @@
           }
           OnOptimizeChanged();
+          OnCombinationsCountChanged();
           OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    protected long combinationsCount;
+    public virtual long CombinationsCount {
+      get { return combinationsCount; }
+      set {
+        if (combinationsCount != value) {
+          combinationsCount = value;
+          OnCombinationsCountChanged();
         }
       }
@@ -179,5 +192,6 @@
 
     #region Constructors and Cloning
-    public ParameterConfiguration(string parameterName, IValueParameter valueParameter, bool discoverValidValues) {
+    public ParameterConfiguration(string parameterName, IValueParameter valueParameter, bool discoverValidValues)
+      : base() {
       this.AutoPopulateValueConfigurations = true;
       this.ParameterName = parameterName;
@@ -202,5 +216,6 @@
       }
     }
-    public ParameterConfiguration(string parameterName, Type type, IItem actualValue, IEnumerable<IValueConfiguration> valueConfigurations) {
+    public ParameterConfiguration(string parameterName, Type type, IItem actualValue, IEnumerable<IValueConfiguration> valueConfigurations)
+      : base() {
       this.AutoPopulateValueConfigurations = false;
       this.ParameterName = parameterName;
@@ -211,9 +226,10 @@
       this.validTypes = new Type[] { type };
       this.IsNullable = false;
-      this.itemImage = valueConfigurations.Count() > 0 ? valueConfigurations.FirstOrDefault().ItemImage : null;
+      this.itemImage = valueConfigurations.Any() ? valueConfigurations.First().ItemImage : null;
       this.ValueConfigurations = new CheckedValueConfigurationList(valueConfigurations);
       this.ActualValue = new ConstrainedValue(actualValue, type, CreateValidValues(), this.IsNullable);
     }
-    public ParameterConfiguration(string parameterName, Type type, IItem actualValue) {
+    public ParameterConfiguration(string parameterName, Type type, IItem actualValue)
+      : base() {
       this.AutoPopulateValueConfigurations = true;
       this.ParameterName = parameterName;
@@ -231,8 +247,7 @@
       }
     }
-    protected ParameterConfiguration() { }
+    protected ParameterConfiguration() : base() { }
     [StorableConstructor]
     protected ParameterConfiguration(bool deserializing) { }
-
     protected ParameterConfiguration(ParameterConfiguration original, Cloner cloner)
       : base(original, cloner) {
@@ -316,4 +331,5 @@
               }
             }
+            valueConfiguration.CombinationsCountChanged += (sender, args) => OnCombinationsCountChanged();
             this.ValueConfigurations.Add(valueConfiguration, true);
           }
@@ -357,5 +373,5 @@
         return new List<Type> { parameter };
 
-      //TODO: not sure if this if makes sense; maybe only leave else branch here
+      // TODO: check if this makes sense; maybe only leave else branch here
       if (IsSubclassOfRawGeneric(typeof(OptionalConstrainedValueParameter<>), parameter.GetType())) {
         // use existing validvalues if known
@@ -391,5 +407,5 @@
 
       // copy value from ValidValues; this ensures that previously set ActualNames for a type are kept
-      IItem value = this.validValues.Where(v => v.GetType() == type).SingleOrDefault();
+      IItem value = this.validValues.SingleOrDefault(v => v.GetType() == type);
       if (value != null)
         return value;
@@ -425,4 +441,5 @@
     private void ValueConfigurations_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
       OnToStringChanged();
+      OnCombinationsCountChanged();
       KeepActualValueConfigurationIndexConsistent();
     }
@@ -430,8 +447,10 @@
     private void ValueConfigurations_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
       OnToStringChanged();
+      OnCombinationsCountChanged();
       KeepActualValueConfigurationIndexConsistent();
     }
     private void ValueConfigurations_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
       OnToStringChanged();
+      OnCombinationsCountChanged();
       KeepActualValueConfigurationIndexConsistent();
     }
@@ -451,10 +470,4 @@
     public virtual bool CanChangeName {
       get { return false; }
-    }
-    public override string ItemDescription {
-      get { return base.ItemDescription; }
-    }
-    public override string ItemName {
-      get { return base.ItemName; }
     }
     #endregion
@@ -494,4 +507,10 @@
     protected virtual void OnOptimizeChanged() {
       var handler = OptimizeChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler CombinationsCountChanged;
+    protected void OnCombinationsCountChanged() {
+      var handler = CombinationsCountChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/SingleValuedParameterConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/SingleValuedParameterConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ParameterConfigurations/SingleValuedParameterConfiguration.cs	(revision 8535)
@@ -29,8 +29,8 @@
   [StorableClass]
   public class SingleValuedParameterConfiguration : ParameterConfiguration {
-
     #region Constructors and Cloning
     [StorableConstructor]
     protected SingleValuedParameterConfiguration(bool deserializing) : base(deserializing) { }
+    protected SingleValuedParameterConfiguration(SingleValuedParameterConfiguration original, Cloner cloner) : base(original, cloner) { }
     public SingleValuedParameterConfiguration(string parameterName, IValueParameter valueParameter)
       : base(parameterName, valueParameter, false) {
@@ -57,7 +57,4 @@
         this.validValues,
         this.IsNullable);
-    }
-    protected SingleValuedParameterConfiguration(SingleValuedParameterConfiguration original, Cloner cloner)
-      : base(original, cloner) {
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/ConstrainedValue.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/ConstrainedValue.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/ConstrainedValue.cs	(revision 8535)
@@ -86,14 +86,7 @@
     }
 
-    #region constructors and cloning
-    public ConstrainedValue() { }
+    #region Constructors and Cloning
     [StorableConstructor]
     protected ConstrainedValue(bool deserializing) : base(deserializing) { }
-    public ConstrainedValue(IItem value, Type valueDataType, IItemSet<IItem> validValues, bool isNullable) {
-      this.Value = value;
-      this.ValueDataType = valueDataType;
-      this.ValidValues = validValues;
-      this.isNullable = isNullable;
-    }
     protected ConstrainedValue(ConstrainedValue original, Cloner cloner)
       : base(original, cloner) {
@@ -103,10 +96,18 @@
       this.isNullable = original.isNullable;
     }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new ConstrainedValue(this, cloner);
+    public ConstrainedValue() : base() { }
+    public ConstrainedValue(IItem value, Type valueDataType, IItemSet<IItem> validValues, bool isNullable)
+      : base() {
+      this.Value = value;
+      this.ValueDataType = valueDataType;
+      this.ValidValues = validValues;
+      this.isNullable = isNullable;
     }
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
       if (this.value != null) RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstrainedValue(this, cloner);
     }
     #endregion
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/DoubleValueRange.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/DoubleValueRange.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/DoubleValueRange.cs	(revision 8535)
@@ -30,21 +30,13 @@
   [StorableClass]
   public class DoubleValueRange : Range<DoubleValue> {
-
-    public override DoubleValue LowerBound {
-      get {
-        return base.LowerBound;
-      }
-      set {
-        base.LowerBound = value;
-      }
-    }
-
-    public DoubleValueRange(DoubleValue lowerBound, DoubleValue upperBound, DoubleValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    #region Constructors and Cloning
     [StorableConstructor]
     protected DoubleValueRange(bool deserializing) : base(deserializing) { }
     protected DoubleValueRange(DoubleValueRange original, Cloner cloner) : base(original, cloner) { }
+    public DoubleValueRange(DoubleValue lowerBound, DoubleValue upperBound, DoubleValue stepSize) : base(lowerBound, upperBound, stepSize) { }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new DoubleValueRange(this, cloner);
     }
+    #endregion
 
     protected override DoubleValue GetRandomSample(IRandom random) {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/IntValueRange.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/IntValueRange.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/IntValueRange.cs	(revision 8535)
@@ -30,12 +30,13 @@
   [StorableClass]
   public class IntValueRange : Range<IntValue> {
-
-    public IntValueRange(IntValue lowerBound, IntValue upperBound, IntValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    #region Constructors and Cloning
     [StorableConstructor]
     protected IntValueRange(bool deserializing) : base(deserializing) { }
     protected IntValueRange(IntValueRange original, Cloner cloner) : base(original, cloner) { }
+    public IntValueRange(IntValue lowerBound, IntValue upperBound, IntValue stepSize) : base(lowerBound, upperBound, stepSize) { }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new IntValueRange(this, cloner);
     }
+    #endregion
 
     protected override IntValue GetRandomSample(IRandom random) {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/PercentValueRange.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/PercentValueRange.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/PercentValueRange.cs	(revision 8535)
@@ -30,12 +30,13 @@
   [StorableClass]
   public class PercentValueRange : Range<PercentValue> {
-
-    public PercentValueRange(PercentValue lowerBound, PercentValue upperBound, PercentValue stepSize) : base(lowerBound, upperBound, stepSize) { }
+    #region Constructors and Cloning
     [StorableConstructor]
     protected PercentValueRange(bool deserializing) : base(deserializing) { }
     protected PercentValueRange(PercentValueRange original, Cloner cloner) : base(original, cloner) { }
+    public PercentValueRange(PercentValue lowerBound, PercentValue upperBound, PercentValue stepSize) : base(lowerBound, upperBound, stepSize) { }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new PercentValueRange(this, cloner);
     }
+    #endregion
 
     protected override PercentValue GetRandomSample(IRandom random) {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/Range.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/Range.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/Range.cs	(revision 8535)
@@ -38,8 +38,10 @@
         if (lowerBound != value) {
           if (lowerBound != null) {
+            lowerBound.ValueChanged -= new EventHandler(lowerBound_ValueChanged);
             lowerBound.ValueChanged -= new EventHandler(lowerBound_ToStringChanged);
           }
           lowerBound = value;
           if (lowerBound != null) {
+            lowerBound.ValueChanged += new EventHandler(lowerBound_ValueChanged);
             lowerBound.ValueChanged += new EventHandler(lowerBound_ToStringChanged);
           }
@@ -56,8 +58,10 @@
         if (upperBound != value) {
           if (upperBound != null) {
+            upperBound.ValueChanged -= new EventHandler(upperBound_ValueChanged);
             upperBound.ValueChanged -= new EventHandler(upperBound_ToStringChanged);
           }
           upperBound = value;
           if (upperBound != null) {
+            upperBound.ValueChanged += new EventHandler(upperBound_ValueChanged);
             upperBound.ValueChanged += new EventHandler(upperBound_ToStringChanged);
           }
@@ -74,8 +78,10 @@
         if (stepSize != value) {
           if (stepSize != null) {
+            stepSize.ValueChanged -= new EventHandler(stepSize_ValueChanged);
             stepSize.ValueChanged -= new EventHandler(stepSize_ToStringChanged);
           }
           stepSize = value;
           if (stepSize != null) {
+            stepSize.ValueChanged += new EventHandler(stepSize_ValueChanged);
             stepSize.ValueChanged += new EventHandler(stepSize_ToStringChanged);
           }
@@ -101,10 +107,4 @@
 
     #region Constructors and Cloning
-    public Range(T lowerBound, T upperBound, T stepSize) {
-      this.LowerBound = lowerBound;
-      this.UpperBound = upperBound;
-      this.StepSize = stepSize;
-    }
-
     [StorableConstructor]
     protected Range(bool deserializing) : base(deserializing) { }
@@ -115,14 +115,22 @@
       this.StepSize = cloner.Clone(original.StepSize);
     }
-
+    public Range(T lowerBound, T upperBound, T stepSize)
+      : base() {
+      this.LowerBound = lowerBound;
+      this.UpperBound = upperBound;
+      this.StepSize = stepSize;
+    }
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
       if (lowerBound != null) {
+        lowerBound.ValueChanged += new EventHandler(lowerBound_ValueChanged);
         lowerBound.ValueChanged += new EventHandler(lowerBound_ToStringChanged);
       }
       if (upperBound != null) {
+        upperBound.ValueChanged += new EventHandler(upperBound_ValueChanged);
         upperBound.ValueChanged += new EventHandler(upperBound_ToStringChanged);
       }
       if (stepSize != null) {
+        stepSize.ValueChanged += new EventHandler(stepSize_ValueChanged);
         stepSize.ValueChanged += new EventHandler(stepSize_ToStringChanged);
       }
@@ -131,4 +139,13 @@
 
     #region Events
+    private void lowerBound_ValueChanged(object sender, EventArgs e) {
+      OnLowerBoundChanged();
+    }
+    private void upperBound_ValueChanged(object sender, EventArgs e) {
+      OnUpperBoundChanged();
+    }
+    private void stepSize_ValueChanged(object sender, EventArgs e) {
+      OnStepSizeChanged();
+    }
     private void lowerBound_ToStringChanged(object sender, EventArgs e) {
       OnToStringChanged();
@@ -189,5 +206,5 @@
     }
     public bool Validate(string value, out string errorMessage) {
-      // TODO: check that upper is larger than lower and that stepsize < upper-lower
+      // TODO: check that stepsize < upper - lower
       T lower = (T)lowerBound.Clone();
       T upper = (T)upperBound.Clone();
@@ -206,4 +223,7 @@
           upperBound.SetValue(parts2[1]) &&
           stepSize.SetValue(parts1[1])) {
+        if (Comparer<T>.Default.Compare(lowerBound, upperBound) >= 0) {
+          errorMessage = "Invalid bounds. (Lower >= Upper)"; return false;
+        }
         errorMessage = string.Empty; return true;
       } else {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolValueConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolValueConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolValueConfiguration.cs	(revision 8535)
@@ -43,4 +43,9 @@
     [StorableConstructor]
     protected SymbolValueConfiguration(bool deserializing) : base(deserializing) { }
+    protected SymbolValueConfiguration(SymbolValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterInitialFrequencyEvents();
+      this.parentOptimizable = cloner.Clone(original.parentOptimizable);
+    }
     public SymbolValueConfiguration(Symbol symbol)
       : base() {
@@ -50,15 +55,10 @@
       this.ActualValue = new ConstrainedValue(symbol, symbol.GetType(), new ItemSet<IItem> { symbol }, false);
     }
-    protected SymbolValueConfiguration(SymbolValueConfiguration original, Cloner cloner)
-      : base(original, cloner) {
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
       RegisterInitialFrequencyEvents();
-      this.parentOptimizable = cloner.Clone(original.parentOptimizable);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new SymbolValueConfiguration(this, cloner);
-    }
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterInitialFrequencyEvents();
     }
     #endregion
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/SymbolicExpressionGrammar/SymbolicExpressionGrammarValueConfiguration.cs	(revision 8535)
@@ -29,15 +29,13 @@
   [StorableClass]
   public class SymbolicExpressionGrammarValueConfiguration : ParameterizedValueConfiguration {
-
     #region Constructors and Cloning
     [StorableConstructor]
     protected SymbolicExpressionGrammarValueConfiguration(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionGrammarValueConfiguration(SymbolicExpressionGrammarValueConfiguration original, Cloner cloner) : base(original, cloner) { }
     public SymbolicExpressionGrammarValueConfiguration() : base() { }
-    public SymbolicExpressionGrammarValueConfiguration(ISymbolicExpressionGrammar grammar) {
+    public SymbolicExpressionGrammarValueConfiguration(ISymbolicExpressionGrammar grammar)
+      : base() {
       this.IsOptimizable = true;
       this.ActualValue = new ConstrainedValue(grammar, grammar.GetType(), new ItemSet<IItem> { grammar }, false);
-    }
-    protected SymbolicExpressionGrammarValueConfiguration(SymbolicExpressionGrammarValueConfiguration original, Cloner cloner)
-      : base(original, cloner) {
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/TypeValue.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/TypeValue.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/TypeValue.cs	(revision 8535)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 using System.Drawing;
 using HeuristicLab.Common;
@@ -32,4 +53,12 @@
     }
 
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected TypeValue(bool deserializing) : base(deserializing) { }
+    protected TypeValue(TypeValue original, Cloner cloner)
+      : base(original, cloner) {
+      this.value = original.value;
+      this.readOnly = original.readOnly;
+    }
     public TypeValue()
       : base() {
@@ -41,14 +70,8 @@
       this.readOnly = false;
     }
-    [StorableConstructor]
-    protected TypeValue(bool deserializing) : base(deserializing) { }
-    protected TypeValue(TypeValue original, Cloner cloner)
-      : base(original, cloner) {
-      this.value = original.value;
-      this.readOnly = original.readOnly;
-    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new TypeValue(this, cloner);
     }
+    #endregion
 
     public virtual TypeValue AsReadOnly() {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/CheckedValueConfigurationCollection.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 8535)
@@ -28,6 +28,6 @@
 
 namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
-  // todo: check that at least 1 elements needs to be selected
-  // todo: control creatable item types
+  // TODO: check that at least 1 element needs to be selected
+  // TODO: control creatable item types
   [StorableClass]
   public class CheckedValueConfigurationList : CheckedItemList<IValueConfiguration>, ICheckedValueConfigurationList {
@@ -44,16 +44,5 @@
     }
 
-    public CheckedValueConfigurationList(IItemSet<IItem> validValues) {
-      this.validValues = validValues;
-      RegisterEvents();
-    }
-    public CheckedValueConfigurationList(IEnumerable<IValueConfiguration> collection)
-      : base(collection) {
-      validValues = null;
-      // event wiring not needed
-    }
-    public CheckedValueConfigurationList() {
-      RegisterEvents();
-    }
+    #region Constructors and Cloning
     [StorableConstructor]
     protected CheckedValueConfigurationList(bool deserializing)
@@ -67,5 +56,18 @@
       RegisterEvents();
     }
-
+    public CheckedValueConfigurationList(IItemSet<IItem> validValues)
+      : base() {
+      this.validValues = validValues;
+      RegisterEvents();
+    }
+    public CheckedValueConfigurationList(IEnumerable<IValueConfiguration> collection)
+      : base(collection) {
+      validValues = null;
+      // event wiring not needed
+    }
+    public CheckedValueConfigurationList()
+      : base() {
+      RegisterEvents();
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new CheckedValueConfigurationList(this, cloner);
@@ -75,12 +77,11 @@
       RegisterEvents();
     }
+    #endregion
 
     private void RegisterEvents() {
       this.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsAdded);
-      this.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsRemoved);
     }
 
     private void DeregisterEvents() {
-      this.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsRemoved);
       this.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IValueConfiguration>>(CheckedValueConfigurationList_ItemsAdded);
     }
@@ -95,17 +96,4 @@
       }
     }
-
-    private void CheckedValueConfigurationList_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
-      // auch collectionreset gehört berücksichtigt
-      // funktioniert so nicht ganz, weil die view das hinzufügen nicht mitkriegt
-      //if (this.Count < minItemCount) {
-      //  foreach (var item in e.Items) {
-      //    if (this.Count >= minItemCount)
-      //      break;
-      //    this.Add(item);
-      //  }
-      //}
-    }
-
   }
 }
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/NullValueConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/NullValueConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/NullValueConfiguration.cs	(revision 8535)
@@ -28,9 +28,5 @@
   [StorableClass]
   public class NullValueConfiguration : ValueConfiguration {
-
-    public NullValueConfiguration() {
-      this.ActualValue = new ConstrainedValue(null, null, null, true);
-      this.IsOptimizable = false;
-    }
+    #region Constructors and Cloning
     [StorableConstructor]
     protected NullValueConfiguration(bool deserializing) : base(deserializing) { }
@@ -38,7 +34,13 @@
       : base(original, cloner) {
     }
+    public NullValueConfiguration()
+      : base() {
+      this.ActualValue = new ConstrainedValue(null, null, null, true);
+      this.IsOptimizable = false;
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new NullValueConfiguration(this, cloner);
     }
+    #endregion
 
     public override string ToString() {
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ParameterizedValueConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 8535)
@@ -83,5 +83,11 @@
     [StorableConstructor]
     protected ParameterizedValueConfiguration(bool deserializing) : base(deserializing) { }
-    public ParameterizedValueConfiguration() {
+    protected ParameterizedValueConfiguration(ParameterizedValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+      this.discoverValidValues = original.discoverValidValues;
+      this.ParameterConfigurations = cloner.Clone(original.parameterConfigurations);
+    }
+    public ParameterizedValueConfiguration()
+      : base() {
       this.ParameterConfigurations = new ItemList<IParameterConfiguration>();
     }
@@ -89,9 +95,4 @@
       : base(value, valueDataType) {
       this.discoverValidValues = discoverValidValues;
-    }
-    protected ParameterizedValueConfiguration(ParameterizedValueConfiguration original, Cloner cloner)
-      : base(original, cloner) {
-      this.discoverValidValues = original.discoverValidValues;
-      this.ParameterConfigurations = cloner.Clone(original.parameterConfigurations);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -107,4 +108,5 @@
           if (valueParameter != null) {
             var pc = new ParameterConfiguration(valueParameter.Name, valueParameter, discoverValidValues);
+            pc.CombinationsCountChanged += (sender, args) => OnCombinationsCountChanged();
             this.parameterConfigurations.Add(pc);
           }
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/RangeValueConfiguration.cs	(revision 8535)
@@ -46,7 +46,4 @@
     [StorableConstructor]
     protected RangeValueConfiguration(bool deserializing) : base(deserializing) { }
-    public RangeValueConfiguration() {
-
-    }
     protected RangeValueConfiguration(RangeValueConfiguration original, Cloner cloner)
       : base(original, cloner) {
@@ -54,4 +51,5 @@
       RegisterRangeConstraintEvents();
     }
+    public RangeValueConfiguration() : base() { }
     public RangeValueConfiguration(IItem value, Type valueDataType)
       : base(value, valueDataType) {
@@ -68,18 +66,29 @@
       }
     }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new RangeValueConfiguration(this, cloner);
-    }
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
       RegisterRangeConstraintEvents();
     }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RangeValueConfiguration(this, cloner);
+    }
     #endregion
 
     private void RegisterRangeConstraintEvents() {
-      if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged += new EventHandler(RangeConstraint_ToStringChanged);
+      if (this.RangeConstraint != null) {
+        this.RangeConstraint.ToStringChanged += new EventHandler(RangeConstraint_ToStringChanged);
+        this.RangeConstraint.LowerBoundChanged += new EventHandler(RangeConstraintParametersChanged);
+        this.RangeConstraint.UpperBoundChanged += new EventHandler(RangeConstraintParametersChanged);
+        this.RangeConstraint.StepSizeChanged += new EventHandler(RangeConstraintParametersChanged);
+      }
     }
+
     private void DeregisterRangeConstraintEvents() {
-      if (this.RangeConstraint != null) this.RangeConstraint.ToStringChanged -= new EventHandler(RangeConstraint_ToStringChanged);
+      if (this.RangeConstraint != null) {
+        this.RangeConstraint.ToStringChanged -= new EventHandler(RangeConstraint_ToStringChanged);
+        this.RangeConstraint.LowerBoundChanged -= new EventHandler(RangeConstraintParametersChanged);
+        this.RangeConstraint.UpperBoundChanged -= new EventHandler(RangeConstraintParametersChanged);
+        this.RangeConstraint.StepSizeChanged -= new EventHandler(RangeConstraintParametersChanged);
+      }
     }
 
@@ -119,4 +128,7 @@
       OnToStringChanged();
     }
+    private void RangeConstraintParametersChanged(object sender, EventArgs e) {
+      OnCombinationsCountChanged();
+    }
     #endregion
   }
Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ValueConfiguration.cs	(revision 8524)
+++ branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/ValueConfigurations/ValueConfiguration.cs	(revision 8535)
@@ -61,4 +61,5 @@
           optimize = value;
           OnOptimizeChanged();
+          OnCombinationsCountChanged();
           OnToStringChanged();
         }
@@ -117,5 +118,6 @@
     }
     protected ValueConfiguration() : base() { }
-    protected ValueConfiguration(IItem value, Type valueDataType) {
+    protected ValueConfiguration(IItem value, Type valueDataType)
+      : base() {
       this.ActualValue = new ConstrainedValue(value, valueDataType, new ItemSet<IItem> { value }, false);
       this.IsOptimizable = true;
@@ -168,4 +170,10 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
+
+    public event EventHandler CombinationsCountChanged;
+    protected void OnCombinationsCountChanged() {
+      var handler = CombinationsCountChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     #endregion
 
