Index: branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/ConstrainedValue.cs
===================================================================
--- branches/ParameterConfigurationEncoding/HeuristicLab.Encodings.ParameterConfigurationEncoding/3.3/RangeConstraints/ConstrainedValue.cs	(revision 8517)
+++ 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 8517)
+++ 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 8517)
+++ 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 8517)
+++ 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 8517)
+++ 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 {
