Index: trunk/sources/HeuristicLab.Common/3.3/CancelEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/CancelEventArgs.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/CancelEventArgs.cs	(revision 3382)
@@ -0,0 +1,60 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 System.ComponentModel;
+
+namespace HeuristicLab.Common {
+  public class CancelEventArgs<T> : CancelEventArgs {
+    private T myValue;
+    public T Value {
+      get { return myValue; }
+    }
+
+    public CancelEventArgs(T value)
+      : base() {
+      myValue = value;
+    }
+    public CancelEventArgs(T value, bool cancel)
+      : base(cancel) {
+      myValue = value;
+    }
+  }
+
+  public class CancelEventArgs<T, U> : CancelEventArgs<T> {
+    private U myValue2;
+    public U Value2 {
+      get { return myValue2; }
+    }
+
+    public CancelEventArgs(T value, U value2)
+      : base(value) {
+      myValue2 = value2;
+    }
+    public CancelEventArgs(T value, U value2, bool cancel)
+      : base(value, cancel) {
+      myValue2 = value2;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/Cloner.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/Cloner.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/Cloner.cs	(revision 3382)
@@ -0,0 +1,62 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Text;
+
+namespace HeuristicLab.Common {
+  /// <summary>
+  /// A helper class which is used to create deep clones of object graphs.
+  /// </summary>
+  public sealed class Cloner {
+    private Dictionary<IDeepCloneable, IDeepCloneable> mapping;
+
+    /// <summary>
+    /// Creates a new Cloner instance.
+    /// </summary>
+    public Cloner() {
+      mapping = new Dictionary<IDeepCloneable, IDeepCloneable>(new ReferenceEqualityComparer<IDeepCloneable>());
+    }
+
+    /// <summary>
+    /// Creates a deep clone of a given deeply cloneable object.
+    /// </summary>
+    /// <param name="item">The object which should be cloned.</param>
+    /// <returns>A clone of the given object.</returns>
+    public IDeepCloneable Clone(IDeepCloneable obj) {
+      if (obj == null) return null;
+      IDeepCloneable clone;
+      if (mapping.TryGetValue(obj, out clone))
+        return clone;
+      else
+        return obj.Clone(this);
+    }
+    /// <summary>
+    /// Registers a new clone for a given deeply cloneable object.
+    /// </summary>
+    /// <param name="item">The original object.</param>
+    /// <param name="clone">The clone of the original object.</param>
+    public void RegisterClonedObject(IDeepCloneable item, IDeepCloneable clone) {
+      mapping.Add(item, clone);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/DoubleExtensions.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/DoubleExtensions.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/DoubleExtensions.cs	(revision 3382)
@@ -0,0 +1,29 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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;
+namespace HeuristicLab.Common {
+  public static class DoubleExtensions {
+    public static bool IsAlmost(this double x, double y) {
+      return Math.Abs(x - y) < 1.0E-12;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/EnumerableEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/EnumerableEventArgs.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/EnumerableEventArgs.cs	(revision 3382)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Common {
+  [Obsolete("Use generic event args EventArgs<T> instead of EnumberableEventArgs<T>", false)]
+  public class EnumerableEventArgs<T> : EventArgs {
+    public EnumerableEventArgs(IEnumerable<T> data) {
+      this.data = data;
+    }
+
+    private IEnumerable<T> data;
+    public IEnumerable<T> Data {
+      get { return data; }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/EventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/EventArgs.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/EventArgs.cs	(revision 3382)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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;
+
+namespace HeuristicLab.Common {
+  public class EventArgs<T> : EventArgs {
+    private T myValue;
+    public T Value {
+      get { return myValue; }
+    }
+
+    public EventArgs(T value) {
+      myValue = value;
+    }
+  }
+
+  public class EventArgs<T, U> : EventArgs<T> {
+    private U myValue2;
+    public U Value2 {
+      get { return myValue2; }
+    }
+
+    public EventArgs(T value, U value2)
+      : base(value) {
+      myValue2 = value2;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/HeuristicLab.Common-3.2.csproj
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/HeuristicLab.Common-3.2.csproj	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/HeuristicLab.Common-3.2.csproj	(revision 3382)
@@ -0,0 +1,129 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{1FC004FC-59AF-4249-B1B6-FF25873A20E4}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Common</RootNamespace>
+    <AssemblyName>HeuristicLab.Common-3.2</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Common-3.2.XML</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>bin\x86\Release\HeuristicLab.Common-3.2.XML</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>bin\x64\Release\HeuristicLab.Common-3.2.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CancelEventArgs.cs" />
+    <None Include="HeuristicLabCommonPlugin.cs.frame" />
+    <Compile Include="Cloner.cs" />
+    <Compile Include="IContent.cs" />
+    <Compile Include="IDeepCloneable.cs" />
+    <Compile Include="ReferenceEqualityComparer.cs" />
+    <Compile Include="TypeExtensions.cs" />
+    <Compile Include="DoubleExtensions.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="EventArgs.cs" />
+    <Compile Include="HeuristicLabCommonPlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Properties\AssemblyInfo.frame" />
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabCommonPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabCommonPlugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: trunk/sources/HeuristicLab.Common/3.3/HeuristicLabCommonPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/HeuristicLabCommonPlugin.cs.frame	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/HeuristicLabCommonPlugin.cs.frame	(revision 3382)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Common {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Common plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Common", "3.2.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Common-3.2.dll", PluginFileType.Assembly)]
+  public class HeuristicLabCommonPlugin : PluginBase {
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/IContent.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/IContent.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/IContent.cs	(revision 3382)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Common {
+  public interface IContent {
+    bool ReadOnlyView { get; set; }
+
+    event EventHandler ReadOnlyViewChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/IDeepCloneable.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/IDeepCloneable.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/IDeepCloneable.cs	(revision 3382)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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;
+
+namespace HeuristicLab.Common {
+  public interface IDeepCloneable : ICloneable {
+    /// <summary>
+    /// Creates a deep clone of this instance.
+    /// </summary>
+    /// <param name="cloner">The cloner which is responsible for keeping track of all already
+    /// cloned objects.</param>
+    /// <returns>A clone of this instance.</returns>
+    IDeepCloneable Clone(Cloner cloner);
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/NotificationDictionary.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/NotificationDictionary.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/NotificationDictionary.cs	(revision 3382)
@@ -0,0 +1,179 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 System.Xml;
+using System.Collections;
+
+namespace HeuristicLab.Common {
+  [Obsolete("Use collections of the HeuristicLab.Collections plugin instead", false)]
+  public class NotificationDictionary<TKey, TValue> : IDictionary<TKey, TValue> {
+    
+    public NotificationDictionary() {
+      this.myDictionary = new Dictionary<TKey, TValue>(); 
+    }
+
+    #region Event Handler
+
+    public event EventHandler BeforeInsertEvent;
+    public event EventHandler AfterInsertEvent;
+    public event EventHandler BeforeRemoveEvent;
+    public event EventHandler AfterRemoveEvent;
+    public event EventHandler ChangeEvent;
+    public event EventHandler ClearEvent;
+
+    private Dictionary<TKey, TValue> myDictionary; 
+
+    protected virtual void OnBeforeInsert() {
+      if (BeforeInsertEvent != null)
+        BeforeInsertEvent(this, EventArgs.Empty);
+    }
+
+    protected virtual void OnAfterInsert() {
+      if (AfterInsertEvent != null)
+        AfterInsertEvent(this, EventArgs.Empty);
+    }
+
+    protected virtual void OnBeforeRemove() {
+      if (BeforeRemoveEvent != null)
+        BeforeRemoveEvent(this, EventArgs.Empty);
+    }
+
+    protected virtual void OnAfterRemove() {
+      if (AfterRemoveEvent != null)
+        AfterRemoveEvent(this, EventArgs.Empty);
+    }
+
+    protected virtual void OnChange() {
+      if (ChangeEvent != null)
+        ChangeEvent(this, EventArgs.Empty);
+    }
+
+    protected virtual void OnClear() {
+      if (ClearEvent != null)
+        ClearEvent(this, EventArgs.Empty);
+    }
+
+    #endregion
+
+    #region IDictionary<TKey,TValue> Members
+
+    public void Add(TKey key, TValue value) {
+      OnBeforeInsert(); 
+      myDictionary.Add(key, value);
+      OnAfterInsert();
+    }
+
+    public bool ContainsKey(TKey key) {
+      return myDictionary.ContainsKey(key);
+    }
+
+    public ICollection<TKey> Keys {
+      get { return myDictionary.Keys; }
+    }
+
+    public bool Remove(TKey key) {
+      OnBeforeRemove(); 
+      bool returnVal = myDictionary.Remove(key);
+      OnAfterRemove();
+      return returnVal;
+    }
+
+    public bool TryGetValue(TKey key, out TValue value) {
+      return TryGetValue(key, out value); 
+    }
+
+    public ICollection<TValue> Values {
+      get { return myDictionary.Values; }
+    }
+
+    public TValue this[TKey key] {
+      get {
+        return myDictionary[key];
+      }
+      set {
+        if (!value.Equals(myDictionary[key])) {
+          myDictionary[key] = value;
+          OnChange(); 
+        }
+      }
+    }
+
+    #endregion
+
+    #region ICollection<KeyValuePair<TKey,TValue>> Members
+
+    public void Add(KeyValuePair<TKey, TValue> item) {
+      OnBeforeInsert();
+      myDictionary.Add(item.Key, item.Value);
+      OnAfterInsert();
+    }
+
+    public void Clear() {
+      myDictionary.Clear();
+      OnClear(); 
+    }
+
+    public bool Contains(KeyValuePair<TKey, TValue> item) {
+      return myDictionary.Contains(item); 
+    }
+
+    public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) {
+      ((IDictionary<TKey, TValue>)myDictionary).CopyTo(array, arrayIndex); 
+    }
+
+    public int Count {
+      get { return myDictionary.Count; }
+    }
+
+    public bool IsReadOnly {
+      get { return false; }
+    }
+
+    public bool Remove(KeyValuePair<TKey, TValue> item) {
+      OnBeforeRemove(); 
+      bool returnVal = myDictionary.Remove(item.Key);
+      OnAfterRemove();
+      return returnVal;
+    }
+
+    #endregion
+
+    #region IEnumerable<KeyValuePair<TKey,TValue>> Members
+
+    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() {
+      return myDictionary.GetEnumerator(); 
+    }
+
+    #endregion
+
+    #region IEnumerable Members
+
+    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
+      return myDictionary.GetEnumerator(); 
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/ObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/ObservableCollection.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/ObservableCollection.cs	(revision 3382)
@@ -0,0 +1,132 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 System.Collections.Specialized;
+
+namespace HeuristicLab.Common {
+  [Obsolete("Use collections of the HeuristicLab.Collections plugin instead", false)]
+  public class ObservableCollection<T> : ICollection<T>, INotifyCollectionChanged {
+    protected List<T> list;
+
+    public ObservableCollection() {
+      list = new List<T>();
+    }
+
+    #region Events
+    public event NotifyCollectionChangedEventHandler CollectionChanged;
+
+    protected void FireCollectionChanged(NotifyCollectionChangedEventArgs e) {
+      if (CollectionChanged != null) {
+        CollectionChanged(this, e);
+      }
+    }
+
+    protected virtual void FireCollectionCleared() {
+        NotifyCollectionChangedEventArgs e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
+        FireCollectionChanged( e);
+    }
+
+    protected virtual void FireItemsAdded(IEnumerable<T> addedItems, int index) {
+        NotifyCollectionChangedEventArgs e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedItems.ToList(), index);
+        FireCollectionChanged(e);
+    }
+
+    protected virtual void FireItemsRemoved(IEnumerable<T> removedItems) {
+        NotifyCollectionChangedEventArgs e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, removedItems.ToList());
+        FireCollectionChanged(e);
+    }
+    #endregion
+
+    #region ICollection<T> Members
+    public void Add(T item) {
+      int index = this.list.Count - 1;
+      this.list.Add(item);
+      FireItemsAdded(new List<T> { item }, index);
+    }
+
+    public void AddRange(IEnumerable<T> items) {
+      int index = this.list.Count - 1;
+      this.list.AddRange(items);
+      FireItemsAdded(items, index);
+    }
+
+    public void Clear() {
+      IEnumerable<T> temp = this.list.ToArray<T>();
+      this.list.Clear();
+      FireItemsRemoved(temp);
+      FireCollectionCleared();
+    }
+
+    public bool Contains(T item) {
+      return this.list.Contains(item);
+    }
+
+    public void CopyTo(T[] array, int arrayIndex) {
+      this.list.CopyTo(array, arrayIndex);
+    }
+
+    public int Count {
+      get { return this.list.Count; }
+    }
+
+    public bool IsReadOnly {
+      get { return false; }
+    }
+
+    public bool Remove(T item) {
+      bool ret = this.list.Remove(item);
+      if (ret)
+        FireItemsRemoved(new List<T> { item });
+      return ret;
+    }
+
+    public void RemoveRange(IEnumerable<T> items) {
+      bool ret = false;
+      foreach (T item in items)
+        ret |= list.Remove(item);
+      if (ret)
+        FireItemsRemoved(items);
+    }
+
+    #endregion
+
+    #region IEnumerable<T> Members
+
+    public IEnumerator<T> GetEnumerator() {
+      return list.GetEnumerator();
+    }
+
+    #endregion
+
+    #region IEnumerable Members
+
+    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
+      return list.GetEnumerator();
+    }
+
+    #endregion
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/ObservableList.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/ObservableList.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/ObservableList.cs	(revision 3382)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 System.Collections.Specialized;
+
+namespace HeuristicLab.Common {
+  [Obsolete("Use collections of the HeuristicLab.Collections plugin instead", false)]
+  public class ObservableList<T> : ObservableCollection<T>, IList<T> {
+
+    public ObservableList()
+      : base() {
+    }
+
+    #region IList<T> Members
+    public int IndexOf(T item) {
+      return list.IndexOf(item);
+    }
+
+    public void Insert(int index, T item) {
+      list.Insert(index, item);
+      FireItemsInserted(new List<T>() { item }, index);
+    }
+
+    public void RemoveAt(int index) {
+      T itemRemoved = list[index];
+      list.RemoveAt(index);
+      FireItemsRemoved(new List<T>() { itemRemoved });
+    }
+
+    public T this[int index] {
+      get {
+        return list[index];
+      }
+      set {
+        T oldItem = list[index];
+        list[index] = value;
+        FireItemsReplaced(value, oldItem, index);
+      }
+    }
+    #endregion
+
+    #region events
+    protected virtual void FireItemsInserted(IEnumerable<T> insertedItems, int index) {
+      NotifyCollectionChangedEventArgs e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, insertedItems.ToList(), index);
+      FireCollectionChanged(e);
+    }
+
+    protected virtual void FireItemsReplaced(T newItem, T oldItem, int index) {
+      NotifyCollectionChangedEventArgs e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, newItem, oldItem);
+      FireCollectionChanged(e);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/Properties/AssemblyInfo.frame	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/Properties/AssemblyInfo.frame	(revision 3382)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Common")]
+[assembly: AssemblyDescription("Auxiliary HeuristicLab classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f1962e16-e911-49fa-a685-1bb0a2a86526")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.2.0.0")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
Index: trunk/sources/HeuristicLab.Common/3.3/ReferenceEqualityComparer.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/ReferenceEqualityComparer.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/ReferenceEqualityComparer.cs	(revision 3382)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Text;
+
+namespace HeuristicLab.Common {
+  public class ReferenceEqualityComparer<T> : IEqualityComparer<T> where T : class {
+    bool IEqualityComparer<T>.Equals(T x, T y) {
+      return object.ReferenceEquals(x, y);
+    }
+
+    int IEqualityComparer<T>.GetHashCode(T obj) {
+      if (obj == null) return 0;
+      return obj.GetHashCode();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Common/3.3/TypeExtensions.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/TypeExtensions.cs	(revision 3382)
+++ trunk/sources/HeuristicLab.Common/3.3/TypeExtensions.cs	(revision 3382)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Text;
+
+namespace HeuristicLab.Common {
+  public static class TypeExtensions {
+    public static string GetPrettyName(this Type x) {
+      return x.GetPrettyName(false);
+    }
+    public static string GetPrettyName(this Type x, bool includeNamespace) {
+      StringBuilder sb = new StringBuilder();
+      if ((includeNamespace) && !string.IsNullOrEmpty(x.Namespace))
+        sb.Append(x.Namespace).Append(".");
+      sb.Append(x.Name);
+      if (x.IsGenericType) {
+        Type[] genericParams = x.GetGenericArguments();
+        sb.Remove(sb.ToString().LastIndexOf('`'), genericParams.Length.ToString().Length + 1);
+        sb.Append("<");
+        for (int i = 0; i < genericParams.Length; i++) {
+          if (i > 0) sb.Append(", ");
+          sb.Append(genericParams[i].GetPrettyName(includeNamespace));
+        }
+        sb.Append(">");
+      }
+      return sb.ToString();
+    }
+  }
+}
