Index: trunk/sources/HeuristicLab.Collections/3.3/CollectionChangedEventsBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/CollectionChangedEventsBase.cs	(revision 2573)
+++ 	(revision )
@@ -1,61 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Runtime.Serialization;
-
-namespace HeuristicLab.Collections {
-  [Serializable]
-  [EmptyStorableClass]
-  public abstract class CollectionChangedEventsBase<T> : ICollectionChangedEvents<T> {
-    [field: NonSerialized]
-    public event CollectionItemsChangedEventHandler<T> ItemsAdded;
-    protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
-    }
-
-    [field: NonSerialized]
-    public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
-    protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
-    }
-
-    [field: NonSerialized]
-    public event CollectionItemsChangedEventHandler<T> ItemsReplaced;
-    protected virtual void OnItemsReplaced(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
-    }
-
-    [field: NonSerialized]
-    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));
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Collections/3.3/HeuristicLab.Collections-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/HeuristicLab.Collections-3.3.csproj	(revision 2573)
+++ trunk/sources/HeuristicLab.Collections/3.3/HeuristicLab.Collections-3.3.csproj	(revision 2574)
@@ -49,14 +49,14 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="IObservableKeyedCollection.cs" />
+    <Compile Include="IObservableList.cs" />
+    <Compile Include="IObservableCollection.cs" />
+    <Compile Include="IObservableDictionary.cs" />
     <Compile Include="ObservableKeyedCollectionBase.cs" />
-    <Compile Include="IndexedCollectionChangedEventsBase.cs" />
     <Compile Include="ObservableCollection.cs" />
-    <Compile Include="IIndexedCollectionChangedEvents.cs" />
     <Compile Include="IndexedItem.cs" />
-    <Compile Include="CollectionChangedEventsBase.cs" />
     <Compile Include="ObservableList.cs" />
     <Compile Include="CollectionItemsChangedEventArgs.cs" />
     <Compile Include="CollectionItemsChangedEventHandler.cs" />
-    <Compile Include="ICollectionChangedEvents.cs" />
     <Compile Include="HeuristicLabCollectionsPlugin.cs" />
     <Compile Include="ObservableDictionary.cs" />
Index: trunk/sources/HeuristicLab.Collections/3.3/ICollectionChangedEvents.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ICollectionChangedEvents.cs	(revision 2573)
+++ 	(revision )
@@ -1,34 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace HeuristicLab.Collections {
-  public interface ICollectionChangedEvents<T> {
-    event CollectionItemsChangedEventHandler<T> ItemsAdded;
-    event CollectionItemsChangedEventHandler<T> ItemsRemoved;
-    event CollectionItemsChangedEventHandler<T> ItemsReplaced;
-    event CollectionItemsChangedEventHandler<T> CollectionReset;
-  }
-}
Index: trunk/sources/HeuristicLab.Collections/3.3/IIndexedCollectionChangedEvents.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IIndexedCollectionChangedEvents.cs	(revision 2573)
+++ 	(revision )
@@ -1,31 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace HeuristicLab.Collections {
-  public interface IIndexedCollectionChangedEvents<T> : ICollectionChangedEvents<T> {
-    event CollectionItemsChangedEventHandler<T> ItemsMoved;
-  }
-}
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 2574)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Collections {
+  public interface IObservableCollection<T> : ICollection<T> {
+    event CollectionItemsChangedEventHandler<T> ItemsAdded;
+    event CollectionItemsChangedEventHandler<T> ItemsRemoved;
+    event CollectionItemsChangedEventHandler<T> CollectionReset;
+  }
+}
Index: trunk/sources/HeuristicLab.Collections/3.3/IObservableDictionary.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IObservableDictionary.cs	(revision 2574)
+++ trunk/sources/HeuristicLab.Collections/3.3/IObservableDictionary.cs	(revision 2574)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Collections {
+  public interface IObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IObservableCollection<KeyValuePair<TKey, TValue>> {
+    event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsReplaced;
+  }
+}
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 2574)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Collections {
+  public interface IObservableKeyedCollection<TKey, TItem> : IObservableCollection<TItem>, IDisposable {
+    event CollectionItemsChangedEventHandler<TItem> ItemsReplaced;
+  }
+}
Index: trunk/sources/HeuristicLab.Collections/3.3/IObservableList.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IObservableList.cs	(revision 2574)
+++ trunk/sources/HeuristicLab.Collections/3.3/IObservableList.cs	(revision 2574)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Collections {
+  public interface IObservableList<T> : IList<T>, IObservableCollection<IndexedItem<T>> {
+    event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
+    event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
+  }
+}
Index: trunk/sources/HeuristicLab.Collections/3.3/IndexedCollectionChangedEventsBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IndexedCollectionChangedEventsBase.cs	(revision 2573)
+++ 	(revision )
@@ -1,40 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Runtime.Serialization;
-
-namespace HeuristicLab.Collections {
-  [Serializable]
-  [EmptyStorableClass]
-  public abstract class IndexedCollectionChangedEventsBase<T> : CollectionChangedEventsBase<T>, IIndexedCollectionChangedEvents<T> {
-    [field: NonSerialized]
-    public event CollectionItemsChangedEventHandler<T> ItemsMoved;
-    protected virtual void OnItemsMoved(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 2573)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 2574)
@@ -30,5 +30,5 @@
 namespace HeuristicLab.Collections {
   [Serializable]
-  public class ObservableCollection<T> : CollectionChangedEventsBase<T>, ICollection<T> {
+  public class ObservableCollection<T> : IObservableCollection<T> {
     [Storable]
     private List<T> list;
@@ -158,4 +158,27 @@
     }
     #endregion
+
+    #region Events
+    [field: NonSerialized]
+    public event CollectionItemsChangedEventHandler<T> ItemsAdded;
+    protected virtual void OnItemsAdded(IEnumerable<T> items) {
+      if (ItemsAdded != null)
+        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+    }
+
+    [field: NonSerialized]
+    public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
+    protected virtual void OnItemsRemoved(IEnumerable<T> items) {
+      if (ItemsRemoved != null)
+        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+    }
+
+    [field: NonSerialized]
+    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));
+    }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 2573)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 2574)
@@ -30,5 +30,5 @@
 namespace HeuristicLab.Collections {
   [Serializable]
-  public class ObservableDictionary<TKey, TValue> : CollectionChangedEventsBase<KeyValuePair<TKey, TValue>>, IDictionary<TKey, TValue> {
+  public class ObservableDictionary<TKey, TValue> : IObservableDictionary<TKey, TValue> {
     [Storable]
     private Dictionary<TKey, TValue> dict;
@@ -156,4 +156,34 @@
     }
     #endregion
+
+    #region Events
+    [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));
+    }
+
+    [field: NonSerialized]
+    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));
+    }
+
+    [field: NonSerialized]
+    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));
+    }
+
+    [field: NonSerialized]
+    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));
+    }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollectionBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollectionBase.cs	(revision 2573)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollectionBase.cs	(revision 2574)
@@ -30,5 +30,5 @@
 namespace HeuristicLab.Collections {
   [Serializable]
-  public abstract class ObservableKeyedCollectionBase<TKey, TItem> : CollectionChangedEventsBase<TItem>, ICollection<TItem> {
+  public abstract class ObservableKeyedCollectionBase<TKey, TItem> : IObservableKeyedCollection<TKey, TItem> {
     [Storable]
     private Dictionary<TKey, TItem> dict;
@@ -76,4 +76,19 @@
       foreach (TItem item in collection)
         AddItem(item);
+    }
+    #endregion
+
+    #region Destructors
+    ~ObservableKeyedCollectionBase() {
+      Dispose(false);
+    }
+    protected virtual void Dispose(bool disposing) {
+      if (disposing) {
+        Clear();
+      }
+    }
+    public void Dispose() {
+      Dispose(true);
+      GC.SuppressFinalize(this);
     }
     #endregion
@@ -232,4 +247,34 @@
     }
     #endregion
+
+    #region Events
+    [field: NonSerialized]
+    public event CollectionItemsChangedEventHandler<TItem> ItemsAdded;
+    protected virtual void OnItemsAdded(IEnumerable<TItem> items) {
+      if (ItemsAdded != null)
+        ItemsAdded(this, new CollectionItemsChangedEventArgs<TItem>(items));
+    }
+
+    [field: NonSerialized]
+    public event CollectionItemsChangedEventHandler<TItem> ItemsRemoved;
+    protected virtual void OnItemsRemoved(IEnumerable<TItem> items) {
+      if (ItemsRemoved != null)
+        ItemsRemoved(this, new CollectionItemsChangedEventArgs<TItem>(items));
+    }
+
+    [field: NonSerialized]
+    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));
+    }
+
+    [field: NonSerialized]
+    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));
+    }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 2573)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 2574)
@@ -30,5 +30,5 @@
 namespace HeuristicLab.Collections {
   [Serializable]
-  public class ObservableList<T> : IndexedCollectionChangedEventsBase<IndexedItem<T>>, IList<T> {
+  public class ObservableList<T> : IObservableList<T> {
     [Storable]
     private List<T> list;
@@ -45,4 +45,7 @@
       get { return ((ICollection<T>)list).IsReadOnly; }
     }
+    bool ICollection<IndexedItem<T>>.IsReadOnly {
+      get { return ((ICollection<T>)list).IsReadOnly; }
+    }
 
     public T this[int index] {
@@ -78,4 +81,7 @@
       return list.Contains(item);
     }
+    public bool Contains(IndexedItem<T> item) {
+      return list[item.Index].Equals(item.Value);
+    }
 
     public int IndexOf(T item) {
@@ -148,4 +154,8 @@
       list.Add(item);
       OnItemsAdded(new IndexedItem<T>[] { new IndexedItem<T>(list.Count - 1, item) });
+    }
+    public void Add(IndexedItem<T> item) {
+      list.Insert(item.Index, item.Value);
+      OnItemsAdded(new IndexedItem<T>[] { item });
     }
     public void AddRange(IEnumerable<T> collection) {
@@ -183,4 +193,12 @@
       return false;
     }
+    public bool Remove(IndexedItem<T> item) {
+      if (list[item.Index].Equals(item.Value)) {
+        list.RemoveAt(item.Index);
+        OnItemsRemoved(new IndexedItem<T>[] { item });
+        return true;
+      }
+      return false;
+    }
     public int RemoveAll(Predicate<T> match) {
       if (match == null) throw new ArgumentNullException();
@@ -254,4 +272,8 @@
       list.CopyTo(array, arrayIndex);
     }
+    void ICollection<IndexedItem<T>>.CopyTo(IndexedItem<T>[] array, int arrayIndex) {
+      IndexedItem<T>[] items = GetIndexedItems();
+      items.CopyTo(array, arrayIndex);
+    }
     public List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter) {
       return list.ConvertAll<TOutput>(converter);
@@ -275,4 +297,11 @@
       return ((IEnumerable<T>)list).GetEnumerator();
     }
+    IEnumerator<IndexedItem<T>> IEnumerable<IndexedItem<T>>.GetEnumerator() {
+      int index = -1;
+      foreach (T item in list) {
+        index++;
+        yield return new IndexedItem<T>(index, item);
+      }
+    }
     IEnumerator IEnumerable.GetEnumerator() {
       return ((IEnumerable)list).GetEnumerator();
@@ -283,4 +312,41 @@
     public void TrimExcess() {
       list.TrimExcess();
+    }
+    #endregion
+
+    #region Events
+    [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));
+    }
+
+    [field: NonSerialized]
+    public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsRemoved;
+    protected virtual void OnItemsRemoved(IEnumerable<IndexedItem<T>> items) {
+      if (ItemsRemoved != null)
+        ItemsRemoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+    }
+
+    [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));
+    }
+
+    [field: NonSerialized]
+    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));
+    }
+
+    [field: NonSerialized]
+    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));
     }
     #endregion
