Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAttribute.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAttribute.cs	(revision 13366)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/3.3/Default/CompositeSerializers/Storable/StorableClassAttribute.cs	(revision 13367)
@@ -49,4 +49,9 @@
     }
 
+    public StorableClassAttribute(string guid) {
+      Guid = new Guid(guid);
+      Released = false;
+    }
+
     /// <summary>
     /// Initializes a new instance of the <see cref="StorableClassAttribute"/> class.
Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/ProtoBufSerializer.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/ProtoBufSerializer.cs	(revision 13366)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/ProtoBufSerializer.cs	(revision 13367)
@@ -29,5 +29,5 @@
 
     protected override Bundle DeserializeBundle(Stream stream) {
-      return Bundle.ParseFrom(stream);
+      return Bundle.ParseFrom(stream, Mapper.StaticCache.GetExtensionRegistry());
     }
   }
Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/StaticCache.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/StaticCache.cs	(revision 13366)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/StaticCache.cs	(revision 13367)
@@ -36,4 +36,5 @@
     private Dictionary<Type, Guid> type2Guid;
     private Dictionary<Type, TypeInfo> typeInfos;
+    private ExtensionRegistry extensionRegistry;
 
     internal StaticCache() {
@@ -47,6 +48,7 @@
         type2Guid = new Dictionary<Type, Guid>();
         typeInfos = new Dictionary<Type, TypeInfo>();
+        extensionRegistry = ExtensionRegistry.CreateInstance();
 
-        foreach (var transformer in ApplicationManager.Manager.GetInstances<ITransformer>().OrderBy(x => x.Order)) {
+        foreach (var transformer in ApplicationManager.Manager.GetInstances<ITransformer>().OrderBy(x => x.Priority)) {
           guid2Transformer.Add(transformer.Guid, transformer);
           transformer2Guid.Add(transformer, transformer.Guid);
@@ -71,4 +73,20 @@
             RegisterType(StorableClassAttribute.GetStorableClassAttribute(t).Guid, t);
         }
+
+        RegisterExtension(BoolBox.Bool);
+        RegisterExtension(IntBox.Int);
+        RegisterExtension(LongBox.Long);
+        RegisterExtension(UnsignedIntBox.UnsignedInt);
+        RegisterExtension(UnsignedLongBox.UnsignedLong);
+        RegisterExtension(FloatBox.Float);
+        RegisterExtension(DoubleBox.Double);
+        RegisterExtension(StringBox.String);
+        RegisterExtension(BytesBox.Bytes);
+        RegisterExtension(BoolArrayBox.BoolArray);
+        RegisterExtension(IntArrayBox.IntArray);
+        RegisterExtension(MatrixBox.Matrix);
+        RegisterExtension(BoolMatrixBox.BoolMatrix);
+        RegisterExtension(IntMatrixBox.IntMatrix);
+        RegisterExtension(DictionaryBox.Dictionary);
       }
     }
@@ -79,4 +97,7 @@
         type2Guid.Add(type, guid);
       }
+    }
+    public void RegisterExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) {
+      extensionRegistry.Add(extension);
     }
 
@@ -104,4 +125,7 @@
       }
     }
+    public ExtensionRegistry GetExtensionRegistry() {
+      return extensionRegistry;
+    }
   }
 }
Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/Transformer.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/Transformer.cs	(revision 13366)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/Transformer.cs	(revision 13367)
@@ -25,15 +25,9 @@
   public abstract class Transformer : ITransformer {
     public Guid Guid { get; private set; }
-    public uint Id { get; private set; }
-    public uint Order { get; private set; }
+    public uint Priority { get; private set; }
 
     protected Transformer() {
       Guid = TransformerAttribute.GetGuid(this.GetType());
-      Order = TransformerAttribute.GetOrder(this.GetType());
-      Id = 0;
-    }
-
-    public void Initialize(uint id) {
-      Id = id;
+      Priority = TransformerAttribute.GetPriority(this.GetType());
     }
 
Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/TransformerAttribute.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/TransformerAttribute.cs	(revision 13366)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Core/TransformerAttribute.cs	(revision 13367)
@@ -26,9 +26,9 @@
   public sealed class TransformerAttribute : Attribute {
     public Guid Guid { get; private set; }
-    public uint Order { get; private set; }
+    public uint Priority { get; private set; }
 
-    public TransformerAttribute(string guid, uint order) {
+    public TransformerAttribute(string guid, uint priority) {
       Guid = new Guid(guid);
-      Order = order;
+      Priority = priority;
     }
 
@@ -42,6 +42,6 @@
       return GetTransformerAttribute(type).Guid;
     }
-    public static uint GetOrder(Type type) {
-      return GetTransformerAttribute(type).Order;
+    public static uint GetPriority(Type type) {
+      return GetTransformerAttribute(type).Priority;
     }
   }
Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/ITransformer.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/ITransformer.cs	(revision 13366)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/ITransformer.cs	(revision 13367)
@@ -25,8 +25,5 @@
   public interface ITransformer {
     Guid Guid { get; }
-    uint Id { get; }
-    uint Order { get; }
-
-    void Initialize(uint id);
+    uint Priority { get; }
 
     bool CanTransformType(Type type);
Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Protos/PersistenceMessages.proto
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Protos/PersistenceMessages.proto	(revision 13366)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Protos/PersistenceMessages.proto	(revision 13367)
@@ -16,5 +16,5 @@
 }
 
-// value boxes
+// scalar boxes
 message BoolBox {
   extend Box {
@@ -73,21 +73,13 @@
 
 // array boxes
-message ArrayBox {
+message BoolArrayBox {
   extend Box {
-    required ArrayBox array = 120;
-  }
-  optional uint32 element_type_id = 1;
-
-  extensions 100 to max;
-}
-message BoolArrayBox {
-  extend ArrayBox {
-    required BoolArrayBox bool_array = 100;
+    required BoolArrayBox bool_array = 120;
   }
   repeated bool values = 1 [packed = true];
 }
 message IntArrayBox {
-  extend ArrayBox {
-    required IntArrayBox int_array = 101;
+  extend Box {
+    required IntArrayBox int_array = 121;
   }
   repeated int32 values = 1 [packed = true];
Index: branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Transformers/Transformers.cs
===================================================================
--- branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Transformers/Transformers.cs	(revision 13366)
+++ branches/PersistenceOverhaul/HeuristicLab.Persistence/4.0/Transformers/Transformers.cs	(revision 13367)
@@ -20,6 +20,9 @@
 #endregion
 
+using Google.ProtocolBuffers;
 using System;
+using System.Collections.Generic;
 using System.Drawing;
+using System.Linq;
 
 namespace HeuristicLab.Persistence {
@@ -43,5 +46,5 @@
   }
 
-  #region Scalar Value Boxes
+  #region Scalar Box Transformers
   public abstract class BoolBoxTransformer<T> : BoxTransformer<T> {
     protected override void Populate(Box.Builder box, T value, Mapper mapper) {
@@ -68,4 +71,16 @@
     protected abstract T ToValueType(int value, Type type, Mapper mapper);
   }
+  public abstract class LongBoxTransformer<T> : BoxTransformer<T> {
+    protected override void Populate(Box.Builder box, T value, Mapper mapper) {
+      var b = LongBox.CreateBuilder();
+      b.Value = ToBoxType(value, mapper);
+      box.SetExtension<LongBox>(LongBox.Long, b.Build());
+    }
+    protected override T Extract(Box box, Type type, Mapper mapper) {
+      return ToValueType(box.GetExtension(LongBox.Long).Value, type, mapper);
+    }
+    protected abstract long ToBoxType(T value, Mapper mapper);
+    protected abstract T ToValueType(long value, Type type, Mapper mapper);
+  }
   public abstract class UnsignedIntBoxTransformer<T> : BoxTransformer<T> {
     protected override void Populate(Box.Builder box, T value, Mapper mapper) {
@@ -80,16 +95,4 @@
     protected abstract T ToValueType(uint value, Type type, Mapper mapper);
   }
-  public abstract class LongBoxTransformer<T> : BoxTransformer<T> {
-    protected override void Populate(Box.Builder box, T value, Mapper mapper) {
-      var b = LongBox.CreateBuilder();
-      b.Value = ToBoxType(value, mapper);
-      box.SetExtension<LongBox>(LongBox.Long, b.Build());
-    }
-    protected override T Extract(Box box, Type type, Mapper mapper) {
-      return ToValueType(box.GetExtension(LongBox.Long).Value, type, mapper);
-    }
-    protected abstract long ToBoxType(T value, Mapper mapper);
-    protected abstract T ToValueType(long value, Type type, Mapper mapper);
-  }
   public abstract class UnsignedLongBoxTransformer<T> : BoxTransformer<T> {
     protected override void Populate(Box.Builder box, T value, Mapper mapper) {
@@ -139,4 +142,43 @@
     protected abstract string ToBoxType(T value, Mapper mapper);
     protected abstract T ToValueType(string value, Type type, Mapper mapper);
+  }
+  public abstract class BytesBoxTransformer<T> : BoxTransformer<T> {
+    protected override void Populate(Box.Builder box, T value, Mapper mapper) {
+      var b = BytesBox.CreateBuilder();
+      b.Value = ByteString.CopyFrom(ToBoxType(value, mapper));
+      box.SetExtension<BytesBox>(BytesBox.Bytes, b.Build());
+    }
+    protected override T Extract(Box box, Type type, Mapper mapper) {
+      return ToValueType(box.GetExtension(BytesBox.Bytes).Value.ToByteArray(), type, mapper);
+    }
+    protected abstract byte[] ToBoxType(T value, Mapper mapper);
+    protected abstract T ToValueType(byte[] value, Type type, Mapper mapper);
+  }
+  #endregion
+
+  #region Array Box Transformers
+  public abstract class BoolArrayBoxTransformer<T> : BoxTransformer<T> {
+    protected override void Populate(Box.Builder box, T value, Mapper mapper) {
+      var b = BoolArrayBox.CreateBuilder();
+      b.AddRangeValues(ToBoxType(value, mapper));
+      box.SetExtension<BoolArrayBox>(BoolArrayBox.BoolArray, b.Build());
+    }
+    protected override T Extract(Box box, Type type, Mapper mapper) {
+      return ToValueType(box.GetExtension(BoolArrayBox.BoolArray).ValuesList, type, mapper);
+    }
+    protected abstract IEnumerable<bool> ToBoxType(T value, Mapper mapper);
+    protected abstract T ToValueType(IEnumerable<bool> value, Type type, Mapper mapper);
+  }
+  public abstract class IntArrayBoxTransformer<T> : BoxTransformer<T> {
+    protected override void Populate(Box.Builder box, T value, Mapper mapper) {
+      var b = IntArrayBox.CreateBuilder();
+      b.AddRangeValues(ToBoxType(value, mapper));
+      box.SetExtension<IntArrayBox>(IntArrayBox.IntArray, b.Build());
+    }
+    protected override T Extract(Box box, Type type, Mapper mapper) {
+      return ToValueType(box.GetExtension(IntArrayBox.IntArray).ValuesList, type, mapper);
+    }
+    protected abstract IEnumerable<int> ToBoxType(T value, Mapper mapper);
+    protected abstract T ToValueType(IEnumerable<int> value, Type type, Mapper mapper);
   }
   #endregion
@@ -226,4 +268,9 @@
     protected override TimeSpan ToValueType(long value, Type type, Mapper mapper) { return new TimeSpan(value); }
   }
+  [Transformer("0B540EAC-79AB-40CF-8277-D2C81135FEB6", 217)]
+  internal sealed class ColorTransformers : IntBoxTransformer<Color> {
+    protected override int ToBoxType(Color value, Mapper mapper) { return value.ToArgb(); }
+    protected override Color ToValueType(int value, Type type, Mapper mapper) { return Color.FromArgb(value); }
+  }
   #endregion
 
@@ -251,12 +298,4 @@
   #endregion
 
-  #region Color
-  [Transformer("0B540EAC-79AB-40CF-8277-D2C81135FEB6", 217)]
-  internal sealed class ColorTransformers : IntBoxTransformer<Color> {
-    protected override int ToBoxType(Color value, Mapper mapper) { return value.ToArgb(); }
-    protected override Color ToValueType(int value, Type type, Mapper mapper) { return Color.FromArgb(value); }
-  }
-  #endregion
-
   #region Type
   [Transformer("8D17FD28-383B-44E9-9BBF-B19D351C5E38", 218)]
@@ -269,3 +308,16 @@
   }
   #endregion
+
+  #region Primitive Array Types
+  [Transformer("F25A73B2-6B67-4493-BD59-B836AF4455D1", 300)]
+  internal sealed class BoolArrayTransformer : BoolArrayBoxTransformer<bool[]> {
+    protected override IEnumerable<bool> ToBoxType(bool[] value, Mapper mapper) { return value; }
+    protected override bool[] ToValueType(IEnumerable<bool> value, Type type, Mapper mapper) { return value.ToArray(); }
+  }
+  [Transformer("5F6DC3BC-4433-4AE9-A636-4BD126F7DACD", 306)]
+  internal sealed class IntArrayTransformer : IntArrayBoxTransformer<int[]> {
+    protected override IEnumerable<int> ToBoxType(int[] value, Mapper mapper) { return value; }
+    protected override int[] ToValueType(IEnumerable<int> value, Type type, Mapper mapper) { return value.ToArray(); }
+  }
+  #endregion
 }
