Index: trunk/sources/HeuristicLab.Analysis/3.3/DataRow.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/DataRow.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Analysis/3.3/DataRow.cs	(revision 3317)
@@ -53,4 +53,5 @@
       DataRow clone = new DataRow(Name, Description);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.values.AddRange(values);
       return clone;
Index: trunk/sources/HeuristicLab.Analysis/3.3/DataTable.cs
===================================================================
--- trunk/sources/HeuristicLab.Analysis/3.3/DataTable.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Analysis/3.3/DataTable.cs	(revision 3317)
@@ -57,4 +57,5 @@
       DataTable clone = new DataTable(Name, Description);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.rows = (NamedItemCollection<DataRow>)cloner.Clone(rows);
       return clone;
Index: trunk/sources/HeuristicLab.Collections/3.3/IObservableArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IObservableArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/IObservableArray.cs	(revision 3317)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
@@ -25,5 +26,8 @@
 namespace HeuristicLab.Collections {
   public interface IObservableArray<T> : IList<T>, INotifyObservableArrayItemsChanged<T>, INotifyPropertyChanged {
+    bool ReadOnlyView { get; set; }
     int Length { get; }
+
+    event EventHandler ReadOnlyViewChanged;
   }
 }
Index: trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs	(revision 3317)
@@ -20,8 +20,13 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 
 namespace HeuristicLab.Collections {
-  public interface IObservableCollection<T> : ICollection<T>, INotifyObservableCollectionItemsChanged<T>, INotifyPropertyChanged { }
+  public interface IObservableCollection<T> : ICollection<T>, INotifyObservableCollectionItemsChanged<T>, INotifyPropertyChanged {
+    bool ReadOnlyView { get; set; }
+
+    event EventHandler ReadOnlyViewChanged;
+  }
 }
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs	(revision 3317)
@@ -35,4 +35,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public int Length {
       get { return array.Length; }
@@ -63,13 +76,17 @@
     public ObservableArray() {
       array = new T[0];
+      readOnlyView = array.IsReadOnly;
     }
     public ObservableArray(int length) {
       array = new T[length];
+      readOnlyView = array.IsReadOnly;
     }
     public ObservableArray(T[] array) {
       this.array = (T[])array.Clone();
+      readOnlyView = array.IsReadOnly;
     }
     public ObservableArray(IEnumerable<T> collection) {
       array = collection.ToArray();
+      readOnlyView = array.IsReadOnly;
     }
     #endregion
@@ -281,8 +298,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -290,6 +314,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
     protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsMoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -297,6 +321,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -304,6 +328,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 3317)
@@ -34,4 +34,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public int Capacity {
       get { return list.Capacity; }
@@ -54,10 +67,13 @@
     public ObservableCollection() {
       list = new List<T>();
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     public ObservableCollection(int capacity) {
       list = new List<T>(capacity);
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     public ObservableCollection(IEnumerable<T> collection) {
       list = new List<T>(collection);
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     #endregion
@@ -189,8 +205,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<T> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -198,6 +221,6 @@
     public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -205,6 +228,6 @@
     public event CollectionItemsChangedEventHandler<T> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -212,6 +235,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 3317)
@@ -35,4 +35,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public ICollection<TKey> Keys {
       get { return dict.Keys; }
@@ -71,19 +84,25 @@
     public ObservableDictionary() {
       dict = new Dictionary<TKey, TValue>();
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(int capacity) {
       dict = new Dictionary<TKey, TValue>(capacity);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TValue>(comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(IDictionary<TKey, TValue> dictionary) {
       dict = new Dictionary<TKey, TValue>(dictionary);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(int capacity, IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TValue>(capacity, comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TValue>(dictionary, comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     #endregion
@@ -181,8 +200,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<KeyValuePair<TKey, TValue>> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
     }
 
@@ -190,6 +216,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<KeyValuePair<TKey, TValue>> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
     }
 
@@ -197,6 +223,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<KeyValuePair<TKey, TValue>> items, IEnumerable<KeyValuePair<TKey, TValue>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
     }
 
@@ -204,6 +230,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<KeyValuePair<TKey, TValue>> items, IEnumerable<KeyValuePair<TKey, TValue>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
     }
 
@@ -211,6 +237,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs	(revision 3317)
@@ -35,4 +35,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public int Count {
       get { return dict.Count; }
@@ -55,10 +68,13 @@
     protected ObservableKeyedCollection() {
       dict = new Dictionary<TKey, TItem>();
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(int capacity) {
       dict = new Dictionary<TKey, TItem>(capacity);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TItem>(comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(IEnumerable<TItem> collection) {
@@ -67,7 +83,9 @@
       foreach (TItem item in collection)
         dict.Add(GetKeyForItem(item), item);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(int capacity, IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TItem>(capacity, comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(IEnumerable<TItem> collection, IEqualityComparer<TKey> comparer) {
@@ -76,4 +94,5 @@
       foreach (TItem item in collection)
         dict.Add(GetKeyForItem(item), item);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     #endregion
@@ -250,8 +269,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<TItem> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<TItem> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<TItem>(items));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items));
     }
 
@@ -259,6 +285,6 @@
     public event CollectionItemsChangedEventHandler<TItem> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<TItem> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<TItem>(items));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items));
     }
 
@@ -266,6 +292,6 @@
     public event CollectionItemsChangedEventHandler<TItem> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<TItem> items, IEnumerable<TItem> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
     }
 
@@ -273,6 +299,6 @@
     public event CollectionItemsChangedEventHandler<TItem> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<TItem> items, IEnumerable<TItem> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
+      CollectionItemsChangedEventHandler<TItem> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
     }
 
@@ -280,6 +306,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 3317)
@@ -34,4 +34,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public int Capacity {
       get { return list.Capacity; }
@@ -68,10 +81,13 @@
     public ObservableList() {
       list = new List<T>();
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     public ObservableList(int capacity) {
       list = new List<T>(capacity);
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     public ObservableList(IEnumerable<T> collection) {
       list = new List<T>(collection);
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     #endregion
@@ -375,8 +391,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<IndexedItem<T>> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
     }
 
@@ -388,6 +411,6 @@
     }
     private void OnItemsAdded(IEnumerable<T> items) {
-      if (itemsAdded != null)
-        itemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = itemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -395,6 +418,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<IndexedItem<T>> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
     }
 
@@ -406,6 +429,6 @@
     }
     private void OnItemsRemoved(IEnumerable<T> items) {
-      if (itemsRemoved != null)
-        itemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = itemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -413,6 +436,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -420,6 +443,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
     protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsMoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -427,6 +450,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -438,6 +461,6 @@
     }
     private void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (collectionReset != null)
-        collectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = collectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -445,6 +468,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs	(revision 3317)
@@ -35,4 +35,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public IEqualityComparer<T> Comparer {
       get { return set.Comparer; }
@@ -49,13 +62,17 @@
     public ObservableSet() {
       set = new HashSet<T>();
+      readOnlyView = ((ICollection<T>)set).IsReadOnly;
     }
     public ObservableSet(IEnumerable<T> collection) {
       set = new HashSet<T>(collection);
+      readOnlyView = ((ICollection<T>)set).IsReadOnly;
     }
     public ObservableSet(IEqualityComparer<T> comparer) {
       set = new HashSet<T>(comparer);
+      readOnlyView = ((ICollection<T>)set).IsReadOnly;
     }
     public ObservableSet(IEnumerable<T> collection, IEqualityComparer<T> comparer) {
       set = new HashSet<T>(collection, comparer);
+      readOnlyView = ((ICollection<T>)set).IsReadOnly;
     }
     #endregion
@@ -227,8 +244,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<T> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -236,6 +260,6 @@
     public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -243,6 +267,6 @@
     public event CollectionItemsChangedEventHandler<T> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -250,6 +274,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Length {
       get { return array.Length; }
@@ -117,9 +122,14 @@
     }
 
+    event EventHandler IObservableArray<T>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -127,6 +137,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
     protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsMoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -134,6 +144,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -141,6 +151,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Count {
       get { return collection.Count; }
@@ -95,9 +100,14 @@
     }
 
+    event EventHandler IObservableCollection<T>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<T> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -105,6 +115,6 @@
     public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -112,6 +122,6 @@
     public event CollectionItemsChangedEventHandler<T> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -119,6 +129,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public ICollection<TKey> Keys {
       get { return dict.Keys; }
@@ -123,9 +128,14 @@
     }
 
+    event EventHandler IObservableCollection<KeyValuePair<TKey, TValue>>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<KeyValuePair<TKey, TValue>> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
     }
 
@@ -133,6 +143,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<KeyValuePair<TKey, TValue>> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
     }
 
@@ -140,6 +150,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<KeyValuePair<TKey, TValue>> items, IEnumerable<KeyValuePair<TKey, TValue>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
     }
 
@@ -147,6 +157,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<KeyValuePair<TKey, TValue>> items, IEnumerable<KeyValuePair<TKey, TValue>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
     }
 
@@ -154,6 +164,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Count {
       get { return collection.Count; }
@@ -112,9 +117,14 @@
     }
 
+    event EventHandler IObservableCollection<TItem>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<TItem> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<TItem> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<TItem>(items));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items));
     }
 
@@ -122,6 +132,6 @@
     public event CollectionItemsChangedEventHandler<TItem> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<TItem> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<TItem>(items));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items));
     }
 
@@ -129,6 +139,6 @@
     public event CollectionItemsChangedEventHandler<TItem> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<TItem> items, IEnumerable<TItem> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
     }
 
@@ -136,6 +146,6 @@
     public event CollectionItemsChangedEventHandler<TItem> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<TItem> items, IEnumerable<TItem> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
+      CollectionItemsChangedEventHandler<TItem> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
     }
 
@@ -143,6 +153,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Count {
       get { return ((ICollection<T>)list).Count; }
@@ -119,9 +124,14 @@
     }
 
+    event EventHandler IObservableCollection<T>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<IndexedItem<T>> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
     }
 
@@ -133,6 +143,6 @@
     }
     private void OnItemsAdded(IEnumerable<T> items) {
-      if (itemsAdded != null)
-        itemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = itemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -140,6 +150,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<IndexedItem<T>> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
     }
 
@@ -151,6 +161,6 @@
     }
     private void OnItemsRemoved(IEnumerable<T> items) {
-      if (itemsRemoved != null)
-        itemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = itemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -158,6 +168,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -165,6 +175,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
     protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsMoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -172,6 +182,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -183,6 +193,6 @@
     }
     private void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (collectionReset != null)
-        collectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = collectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -190,6 +200,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Count {
       get { return set.Count; }
@@ -136,9 +141,14 @@
     }
 
+    event EventHandler IObservableCollection<T>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<T> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -146,6 +156,6 @@
     public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -153,6 +163,6 @@
     public event CollectionItemsChangedEventHandler<T> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -160,6 +170,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ItemCollectionView.cs	(revision 3317)
@@ -280,5 +280,5 @@
       T item = (T)listViewItem.Tag;
       int i = 0;
-      while ((i < itemsListView.SmallImageList.Images.Count) && (item.ItemImage != itemsListView.SmallImageList.Images[i]))
+      while ((i < itemsListView.SmallImageList.Images.Count) && !item.ItemImage.Equals(itemsListView.SmallImageList.Images[i]))
         i++;
       if (i == itemsListView.SmallImageList.Images.Count) itemsListView.SmallImageList.Images.Add(item.ItemImage);
Index: trunk/sources/HeuristicLab.Core/3.3/ExecutionContext.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ExecutionContext.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/ExecutionContext.cs	(revision 3317)
@@ -26,5 +26,5 @@
 namespace HeuristicLab.Core {
   [StorableClass]
-  public class ExecutionContext : DeepCloneable, IExecutionContext, IAtomicOperation {
+  public sealed class ExecutionContext : DeepCloneable, IExecutionContext, IAtomicOperation {
     [Storable]
     private IParameterizedItem parameterizedItem;
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs	(revision 3317)
@@ -32,5 +32,8 @@
     Image ItemImage { get; }
 
+    bool ReadOnlyView { get; set; }
+
     event EventHandler ItemImageChanged;
+    event EventHandler ReadOnlyViewChanged;
     event EventHandler ToStringChanged;
   }
Index: trunk/sources/HeuristicLab.Core/3.3/Item.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Item.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/Item.cs	(revision 3317)
@@ -22,5 +22,4 @@
 using System;
 using System.Drawing;
-using HeuristicLab.Common.Resources;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -39,11 +38,37 @@
     }
     public virtual Image ItemImage {
-      get { return VS2008ImageLibrary.Class; }
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Class; }
     }
 
-    protected Item() : base() { }
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+        }
+      }
+    }
+
+    protected Item()
+      : base() {
+      readOnlyView = false;
+    }
     [StorableConstructor]
     protected Item(bool deserializing) : base(deserializing) { }
 
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="Variable"/>.</returns>
+    public override IDeepCloneable Clone(Cloner cloner) {
+      Item clone = (Item)base.Clone(cloner);
+      clone.readOnlyView = readOnlyView;
+      return clone;
+    }
 
     /// <summary>
@@ -60,4 +85,9 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler ToStringChanged;
     protected virtual void OnToStringChanged() {
Index: trunk/sources/HeuristicLab.Core/3.3/ItemArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemArray.cs	(revision 3317)
@@ -57,4 +57,5 @@
       ItemArray<T> clone = (ItemArray<T>)Activator.CreateInstance(this.GetType());
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.array = this.Select(x => (T)cloner.Clone(x)).ToArray();
       return clone;
Index: trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemCollection.cs	(revision 3317)
@@ -53,4 +53,5 @@
       ItemCollection<T> clone = (ItemCollection<T>)Activator.CreateInstance(this.GetType());
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.list = new List<T>(this.Select(x => (T)cloner.Clone(x)));
       return clone;
Index: trunk/sources/HeuristicLab.Core/3.3/ItemList.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemList.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemList.cs	(revision 3317)
@@ -57,4 +57,5 @@
       ItemList<T> clone = (ItemList<T>)Activator.CreateInstance(this.GetType());
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.list = new List<T>(this.Select(x => (T)cloner.Clone(x)));
       return clone;
Index: trunk/sources/HeuristicLab.Core/3.3/ItemSet.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemSet.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemSet.cs	(revision 3317)
@@ -56,4 +56,5 @@
       ItemSet<T> clone = (ItemSet<T>)Activator.CreateInstance(this.GetType());
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.set = new HashSet<T>(this.Select(x => (T)cloner.Clone(x)));
       return clone;
Index: trunk/sources/HeuristicLab.Core/3.3/NamedItemCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/NamedItemCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/NamedItemCollection.cs	(revision 3317)
@@ -49,5 +49,5 @@
 
     [StorableHook(HookType.AfterDeserialization)]
-    private void Initialize() {
+    protected void Initialize() {
       RegisterItemEvents(this);
     }
@@ -59,4 +59,5 @@
       NamedItemCollection<T> clone = (NamedItemCollection<T>)Activator.CreateInstance(this.GetType());
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       foreach (string key in dict.Keys)
         clone.dict.Add(key, (T)cloner.Clone(dict[key]));
Index: trunk/sources/HeuristicLab.Core/3.3/OperationCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperationCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/OperationCollection.cs	(revision 3317)
@@ -26,5 +26,5 @@
 namespace HeuristicLab.Core {
   [StorableClass]
-  public class OperationCollection : DeepCloneable, IList<IOperation>, IOperation {
+  public sealed class OperationCollection : DeepCloneable, IList<IOperation>, IOperation {
     [Storable]
     private IList<IOperation> operations;
@@ -51,6 +51,6 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      OperationCollection clone = new OperationCollection(this.Select(x => (IOperation)cloner.Clone(x)));
-      cloner.RegisterClonedObject(this, clone);
+      OperationCollection clone = (OperationCollection)base.Clone(cloner);
+      clone.operations = new List<IOperation>(this.Select(x => (IOperation)cloner.Clone(x)));
       clone.parallel = parallel;
       return clone;
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs	(revision 3317)
@@ -37,16 +37,11 @@
   [StorableClass]
   public class OperatorGraph : Item {
+    [Storable]
     private OperatorSet operators;
     /// <summary>
     /// Gets all operators of the current instance.
     /// </summary>
-    [Storable]
     public OperatorSet Operators {
       get { return operators; }
-      private set {
-        DeregisterOperatorsEvents();
-        operators = value;
-        RegisterOperatorsEvents();
-      }
     }
 
@@ -87,7 +82,15 @@
     /// </summary>
     public OperatorGraph() {
-      Operators = new OperatorSet();
+      operators = new OperatorSet();
       initialOperator = null;
       visualizationInfo = null;
+      Initialize();
+    }
+    [StorableConstructor]
+    protected OperatorGraph(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      RegisterOperatorsEvents();
     }
 
@@ -100,9 +103,9 @@
     /// <returns>The cloned object as <see cref="OperatorGraph"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      OperatorGraph clone = new OperatorGraph();
-      cloner.RegisterClonedObject(this, clone);
-      clone.Operators = (OperatorSet)cloner.Clone(operators);
+      OperatorGraph clone = (OperatorGraph)base.Clone(cloner);
+      clone.operators = (OperatorSet)cloner.Clone(operators);
       clone.initialOperator = (IOperator)cloner.Clone(initialOperator);
       clone.visualizationInfo = cloner.Clone(visualizationInfo);
+      clone.Initialize();
       return clone;
     }
@@ -166,18 +169,4 @@
       }
     }
-    private void DeregisterOperatorsEvents() {
-      if (operators != null) {
-        foreach (IOperator op in operators) {
-          foreach (IParameter param in op.Parameters) {
-            IValueParameter<IOperator> opParam = param as IValueParameter<IOperator>;
-            if (opParam != null) DeregisterOperatorParameterEvents(opParam);
-          }
-          DeregisterOperatorEvents(op);
-        }
-        operators.ItemsAdded -= new CollectionItemsChangedEventHandler<IOperator>(Operators_ItemsAdded);
-        operators.ItemsRemoved -= new CollectionItemsChangedEventHandler<IOperator>(Operators_ItemsRemoved);
-        operators.CollectionReset -= new CollectionItemsChangedEventHandler<IOperator>(Operators_CollectionReset);
-      }
-    }
     private void RegisterOperatorEvents(IOperator op) {
       op.Parameters.ItemsAdded += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsAdded);
Index: trunk/sources/HeuristicLab.Core/3.3/Scope.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 3317)
@@ -51,13 +51,8 @@
     }
 
+    [Storable]
     private ScopeList subScopes;
-    [Storable]
     public ScopeList SubScopes {
       get { return subScopes; }
-      private set {
-        DeregisterSubScopesEvents();
-        subScopes = value;
-        RegisterSubScopesEvents();
-      }
     }
 
@@ -69,5 +64,6 @@
       parent = null;
       variables = new VariableCollection();
-      SubScopes = new ScopeList();
+      subScopes = new ScopeList();
+      Initialize();
     }
     /// <summary>
@@ -79,5 +75,6 @@
       parent = null;
       variables = new VariableCollection();
-      SubScopes = new ScopeList();
+      subScopes = new ScopeList();
+      Initialize();
     }
     public Scope(string name, string description)
@@ -85,5 +82,13 @@
       parent = null;
       variables = new VariableCollection();
-      SubScopes = new ScopeList();
+      subScopes = new ScopeList();
+      Initialize();
+    }
+    [StorableConstructor]
+    private Scope(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      RegisterSubScopesEvents();
     }
 
@@ -98,11 +103,13 @@
       Scope clone = new Scope();
       cloner.RegisterClonedObject(this, clone);
-      clone.Name = Name;
-      clone.Description = Description;
+      clone.ReadOnlyView = ReadOnlyView;
+      clone.name = name;
+      clone.description = description;
       if (variables.Count > 0) clone.variables = (VariableCollection)cloner.Clone(variables);
       if (subScopes.Count > 0) {
-        clone.SubScopes = (ScopeList)cloner.Clone(subScopes);
+        clone.subScopes = (ScopeList)cloner.Clone(subScopes);
         foreach (IScope child in clone.SubScopes)
           child.Parent = clone;
+        clone.Initialize();
       }
       return clone;
@@ -116,12 +123,4 @@
         subScopes.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
         subScopes.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
-      }
-    }
-    private void DeregisterSubScopesEvents() {
-      if (subScopes != null) {
-        subScopes.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
-        subScopes.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
-        subScopes.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
-        subScopes.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
       }
     }
Index: trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/ScopeList.cs	(revision 3317)
@@ -33,6 +33,8 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      ScopeList clone = new ScopeList(this.Select(x => (IScope)cloner.Clone(x)));
+      ScopeList clone = new ScopeList();
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
+      clone.list = new List<IScope>(this.Select(x => (IScope)cloner.Clone(x)));
       return clone;
     }
Index: trunk/sources/HeuristicLab.Core/3.3/Variable.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Variable.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/Variable.cs	(revision 3317)
@@ -31,8 +31,8 @@
   [StorableClass]
   public sealed class Variable : NamedItem, IVariable {
+    [Storable]
     private IItem value;
     /// <inheritdoc/>
     /// <remarks>Calls <see cref="OnValueChanged"/> in the setter.</remarks>
-    [Storable]
     public IItem Value {
       get { return value; }
@@ -72,10 +72,17 @@
       : base(name) {
       this.value = value;
-      if (this.value != null) this.value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+      Initialize();
     }
     public Variable(string name, string description, IItem value)
       : base(name, description) {
       this.value = value;
-      if (this.value != null) this.value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+      Initialize();
+    }
+    [StorableConstructor]
+    private Variable(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (value != null) value.ToStringChanged += new EventHandler(Value_ToStringChanged);
     }
 
@@ -86,6 +93,9 @@
     /// <returns>The cloned object as <see cref="Variable"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      Variable clone = new Variable(Name, Description, (IItem)cloner.Clone(value));
+      Variable clone = new Variable(Name, Description);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
+      clone.value = (IItem)cloner.Clone(value);
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableCollection.cs	(revision 3317)
@@ -33,6 +33,10 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      VariableCollection clone = new VariableCollection(this.Select(x => (IVariable)cloner.Clone(x)));
+      VariableCollection clone = new VariableCollection();
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
+      foreach (string key in dict.Keys)
+        clone.dict.Add(key, (IVariable)cloner.Clone(dict[key]));
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data.Views/3.3/BoolValueView.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/BoolValueView.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/BoolValueView.cs	(revision 3317)
@@ -62,5 +62,5 @@
         Caption = Content.ToString() + " (" + Content.GetType().Name + ")";
         valueCheckBox.Checked = Content.Value;
-        valueCheckBox.Enabled = true;
+        valueCheckBox.Enabled = !Content.ReadOnlyView;
       }
     }
Index: trunk/sources/HeuristicLab.Data.Views/3.3/ComparisonView.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/ComparisonView.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/ComparisonView.cs	(revision 3317)
@@ -62,5 +62,5 @@
         Caption = Content.ToString() + " (" + Content.GetType().Name + ")";
         valueComboBox.SelectedItem = Content.Value;
-        valueComboBox.Enabled = true;
+        valueComboBox.Enabled = !Content.ReadOnlyView;
       }
     }
Index: trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleArrayView.cs	(revision 3317)
@@ -90,4 +90,5 @@
         dataGridView.Columns[0].Width = dataGridView.Columns[0].GetPreferredWidth(DataGridViewAutoSizeColumnMode.AllCells, true);
       }
+      dataGridView.ReadOnly = Content.ReadOnlyView;
       dataGridView.Enabled = true;
     }
Index: trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 3317)
@@ -104,4 +104,5 @@
         UpdateColumnHeaders();
       }
+      dataGridView.ReadOnly = Content.ReadOnlyView;
       dataGridView.Enabled = true;
     }
Index: trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleValueView.cs	(revision 3317)
@@ -65,4 +65,5 @@
         Caption = Content.GetValue() + " (" + Content.GetType().Name + ")";
         valueTextBox.Text = Content.GetValue();
+        valueTextBox.ReadOnly = Content.ReadOnlyView;
         valueTextBox.Enabled = true;
       }
Index: trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolArray.cs	(revision 3317)
@@ -35,4 +35,5 @@
       BoolArray clone = new BoolArray(array);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolMatrix.cs	(revision 3317)
@@ -39,7 +39,8 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       BoolMatrix clone = new BoolMatrix(matrix);
+      cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.ColumnNames = new List<string>(ColumnNames);
       clone.RowNames = new List<string>(RowNames);
-      cloner.RegisterClonedObject(this, clone);
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/BoolValue.cs	(revision 3317)
@@ -40,4 +40,5 @@
       BoolValue clone = new BoolValue(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/Comparison.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/Comparison.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/Comparison.cs	(revision 3317)
@@ -39,4 +39,5 @@
       Comparison clone = new Comparison(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/DateTimeValue.cs	(revision 3317)
@@ -34,4 +34,5 @@
       DateTimeValue clone = new DateTimeValue(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/DoubleArray.cs	(revision 3317)
@@ -35,4 +35,5 @@
       DoubleArray clone = new DoubleArray(array);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/DoubleMatrix.cs	(revision 3317)
@@ -39,7 +39,8 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       DoubleMatrix clone = new DoubleMatrix(matrix);
+      cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.ColumnNames = new List<string>(ColumnNames);
       clone.RowNames = new List<string>(RowNames);
-      cloner.RegisterClonedObject(this, clone);
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/DoubleValue.cs	(revision 3317)
@@ -40,4 +40,5 @@
       DoubleValue clone = new DoubleValue(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleArray.cs	(revision 3317)
@@ -25,4 +25,5 @@
 namespace HeuristicLab.Data {
   public interface IStringConvertibleArray {
+    bool ReadOnlyView { get; set; }
     int Length { get; set; }
 
@@ -31,4 +32,5 @@
     bool SetValue(string value, int index);
 
+    event EventHandler ReadOnlyViewChanged;
     event EventHandler<EventArgs<int>> ItemChanged;
     event EventHandler Reset;
Index: trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleMatrix.cs	(revision 3317)
@@ -26,4 +26,5 @@
 namespace HeuristicLab.Data {
   public interface IStringConvertibleMatrix {
+    bool ReadOnlyView { get; set; }
     int Rows { get; set; }
     int Columns { get; set; }
@@ -37,4 +38,5 @@
     bool SetValue(string value, int rowIndex, int columnIndex);
 
+    event EventHandler ReadOnlyViewChanged;
     event EventHandler<EventArgs<int, int>> ItemChanged;
     event EventHandler Reset;
Index: trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleValue.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/IStringConvertibleValue.cs	(revision 3317)
@@ -24,8 +24,11 @@
 namespace HeuristicLab.Data {
   public interface IStringConvertibleValue {
+    bool ReadOnlyView { get; set; }
+
     bool Validate(string value, out string errorMessage);
     string GetValue();
     bool SetValue(string value);
 
+    event EventHandler ReadOnlyViewChanged;
     event EventHandler ValueChanged;
   }
Index: trunk/sources/HeuristicLab.Data/3.3/IntArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/IntArray.cs	(revision 3317)
@@ -35,4 +35,5 @@
       IntArray clone = new IntArray(array);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/IntMatrix.cs	(revision 3317)
@@ -39,7 +39,8 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       IntMatrix clone = new IntMatrix(matrix);
+      cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.ColumnNames = new List<string>(ColumnNames);
       clone.RowNames = new List<string>(RowNames);
-      cloner.RegisterClonedObject(this, clone);
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/IntValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/IntValue.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/IntValue.cs	(revision 3317)
@@ -40,4 +40,5 @@
       IntValue clone = new IntValue(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/PercentValue.cs	(revision 3317)
@@ -34,4 +34,5 @@
       PercentValue clone = new PercentValue(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/StringArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/StringArray.cs	(revision 3317)
@@ -80,4 +80,5 @@
       StringArray clone = new StringArray();
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.array = (string[])array.Clone();
       return clone;
Index: trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/StringMatrix.cs	(revision 3317)
@@ -147,4 +147,5 @@
       StringMatrix clone = new StringMatrix();
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.matrix = (string[,])matrix.Clone();
       clone.columnNames = new List<string>(columnNames);
Index: trunk/sources/HeuristicLab.Data/3.3/StringValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/StringValue.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/StringValue.cs	(revision 3317)
@@ -57,4 +57,5 @@
       StringValue clone = new StringValue(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Data/3.3/TimeSpanValue.cs	(revision 3317)
@@ -35,4 +35,5 @@
       TimeSpanValue clone = new TimeSpanValue(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVector.cs	(revision 3317)
@@ -44,4 +44,5 @@
       BinaryVector clone = new BinaryVector(array);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Tests/TestRandom.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Tests/TestRandom.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Tests/TestRandom.cs	(revision 3317)
@@ -112,5 +112,11 @@
     }
 
+    public bool ReadOnlyView {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
     public event EventHandler ItemImageChanged;
+    public event EventHandler ReadOnlyViewChanged;
     public event EventHandler ToStringChanged;
 
Index: trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVector.cs	(revision 3317)
@@ -44,4 +44,5 @@
       IntegerVector clone = new IntegerVector(array);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Tests/TestRandom.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Tests/TestRandom.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Tests/TestRandom.cs	(revision 3317)
@@ -112,5 +112,11 @@
     }
 
+    public bool ReadOnlyView {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
     public event EventHandler ItemImageChanged;
+    public event EventHandler ReadOnlyViewChanged;
     public event EventHandler ToStringChanged;
 
Index: trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Permutation.cs	(revision 3317)
@@ -65,4 +65,5 @@
       Permutation clone = new Permutation(permutationType, array);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationType.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationType.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationType.cs	(revision 3317)
@@ -34,4 +34,5 @@
       PermutationType clone = new PermutationType(value);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Tests/Random.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Tests/Random.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Tests/Random.cs	(revision 3317)
@@ -112,5 +112,11 @@
     }
 
+    public bool ReadOnlyView {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
     public event EventHandler ItemImageChanged;
+    public event EventHandler ReadOnlyViewChanged;
     public event EventHandler ToStringChanged;
 
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVector.cs	(revision 3317)
@@ -44,4 +44,5 @@
       RealVector clone = new RealVector(array);
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       return clone;
     }
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Tests/TestRandom.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Tests/TestRandom.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Tests/TestRandom.cs	(revision 3317)
@@ -112,5 +112,11 @@
     }
 
+    public bool ReadOnlyView {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
     public event EventHandler ItemImageChanged;
+    public event EventHandler ReadOnlyViewChanged;
     public event EventHandler ToStringChanged;
 
Index: trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTree.cs	(revision 3317)
@@ -99,4 +99,5 @@
       SymbolicExpressionTree clone = new SymbolicExpressionTree();
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.root = (SymbolicExpressionTreeNode)this.root.Clone();
       clone.allowedFunctionsInBranch = new Dictionary<int, IEnumerable<string>>(allowedFunctionsInBranch);
Index: trunk/sources/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Operators.Programmable/3.3/ProgrammableOperator.cs	(revision 3317)
@@ -418,5 +418,5 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       ProgrammableOperator clone = (ProgrammableOperator)base.Clone(cloner);
-      clone.Description = Description;
+      clone.description = description;
       clone.code = Code;
       clone.executeMethod = executeMethod;
Index: trunk/sources/HeuristicLab.Operators/3.3/MultipleCallsOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/MultipleCallsOperator.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Operators/3.3/MultipleCallsOperator.cs	(revision 3317)
@@ -37,23 +37,21 @@
     private List<IValueParameter<IOperator>> operatorParameters;
 
+    [Storable]
     private OperatorList operators;
-    [Storable]
     public OperatorList Operators {
       get { return operators; }
-      private set {
-        if (operators != null) DeregisterOperatorsEvents();
-        operators = value;
-        if (operators != null) RegisterOperatorsEvents();
-      }
     }
 
     public MultipleCallsOperator()
       : base() {
-      Operators = new OperatorList();
+      operators = new OperatorList();
       Initialize();
     }
+    [StorableConstructor]
+    protected MultipleCallsOperator(bool deserializing) : base(deserializing) { }
 
     [StorableHook(HookType.AfterDeserialization)]
     private void Initialize() {
+      if (operators != null) RegisterOperatorsEvents();
       operatorParameters = new List<IValueParameter<IOperator>>();
       for (int i = 0; i < Operators.Count; i++) {
@@ -66,5 +64,5 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       MultipleCallsOperator clone = (MultipleCallsOperator)base.Clone(cloner);
-      clone.Operators = (OperatorList)cloner.Clone(operators);
+      clone.operators = (OperatorList)cloner.Clone(operators);
       clone.Initialize();
       return clone;
Index: trunk/sources/HeuristicLab.Operators/3.3/Operator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/Operator.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Operators/3.3/Operator.cs	(revision 3317)
@@ -113,4 +113,6 @@
       breakpoint = false;
     }
+    [StorableConstructor]
+    protected Operator(bool deserializing) : base(deserializing) { }
 
     /// <summary>
Index: trunk/sources/HeuristicLab.Operators/3.3/SingleSuccessorOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/SingleSuccessorOperator.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Operators/3.3/SingleSuccessorOperator.cs	(revision 3317)
@@ -43,4 +43,6 @@
       Parameters.Add(new OperatorParameter("Successor", "Operator which is executed next."));
     }
+    [StorableConstructor]
+    protected SingleSuccessorOperator(bool deserializing) : base(deserializing) { }
 
     public override IOperation Apply() {
Index: trunk/sources/HeuristicLab.Operators/3.3/ValuesCollector.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/ValuesCollector.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Operators/3.3/ValuesCollector.cs	(revision 3317)
@@ -31,24 +31,29 @@
   [StorableClass]
   public abstract class ValuesCollector : SingleSuccessorOperator, IOperator {
+    [Storable]
     private ParameterCollection collectedValues;
-    [Storable]
     public ParameterCollection CollectedValues {
       get { return collectedValues; }
-      private set {
-        collectedValues = value;
-        collectedValues.ItemsAdded += new CollectionItemsChangedEventHandler<IParameter>(collectedValues_ItemsAdded);
-        collectedValues.ItemsRemoved += new CollectionItemsChangedEventHandler<IParameter>(collectedValues_ItemsRemoved);
-        collectedValues.CollectionReset += new CollectionItemsChangedEventHandler<IParameter>(collectedValues_CollectionReset);
-      }
     }
 
     public ValuesCollector()
       : base() {
-      CollectedValues = new ParameterCollection();
+      collectedValues = new ParameterCollection();
+      Initialize();
+    }
+    [StorableConstructor]
+    protected ValuesCollector(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      collectedValues.ItemsAdded += new CollectionItemsChangedEventHandler<IParameter>(collectedValues_ItemsAdded);
+      collectedValues.ItemsRemoved += new CollectionItemsChangedEventHandler<IParameter>(collectedValues_ItemsRemoved);
+      collectedValues.CollectionReset += new CollectionItemsChangedEventHandler<IParameter>(collectedValues_CollectionReset);
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       ValuesCollector clone = (ValuesCollector)base.Clone(cloner);
-      clone.CollectedValues = (ParameterCollection)cloner.Clone(collectedValues);
+      clone.collectedValues = (ParameterCollection)cloner.Clone(collectedValues);
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Optimization/3.3/OptimizerList.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/OptimizerList.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Optimization/3.3/OptimizerList.cs	(revision 3317)
@@ -33,10 +33,4 @@
     public OptimizerList(int capacity) : base(capacity) { }
     public OptimizerList(IEnumerable<IOptimizer> collection) : base(collection) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      OptimizerList clone = new OptimizerList(this.Select(x => (IOptimizer)cloner.Clone(x)));
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Optimization/3.3/Result.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Result.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Result.cs	(revision 3317)
@@ -45,6 +45,6 @@
     }
 
+    [Storable]
     private IItem value;
-    [Storable]
     public IItem Value {
       get { return value; }
@@ -84,5 +84,5 @@
       this.dataType = value == null ? typeof(IItem) : value.GetType();
       this.value = value;
-      if (this.value != null) this.value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+      Initialize();
     }
     public Result(string name, string description, IItem value)
@@ -90,11 +90,20 @@
       this.dataType = value == null ? typeof(IItem) : value.GetType();
       this.value = value;
-      if (this.value != null) this.value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+      Initialize();
+    }
+    [StorableConstructor]
+    private Result(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (value != null) value.ToStringChanged += new EventHandler(Value_ToStringChanged);
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      Result clone = new Result(Name, Description, (IItem)cloner.Clone(value));
+      Result clone = new Result(Name, Description, DataType);
       cloner.RegisterClonedObject(this, clone);
-      clone.dataType = dataType;
+      clone.ReadOnlyView = ReadOnlyView;
+      clone.value = (IItem)cloner.Clone(value);
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Optimization/3.3/ResultCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/ResultCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Optimization/3.3/ResultCollection.cs	(revision 3317)
@@ -32,10 +32,4 @@
     public ResultCollection(int capacity) : base(capacity) { }
     public ResultCollection(IEnumerable<IResult> collection) : base(collection) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      ResultCollection clone = new ResultCollection(this.Select(x => (IResult)cloner.Clone(x)));
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 3317)
@@ -32,10 +32,4 @@
     public RunCollection(int capacity) : base(capacity) { }
     public RunCollection(IEnumerable<IRun> collection) : base(collection) { }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      RunCollection clone = new RunCollection(this.Select(x => (IRun)cloner.Clone(x)));
-      cloner.RegisterClonedObject(this, clone);
-      return clone;
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 3317)
@@ -71,4 +71,6 @@
       this.actualName = actualName == null ? string.Empty : actualName;
     }
+    [StorableConstructor]
+    protected LookupParameter(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: trunk/sources/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 3317)
@@ -33,17 +33,12 @@
   [StorableClass]
   public class OptionalConstrainedValueParameter<T> : Parameter, IValueParameter<T> where T : class, IItem {
+    [Storable]
     private ItemSet<T> validValues;
-    [Storable]
     public ItemSet<T> ValidValues {
       get { return validValues; }
-      private set {
-        DeregisterValidValuesEvents();
-        validValues = value;
-        RegisterValidValuesEvents();
-      }
     }
 
+    [Storable]
     private T value;
-    [Storable]
     public virtual T Value {
       get { return this.value; }
@@ -74,37 +69,53 @@
     public OptionalConstrainedValueParameter()
       : base("Anonymous", typeof(T)) {
-      ValidValues = new ItemSet<T>();
+      this.validValues = new ItemSet<T>();
+      Initialize();
     }
     public OptionalConstrainedValueParameter(string name)
       : base(name, typeof(T)) {
-      ValidValues = new ItemSet<T>();
+      this.validValues = new ItemSet<T>();
+      Initialize();
     }
     public OptionalConstrainedValueParameter(string name, ItemSet<T> validValues)
       : base(name, typeof(T)) {
-      ValidValues = validValues;
+      this.validValues = validValues;
+      Initialize();
     }
     public OptionalConstrainedValueParameter(string name, ItemSet<T> validValues, T value)
       : base(name, typeof(T)) {
-      ValidValues = validValues;
-      Value = value;
+      this.validValues = validValues;
+      this.value = value;
+      Initialize();
     }
     public OptionalConstrainedValueParameter(string name, string description)
       : base(name, description, typeof(T)) {
-      ValidValues = new ItemSet<T>();
+      this.validValues = new ItemSet<T>();
+      Initialize();
     }
     public OptionalConstrainedValueParameter(string name, string description, ItemSet<T> validValues)
       : base(name, description, typeof(T)) {
-      ValidValues = validValues;
+      this.validValues = validValues;
+      Initialize();
     }
     public OptionalConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value)
       : base(name, description, typeof(T)) {
-      ValidValues = validValues;
-      Value = value;
+      this.validValues = validValues;
+      this.value = value;
+      Initialize();
+    }
+    [StorableConstructor]
+    protected OptionalConstrainedValueParameter(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      RegisterValidValuesEvents();
+      if (value != null) value.ToStringChanged += new EventHandler(Value_ToStringChanged);
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       OptionalConstrainedValueParameter<T> clone = (OptionalConstrainedValueParameter<T>)base.Clone(cloner);
-      clone.ValidValues = (ItemSet<T>)cloner.Clone(validValues);
-      clone.Value = (T)cloner.Clone(value);
+      clone.validValues = (ItemSet<T>)cloner.Clone(validValues);
+      clone.value = (T)cloner.Clone(value);
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs	(revision 3317)
@@ -32,6 +32,6 @@
   [StorableClass]
   public class OptionalValueParameter<T> : Parameter, IValueParameter<T> where T : class, IItem {
+    [Storable]
     private T value;
-    [Storable]
     public virtual T Value {
       get { return this.value; }
@@ -66,5 +66,6 @@
     public OptionalValueParameter(string name, T value)
       : base(name, typeof(T)) {
-      Value = value;
+      this.value = value;
+      Initialize();
     }
     public OptionalValueParameter(string name, string description)
@@ -73,10 +74,19 @@
     public OptionalValueParameter(string name, string description, T value)
       : base(name, description, typeof(T)) {
-      Value = value;
+      this.value = value;
+      Initialize();
+    }
+    [StorableConstructor]
+    protected OptionalValueParameter(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (value != null) value.ToStringChanged += new EventHandler(Value_ToStringChanged);
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       OptionalValueParameter<T> clone = (OptionalValueParameter<T>)base.Clone(cloner);
-      clone.Value = (T)cloner.Clone(value);
+      clone.value = (T)cloner.Clone(value);
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Parameters/3.3/Parameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters/3.3/Parameter.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Parameters/3.3/Parameter.cs	(revision 3317)
@@ -91,4 +91,6 @@
       this.dataType = dataType;
     }
+    [StorableConstructor]
+    protected Parameter(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: trunk/sources/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs
===================================================================
--- trunk/sources/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Parameters/3.3/ValueLookupParameter.cs	(revision 3317)
@@ -32,6 +32,6 @@
   [StorableClass]
   public class ValueLookupParameter<T> : LookupParameter<T>, IValueLookupParameter<T> where T : class, IItem {
+    [Storable]
     private T value;
-    [Storable]
     public T Value {
       get { return this.value; }
@@ -66,5 +66,6 @@
     public ValueLookupParameter(string name, T value)
       : base(name) {
-      Value = value;
+      this.value = value;
+      Initialize();
     }
     public ValueLookupParameter(string name, string description)
@@ -73,13 +74,22 @@
     public ValueLookupParameter(string name, string description, T value)
       : base(name, description) {
-      Value = value;
+      this.value = value;
+      Initialize();
     }
     public ValueLookupParameter(string name, string description, string actualName)
       : base(name, description, actualName) {
     }
+    [StorableConstructor]
+    protected ValueLookupParameter(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (value != null) value.ToStringChanged += new EventHandler(Value_ToStringChanged);
+    }
 
     public override IDeepCloneable Clone(Cloner cloner) {
       ValueLookupParameter<T> clone = (ValueLookupParameter<T>)base.Clone(cloner);
-      clone.Value = (T)cloner.Clone(value);
+      clone.value = (T)cloner.Clone(value);
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/AntTrail.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/AntTrail.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.3/AntTrail.cs	(revision 3317)
@@ -34,6 +34,6 @@
   [StorableClass]
   public sealed class AntTrail : Item {
+    [Storable]
     private SymbolicExpressionTree expression;
-    [Storable]
     public SymbolicExpressionTree SymbolicExpressionTree {
       get { return expression; }
@@ -48,6 +48,6 @@
     }
 
+    [Storable]
     private BoolMatrix world;
-    [Storable]
     public BoolMatrix World {
       get { return world; }
@@ -61,6 +61,6 @@
       }
     }
+    [Storable]
     private IntValue maxTimeSteps;
-    [Storable]
     public IntValue MaxTimeSteps {
       get { return maxTimeSteps; }
@@ -80,7 +80,17 @@
     public AntTrail(BoolMatrix world, SymbolicExpressionTree expression, IntValue maxTimeSteps)
       : this() {
-      World = world;
-      SymbolicExpressionTree = expression;
-      MaxTimeSteps = maxTimeSteps;
+      this.world = world;
+      this.expression = expression;
+      this.maxTimeSteps = maxTimeSteps;
+      Initialize();
+    }
+    [StorableConstructor]
+    private AntTrail(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      //if (expression != null) RegisterSymbolicExpressionTreeEvents();
+      if (world != null) RegisterWorldEvents();
+      if (maxTimeSteps != null) RegisterMaxTimeStepsEvents();
     }
 
@@ -88,7 +98,9 @@
       AntTrail clone = new AntTrail();
       cloner.RegisterClonedObject(this, clone);
+      clone.ReadOnlyView = ReadOnlyView;
       clone.expression = (SymbolicExpressionTree)cloner.Clone(expression);
       clone.world = (BoolMatrix)cloner.Clone(world);
       clone.maxTimeSteps = (IntValue)cloner.Clone(maxTimeSteps);
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/PathTSPTour.cs	(revision 3317)
@@ -39,6 +39,6 @@
     }
 
+    [Storable]
     private DoubleMatrix coordinates;
-    [Storable]
     public DoubleMatrix Coordinates {
       get { return coordinates; }
@@ -52,6 +52,6 @@
       }
     }
+    [Storable]
     private Permutation permutation;
-    [Storable]
     public Permutation Permutation {
       get { return permutation; }
@@ -69,9 +69,20 @@
     public PathTSPTour(DoubleMatrix coordinates)
       : base() {
-      Coordinates = coordinates;
+      this.coordinates = coordinates;
+      Initialize();
     }
     public PathTSPTour(DoubleMatrix coordinates, Permutation permutation)
-      : this(coordinates) {
-      Permutation = permutation;
+      : base() {
+      this.coordinates = coordinates;
+      this.permutation = permutation;
+      Initialize();
+    }
+    [StorableConstructor]
+    private PathTSPTour(bool deserializing) : base(deserializing) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void Initialize() {
+      if (coordinates != null) RegisterCoordinatesEvents();
+      if (permutation != null) RegisterPermutationEvents();
     }
 
@@ -79,6 +90,8 @@
       PathTSPTour clone = new PathTSPTour();
       cloner.RegisterClonedObject(this, clone);
-      clone.Coordinates = (DoubleMatrix)cloner.Clone(coordinates);
-      clone.Permutation = (Permutation)cloner.Clone(permutation);
+      clone.ReadOnlyView = ReadOnlyView;
+      clone.coordinates = (DoubleMatrix)cloner.Clone(coordinates);
+      clone.permutation = (Permutation)cloner.Clone(permutation);
+      clone.Initialize();
       return clone;
     }
Index: trunk/sources/HeuristicLab.Random/3.3/MersenneTwister.cs
===================================================================
--- trunk/sources/HeuristicLab.Random/3.3/MersenneTwister.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Random/3.3/MersenneTwister.cs	(revision 3317)
@@ -84,6 +84,5 @@
     /// <returns>The cloned object as <see cref="MersenneTwister"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      MersenneTwister clone = new MersenneTwister();
-      cloner.RegisterClonedObject(this, clone);
+      MersenneTwister clone = (MersenneTwister)base.Clone(cloner);
       clone.state = (uint[])state.Clone();
       clone.p = p;
Index: trunk/sources/HeuristicLab.Random/3.3/NormalDistributedRandom.cs
===================================================================
--- trunk/sources/HeuristicLab.Random/3.3/NormalDistributedRandom.cs	(revision 3316)
+++ trunk/sources/HeuristicLab.Random/3.3/NormalDistributedRandom.cs	(revision 3317)
@@ -553,6 +553,8 @@
     /// <returns>The cloned object as <see cref="NormalDistributedRandom"/>.</returns>
     public override IDeepCloneable Clone(Cloner cloner) {
-      NormalDistributedRandom clone = new NormalDistributedRandom((IRandom)cloner.Clone(uniform), mu, sigma);
-      cloner.RegisterClonedObject(this, clone);
+      NormalDistributedRandom clone = (NormalDistributedRandom)base.Clone(cloner);
+      clone.uniform = (IRandom)cloner.Clone(uniform);
+      clone.mu = mu;
+      clone.sigma = sigma;
       return clone;
     }
