Index: stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableAttribute.cs
===================================================================
--- stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableAttribute.cs	(revision 15584)
+++ 	(revision )
@@ -1,88 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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.Persistence.Default.CompositeSerializers.Storable {
-
-
-  /// <summary>
-  /// Mark the member of a class to be considered by the <c>StorableSerializer</c>.
-  /// The class must be marked as <c>[StorableClass]</c> and the
-  /// <c>StorableClassType</c> should be set to <c>MarkedOnly</c> for
-  /// this attribute to kick in.
-  /// </summary>
-  [AttributeUsage(
-    AttributeTargets.Field | AttributeTargets.Property,
-    AllowMultiple = false,
-    Inherited = false)]
-  public class StorableAttribute : Attribute {
-
-    /// <summary>
-    /// An optional name for this member that will be used during serialization.
-    /// This allows to rename a field/property in code but still be able to read
-    /// the old serialized format.
-    /// </summary>
-    /// <value>The name.</value>
-    public string Name { get; set; }
-
-
-    /// <summary>
-    /// A default value in case the field/property was not present or not serialized
-    /// in a previous version of the class and could therefore be absent during
-    /// deserialization.
-    /// </summary>
-    /// <value>The default value.</value>
-    public object DefaultValue { get; set; }
-
-    /// <summary>
-    /// Allow storable attribute on properties with only a getter or a setter. These
-    /// properties will then by either only serialized but not deserialized or only
-    /// deserialized (if stored) but not serialized again.
-    /// </summary>
-    public bool AllowOneWay { get; set; }
-
-    /// <summary>
-    /// Returns a <see cref="System.String"/> that represents this instance.
-    /// </summary>
-    /// <returns>
-    /// A <see cref="System.String"/> that represents this instance.
-    /// </returns>
-    public override string ToString() {
-      StringBuilder sb = new StringBuilder();
-      sb.Append("[Storable");
-      if (Name != null || DefaultValue != null)
-        sb.Append('(');
-      if (Name != null) {
-        sb.Append("Name = \"").Append(Name).Append("\"");
-        if (DefaultValue != null)
-          sb.Append(", ");
-      }
-      if (DefaultValue != null)
-        sb.Append("DefaultValue = \"").Append(DefaultValue).Append("\"");
-      if (Name != null || DefaultValue != null)
-        sb.Append(')');
-      sb.Append(']');
-      return sb.ToString();
-    }
-  }
-}
Index: stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAttribute.cs
===================================================================
--- stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAttribute.cs	(revision 15584)
+++ 	(revision )
@@ -1,65 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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.Persistence.Default.CompositeSerializers.Storable {
-
-  /// <summary>
-  /// Mark a class to be considered by the <c>StorableSerializer</c>.
-  /// </summary>
-  [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
-  public sealed class StorableClassAttribute : Attribute {
-
-
-    /// <summary>
-    /// Specify how members are selected for serialization.
-    /// </summary>
-    public StorableClassType Type { get; private set; }
-
-    /// <summary>
-    /// Mark a class to be serialize by the <c>StorableSerizlier</c>
-    /// </summary>
-    /// <param name="type">The storable class type.</param>
-    public StorableClassAttribute(StorableClassType type) {
-      Type = type;
-    }
-
-    /// <summary>
-    /// Initializes a new instance of the <see cref="StorableClassAttribute"/> class.
-    /// The default value for <see cref="StorableClassType"/> is
-    /// <see cref="StorableClassType.MarkedOnly"/>.
-    /// </summary>
-    public StorableClassAttribute() { }
-
-    /// <summary>
-    ///  Checks if the <see cref="StorableClassAttribute"/> is present on a type.
-    /// </summary>
-    /// <param name="type">The type which should be checked for the <see cref="StorableClassAttribute"/></param>
-    /// <returns></returns>
-    public static bool IsStorableClass(Type type) {
-      object[] attribs = type.GetCustomAttributes(typeof(StorableClassAttribute), false);
-      return attribs.Length > 0;
-    }
-
-  }
-}
-
Index: stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassType.cs
===================================================================
--- stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassType.cs	(revision 15584)
+++ 	(revision )
@@ -1,62 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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
-
-
-namespace HeuristicLab.Persistence.Default.CompositeSerializers.Storable {
-
-  /// <summary>
-  /// Specifies which memebrs are selected for serialization by the StorableSerializer
-  /// </summary>
-  public enum StorableClassType {
-
-    /// <summary>
-    /// Serialize only fields and properties that have been marked
-    /// with the [Storable] attribute. This is the default value.
-    /// </summary>
-    MarkedOnly,
-
-    /// <summary>
-    /// Serialize all fields but ignore the 
-    /// [Storable] attribute on properties.
-    /// 
-    /// This does not include generated backing fields
-    /// for automatic properties.
-    /// </summary>    
-    AllFields,
-
-    /// <summary>
-    /// Serialize all properties but ignore the
-    /// [Storable] attribute on fields.
-    /// </summary>    
-    AllProperties,
-
-    /// <summary>
-    /// Serialize all fields and all properties
-    /// regardless of the [Storable] attribute.
-    /// 
-    /// This does not include generated backing fields
-    /// for automatic properties, but uses the property
-    /// accessors instead.
-    /// </summary>    
-    AllFieldsAndAllProperties
-  };
-}
-
Index: stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableConstructorAttribute.cs
===================================================================
--- stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableConstructorAttribute.cs	(revision 15584)
+++ 	(revision )
@@ -1,37 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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.Persistence.Default.CompositeSerializers.Storable {
-
-
-  /// <summary>
-  /// Indicate that this constructor should be used instead of the default constructor
-  /// when the <c>StorableSerializer</c> instantiates this class during
-  /// deserialization.
-  /// 
-  /// The constructor must take exactly one <c>bool</c> argument that will be
-  /// set to <c>true</c> during deserialization.
-  /// </summary>
-  [AttributeUsage(AttributeTargets.Constructor, Inherited = false, AllowMultiple = false)]
-  public sealed class StorableConstructorAttribute : Attribute { }
-}
Index: stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableHookAttribute.cs
===================================================================
--- stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableHookAttribute.cs	(revision 15584)
+++ 	(revision )
@@ -1,71 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2018 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.Persistence.Default.CompositeSerializers.Storable {
-
-
-  /// <summary>
-  /// Indicates the time at which the hook should be invoked.
-  /// </summary>
-  public enum HookType {
-
-    /// <summary>
-    /// States that this hook should be called before the storable
-    /// serializer starts decomposing the object.
-    /// </summary>
-    BeforeSerialization,
-
-    /// <summary>
-    /// States that this hook should be called after the storable
-    /// serializer hast complete re-assembled the object.
-    /// </summary>
-    AfterDeserialization
-  };
-
-
-  /// <summary>
-  /// Mark methods that should be called at certain times during
-  /// serialization/deserialization by the <c>StorableSerializer</c>.
-  /// </summary>
-  [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
-  public sealed class StorableHookAttribute : Attribute {
-
-    private readonly HookType hookType;
-    /// <summary>
-    /// Gets the type of the hook.
-    /// </summary>
-    /// <value>The type of the hook.</value>
-    public HookType HookType {
-      get { return hookType; }
-    }
-
-    /// <summary>
-    /// Mark method as <c>StorableSerializer</c> hook to be run
-    /// at the <c>HookType</c> time.
-    /// </summary>
-    /// <param name="hookType">Type of the hook.</param>
-    public StorableHookAttribute(HookType hookType) {
-      this.hookType = hookType;
-    }
-  }
-}
Index: stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableMemberInfo.cs
===================================================================
--- stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableMemberInfo.cs	(revision 15584)
+++ stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableMemberInfo.cs	(revision 17097)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -23,5 +23,5 @@
 using System.Reflection;
 using System.Text;
-using HeuristicLab.Persistence.Core;
+using HEAL.Attic;
 
 namespace HeuristicLab.Persistence.Default.CompositeSerializers.Storable {
Index: stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs
===================================================================
--- stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs	(revision 15584)
+++ stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableReflection.cs	(revision 17097)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -24,5 +24,5 @@
 using System.Linq;
 using System.Reflection;
-using HeuristicLab.Persistence.Core;
+using HEAL.Attic;
 
 namespace HeuristicLab.Persistence.Default.CompositeSerializers.Storable {
@@ -43,17 +43,17 @@
         storableMembers.AddRange(GenerateStorableMembers(type.BaseType));
 
-      var storableClassAttribute = GetStorableClassAttribute(type);
-      if (storableClassAttribute != null) {
-        switch (storableClassAttribute.Type) {
-          case StorableClassType.MarkedOnly:
+      var storableTypeAttribute = GetStorableTypeAttribute(type);
+      if (storableTypeAttribute != null) {
+        switch (storableTypeAttribute.MemberSelection) {
+          case StorableMemberSelection.MarkedOnly:
             AddMarkedMembers(type, storableMembers); break;
-          case StorableClassType.AllFields:
+          case StorableMemberSelection.AllFields:
             AddAll(type, MemberTypes.Field, storableMembers); break;
-          case StorableClassType.AllProperties:
+          case StorableMemberSelection.AllProperties:
             AddAll(type, MemberTypes.Property, storableMembers); break;
-          case StorableClassType.AllFieldsAndAllProperties:
+          case StorableMemberSelection.AllFieldsAndAllProperties:
             AddAll(type, MemberTypes.Field | MemberTypes.Property, storableMembers); break;
           default:
-            throw new PersistenceException("unsupported [StorableClassType]: " + storableClassAttribute.Type);
+            throw new PersistenceException("unsupported [StorableMemberSelection]: " + storableTypeAttribute.MemberSelection);
         }
       }
@@ -62,5 +62,5 @@
 
     public static bool IsEmptyOrStorableType(Type type, bool recursive) {
-      if (!HasStorableClassAttribute(type) && !IsEmptyType(type, false)) return false;
+      if (!HasStorableTypeAttribute(type) && !IsEmptyType(type, false)) return false;
       return !recursive || type.BaseType == null || IsEmptyOrStorableType(type.BaseType, true);
     }
@@ -72,5 +72,5 @@
         foreach (var hook in CollectHooks(hookType, type.BaseType))
           yield return hook;
-      if (HasStorableClassAttribute(type)) {
+      if (HasStorableTypeAttribute(type)) {
         foreach (MethodInfo methodInfo in type.GetMethods(DECLARED_INSTANCE_MEMBERS)) {
           if (methodInfo.ReturnType == typeof(void) && methodInfo.GetParameters().Length == 0) {
@@ -174,22 +174,22 @@
     #region [StorableClass] helpers
 
-    private static StorableClassAttribute GetStorableClassAttribute(Type type) {
-      lock (storableClassCache) {
-        if (storableClassCache.ContainsKey(type))
-          return storableClassCache[type];
-        StorableClassAttribute attribute = type
-          .GetCustomAttributes(typeof(StorableClassAttribute), false)
-          .SingleOrDefault() as StorableClassAttribute;
-        storableClassCache.Add(type, attribute);
+    private static StorableTypeAttribute GetStorableTypeAttribute(Type type) {
+      lock (storableTypeCache) {
+        if (storableTypeCache.ContainsKey(type))
+          return storableTypeCache[type];
+        StorableTypeAttribute attribute = type
+          .GetCustomAttributes(typeof(StorableTypeAttribute), false)
+          .SingleOrDefault() as StorableTypeAttribute;
+        storableTypeCache.Add(type, attribute);
         return attribute;
       }
     }
 
-    public static bool HasStorableClassAttribute(Type type) {
-      return GetStorableClassAttribute(type) != null;
-    }
-
-    private static Dictionary<Type, StorableClassAttribute> storableClassCache =
-      new Dictionary<Type, StorableClassAttribute>();
+    public static bool HasStorableTypeAttribute(Type type) {
+      return GetStorableTypeAttribute(type) != null;
+    }
+
+    private static Dictionary<Type, StorableTypeAttribute> storableTypeCache =
+      new Dictionary<Type, StorableTypeAttribute>();
 
     #endregion
Index: stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs
===================================================================
--- stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 15584)
+++ stable/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableSerializer.cs	(revision 17097)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -26,4 +26,5 @@
 using System.Reflection.Emit;
 using System.Text;
+using HEAL.Attic;
 using HeuristicLab.Persistence.Core;
 using HeuristicLab.Persistence.Interfaces;
@@ -38,5 +39,5 @@
   /// or <c>AllFieldsAndAllProperties</c>.
   /// </summary>
-  [StorableClass]
+  [StorableType("F60343E8-4337-4171-A50A-6A57D09267ED")]
   public sealed class StorableSerializer : ICompositeSerializer {
 
@@ -49,5 +50,5 @@
 
     [StorableConstructor]
-    private StorableSerializer(bool deserializing) : this() { }
+    private StorableSerializer(StorableConstructorFlag _) { }
 
     #region ICompositeSerializer implementation
@@ -69,12 +70,13 @@
     /// </returns>
     public bool CanSerialize(Type type) {
-      var markedStorable = StorableReflection.HasStorableClassAttribute(type);
+      if (type.IsEnum || type.IsValueType) return false; // there are other more specific serializers for enums and structs
+      var markedStorable = StorableReflection.HasStorableTypeAttribute(type);
       if (GetConstructor(type) == null)
-        if (markedStorable)
+        if (markedStorable && !type.IsInterface)
           throw new Exception("[Storable] type has no default constructor and no [StorableConstructor]");
         else
           return false;
       if (!StorableReflection.IsEmptyOrStorableType(type, true))
-        if (markedStorable)
+        if (markedStorable && !type.IsInterface)
           throw new Exception("[Storable] type has non emtpy, non [Storable] base classes");
         else
@@ -240,9 +242,10 @@
         .Where(ci => ci.GetCustomAttributes(typeof(StorableConstructorAttribute), false).Length > 0)) {
         if (ci.GetParameters().Length != 1 ||
-            ci.GetParameters()[0].ParameterType != typeof(bool))
-          throw new PersistenceException("StorableConstructor must have exactly one argument of type bool");
+            ci.GetParameters()[0].ParameterType != typeof(StorableConstructorFlag))
+          throw new PersistenceException("StorableConstructor must have exactly one argument of type StorableConstructorFlag");
         var dm = new DynamicMethod("", typeof(object), null, type, true);
         var ilgen = dm.GetILGenerator();
-        ilgen.Emit(OpCodes.Ldc_I4_1); // load true
+        var defaultFlagFieldInfo = typeof(StorableConstructorFlag).GetField("Default", BindingFlags.Static | BindingFlags.Public);
+        ilgen.Emit(OpCodes.Ldsfld, defaultFlagFieldInfo); // load the object
         ilgen.Emit(OpCodes.Newobj, ci);
         ilgen.Emit(OpCodes.Ret);
