Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/ArrayDecomposer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/ArrayDecomposer.cs	(revision 1542)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/ArrayDecomposer.cs	(revision 1553)
@@ -16,16 +16,24 @@
     }
 
+    public IEnumerable<Tag> CreateMetaInfo(object obj) {
+      Array a = (Array)obj;
+      yield return new Tag("rank", a.Rank);
+      for (int i = 0; i < a.Rank; i++) {      
+        yield return new Tag("length_" + i, a.GetLength(i));
+      }
+      for (int i = 0; i < a.Rank; i++) {        
+        yield return new Tag("lowerBound_" + i, a.GetLowerBound(i));
+      }      
+    }
+
     public IEnumerable<Tag> Decompose(object array) {
       Array a = (Array)array;      
-      yield return new Tag("rank", a.Rank);
       int[] lengths = new int[a.Rank];
       int[] lowerBounds = new int[a.Rank];
       for (int i = 0; i < a.Rank; i++) {
         lengths[i] = a.GetLength(i);
-        yield return new Tag("length_" + i, a.GetLength(i));
       }
       for (int i = 0; i < a.Rank; i++) {
         lowerBounds[i] = a.GetLowerBound(i);
-        yield return new Tag("lowerBound_" + i, a.GetLowerBound(i));
       }
       int[] positions = (int[])lowerBounds.Clone();
@@ -44,10 +52,6 @@
     }
 
-    public object CreateInstance(Type t) {
-      return null;
-    }
-
-    public object Populate(object instance, IEnumerable<Tag> elements, Type t) {
-      IEnumerator<Tag> e = elements.GetEnumerator();
+    public object CreateInstance(Type t, IEnumerable<Tag> metaInfo) {
+      IEnumerator<Tag> e = metaInfo.GetEnumerator();
       e.MoveNext();
       int rank = (int)e.Current.Value;
@@ -61,12 +65,25 @@
         e.MoveNext();
         lowerBounds[i] = (int)e.Current.Value;
+      }
+      return Array.CreateInstance(t.GetElementType(), lengths, lowerBounds);      
+    }
+
+    public void Populate(object instance, IEnumerable<Tag> elements, Type t) {      
+      Array a = (Array)instance;
+      int[] lengths = new int[a.Rank];
+      int[] lowerBounds = new int[a.Rank];
+      for (int i = 0; i < a.Rank; i++) {
+        lengths[i] = a.GetLength(i);
+      }
+      for (int i = 0; i < a.Rank; i++) {
+        lowerBounds[i] = a.GetLowerBound(i);
       }      
-      Array a = Array.CreateInstance(t.GetElementType(), lengths, lowerBounds);
       int[] positions = (int[])lowerBounds.Clone();
+      IEnumerator<Tag> e = elements.GetEnumerator();
       while (e.MoveNext()) {
         int[] currentPositions = positions;
-        e.Current.SafeSet(value => a.SetValue(value, currentPositions));        
+        a.SetValue(e.Current.Value, currentPositions);
         positions[0] += 1;
-        for (int i = 0; i < rank-1; i++) {
+        for (int i = 0; i < a.Rank-1; i++) {
           if (positions[i] >= lengths[i]+lowerBounds[i]) {
             positions[i] = lowerBounds[i];
@@ -77,5 +94,4 @@
         }
       }
-      return a;
     }
   }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/DictionaryDecomposer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/DictionaryDecomposer.cs	(revision 1542)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/DictionaryDecomposer.cs	(revision 1553)
@@ -5,37 +5,5 @@
 using System.Collections.Generic;
 
-namespace HeuristicLab.Persistence.Default.Decomposers {
-
-  class DictionaryAdder {
-
-    bool keyIsSet, valueIsSet;
-    object key;
-    object value;
-    readonly IDictionary dict;
-
-    public DictionaryAdder(IDictionary dict) {
-      this.dict = dict;
-      keyIsSet = false;
-      valueIsSet = false;
-    }
-
-    public void SetKey(object v) {
-      key = v;
-      keyIsSet = true;
-      Check();
-    }
-
-    public void SetValue(object v) {
-      value = v;
-      valueIsSet = true;
-      Check();
-    }
-
-    private void Check() {
-      if ( keyIsSet && valueIsSet )
-        dict.Add(key, value);
-    }
-
-  }
+namespace HeuristicLab.Persistence.Default.Decomposers {  
   
   public class DictionaryDecomposer : IDecomposer {
@@ -50,4 +18,8 @@
     }
 
+    public IEnumerable<Tag> CreateMetaInfo(object o) {
+      return new Tag[] { };
+    }
+
     public IEnumerable<Tag> Decompose(object o) {
       IDictionary dict = (IDictionary)o;      
@@ -58,9 +30,9 @@
     }
 
-    public object CreateInstance(Type t) {
+    public object CreateInstance(Type t, IEnumerable<Tag> metaInfo) {
       return Activator.CreateInstance(t, true);
     }
 
-    public object Populate(object instance, IEnumerable<Tag> o, Type t) {
+    public void Populate(object instance, IEnumerable<Tag> o, Type t) {
       IDictionary dict = (IDictionary)instance;
       IEnumerator<Tag> iter = o.GetEnumerator();
@@ -69,9 +41,6 @@
         iter.MoveNext();
         Tag value = iter.Current;
-        DictionaryAdder da = new DictionaryAdder(dict);
-        key.SafeSet(da.SetKey);
-        value.SafeSet(da.SetValue);        
-      }
-      return dict;
+        dict.Add(key.Value, value.Value);
+      }      
     }
   }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/EnumDecomposer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/EnumDecomposer.cs	(revision 1542)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/EnumDecomposer.cs	(revision 1553)
@@ -16,19 +16,20 @@
     }
 
-    public IEnumerable<Tag> Decompose(object obj) {      
+    public IEnumerable<Tag> CreateMetaInfo(object obj) {
       yield return new Tag(Enum.GetName(obj.GetType(), obj));
     }
 
-    public object CreateInstance(Type t) {
-      return null;
+    public IEnumerable<Tag> Decompose(object obj) {
+      return new Tag[] { };
     }
-    
-    public object Populate(object instance, IEnumerable<Tag> elements, Type t) {
-      IEnumerator<Tag> it = elements.GetEnumerator();
+
+    public object CreateInstance(Type t, IEnumerable<Tag> metaInfo) {
+      IEnumerator<Tag> it = metaInfo.GetEnumerator();
       it.MoveNext();
       return Enum.Parse(t, (string)it.Current.Value);
     }
     
+    public void Populate(object instance, IEnumerable<Tag> elements, Type t) {      
+    }
   }
-  
 }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/EnumerableDecomposer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/EnumerableDecomposer.cs	(revision 1542)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/EnumerableDecomposer.cs	(revision 1553)
@@ -6,46 +6,5 @@
 using System.Collections.Generic;
 
-namespace HeuristicLab.Persistence.Default.Decomposers {
-
-  public class EnumerableCache {
-    readonly List<object> values;
-    int nSet;
-    int count;
-    readonly object enumerable;
-    readonly MethodInfo addMethod;
-
-    public EnumerableCache(object enumerable, MethodInfo addMethod) {      
-      values = new List<object>();
-      this.enumerable = enumerable;
-      this.addMethod = addMethod;
-      count = -1;
-    }
-
-    public Setter GetNextSetter() {      
-      int index = values.Count;      
-      values.Add(new object());
-      return v => Set(index, v);
-    }
-
-    private void Set(int index, object value) {      
-      values[index] = value;
-      nSet += 1;
-      if (count >= 0 && nSet >= count)
-        Fill();
-    }
-
-    public void Terminate() {
-      count = values.Count;      
-      if (nSet >= count)
-        Fill();
-    }
-
-    private void Fill() {      
-      foreach ( object v in values ) {
-        addMethod.Invoke(enumerable, new[] {v});
-      }
-    }
-
-  }
+namespace HeuristicLab.Persistence.Default.Decomposers { 
 
   public class EnumerableDecomposer : IDecomposer {
@@ -68,4 +27,8 @@
     }
 
+    public IEnumerable<Tag> CreateMetaInfo(object o) {
+      return new Tag[] { };
+    }
+
     public IEnumerable<Tag> Decompose(object obj) {
       foreach (object o in (IEnumerable)obj) {
@@ -74,19 +37,13 @@
     }
 
-    public object CreateInstance(Type type) {
+    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
       return Activator.CreateInstance(type, true);
     }
 
-    public object Populate(object instance, IEnumerable<Tag> tags, Type type) {
+    public void Populate(object instance, IEnumerable<Tag> tags, Type type) {
       MethodInfo addMethod = type.GetMethod("Add");
-      EnumerableCache cache = new EnumerableCache(instance, addMethod);
-      foreach (var tag in tags) {
-        tag.SafeSet(cache.GetNextSetter());
-      }
-      cache.Terminate();
-      return instance;
+      foreach (var tag in tags)
+        addMethod.Invoke(instance, new[] { tag.Value });
     }
-
-  }  
-
+  }
 }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/KeyValuePairDecomposer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/KeyValuePairDecomposer.cs	(revision 1542)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/KeyValuePairDecomposer.cs	(revision 1553)
@@ -21,5 +21,9 @@
     }
 
-    public IEnumerable<Tag> Decompose(object o) {      
+    public IEnumerable<Tag> CreateMetaInfo(object o) {
+      return new Tag[] { };
+    }
+
+    public IEnumerable<Tag> Decompose(object o) {
       Type t = o.GetType();
       yield return new Tag("key", t.GetProperty("Key").GetValue(o, null));
@@ -27,23 +31,17 @@
     }
 
-    public object CreateInstance(Type type) {
+    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
       return Activator.CreateInstance(type, true);
     }
 
-    public object Populate(object instance, IEnumerable<Tag> o, Type t) {
+    public void Populate(object instance, IEnumerable<Tag> o, Type t) {
       IEnumerator<Tag> iter = o.GetEnumerator();
+      iter.MoveNext();      
+      t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
+        .Single(fi => fi.Name == "key").SetValue(instance, iter.Current.Value);
       iter.MoveNext();
-      FieldInfo keyFieldInfo =
-        t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
-        .Single(fi => fi.Name == "key");
-      FieldInfo valueFieldInfo = 
-        t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
-        .Single(fi => fi.Name == "value");
-      iter.Current.SafeSet(value => keyFieldInfo.SetValue(instance, value));      
-      iter.MoveNext();
-      iter.Current.SafeSet(value => valueFieldInfo.SetValue(instance, value));
-      return instance;
-    }    
+      t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
+        .Single(fi => fi.Name == "value").SetValue(instance, iter.Current.Value);      
+    }
   }
-
 }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/StorableDecomposer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/StorableDecomposer.cs	(revision 1542)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/StorableDecomposer.cs	(revision 1553)
@@ -17,5 +17,9 @@
         EmptyStorableClassAttribute.IsEmpyStorable(type);
 
-    }    
+    }
+
+    public IEnumerable<Tag> CreateMetaInfo(object o) {
+      return new Tag[] { };
+    }
 
     public IEnumerable<Tag> Decompose(object obj) {
@@ -25,9 +29,9 @@
     }
 
-    public object CreateInstance(Type type) {
+    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
       return Activator.CreateInstance(type, true);
     }
 
-    public object Populate(object instance, IEnumerable<Tag> objects, Type type) {           
+    public void Populate(object instance, IEnumerable<Tag> objects, Type type) {           
       var memberDict = new Dictionary<string, Tag>();      
       IEnumerator<Tag> iter = objects.GetEnumerator();      
@@ -37,12 +41,10 @@
       foreach (var mapping in StorableAttribute.GetAutostorableAccessors(instance)) {
         if (memberDict.ContainsKey(mapping.Key)) {
-          memberDict[mapping.Key].SafeSet(mapping.Value.Set);
+          mapping.Value.Set(memberDict[mapping.Key].Value);          
         } else if (mapping.Value.DefaultValue != null) {
           mapping.Value.Set(mapping.Value.DefaultValue);
         }
       }
-      return instance;
     }
-
   }
 }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/TypeDecomposer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/TypeDecomposer.cs	(revision 1542)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/TypeDecomposer.cs	(revision 1553)
@@ -17,18 +17,20 @@
     }
 
-    public IEnumerable<Tag> Decompose(object obj) {
-      Type t = (Type) obj;
-      yield return new Tag("VersionInvariantName", t.VersionInvariantName());
+    public IEnumerable<Tag> CreateMetaInfo(object o) {
+      yield return new Tag("VersionInvariantName", ((Type)o).VersionInvariantName());
     }
 
-    public object CreateInstance(Type type) {
-      return null;
+    public IEnumerable<Tag> Decompose(object obj) {
+      return new Tag[] { };
     }
 
-    public object Populate(object instance, IEnumerable<Tag> objects, Type type) {
-      foreach ( var typeName in objects ) {
+    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
+      foreach (var typeName in metaInfo) {
         return Type.GetType((string)typeName.Value);
       }
-      return null;
+      return null;      
+    }
+
+    public void Populate(object instance, IEnumerable<Tag> objects, Type type) {      
     }
   }
Index: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/X2StringDecomposer.cs
===================================================================
--- trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/X2StringDecomposer.cs	(revision 1542)
+++ trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/X2StringDecomposer.cs	(revision 1553)
@@ -72,17 +72,20 @@
     }
 
+    public IEnumerable<Tag> CreateMetaInfo(object obj) {
+      yield return new Tag(((DateTime)obj).Ticks);
+    }
+
     public IEnumerable<Tag> Decompose(object obj) {
-      yield return new Tag(((DateTime)obj).Ticks);
-    }
-
-    public object CreateInstance(Type type) {
-      return null;
-    }
-
-    public object Populate(object instance, IEnumerable<Tag> tags, Type type) {
-      foreach (Tag tag in tags) {
+      return new Tag[] { };
+    }
+
+    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
+      foreach (Tag tag in metaInfo) {
         return new DateTime((long)tag.Value);
       }
       throw new ApplicationException("Not enough components to compose a bool.");
+    }
+
+    public void Populate(object instance, IEnumerable<Tag> tags, Type type) {      
     }
 
@@ -104,6 +107,6 @@
     }
 
-    public IEnumerable<Tag> Decompose(object obj) {
-      Array a = (Array) obj;
+    public IEnumerable<Tag> CreateMetaInfo(object obj) {
+      Array a = (Array)obj;
       int[] lengths = new int[a.Rank];
       int[] lowerBounds = new int[a.Rank];
@@ -134,10 +137,10 @@
     }
 
-    public object CreateInstance(Type type) {
-      return null;
-    }
-
-    public object Populate(object instance, IEnumerable<Tag> tags, Type type) {      
-      var tagIter = tags.GetEnumerator();
+    public IEnumerable<Tag> Decompose(object obj) {
+      return new Tag[] { };
+    }
+
+    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
+      var tagIter = metaInfo.GetEnumerator();
       tagIter.MoveNext();
       var valueIter = ((string) tagIter.Current.Value)
@@ -175,4 +178,8 @@
       return a;
     }
+
+    public void Populate(object instance, IEnumerable<Tag> tags, Type type) {
+    }
+
   }
 
@@ -222,4 +229,8 @@
         ImplementsGenericEnumerable(type) &&
         HasAddMethod(type);
+    }
+
+    public IEnumerable<Tag> CreateMetaInfo(object o) {
+      return new Tag[] { };
     }
 
@@ -245,9 +256,9 @@
     }
 
-    public object CreateInstance(Type type) {
+    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
       return Activator.CreateInstance(type, true);
     }
 
-    public object Populate(object instance, IEnumerable<Tag> tags, Type type) {
+    public void Populate(object instance, IEnumerable<Tag> tags, Type type) {
       Type enumerable = GetGenericEnumerableInterface(type);
       Type elementType = enumerable.GetGenericArguments()[0];      
@@ -259,9 +270,6 @@
       foreach (var value in stringValues) {
         addMethod.Invoke(instance, new[] {numberConverter.Parse(value, elementType)});
-      }      
-      return instance;      
-    }
-    
+      }
+    }
   }
-
 }
