Index: /trunk/HeuristicLab.Core/3.3/Interfaces/IValueParameter.cs
===================================================================
--- /trunk/HeuristicLab.Core/3.3/Interfaces/IValueParameter.cs	(revision 16871)
+++ /trunk/HeuristicLab.Core/3.3/Interfaces/IValueParameter.cs	(revision 16872)
@@ -27,6 +27,8 @@
   public interface IValueParameter : IParameter {
     IItem Value { get; set; }
+    bool ReadOnly { get; set; }
     bool GetsCollected { get; set; }
     event EventHandler ValueChanged;
+    event EventHandler ReadOnlyChanged;
     event EventHandler GetsCollectedChanged;
   }
Index: /trunk/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs
===================================================================
--- /trunk/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs	(revision 16871)
+++ /trunk/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs	(revision 16872)
@@ -62,4 +62,5 @@
     protected override void DeregisterContentEvents() {
       Content.GetsCollectedChanged -= new EventHandler(Content_GetsCollectedChanged);
+      Content.ReadOnlyChanged -= new EventHandler(Content_ReadOnlyChanged);
       Content.ValidValues.ItemsAdded -= new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsAdded);
       Content.ValidValues.ItemsRemoved -= new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved);
@@ -76,4 +77,5 @@
       base.RegisterContentEvents();
       Content.GetsCollectedChanged += new EventHandler(Content_GetsCollectedChanged);
+      Content.ReadOnlyChanged += new EventHandler(Content_ReadOnlyChanged);
       Content.ValidValues.ItemsAdded += new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsAdded);
       Content.ValidValues.ItemsRemoved += new CollectionItemsChangedEventHandler<T>(ValidValues_ItemsRemoved);
@@ -100,5 +102,5 @@
       base.SetEnabledStateOfControls();
       valueGroupBox.Enabled = Content != null;
-      valueComboBox.Enabled = (valueComboBox.Items.Count > 0) && !ReadOnly;
+      valueComboBox.Enabled = (valueComboBox.Items.Count > 0) && !Content.ReadOnly && !ReadOnly;
       showInRunCheckBox.Enabled = Content != null && !ReadOnly;
     }
@@ -153,4 +155,11 @@
         FillValueComboBox();
     }
+    protected virtual void Content_ReadOnlyChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ReadOnlyChanged), sender, e);
+      else {
+        SetEnabledStateOfControls();
+      }
+    }
     protected virtual void Content_GetsCollectedChanged(object sender, EventArgs e) {
       if (InvokeRequired)
Index: /trunk/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs
===================================================================
--- /trunk/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs	(revision 16871)
+++ /trunk/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs	(revision 16872)
@@ -74,4 +74,5 @@
       Content.ActualNameChanged -= new EventHandler(Content_ActualNameChanged);
       Content.GetsCollectedChanged -= new EventHandler(Content_GetsCollectedChanged);
+      Content.ReadOnlyChanged -= new EventHandler(Content_ReadOnlyChanged);
       Content.ValueChanged -= new EventHandler(Content_ValueChanged);
       base.DeregisterContentEvents();
@@ -86,4 +87,5 @@
       Content.ActualNameChanged += new EventHandler(Content_ActualNameChanged);
       Content.GetsCollectedChanged += new EventHandler(Content_GetsCollectedChanged);
+      Content.ReadOnlyChanged += new EventHandler(Content_ReadOnlyChanged);
       Content.ValueChanged += new EventHandler(Content_ValueChanged);
     }
@@ -108,6 +110,6 @@
       actualNameTextBox.Enabled = Content != null;
       actualNameTextBox.ReadOnly = ReadOnly;
-      setValueButton.Enabled = Content != null && !ReadOnly;
-      clearValueButton.Enabled = Content != null && Content.Value != null && !ReadOnly;
+      setValueButton.Enabled = Content != null && !Content.ReadOnly && !ReadOnly;
+      clearValueButton.Enabled = Content != null && !Content.ReadOnly && Content.Value != null && !ReadOnly;
       showInRunCheckBox.Enabled = Content != null && !ReadOnly;
     }
@@ -124,7 +126,14 @@
       else {
         SetDataTypeTextBoxText();
-        clearValueButton.Enabled = Content != null && Content.Value != null && !ReadOnly;
+        clearValueButton.Enabled = Content != null && !Content.ReadOnly && Content.Value != null && !ReadOnly;
         valueViewHost.ViewType = null;
         valueViewHost.Content = Content != null ? Content.Value : null;
+      }
+    }
+    protected virtual void Content_ReadOnlyChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ReadOnlyChanged), sender, e);
+      else {
+        SetEnabledStateOfControls();
       }
     }
Index: /trunk/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs
===================================================================
--- /trunk/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs	(revision 16871)
+++ /trunk/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs	(revision 16872)
@@ -74,4 +74,5 @@
     protected override void DeregisterContentEvents() {
       Content.GetsCollectedChanged -= new EventHandler(Content_GetsCollectedChanged);
+      Content.ReadOnlyChanged -= new EventHandler(Content_ReadOnlyChanged);
       Content.ValueChanged -= new EventHandler(Content_ValueChanged);
       base.DeregisterContentEvents();
@@ -85,4 +86,5 @@
       base.RegisterContentEvents();
       Content.GetsCollectedChanged += new EventHandler(Content_GetsCollectedChanged);
+      Content.ReadOnlyChanged += new EventHandler(Content_ReadOnlyChanged);
       Content.ValueChanged += new EventHandler(Content_ValueChanged);
     }
@@ -103,6 +105,6 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      setValueButton.Enabled = Content != null && !(Content is IFixedValueParameter) && !ReadOnly;
-      clearValueButton.Enabled = Content != null && Content.Value != null && !(Content is IFixedValueParameter) && !(Content is ValueParameter<T>) && !ReadOnly;
+      setValueButton.Enabled = Content != null && !Content.ReadOnly && !(Content is IFixedValueParameter) && !ReadOnly;
+      clearValueButton.Enabled = Content != null && !Content.ReadOnly && Content.Value != null && !(Content is IFixedValueParameter) && !(Content is ValueParameter<T>) && !ReadOnly;
       showInRunCheckBox.Enabled = Content != null && !ReadOnly;
     }
@@ -113,8 +115,16 @@
       else {
         SetDataTypeTextBoxText();
-        setValueButton.Enabled = Content != null && !(Content is IFixedValueParameter) && !ReadOnly;
-        clearValueButton.Enabled = Content != null && Content.Value != null && !(Content is IFixedValueParameter<T>) && !(Content is ValueParameter<T>) && !ReadOnly;
+        setValueButton.Enabled = Content != null && !Content.ReadOnly && !(Content is IFixedValueParameter) && !ReadOnly;
+        clearValueButton.Enabled = Content != null && !Content.ReadOnly && Content.Value != null && !(Content is IFixedValueParameter<T>) && !(Content is ValueParameter<T>) && !ReadOnly;
         valueViewHost.ViewType = null;
         valueViewHost.Content = Content != null ? Content.Value : null;
+      }
+    }
+
+    protected virtual void Content_ReadOnlyChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ReadOnlyChanged), sender, e);
+      else {
+        SetEnabledStateOfControls();
       }
     }
@@ -135,6 +145,5 @@
         try {
           Content.Value = (T)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
           ErrorHandling.ShowErrorDialog(this, ex);
         }
Index: /trunk/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs
===================================================================
--- /trunk/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 16871)
+++ /trunk/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 16872)
@@ -22,8 +22,8 @@
 using System;
 using System.Drawing;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Parameters {
@@ -40,5 +40,5 @@
       }
     }
-      
+
     [Storable]
     private ItemSet<T> validValues;
@@ -52,4 +52,5 @@
       get { return this.value; }
       set {
+        if (ReadOnly) throw new InvalidOperationException("Cannot set the value of a readonly parameter.");
         if (value != this.value) {
           if ((value != null) && !validValues.Contains(value)) throw new ArgumentException("Invalid value.");
@@ -74,4 +75,15 @@
     }
 
+    [Storable(DefaultValue = false)]
+    private bool readOnly;
+    public bool ReadOnly {
+      get { return readOnly; }
+      set {
+        if (value == readOnly) return;
+        readOnly = value;
+        OnReadOnlyChanged();
+      }
+    }
+
     [Storable(DefaultValue = true)]
     private bool getsCollected;
@@ -93,4 +105,5 @@
       validValues = cloner.Clone(original.validValues);
       value = cloner.Clone(original.value);
+      readOnly = original.readOnly;
       getsCollected = original.getsCollected;
       Initialize();
@@ -99,4 +112,5 @@
       : base("Anonymous", typeof(T)) {
       this.validValues = new ItemSet<T>();
+      this.readOnly = false;
       this.getsCollected = true;
       Initialize();
@@ -105,4 +119,5 @@
       : base(name, typeof(T)) {
       this.validValues = new ItemSet<T>();
+      this.readOnly = false;
       this.getsCollected = true;
       Initialize();
@@ -111,4 +126,5 @@
       : base(name, typeof(T)) {
       this.validValues = new ItemSet<T>();
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       Initialize();
@@ -117,4 +133,5 @@
       : base(name, typeof(T)) {
       this.validValues = validValues;
+      this.readOnly = false;
       this.getsCollected = true;
       Initialize();
@@ -123,4 +140,5 @@
       : base(name, typeof(T)) {
       this.validValues = validValues;
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       Initialize();
@@ -130,4 +148,5 @@
       this.validValues = validValues;
       this.value = value;
+      this.readOnly = false;
       this.getsCollected = true;
       Initialize();
@@ -137,4 +156,5 @@
       this.validValues = validValues;
       this.value = value;
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       Initialize();
@@ -143,4 +163,5 @@
       : base(name, description, typeof(T)) {
       this.validValues = new ItemSet<T>();
+      this.readOnly = false;
       this.getsCollected = true;
       Initialize();
@@ -149,4 +170,5 @@
       : base(name, description, typeof(T)) {
       this.validValues = new ItemSet<T>();
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       Initialize();
@@ -155,4 +177,5 @@
       : base(name, description, typeof(T)) {
       this.validValues = validValues;
+      this.readOnly = false;
       this.getsCollected = true;
       Initialize();
@@ -161,4 +184,5 @@
       : base(name, description, typeof(T)) {
       this.validValues = validValues;
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       Initialize();
@@ -168,4 +192,5 @@
       this.validValues = validValues;
       this.value = value;
+      this.readOnly = false;
       this.getsCollected = true;
       Initialize();
@@ -175,4 +200,5 @@
       this.validValues = validValues;
       this.value = value;
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       Initialize();
@@ -212,4 +238,9 @@
       OnToStringChanged();
     }
+    public event EventHandler ReadOnlyChanged;
+    protected virtual void OnReadOnlyChanged() {
+      EventHandler handler = ReadOnlyChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler GetsCollectedChanged;
     protected virtual void OnGetsCollectedChanged() {
Index: /trunk/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs
===================================================================
--- /trunk/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 16871)
+++ /trunk/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 16872)
@@ -22,7 +22,7 @@
 using System;
 using System.Drawing;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Parameters {
@@ -45,4 +45,5 @@
       get { return this.value; }
       set {
+        if (ReadOnly) throw new InvalidOperationException("Cannot set the value of a readonly parameter.");
         if (value != this.value) {
           DeregisterValueEvents();
@@ -63,4 +64,15 @@
           );
         Value = val;
+      }
+    }
+
+    [Storable(DefaultValue = false)]
+    private bool readOnly;
+    public bool ReadOnly {
+      get { return readOnly; }
+      set {
+        if (value == readOnly) return;
+        readOnly = value;
+        OnReadOnlyChanged();
       }
     }
@@ -108,4 +120,5 @@
       : base(original, cloner) {
       value = cloner.Clone(original.value);
+      readOnly = original.readOnly;
       getsCollected = original.getsCollected;
       reactOnValueToStringChangedAndValueItemImageChanged = original.reactOnValueToStringChangedAndValueItemImageChanged;
@@ -114,4 +127,5 @@
     public OptionalValueParameter()
       : base("Anonymous", typeof(T)) {
+      this.readOnly = false;
       this.getsCollected = true;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -119,4 +133,5 @@
     public OptionalValueParameter(string name)
       : base(name, typeof(T)) {
+      this.readOnly = false;
       this.getsCollected = true;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -124,4 +139,5 @@
     public OptionalValueParameter(string name, bool getsCollected)
       : base(name, typeof(T)) {
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -130,4 +146,5 @@
       : base(name, typeof(T)) {
       this.value = value;
+      this.readOnly = false;
       this.getsCollected = true;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -137,4 +154,5 @@
       : base(name, typeof(T)) {
       this.value = value;
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -143,4 +161,5 @@
     public OptionalValueParameter(string name, string description)
       : base(name, description, typeof(T)) {
+      this.readOnly = false;
       this.getsCollected = true;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -148,4 +167,5 @@
     public OptionalValueParameter(string name, string description, bool getsCollected)
       : base(name, description, typeof(T)) {
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -154,4 +174,5 @@
       : base(name, description, typeof(T)) {
       this.value = value;
+      this.readOnly = false;
       this.getsCollected = true;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -161,4 +182,5 @@
       : base(name, description, typeof(T)) {
       this.value = value;
+      this.readOnly = false;
       this.getsCollected = getsCollected;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
@@ -197,4 +219,10 @@
       OnToStringChanged();
     }
+
+    public event EventHandler ReadOnlyChanged;
+    protected virtual void OnReadOnlyChanged() {
+      EventHandler handler = ReadOnlyChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler GetsCollectedChanged;
     protected virtual void OnGetsCollectedChanged() {
Index: /trunk/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs
===================================================================
--- /trunk/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs	(revision 16871)
+++ /trunk/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs	(revision 16872)
@@ -22,7 +22,7 @@
 using System;
 using System.Drawing;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Parameters {
@@ -45,4 +45,5 @@
       get { return this.value; }
       set {
+        if (ReadOnly) throw new InvalidOperationException("Cannot set the value of a readonly parameter.");
         if (value != this.value) {
           DeregisterValueEvents();
@@ -66,4 +67,15 @@
     }
 
+    [Storable(DefaultValue = false)]
+    private bool readOnly;
+    public bool ReadOnly {
+      get { return readOnly; }
+      set {
+        if (value == readOnly) return;
+        readOnly = value;
+        OnReadOnlyChanged();
+      }
+    }
+
     [Storable(DefaultValue = true)]
     private bool getsCollected;
@@ -84,4 +96,5 @@
       : base(original, cloner) {
       value = cloner.Clone(original.value);
+      readOnly = original.readOnly;
       getsCollected = original.getsCollected;
       RegisterValueEvents();
@@ -89,4 +102,5 @@
     public ValueLookupParameter()
       : base() {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
@@ -94,4 +108,5 @@
     public ValueLookupParameter(string name)
       : base(name) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
@@ -99,4 +114,5 @@
     public ValueLookupParameter(string name, bool getsCollected)
       : base(name) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = getsCollected;
@@ -105,4 +121,5 @@
       : base(name) {
       this.value = value;
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
@@ -112,4 +129,5 @@
       : base(name) {
       this.value = value;
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = getsCollected;
@@ -118,4 +136,5 @@
     public ValueLookupParameter(string name, string description)
       : base(name, description) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
@@ -123,4 +142,5 @@
     public ValueLookupParameter(string name, string description, bool getsCollected)
       : base(name, description) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = getsCollected;
@@ -129,4 +149,5 @@
       : base(name, description) {
       this.value = value;
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
@@ -136,4 +157,5 @@
       : base(name, description) {
       this.value = value;
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = getsCollected;
@@ -142,4 +164,5 @@
     public ValueLookupParameter(string name, string description, string actualName)
       : base(name, description, actualName) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
@@ -147,4 +170,5 @@
     public ValueLookupParameter(string name, string description, string actualName, bool getsCollected)
       : base(name, description, actualName) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = getsCollected;
@@ -177,4 +201,9 @@
       OnToStringChanged();
     }
+    public event EventHandler ReadOnlyChanged;
+    protected virtual void OnReadOnlyChanged() {
+      EventHandler handler = ReadOnlyChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler GetsCollectedChanged;
     protected virtual void OnGetsCollectedChanged() {
