Index: /stable/HeuristicLab.Algorithms.ALPS/3.3/AlpsOffspringSelectionGeneticAlgorithmMainOperator.cs
===================================================================
--- /stable/HeuristicLab.Algorithms.ALPS/3.3/AlpsOffspringSelectionGeneticAlgorithmMainOperator.cs	(revision 17148)
+++ /stable/HeuristicLab.Algorithms.ALPS/3.3/AlpsOffspringSelectionGeneticAlgorithmMainOperator.cs	(revision 17149)
@@ -20,4 +20,5 @@
 #endregion
 
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -26,5 +27,4 @@
 using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 using HeuristicLab.Selection;
 
@@ -266,9 +266,9 @@
 
       variableCreator1.Name = "MutatedOffspring = true";
-      variableCreator1.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(true), false));
+      variableCreator1.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(true)) { GetsCollected = false });
       variableCreator1.Successor = null;
 
       variableCreator2.Name = "MutatedOffspring = false";
-      variableCreator2.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(false), false));
+      variableCreator2.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(false)) { GetsCollected = false });
       variableCreator2.Successor = null;
 
Index: /stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs
===================================================================
--- /stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs	(revision 17148)
+++ /stable/HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm/3.3/OffspringSelectionGeneticAlgorithmMainOperator.cs	(revision 17149)
@@ -20,4 +20,5 @@
 #endregion
 
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -26,5 +27,4 @@
 using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 using HeuristicLab.Selection;
 
@@ -218,8 +218,8 @@
 
       variableCreator1.Name = "MutatedOffspring = true";
-      variableCreator1.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(true), false));
+      variableCreator1.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(true)) { GetsCollected = false });
 
       variableCreator2.Name = "MutatedOffspring = false";
-      variableCreator2.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(false), false));
+      variableCreator2.CollectedValues.Add(new ValueParameter<BoolValue>("MutatedOffspring", null, new BoolValue(false)) { GetsCollected = false });
 
       conditionalSelector.ConditionParameter.ActualName = "MutatedOffspring";
Index: /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTableValuesCollector.cs
===================================================================
--- /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTableValuesCollector.cs	(revision 17148)
+++ /stable/HeuristicLab.Analysis/3.3/DataVisualization/DataTableValuesCollector.cs	(revision 17149)
@@ -22,4 +22,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -27,5 +28,4 @@
 using HeuristicLab.Operators;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Analysis {
@@ -59,5 +59,5 @@
       : base() {
       Parameters.Add(new ValueLookupParameter<DataTable>("DataTable", "The table of data values where the collected values should be stored."));
-      Parameters.Add(new FixedValueParameter<BoolValue>("StartIndexZero", "True, if the collected data values should start with index 0, otherwise false.", new BoolValue(true), false));
+      Parameters.Add(new FixedValueParameter<BoolValue>("StartIndexZero", "True, if the collected data values should start with index 0, otherwise false.", new BoolValue(true)) { GetsCollected = false });
       StartIndexZeroParameter.Hidden = true;
     }
@@ -68,5 +68,5 @@
       #region Backwards compatible code (remove with 3.4)
       if (!Parameters.ContainsKey("StartIndexZero")) {
-        Parameters.Add(new FixedValueParameter<BoolValue>("StartIndexZero", "True, if the collected data values should start with index 0, otherwise false.", new BoolValue(true), false));
+        Parameters.Add(new FixedValueParameter<BoolValue>("StartIndexZero", "True, if the collected data values should start with index 0, otherwise false.", new BoolValue(true)) { GetsCollected = false });
         StartIndexZeroParameter.Hidden = true;
       }
Index: /stable/HeuristicLab.Core/3.3/Interfaces/IValueParameter.cs
===================================================================
--- /stable/HeuristicLab.Core/3.3/Interfaces/IValueParameter.cs	(revision 17148)
+++ /stable/HeuristicLab.Core/3.3/Interfaces/IValueParameter.cs	(revision 17149)
@@ -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: /stable/HeuristicLab.Optimization/3.3/Problems/Problem.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Problems/Problem.cs	(revision 17148)
+++ /stable/HeuristicLab.Optimization/3.3/Problems/Problem.cs	(revision 17149)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Drawing;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
@@ -28,5 +29,4 @@
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Optimization {
@@ -52,5 +52,5 @@
     protected Problem()
       : base() {
-      Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(), false));
+      Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>()) { GetsCollected = false });
       OperatorsParameter.Hidden = true;
       RegisterEventHandlers();
@@ -66,5 +66,5 @@
         if (operators != null) {
           Parameters.Remove(OperatorsParameterName);
-          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(operators), false));
+          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(operators)) { GetsCollected = false });
           OperatorsParameter.Hidden = true;
         }
@@ -95,5 +95,5 @@
         //necessary to convert old experiments files where no parameter was used for saving the operators
         if (!Parameters.ContainsKey(OperatorsParameterName)) {
-          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(), false));
+          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>()) { GetsCollected = false });
           OperatorsParameter.Hidden = true;
         }
@@ -107,5 +107,5 @@
         #region Backwards compatible code, remove with 3.4
         if (!Parameters.ContainsKey(OperatorsParameterName)) {
-          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(), false));
+          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>()) { GetsCollected = false });
           OperatorsParameter.Hidden = true;
         }
Index: /stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 17148)
+++ /stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 17149)
@@ -25,4 +25,5 @@
 using System.Linq;
 using System.Threading;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
@@ -30,5 +31,4 @@
 using HeuristicLab.Data;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 using HeuristicLab.PluginInfrastructure;
 
@@ -130,5 +130,5 @@
         ItemList<IOperator> tmp = ((ValueParameter<ItemList<IOperator>>)Parameters["Operators"]).Value;
         Parameters.Remove("Operators");
-        Parameters.Add(new ValueParameter<ItemList<IItem>>("Operators", "The operators and items that the problem provides to the algorithms.", new ItemList<IItem>(tmp), false));
+        Parameters.Add(new ValueParameter<ItemList<IItem>>("Operators", "The operators and items that the problem provides to the algorithms.", new ItemList<IItem>(tmp)) { GetsCollected = false });
       }
       #endregion
Index: /stable/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs
===================================================================
--- /stable/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters.Views/3.3/ConstrainedValueParameterView.cs	(revision 17149)
@@ -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 = Content != null && 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: /stable/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs
===================================================================
--- /stable/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters.Views/3.3/ValueLookupParameterView.cs	(revision 17149)
@@ -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: /stable/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs
===================================================================
--- /stable/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters.Views/3.3/ValueParameterView.cs	(revision 17149)
@@ -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: /stable/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs
===================================================================
--- /stable/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters/3.3/ConstrainedValueParameter.cs	(revision 17149)
@@ -22,8 +22,8 @@
 using System;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Parameters {
@@ -47,15 +47,9 @@
     public ConstrainedValueParameter() : base() { }
     public ConstrainedValueParameter(string name) : base(name) { }
-    public ConstrainedValueParameter(string name, bool getsCollected) : base(name, getsCollected) { }
     public ConstrainedValueParameter(string name, ItemSet<T> validValues) : base(name, validValues) { }
-    public ConstrainedValueParameter(string name, ItemSet<T> validValues, bool getsCollected) : base(name, validValues, getsCollected) { }
     public ConstrainedValueParameter(string name, ItemSet<T> validValues, T value) : base(name, validValues, value) { }
-    public ConstrainedValueParameter(string name, ItemSet<T> validValues, T value, bool getsCollected) : base(name, validValues, value, getsCollected) { }
     public ConstrainedValueParameter(string name, string description) : base(name, description) { }
-    public ConstrainedValueParameter(string name, string description, bool getsCollected) : base(name, description, getsCollected) { }
     public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues) : base(name, description, validValues) { }
-    public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues, bool getsCollected) : base(name, description, validValues, getsCollected) { }
     public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value) : base(name, description, validValues, value) { }
-    public ConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value, bool getsCollected) : base(name, description, validValues, value, getsCollected) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /stable/HeuristicLab.Parameters/3.3/FixedValueParameter.cs
===================================================================
--- /stable/HeuristicLab.Parameters/3.3/FixedValueParameter.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters/3.3/FixedValueParameter.cs	(revision 17149)
@@ -21,7 +21,7 @@
 
 using System;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Parameters {
@@ -31,5 +31,5 @@
   [Item("FixedValueParameter", "A parameter whose value is defined in the parameter itself and cannot be set.")]
   [StorableType("7787B99D-5F32-4639-B47A-76CB4D204392")]
-  public class FixedValueParameter<T> : ValueParameter<T>, IFixedValueParameter<T> where T : class,IItem, new() {
+  public class FixedValueParameter<T> : ValueParameter<T>, IFixedValueParameter<T> where T : class, IItem, new() {
 
     public override T Value {
@@ -46,11 +46,7 @@
     public FixedValueParameter() : base() { }
     public FixedValueParameter(string name) : base(name) { }
-    public FixedValueParameter(string name, bool getsCollected) : base(name, getsCollected) { }
     public FixedValueParameter(string name, T value) : base(name, value) { }
-    public FixedValueParameter(string name, T value, bool getsCollected) : base(name, value, getsCollected) { }
     public FixedValueParameter(string name, string description) : base(name, description) { }
-    public FixedValueParameter(string name, string description, bool getsCollected) : base(name, description, getsCollected) { }
     public FixedValueParameter(string name, string description, T value) : base(name, description, value) { }
-    public FixedValueParameter(string name, string description, T value, bool getsCollected) : base(name, description, value, getsCollected) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /stable/HeuristicLab.Parameters/3.3/OperatorParameter.cs
===================================================================
--- /stable/HeuristicLab.Parameters/3.3/OperatorParameter.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters/3.3/OperatorParameter.cs	(revision 17149)
@@ -20,7 +20,7 @@
 #endregion
 
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Parameters {
@@ -36,11 +36,7 @@
     public OperatorParameter() : base("Anonymous") { }
     public OperatorParameter(string name) : base(name) { }
-    public OperatorParameter(string name, bool getsCollected) : base(name, getsCollected) { }
     public OperatorParameter(string name, IOperator value) : base(name, value) { }
-    public OperatorParameter(string name, IOperator value, bool getsCollected) : base(name, value, getsCollected) { }
     public OperatorParameter(string name, string description) : base(name, description) { }
-    public OperatorParameter(string name, string description, bool getsCollected) : base(name, description, getsCollected) { }
     public OperatorParameter(string name, string description, IOperator value) : base(name, description, value) { }
-    public OperatorParameter(string name, string description, IOperator value, bool getsCollected) : base(name, description, value, getsCollected) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /stable/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs
===================================================================
--- /stable/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 17149)
@@ -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,11 +119,6 @@
       : base(name, typeof(T)) {
       this.validValues = new ItemSet<T>();
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, bool getsCollected)
-      : base(name, typeof(T)) {
-      this.validValues = new ItemSet<T>();
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -117,11 +126,6 @@
       : base(name, typeof(T)) {
       this.validValues = validValues;
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, ItemSet<T> validValues, bool getsCollected)
-      : base(name, typeof(T)) {
-      this.validValues = validValues;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -130,12 +134,6 @@
       this.validValues = validValues;
       this.value = value;
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, ItemSet<T> validValues, T value, bool getsCollected)
-      : base(name, typeof(T)) {
-      this.validValues = validValues;
-      this.value = value;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -143,11 +141,6 @@
       : base(name, description, typeof(T)) {
       this.validValues = new ItemSet<T>();
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, string description, bool getsCollected)
-      : base(name, description, typeof(T)) {
-      this.validValues = new ItemSet<T>();
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -155,11 +148,6 @@
       : base(name, description, typeof(T)) {
       this.validValues = validValues;
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, string description, ItemSet<T> validValues, bool getsCollected)
-      : base(name, description, typeof(T)) {
-      this.validValues = validValues;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -168,12 +156,6 @@
       this.validValues = validValues;
       this.value = value;
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value, bool getsCollected)
-      : base(name, description, typeof(T)) {
-      this.validValues = validValues;
-      this.value = value;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -212,4 +194,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: /stable/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs
===================================================================
--- /stable/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 17149)
@@ -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,10 +133,6 @@
     public OptionalValueParameter(string name)
       : base(name, typeof(T)) {
-      this.getsCollected = true;
-      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
-    }
-    public OptionalValueParameter(string name, bool getsCollected)
-      : base(name, typeof(T)) {
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
     }
@@ -130,12 +140,6 @@
       : base(name, typeof(T)) {
       this.value = value;
-      this.getsCollected = true;
-      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
-      RegisterValueEvents();
-    }
-    public OptionalValueParameter(string name, T value, bool getsCollected)
-      : base(name, typeof(T)) {
-      this.value = value;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
       RegisterValueEvents();
@@ -143,23 +147,14 @@
     public OptionalValueParameter(string name, string description)
       : base(name, description, typeof(T)) {
-      this.getsCollected = true;
-      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
-    }
-    public OptionalValueParameter(string name, string description, bool getsCollected)
-      : base(name, description, typeof(T)) {
-      this.getsCollected = getsCollected;
-      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
-    }
+      this.readOnly = false;
+      this.getsCollected = true;
+      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
+    }
+
     public OptionalValueParameter(string name, string description, T value)
       : base(name, description, typeof(T)) {
       this.value = value;
-      this.getsCollected = true;
-      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
-      RegisterValueEvents();
-    }
-    public OptionalValueParameter(string name, string description, T value, bool getsCollected)
-      : base(name, description, typeof(T)) {
-      this.value = value;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       this.reactOnValueToStringChangedAndValueItemImageChanged = true;
       RegisterValueEvents();
@@ -197,4 +192,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: /stable/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs
===================================================================
--- /stable/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs	(revision 17149)
@@ -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,59 +108,35 @@
     public ValueLookupParameter(string name)
       : base(name) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
-    }
-    public ValueLookupParameter(string name, bool getsCollected)
-      : base(name) {
-      this.Hidden = false;
-      this.getsCollected = getsCollected;
     }
     public ValueLookupParameter(string name, T value)
       : base(name) {
       this.value = value;
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
       RegisterValueEvents();
     }
-    public ValueLookupParameter(string name, T value, bool getsCollected)
-      : base(name) {
-      this.value = value;
-      this.Hidden = false;
-      this.getsCollected = getsCollected;
-      RegisterValueEvents();
-    }
     public ValueLookupParameter(string name, string description)
       : base(name, description) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
-    }
-    public ValueLookupParameter(string name, string description, bool getsCollected)
-      : base(name, description) {
-      this.Hidden = false;
-      this.getsCollected = getsCollected;
     }
     public ValueLookupParameter(string name, string description, T value)
       : base(name, description) {
       this.value = value;
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
       RegisterValueEvents();
     }
-    public ValueLookupParameter(string name, string description, T value, bool getsCollected)
-      : base(name, description) {
-      this.value = value;
-      this.Hidden = false;
-      this.getsCollected = getsCollected;
-      RegisterValueEvents();
-    }
     public ValueLookupParameter(string name, string description, string actualName)
       : base(name, description, actualName) {
+      this.readOnly = false;
       this.Hidden = false;
       this.getsCollected = true;
-    }
-    public ValueLookupParameter(string name, string description, string actualName, bool getsCollected)
-      : base(name, description, actualName) {
-      this.Hidden = false;
-      this.getsCollected = getsCollected;
     }
     #endregion
@@ -177,4 +167,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: /stable/HeuristicLab.Parameters/3.3/ValueParameter.cs
===================================================================
--- /stable/HeuristicLab.Parameters/3.3/ValueParameter.cs	(revision 17148)
+++ /stable/HeuristicLab.Parameters/3.3/ValueParameter.cs	(revision 17149)
@@ -22,7 +22,7 @@
 using System;
 using System.Reflection;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Parameters {
@@ -47,12 +47,8 @@
     public ValueParameter() : base() { }
     public ValueParameter(string name) : base(name) { base.Value = CreateDefaultValue(); }
-    public ValueParameter(string name, bool getsCollected) : base(name, getsCollected) { base.Value = CreateDefaultValue(); }
     public ValueParameter(string name, T value) : base(name, value) { }
-    public ValueParameter(string name, T value, bool getsCollected) : base(name, value, getsCollected) { }
     public ValueParameter(string name, string description) : base(name, description) { base.Value = CreateDefaultValue(); }
-    public ValueParameter(string name, string description, bool getsCollected) : base(name, description, getsCollected) { base.Value = CreateDefaultValue(); }
     public ValueParameter(string name, string description, T value) : base(name, description, value) { }
-    public ValueParameter(string name, string description, T value, bool getsCollected) : base(name, description, value, getsCollected) { }
-                                                                                  
+
     protected T CreateDefaultValue() {
       Type type = typeof(T);
Index: /stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs	(revision 17148)
+++ /stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/Evaluators/SymbolicRegressionConstantOptimizationEvaluator.cs	(revision 17149)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -29,5 +30,4 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
@@ -114,8 +114,8 @@
     public SymbolicRegressionConstantOptimizationEvaluator()
       : base() {
-      Parameters.Add(new FixedValueParameter<IntValue>(ConstantOptimizationIterationsParameterName, "Determines how many iterations should be calculated while optimizing the constant of a symbolic expression tree (0 indicates other or default stopping criterion).", new IntValue(10), true));
-      Parameters.Add(new FixedValueParameter<DoubleValue>(ConstantOptimizationImprovementParameterName, "Determines the relative improvement which must be achieved in the constant optimization to continue with it (0 indicates other or default stopping criterion).", new DoubleValue(0), true) { Hidden = true });
-      Parameters.Add(new FixedValueParameter<PercentValue>(ConstantOptimizationProbabilityParameterName, "Determines the probability that the constants are optimized", new PercentValue(1), true));
-      Parameters.Add(new FixedValueParameter<PercentValue>(ConstantOptimizationRowsPercentageParameterName, "Determines the percentage of the rows which should be used for constant optimization", new PercentValue(1), true));
+      Parameters.Add(new FixedValueParameter<IntValue>(ConstantOptimizationIterationsParameterName, "Determines how many iterations should be calculated while optimizing the constant of a symbolic expression tree (0 indicates other or default stopping criterion).", new IntValue(10)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(ConstantOptimizationImprovementParameterName, "Determines the relative improvement which must be achieved in the constant optimization to continue with it (0 indicates other or default stopping criterion).", new DoubleValue(0)) { Hidden = true });
+      Parameters.Add(new FixedValueParameter<PercentValue>(ConstantOptimizationProbabilityParameterName, "Determines the probability that the constants are optimized", new PercentValue(1)));
+      Parameters.Add(new FixedValueParameter<PercentValue>(ConstantOptimizationRowsPercentageParameterName, "Determines the percentage of the rows which should be used for constant optimization", new PercentValue(1)));
       Parameters.Add(new FixedValueParameter<BoolValue>(UpdateConstantsInTreeParameterName, "Determines if the constants in the tree should be overwritten by the optimized constants.", new BoolValue(true)) { Hidden = true });
       Parameters.Add(new FixedValueParameter<BoolValue>(UpdateVariableWeightsParameterName, "Determines if the variable weights in the tree should be  optimized.", new BoolValue(true)) { Hidden = true });
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs	(revision 17148)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs	(revision 17149)
@@ -23,4 +23,5 @@
 using System.Diagnostics.Contracts;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -29,5 +30,4 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 
@@ -128,4 +128,5 @@
       g.AddTerminalSymbols(new string[] { "Move", "Left", "Right" });
       base.Encoding = new SymbolicExpressionTreeEncoding(g, 20, 10);
+      base.Encoding.GrammarParameter.ReadOnly = true;
     }
 
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/BasicSymbolicRegression/Problem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/BasicSymbolicRegression/Problem.cs	(revision 17148)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/BasicSymbolicRegression/Problem.cs	(revision 17149)
@@ -23,9 +23,9 @@
 using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 using HeuristicLab.Problems.DataAnalysis;
 using HeuristicLab.Problems.Instances;
@@ -87,4 +87,5 @@
       var g = new SimpleSymbolicExpressionGrammar(); // empty grammar is replaced in UpdateGrammar()
       base.Encoding = new SymbolicExpressionTreeEncoding(g, 100, 17);
+      Encoding.GrammarParameter.ReadOnly = true;
 
       UpdateGrammar();
@@ -177,5 +178,7 @@
       }
 
+      Encoding.GrammarParameter.ReadOnly = false;
       Encoding.Grammar = g;
+      Encoding.GrammarParameter.ReadOnly = true;
     }
     #endregion
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/EvenParityProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/EvenParityProblem.cs	(revision 17148)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/EvenParityProblem.cs	(revision 17149)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -28,5 +29,4 @@
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/MultiplexerProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/MultiplexerProblem.cs	(revision 17148)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/MultiplexerProblem.cs	(revision 17149)
@@ -24,4 +24,5 @@
 using System.Diagnostics.Contracts;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -29,5 +30,4 @@
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 
@@ -88,4 +88,5 @@
       var g = new SimpleSymbolicExpressionGrammar(); // will be replaced in update grammar
       Encoding = new SymbolicExpressionTreeEncoding(g, 100, 17);
+      Encoding.GrammarParameter.ReadOnly = true;
 
       UpdateGrammar();
@@ -110,5 +111,7 @@
         g.AddTerminalSymbol(string.Format("d{0}", i));
 
+      Encoding.GrammarParameter.ReadOnly = false;
       Encoding.Grammar = g;
+      Encoding.GrammarParameter.ReadOnly = true;
 
       BestKnownQuality = Math.Pow(2, NumberOfBits); // this is a benchmark problem (the best achievable quality is known for a given number of bits)
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/robocode/Problem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/robocode/Problem.cs	(revision 17148)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/robocode/Problem.cs	(revision 17149)
@@ -20,4 +20,5 @@
 #endregion
 
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -26,5 +27,4 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.GeneticProgramming.Robocode {
@@ -86,4 +86,5 @@
 
       Encoding = new SymbolicExpressionTreeEncoding(new Grammar(), 1000, 10);
+      Encoding.GrammarParameter.ReadOnly = true;
       Encoding.FunctionArguments = 0;
       Encoding.FunctionDefinitions = 0;
@@ -134,5 +135,5 @@
     }
 
-    void RobocodePathParameter_ValueChanged(object sender, System.EventArgs e) {
+    private void RobocodePathParameter_ValueChanged(object sender, System.EventArgs e) {
       EnemiesParameter.Value.RobocodePath = RobocodePathParameter.Value.Value;
     }
Index: /stable/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 17148)
+++ /stable/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 17149)
@@ -24,4 +24,5 @@
 using System.IO;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Analysis;
 using HeuristicLab.Common;
@@ -32,5 +33,4 @@
 using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.Problems.Instances;
@@ -210,5 +210,5 @@
       if (oldCoordinates != null) {
         Parameters.Remove(oldCoordinates);
-        Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.", oldCoordinates.Value, oldCoordinates.GetsCollected));
+        Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.", oldCoordinates.Value) { GetsCollected = oldCoordinates.GetsCollected });
       }
 
