Index: branches/histogram/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj
===================================================================
--- branches/histogram/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj	(revision 5959)
+++ branches/histogram/HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj	(revision 6195)
@@ -121,4 +121,5 @@
     <Compile Include="Content\IStorableContent.cs" />
     <Compile Include="Constants.cs" />
+    <Compile Include="ObjectExtensions.cs" />
     <Compile Include="DeepCloneable.cs" />
     <Compile Include="Content\IContent.cs" />
Index: branches/histogram/HeuristicLab.Common/3.3/HeuristicLabCommonPlugin.cs.frame
===================================================================
--- branches/histogram/HeuristicLab.Common/3.3/HeuristicLabCommonPlugin.cs.frame	(revision 5959)
+++ branches/histogram/HeuristicLab.Common/3.3/HeuristicLabCommonPlugin.cs.frame	(revision 6195)
@@ -29,5 +29,5 @@
   /// Plugin class for HeuristicLab.Common plugin.
   /// </summary>
-  [Plugin("HeuristicLab.Common", "3.3.3.$WCREV$")]
+  [Plugin("HeuristicLab.Common", "3.3.4.$WCREV$")]
   [PluginFile("HeuristicLab.Common-3.3.dll", PluginFileType.Assembly)]
   public class HeuristicLabCommonPlugin : PluginBase {
Index: branches/histogram/HeuristicLab.Common/3.3/ObjectExtensions.cs
===================================================================
--- branches/histogram/HeuristicLab.Common/3.3/ObjectExtensions.cs	(revision 6195)
+++ branches/histogram/HeuristicLab.Common/3.3/ObjectExtensions.cs	(revision 6195)
@@ -0,0 +1,87 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Threading;
+
+namespace HeuristicLab.Common {
+  public static class ObjectExtensions {
+    public static IEnumerable<object> GetObjectGraphObjects(this object obj) {
+      var objects = new HashSet<object>();
+      obj.CollectObjectGraphObjects(objects);
+      return objects;
+    }
+    /// <summary>
+    /// Types not collected:
+    ///   * System.Delegate
+    ///   * System.EventHandler (+ System.EventHandler<T>)
+    ///   * Primitives (Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, Single)
+    ///   * string, decimal
+    ///   * Arrays of primitives (+ string, decimal)
+    /// Types of which the fields are not further collected:
+    ///   * System.Type
+    ///   * System.Threading.ThreadLocal<T>
+    /// </summary>
+    private static void CollectObjectGraphObjects(this object obj, HashSet<object> objects) {
+      if (obj == null || objects.Contains(obj)) return;
+      if (obj is Delegate || obj is EventHandler) return; 
+      Type type = obj.GetType();
+      if (type.IsSubclassOfRawGeneric(typeof(EventHandler<>))) return;
+      if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal)) return;
+      if (type.IsArray) {
+        Type elementType = type.GetElementType();
+        if (elementType.IsPrimitive || elementType == typeof(string) || elementType == typeof(decimal)) return;
+      }
+
+      objects.Add(obj);
+
+      if (typeof(Type).IsInstanceOfType(obj)) return; // avoid infinite recursion
+      if (type.IsSubclassOfRawGeneric(typeof(ThreadLocal<>))) return; // avoid stack overflow when the field `ConcurrentStack<int> s_availableIndices` grows large
+
+      // performance critical to handle dictionaries in a special way
+      var dictionary = obj as IDictionary;
+      if (dictionary != null) {
+        foreach (object value in dictionary.Keys) {
+          CollectObjectGraphObjects(value, objects);
+        }
+        foreach (object value in dictionary.Values) {
+          CollectObjectGraphObjects(value, objects);
+        }
+        return;
+      }
+
+      if (type.IsArray) {
+        var array = obj as Array;
+        foreach (object value in array) {
+          CollectObjectGraphObjects(value, objects);
+        }
+        return;
+      }
+
+      foreach (FieldInfo f in type.GetAllFields()) {
+        f.GetValue(obj).CollectObjectGraphObjects(objects);
+      }      
+    }
+  }
+}
Index: branches/histogram/HeuristicLab.Common/3.3/Properties/AssemblyInfo.frame
===================================================================
--- branches/histogram/HeuristicLab.Common/3.3/Properties/AssemblyInfo.frame	(revision 5959)
+++ branches/histogram/HeuristicLab.Common/3.3/Properties/AssemblyInfo.frame	(revision 6195)
@@ -54,3 +54,3 @@
 // by using the '*' as shown below:
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.3.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.4.$WCREV$")]
Index: branches/histogram/HeuristicLab.Common/3.3/TypeExtensions.cs
===================================================================
--- branches/histogram/HeuristicLab.Common/3.3/TypeExtensions.cs	(revision 5959)
+++ branches/histogram/HeuristicLab.Common/3.3/TypeExtensions.cs	(revision 6195)
@@ -21,4 +21,6 @@
 
 using System;
+using System.Collections.Generic;
+using System.Reflection;
 using System.Text;
 
@@ -45,4 +47,31 @@
       return sb.ToString();
     }
+
+    public static IEnumerable<FieldInfo> GetAllFields(this Type type) {
+      foreach (var field in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
+        yield return field;
+
+      foreach (var field in type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))
+        yield return field;
+
+      if (type.BaseType != null) {
+        foreach (var field in type.BaseType.GetAllFields())
+          yield return field;
+      }
+    }
+
+    // http://stackoverflow.com/questions/457676/c-reflection-check-if-a-class-is-derived-from-a-generic-class
+    public static bool IsSubclassOfRawGeneric(this Type toCheck, Type generic) {
+      while (toCheck != typeof(object)) {
+        var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
+        if (generic == cur) {
+          return true;
+        }
+        toCheck = toCheck.BaseType; // baseType is null when toCheck is an Interface
+        if (toCheck == null)
+          return false;
+      }
+      return false;
+    }
   }
 }
