Index: trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs	(revision 2574)
+++ trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs	(revision 2575)
@@ -26,5 +26,5 @@
 
 namespace HeuristicLab.Collections {
-  public interface IObservableCollection<T> : ICollection<T> {
+  public interface IObservableCollection<T> : ICollection<T>, IDisposable {
     event CollectionItemsChangedEventHandler<T> ItemsAdded;
     event CollectionItemsChangedEventHandler<T> ItemsRemoved;
Index: trunk/sources/HeuristicLab.Collections/3.3/IObservableKeyedCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IObservableKeyedCollection.cs	(revision 2574)
+++ trunk/sources/HeuristicLab.Collections/3.3/IObservableKeyedCollection.cs	(revision 2575)
@@ -26,5 +26,5 @@
 
 namespace HeuristicLab.Collections {
-  public interface IObservableKeyedCollection<TKey, TItem> : IObservableCollection<TItem>, IDisposable {
+  public interface IObservableKeyedCollection<TKey, TItem> : IObservableCollection<TItem> {
     event CollectionItemsChangedEventHandler<TItem> ItemsReplaced;
   }
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 2574)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 2575)
@@ -56,4 +56,20 @@
     public ObservableCollection(IEnumerable<T> collection) {
       list = new List<T>(collection);
+      OnItemsAdded(collection);
+    }
+    #endregion
+
+    #region Destructors
+    ~ObservableCollection() {
+      Dispose(false);
+    }
+    protected virtual void Dispose(bool disposing) {
+      if (disposing) {
+        Clear();
+      }
+    }
+    public void Dispose() {
+      Dispose(true);
+      GC.SuppressFinalize(this);
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 2574)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 2575)
@@ -80,4 +80,5 @@
     public ObservableDictionary(IDictionary<TKey, TValue> dictionary) {
       dict = new Dictionary<TKey, TValue>(dictionary);
+      OnItemsAdded(dictionary);
     }
     public ObservableDictionary(int capacity, IEqualityComparer<TKey> comparer) {
@@ -86,4 +87,20 @@
     public ObservableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TValue>(dictionary, comparer);
+      OnItemsAdded(dictionary);
+    }
+    #endregion
+
+    #region Destructors
+    ~ObservableDictionary() {
+      Dispose(false);
+    }
+    protected virtual void Dispose(bool disposing) {
+      if (disposing) {
+        Clear();
+      }
+    }
+    public void Dispose() {
+      Dispose(true);
+      GC.SuppressFinalize(this);
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollectionBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollectionBase.cs	(revision 2574)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollectionBase.cs	(revision 2575)
@@ -66,5 +66,6 @@
       dict = new Dictionary<TKey, TItem>();
       foreach (TItem item in collection)
-        AddItem(item);
+        dict.Add(GetKeyForItem(item), item);
+      OnItemsAdded(collection);
     }
     protected ObservableKeyedCollectionBase(int capacity, IEqualityComparer<TKey> comparer) {
@@ -75,5 +76,6 @@
       dict = new Dictionary<TKey, TItem>(comparer);
       foreach (TItem item in collection)
-        AddItem(item);
+        dict.Add(GetKeyForItem(item), item);
+      OnItemsAdded(collection);
     }
     #endregion
@@ -150,9 +152,6 @@
 
     #region Manipulation
-    protected virtual void AddItem(TItem item) {
+    public void Add(TItem item) {
       dict.Add(GetKeyForItem(item), item);
-    }
-    public void Add(TItem item) {
-      AddItem(item);
       OnItemsAdded(new TItem[] { item });
     }
@@ -160,15 +159,12 @@
       if (collection == null) throw new ArgumentNullException();
       foreach (TItem item in collection)
-        AddItem(item);
+        dict.Add(GetKeyForItem(item), item);
       OnItemsAdded(collection);
     }
 
-    protected virtual bool RemoveItem(TItem item) {
-      return dict.Remove(GetKeyForItem(item));
-    }
     public bool Remove(TKey key) {
       TItem item;
       if (TryGetValue(key, out item)) {
-        RemoveItem(item);
+        dict.Remove(key);
         OnItemsRemoved(new TItem[] { item });
         return true;
@@ -177,5 +173,5 @@
     }
     public bool Remove(TItem item) {
-      if (RemoveItem(item)) {
+      if (dict.Remove(GetKeyForItem(item))) {
         OnItemsRemoved(new TItem[] { item });
         return true;
@@ -187,5 +183,5 @@
       List<TItem> items = new List<TItem>();
       foreach (TItem item in collection) {
-        if (RemoveItem(item))
+        if (dict.Remove(GetKeyForItem(item)))
           items.Add(item);
       }
@@ -199,10 +195,7 @@
     }
 
-    protected virtual void ClearItems() {
-      dict.Clear();
-    }
     public void Clear() {
       TItem[] items = dict.Values.ToArray();
-      ClearItems();
+      dict.Clear();
       OnCollectionReset(new TItem[0], items);
     }
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 2574)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 2575)
@@ -70,4 +70,20 @@
     public ObservableList(IEnumerable<T> collection) {
       list = new List<T>(collection);
+      OnItemsAdded(GetIndexedItems());
+    }
+    #endregion
+
+    #region Destructors
+    ~ObservableList() {
+      Dispose(false);
+    }
+    protected virtual void Dispose(bool disposing) {
+      if (disposing) {
+        Clear();
+      }
+    }
+    public void Dispose() {
+      Dispose(true);
+      GC.SuppressFinalize(this);
     }
     #endregion
