Index: /trunk/sources/HeuristicLab 3.3/Files.txt
===================================================================
--- /trunk/sources/HeuristicLab 3.3/Files.txt	(revision 3429)
+++ /trunk/sources/HeuristicLab 3.3/Files.txt	(revision 3430)
@@ -57,5 +57,4 @@
 HeuristicLab.Random\3.3:HeuristicLab.Random-3.3.dll
 HeuristicLab.Selection\3.3:HeuristicLab.Selection-3.3.dll
-HeuristicLab.Selection.OffspringSelection\3.3:HeuristicLab.Selection.OffspringSelection-3.3.dll
 HeuristicLab.SequentialEngine\3.3:HeuristicLab.SequentialEngine-3.3.dll
 HeuristicLab.TestFunctions\3.3:HeuristicLab.TestFunctions-3.3.dll
Index: /trunk/sources/HeuristicLab.Data.Views/3.3/BoolValueView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data.Views/3.3/BoolValueView.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data.Views/3.3/BoolValueView.cs	(revision 3430)
@@ -32,4 +32,12 @@
       get { return (BoolValue)base.Content; }
       set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
     }
 
@@ -82,5 +90,5 @@
 
     private void valueCheckBox_CheckedChanged(object sender, EventArgs e) {
-      Content.Value = valueCheckBox.Checked;
+      if (!Content.ReadOnly) Content.Value = valueCheckBox.Checked;
     }
   }
Index: /trunk/sources/HeuristicLab.Data.Views/3.3/ComparisonView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data.Views/3.3/ComparisonView.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data.Views/3.3/ComparisonView.cs	(revision 3430)
@@ -32,4 +32,12 @@
       get { return (Comparison)base.Content; }
       set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
     }
 
@@ -82,5 +90,5 @@
 
     private void valueComboBox_SelectedIndexChanged(object sender, EventArgs e) {
-      if (Content != null) Content.Value = (ComparisonType)valueComboBox.SelectedItem;
+      if ((Content != null) && !Content.ReadOnly) Content.Value = (ComparisonType)valueComboBox.SelectedItem;
     }
   }
Index: /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs	(revision 3430)
@@ -35,4 +35,12 @@
       get { return (IStringConvertibleArray)base.Content; }
       set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
     }
 
@@ -133,5 +141,5 @@
     }
     private void lengthTextBox_Validated(object sender, EventArgs e) {
-      Content.Length = int.Parse(lengthTextBox.Text);
+      if (!Content.ReadOnly) Content.Length = int.Parse(lengthTextBox.Text);
       errorProvider.SetError(lengthTextBox, string.Empty);
     }
Index: /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 3430)
@@ -34,4 +34,8 @@
   [Content(typeof(IStringConvertibleMatrix), true)]
   public partial class StringConvertibleMatrixView : AsynchronousContentView {
+    private int[] virtualRowIndizes;
+    private List<KeyValuePair<int, SortOrder>> sortedColumnIndizes;
+    private RowComparer rowComparer;
+
     public new IStringConvertibleMatrix Content {
       get { return (IStringConvertibleMatrix)base.Content; }
@@ -39,7 +43,11 @@
     }
 
-    private int[] virtualRowIndizes;
-    private List<KeyValuePair<int, SortOrder>> sortedColumnIndizes;
-    RowComparer rowComparer;
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
+    }
 
     public StringConvertibleMatrixView() {
@@ -66,5 +74,4 @@
       base.DeregisterContentEvents();
     }
-
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
@@ -75,5 +82,4 @@
       Content.ReadOnlyViewChanged += new EventHandler(Content_ReadOnlyViewChanged);
     }
-
 
     protected override void OnContentChanged() {
@@ -204,7 +210,5 @@
     }
     private void rowsTextBox_Validated(object sender, EventArgs e) {
-      int textBoxValue = int.Parse(rowsTextBox.Text);
-      if (textBoxValue != Content.Rows)
-        Content.Rows = textBoxValue;
+      if (!Content.ReadOnly) Content.Rows = int.Parse(rowsTextBox.Text);
       errorProvider.SetError(rowsTextBox, string.Empty);
     }
@@ -226,7 +230,5 @@
     }
     private void columnsTextBox_Validated(object sender, EventArgs e) {
-      int textBoxValue = int.Parse(columnsTextBox.Text);
-      if (textBoxValue != Content.Columns)
-        Content.Columns = textBoxValue;
+      if (!Content.ReadOnly) Content.Columns = int.Parse(columnsTextBox.Text);
       errorProvider.SetError(columnsTextBox, string.Empty);
     }
Index: /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs	(revision 3430)
@@ -33,4 +33,12 @@
       get { return (IStringConvertibleValue)base.Content; }
       set { base.Content = value; }
+    }
+
+    public override bool ReadOnly {
+      get {
+        if ((Content != null) && Content.ReadOnly) return true;
+        return base.ReadOnly;
+      }
+      set { base.ReadOnly = value; }
     }
 
@@ -103,5 +111,5 @@
     }
     private void valueTextBox_Validated(object sender, EventArgs e) {
-      Content.SetValue(valueTextBox.Text);
+      if (!Content.ReadOnly) Content.SetValue(valueTextBox.Text);
       errorProvider.SetError(valueTextBox, string.Empty);
       valueTextBox.Text = Content.GetValue();
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 3430)
@@ -37,4 +37,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 3430)
@@ -30,5 +30,5 @@
   [StorableClass]
   public class BoolMatrix : ValueTypeMatrix<bool>, IStringConvertibleMatrix {
-        public BoolMatrix() : base() { }
+    public BoolMatrix() : base() { }
     public BoolMatrix(int rows, int columns) : base(rows, columns) { }
     public BoolMatrix(int rows, int columns, IEnumerable<string> columnNames) : base(rows, columns, columnNames) { }
@@ -39,9 +39,12 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      BoolMatrix clone = new BoolMatrix(matrix);
+      BoolMatrix clone = new BoolMatrix();
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
-      clone.ColumnNames = new List<string>(ColumnNames);
-      clone.RowNames = new List<string>(RowNames);
+      clone.matrix = (bool[,])matrix.Clone();
+      clone.columnNames = new List<string>(columnNames);
+      clone.rowNames = new List<string>(rowNames);
+      clone.sortableView = sortableView;
+      clone.readOnly = readOnly;
       return clone;
     }
@@ -82,16 +85,4 @@
       set { Columns = value; }
     }
-    IEnumerable<string> IStringConvertibleMatrix.ColumnNames {
-      get { return this.ColumnNames; }
-      set { this.ColumnNames = value; }
-    }
-    IEnumerable<string> IStringConvertibleMatrix.RowNames {
-      get { return this.RowNames; }
-      set { this.RowNames = value; }
-    }
-    bool IStringConvertibleMatrix.SortableView {
-      get { return this.SortableView; }
-      set { this.SortableView = value; }
-    }
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: /trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs	(revision 3430)
@@ -42,4 +42,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/Comparison.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/Comparison.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/Comparison.cs	(revision 3430)
@@ -41,4 +41,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 3430)
@@ -36,4 +36,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 3430)
@@ -37,4 +37,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 3430)
@@ -39,9 +39,12 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      DoubleMatrix clone = new DoubleMatrix(matrix);
+      DoubleMatrix clone = new DoubleMatrix();
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
-      clone.ColumnNames = new List<string>(ColumnNames);
-      clone.RowNames = new List<string>(RowNames);
+      clone.matrix = (double[,])matrix.Clone();
+      clone.columnNames = new List<string>(columnNames);
+      clone.rowNames = new List<string>(rowNames);
+      clone.sortableView = sortableView;
+      clone.readOnly = readOnly;
       return clone;
     }
@@ -82,16 +85,4 @@
       set { Columns = value; }
     }
-    IEnumerable<string> IStringConvertibleMatrix.ColumnNames {
-      get { return this.ColumnNames; }
-      set { this.ColumnNames = value; }
-    }
-    IEnumerable<string> IStringConvertibleMatrix.RowNames {
-      get { return this.RowNames; }
-      set { this.RowNames = value; }
-    }
-    bool IStringConvertibleMatrix.SortableView {
-      get { return this.SortableView; }
-      set { this.SortableView = value; }
-    }
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: /trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 3430)
@@ -42,4 +42,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArray.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArray.cs	(revision 3430)
@@ -27,4 +27,6 @@
     int Length { get; set; }
 
+    bool ReadOnly { get; }
+
     bool Validate(string value, out string errorMessage);
     string GetValue(int index);
Index: /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs	(revision 3430)
@@ -32,4 +32,5 @@
 
     bool SortableView { get; set; }
+    bool ReadOnly { get; }
 
     bool Validate(string value, out string errorMessage);
Index: /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleValue.cs	(revision 3430)
@@ -25,4 +25,6 @@
 namespace HeuristicLab.Data {
   public interface IStringConvertibleValue : IContent {
+    bool ReadOnly { get; }
+
     bool Validate(string value, out string errorMessage);
     string GetValue();
Index: /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 3430)
@@ -37,4 +37,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 3430)
@@ -39,9 +39,12 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      IntMatrix clone = new IntMatrix(matrix);
+      IntMatrix clone = new IntMatrix();
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
-      clone.ColumnNames = new List<string>(ColumnNames);
-      clone.RowNames = new List<string>(RowNames);
+      clone.matrix = (int[,])matrix.Clone();
+      clone.columnNames = new List<string>(columnNames);
+      clone.rowNames = new List<string>(rowNames);
+      clone.sortableView = sortableView;
+      clone.readOnly = readOnly;
       return clone;
     }
@@ -82,12 +85,4 @@
       set { Columns = value; }
     }
-    IEnumerable<string> IStringConvertibleMatrix.ColumnNames {
-      get { return this.ColumnNames; }
-      set { this.ColumnNames = value; }
-    }
-    IEnumerable<string> IStringConvertibleMatrix.RowNames {
-      get { return this.RowNames; }
-      set { this.RowNames = value; }
-    }
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: /trunk/sources/HeuristicLab.Data/3.3/IntValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/IntValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/IntValue.cs	(revision 3430)
@@ -42,4 +42,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs	(revision 3430)
@@ -36,4 +36,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 3430)
@@ -44,4 +44,5 @@
       get { return array.Length; }
       protected set {
+        if (ReadOnly) throw new NotSupportedException("Length cannot be set. StringArray is read-only.");
         if (value != Length) {
           Array.Resize<string>(ref array, value);
@@ -53,4 +54,5 @@
       get { return array[index]; }
       set {
+        if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringArray is read-only.");
         if (value != array[index]) {
           if ((value != null) || (array[index] != string.Empty)) {
@@ -62,6 +64,13 @@
     }
 
+    [Storable]
+    protected bool readOnly;
+    public virtual bool ReadOnly {
+      get { return readOnly; }
+    }
+
     public StringArray() {
       array = new string[0];
+      readOnly = false;
     }
     public StringArray(int length) {
@@ -69,4 +78,5 @@
       for (int i = 0; i < array.Length; i++)
         array[i] = string.Empty;
+      readOnly = false;
     }
     public StringArray(string[] elements) {
@@ -75,4 +85,5 @@
       for (int i = 0; i < array.Length; i++)
         array[i] = elements[i] == null ? string.Empty : elements[i];
+      readOnly = false;
     }
 
@@ -82,5 +93,12 @@
       clone.ReadOnlyView = ReadOnlyView;
       clone.array = (string[])array.Clone();
+      clone.readOnly = readOnly;
       return clone;
+    }
+
+    public virtual StringArray AsReadOnly() {
+      StringArray readOnlyStringArray = (StringArray)this.Clone();
+      readOnlyStringArray.readOnly = true;
+      return readOnlyStringArray;
     }
 
@@ -97,10 +115,10 @@
     }
 
-    public IEnumerator<string> GetEnumerator() {
+    public virtual IEnumerator<string> GetEnumerator() {
       return array.Cast<string>().GetEnumerator();
     }
 
     IEnumerator IEnumerable.GetEnumerator() {
-      return array.GetEnumerator();
+      return GetEnumerator();
     }
 
Index: /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 3430)
@@ -33,5 +33,5 @@
   [Item("StringMatrix", "Represents a matrix of strings.")]
   [StorableClass]
-  public class StringMatrix : Item, IEnumerable, IStringConvertibleMatrix {
+  public class StringMatrix : Item, IEnumerable<string>, IStringConvertibleMatrix {
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Class; }
@@ -42,8 +42,9 @@
 
     [Storable]
-    private List<string> columnNames;
-    public IEnumerable<string> ColumnNames {
+    protected List<string> columnNames;
+    public virtual IEnumerable<string> ColumnNames {
       get { return this.columnNames; }
       set {
+        if (ReadOnly) throw new NotSupportedException("ColumnNames cannot be set. StringMatrix is read-only.");
         if (value == null || value.Count() == 0)
           columnNames = new List<string>();
@@ -55,8 +56,9 @@
     }
     [Storable]
-    private List<string> rowNames;
-    public IEnumerable<string> RowNames {
+    protected List<string> rowNames;
+    public virtual IEnumerable<string> RowNames {
       get { return this.rowNames; }
       set {
+        if (ReadOnly) throw new NotSupportedException("RowNames cannot be set. StringMatrix is read-only.");
         if (value == null || value.Count() == 0)
           rowNames = new List<string>();
@@ -68,8 +70,9 @@
     }
     [Storable]
-    private bool sortableView;
-    public bool SortableView {
+    protected bool sortableView;
+    public virtual bool SortableView {
       get { return sortableView; }
       set {
+        if (ReadOnly) throw new NotSupportedException("SortableView cannot be set. StringMatrix is read-only.");
         if (value != sortableView) {
           sortableView = value;
@@ -82,4 +85,5 @@
       get { return matrix.GetLength(0); }
       protected set {
+        if (ReadOnly) throw new NotSupportedException("Rows cannot be set. StringMatrix is read-only.");
         if (value != Rows) {
           string[,] newMatrix = new string[value, Columns];
@@ -97,4 +101,5 @@
       get { return matrix.GetLength(1); }
       protected set {
+        if (ReadOnly) throw new NotSupportedException("Columns cannot be set. StringMatrix is read-only.");
         if (value != Columns) {
           string[,] newMatrix = new string[Rows, value];
@@ -113,4 +118,5 @@
       get { return matrix[rowIndex, columnIndex]; }
       set {
+        if (ReadOnly) throw new NotSupportedException("Item cannot be set. StringMatrix is read-only.");
         if (value != matrix[rowIndex, columnIndex]) {
           if ((value != null) || (matrix[rowIndex, columnIndex] != string.Empty)) {
@@ -122,4 +128,10 @@
     }
 
+    [Storable]
+    protected bool readOnly;
+    public virtual bool ReadOnly {
+      get { return readOnly; }
+    }
+
     public StringMatrix() {
       matrix = new string[0, 0];
@@ -127,4 +139,5 @@
       rowNames = new List<string>();
       sortableView = false;
+      readOnly = false;
     }
     public StringMatrix(int rows, int columns) {
@@ -137,4 +150,5 @@
       rowNames = new List<string>();
       sortableView = false;
+      readOnly = false;
     }
     protected StringMatrix(int rows, int columns, IEnumerable<string> columnNames)
@@ -156,4 +170,5 @@
       rowNames = new List<string>();
       sortableView = false;
+      readOnly = false;
     }
     protected StringMatrix(string[,] elements, IEnumerable<string> columnNames)
@@ -170,9 +185,16 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
-      clone.SortableView = SortableView;
       clone.matrix = (string[,])matrix.Clone();
       clone.columnNames = new List<string>(columnNames);
       clone.rowNames = new List<string>(rowNames);
+      clone.sortableView = sortableView;
+      clone.readOnly = readOnly;
       return clone;
+    }
+
+    public virtual StringMatrix AsReadOnly() {
+      StringMatrix readOnlyStringMatrix = (StringMatrix)this.Clone();
+      readOnlyStringMatrix.readOnly = true;
+      return readOnlyStringMatrix;
     }
 
@@ -192,6 +214,10 @@
     }
 
-    public virtual IEnumerator GetEnumerator() {
-      return matrix.GetEnumerator();
+    public virtual IEnumerator<string> GetEnumerator() {
+      return matrix.Cast<string>().GetEnumerator();
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
     }
 
@@ -257,16 +283,4 @@
       set { Columns = value; }
     }
-    IEnumerable<string> IStringConvertibleMatrix.ColumnNames {
-      get { return this.ColumnNames; }
-      set { this.ColumnNames = value; }
-    }
-    IEnumerable<string> IStringConvertibleMatrix.RowNames {
-      get { return this.RowNames; }
-      set { this.RowNames = value; }
-    }
-    bool IStringConvertibleMatrix.SortableView {
-      get { return this.SortableView; }
-      set { this.SortableView = value; }
-    }
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
       return Validate(value, out errorMessage);
Index: /trunk/sources/HeuristicLab.Data/3.3/StringValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/StringValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/StringValue.cs	(revision 3430)
@@ -39,4 +39,5 @@
       get { return value; }
       set {
+        if (ReadOnly) throw new NotSupportedException("Value cannot be set. StringValue is read-only.");
         if (value != this.value) {
           if ((value != null) || (this.value != string.Empty)) {
@@ -48,9 +49,17 @@
     }
 
+    [Storable]
+    protected bool readOnly;
+    public virtual bool ReadOnly {
+      get { return readOnly; }
+    }
+
     public StringValue() {
       this.value = string.Empty;
+      this.readOnly = false;
     }
     public StringValue(string value) {
       this.value = value != null ? value : string.Empty;
+      this.readOnly = false;
     }
 
@@ -59,5 +68,12 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
+    }
+
+    public virtual StringValue AsReadOnly() {
+      StringValue readOnlyStringValue = (StringValue)this.Clone();
+      readOnlyStringValue.readOnly = true;
+      return readOnlyStringValue;
     }
 
Index: /trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 3430)
@@ -37,4 +37,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/ValueTypeArray.cs	(revision 3430)
@@ -22,5 +22,7 @@
 using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.Drawing;
+using System.Linq;
 using System.Text;
 using HeuristicLab.Common;
@@ -31,5 +33,5 @@
   [Item("ValueTypeArray<T>", "An abstract base class for representing arrays of value types.")]
   [StorableClass]
-  public abstract class ValueTypeArray<T> : Item, IEnumerable where T : struct {
+  public abstract class ValueTypeArray<T> : Item, IEnumerable<T> where T : struct {
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Class; }
@@ -42,4 +44,5 @@
       get { return array.Length; }
       protected set {
+        if (ReadOnly) throw new NotSupportedException("Length cannot be set. ValueTypeArray is read-only.");
         if (value != Length) {
           Array.Resize<T>(ref array, value);
@@ -51,4 +54,5 @@
       get { return array[index]; }
       set {
+        if (ReadOnly) throw new NotSupportedException("Item cannot be set. ValueTypeArray is read-only.");
         if (!value.Equals(array[index])) {
           array[index] = value;
@@ -58,13 +62,22 @@
     }
 
+    [Storable]
+    protected bool readOnly;
+    public virtual bool ReadOnly {
+      get { return readOnly; }
+    }
+
     protected ValueTypeArray() {
       array = new T[0];
+      readOnly = false;
     }
     protected ValueTypeArray(int length) {
       array = new T[length];
+      readOnly = false;
     }
     protected ValueTypeArray(T[] elements) {
       if (elements == null) throw new ArgumentNullException();
       array = (T[])elements.Clone();
+      readOnly = false;
     }
 
@@ -72,5 +85,12 @@
       ValueTypeArray<T> clone = (ValueTypeArray<T>)base.Clone(cloner);
       clone.array = (T[])array.Clone();
+      clone.readOnly = readOnly;
       return clone;
+    }
+
+    public virtual ValueTypeArray<T> AsReadOnly() {
+      ValueTypeArray<T> readOnlyValueTypeArray = (ValueTypeArray<T>)this.Clone();
+      readOnlyValueTypeArray.readOnly = true;
+      return readOnlyValueTypeArray;
     }
 
@@ -87,6 +107,10 @@
     }
 
-    public virtual IEnumerator GetEnumerator() {
-      return array.GetEnumerator();
+    public virtual IEnumerator<T> GetEnumerator() {
+      return array.Cast<T>().GetEnumerator();
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
     }
 
Index: /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/ValueTypeMatrix.cs	(revision 3430)
@@ -33,5 +33,5 @@
   [Item("ValueTypeMatrix<T>", "An abstract base class for representing matrices of value types.")]
   [StorableClass]
-  public abstract class ValueTypeMatrix<T> : Item, IEnumerable where T : struct {
+  public abstract class ValueTypeMatrix<T> : Item, IEnumerable<T> where T : struct {
     public override Image ItemImage {
       get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Class; }
@@ -42,8 +42,9 @@
 
     [Storable]
-    private List<string> columnNames;
-    public IEnumerable<string> ColumnNames {
+    protected List<string> columnNames;
+    public virtual IEnumerable<string> ColumnNames {
       get { return this.columnNames; }
       set {
+        if (ReadOnly) throw new NotSupportedException("ColumnNames cannot be set. ValueTypeMatrix is read-only.");
         if (value == null || value.Count() == 0)
           columnNames = new List<string>();
@@ -55,8 +56,9 @@
     }
     [Storable]
-    private List<string> rowNames;
-    public IEnumerable<string> RowNames {
+    protected List<string> rowNames;
+    public virtual IEnumerable<string> RowNames {
       get { return this.rowNames; }
       set {
+        if (ReadOnly) throw new NotSupportedException("RowNames cannot be set. ValueTypeMatrix is read-only.");
         if (value == null || value.Count() == 0)
           rowNames = new List<string>();
@@ -68,8 +70,9 @@
     }
     [Storable]
-    private bool sortableView;
-    public bool SortableView {
+    protected bool sortableView;
+    public virtual bool SortableView {
       get { return sortableView; }
       set {
+        if (ReadOnly) throw new NotSupportedException("SortableView cannot be set. ValueTypeMatrix is read-only.");
         if (value != sortableView) {
           sortableView = value;
@@ -82,4 +85,5 @@
       get { return matrix.GetLength(0); }
       protected set {
+        if (ReadOnly) throw new NotSupportedException("Rows cannot be set. ValueTypeMatrix is read-only.");
         if (value != Rows) {
           T[,] newArray = new T[value, Columns];
@@ -97,4 +101,5 @@
       get { return matrix.GetLength(1); }
       protected set {
+        if (ReadOnly) throw new NotSupportedException("Columns cannot be set. ValueTypeMatrix is read-only.");
         if (value != Columns) {
           T[,] newArray = new T[Rows, value];
@@ -113,4 +118,5 @@
       get { return matrix[rowIndex, columnIndex]; }
       set {
+        if (ReadOnly) throw new NotSupportedException("Item cannot be set. ValueTypeMatrix is read-only.");
         if (!value.Equals(matrix[rowIndex, columnIndex])) {
           matrix[rowIndex, columnIndex] = value;
@@ -118,4 +124,10 @@
         }
       }
+    }
+
+    [Storable]
+    protected bool readOnly;
+    public virtual bool ReadOnly {
+      get { return readOnly; }
     }
 
@@ -125,4 +137,5 @@
       rowNames = new List<string>();
       sortableView = false;
+      readOnly = false;
     }
     protected ValueTypeMatrix(int rows, int columns) {
@@ -131,4 +144,5 @@
       rowNames = new List<string>();
       sortableView = false;
+      readOnly = false;
     }
     protected ValueTypeMatrix(int rows, int columns, IEnumerable<string> columnNames)
@@ -136,5 +150,5 @@
       ColumnNames = columnNames;
     }
-    protected ValueTypeMatrix(int rows, int columns, IEnumerable<string> columnNames,IEnumerable<string> rowNames)
+    protected ValueTypeMatrix(int rows, int columns, IEnumerable<string> columnNames, IEnumerable<string> rowNames)
       : this(rows, columns, columnNames) {
       RowNames = rowNames;
@@ -146,4 +160,5 @@
       rowNames = new List<string>();
       sortableView = false;
+      readOnly = false;
     }
     protected ValueTypeMatrix(T[,] elements, IEnumerable<string> columnNames)
@@ -158,9 +173,16 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       ValueTypeMatrix<T> clone = (ValueTypeMatrix<T>)base.Clone(cloner);
-      clone.SortableView = SortableView;
       clone.matrix = (T[,])matrix.Clone();
       clone.columnNames = new List<string>(columnNames);
       clone.rowNames = new List<string>(rowNames);
+      clone.sortableView = sortableView;
+      clone.readOnly = readOnly;
       return clone;
+    }
+
+    public virtual ValueTypeMatrix<T> AsReadOnly() {
+      ValueTypeMatrix<T> readOnlyValueTypeMatrix = (ValueTypeMatrix<T>)this.Clone();
+      readOnlyValueTypeMatrix.readOnly = true;
+      return readOnlyValueTypeMatrix;
     }
 
@@ -180,6 +202,10 @@
     }
 
-    public virtual IEnumerator GetEnumerator() {
-      return matrix.GetEnumerator();
+    public virtual IEnumerator<T> GetEnumerator() {
+      return matrix.Cast<T>().GetEnumerator();
+    }
+
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
     }
 
Index: /trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Data/3.3/ValueTypeValue.cs	(revision 3430)
@@ -39,4 +39,5 @@
       get { return value; }
       set {
+        if (ReadOnly) throw new NotSupportedException("Value cannot be set. ValueTypeValue is read-only.");
         if (!value.Equals(this.value)) {
           this.value = value;
@@ -46,9 +47,17 @@
     }
 
+    [Storable]
+    protected bool readOnly;
+    public virtual bool ReadOnly {
+      get { return readOnly; }
+    }
+
     protected ValueTypeValue() {
       this.value = default(T);
+      this.readOnly = false;
     }
     protected ValueTypeValue(T value) {
       this.value = value;
+      this.readOnly = false;
     }
 
@@ -56,5 +65,12 @@
       ValueTypeValue<T> clone = (ValueTypeValue<T>)base.Clone(cloner);
       clone.value = value;
+      clone.readOnly = readOnly;
       return clone;
+    }
+
+    public virtual ValueTypeValue<T> AsReadOnly() {
+      ValueTypeValue<T> readOnlyValueTypeValue = (ValueTypeValue<T>)this.Clone();
+      readOnlyValueTypeValue.readOnly = true;
+      return readOnlyValueTypeValue;
     }
 
Index: /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs	(revision 3430)
@@ -46,4 +46,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs	(revision 3430)
@@ -46,4 +46,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs	(revision 3430)
@@ -67,4 +67,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs	(revision 3430)
@@ -46,4 +46,5 @@
       cloner.RegisterClonedObject(this, clone);
       clone.ReadOnlyView = ReadOnlyView;
+      clone.readOnly = readOnly;
       return clone;
     }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3430)
@@ -151,4 +151,7 @@
       get { return true; }
       set { throw new NotSupportedException(); }
+    }
+    public bool ReadOnly {
+      get { return false; }
     }
 
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Dataset.cs	(revision 3430)
@@ -291,4 +291,8 @@
     }
 
+    public bool ReadOnly {
+      get { return false; }
+    }
+
     IEnumerable<string> IStringConvertibleMatrix.ColumnNames {
       get { return this.VariableNames; }
Index: /trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs	(revision 3430)
@@ -68,5 +68,5 @@
               dm[i, j] = CalculateDistance(c[i, 0], c[i, 1], c[j, 0], c[j, 1]);
           }
-          DistanceMatrixParameter.ActualValue = dm;
+          DistanceMatrixParameter.ActualValue = (DoubleMatrix)dm.AsReadOnly();
         }
 
Index: /trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 3429)
+++ /trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 3430)
@@ -168,4 +168,5 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       TravelingSalesmanProblem clone = (TravelingSalesmanProblem)base.Clone(cloner);
+      clone.DistanceMatrixParameter.Value = DistanceMatrixParameter.Value;
       clone.Initialize();
       return clone;
