diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java
index 2d4989b..a85b0ff 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/DecoderImpl.java
@@ -20,6 +20,18 @@
  */
 package org.apache.qpid.proton.codec;
 
+import java.lang.reflect.Array;
+import java.nio.ByteBuffer;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
 import org.apache.qpid.proton.ProtonException;
 import org.apache.qpid.proton.amqp.Binary;
 import org.apache.qpid.proton.amqp.Decimal128;
@@ -32,12 +44,6 @@
 import org.apache.qpid.proton.amqp.UnsignedLong;
 import org.apache.qpid.proton.amqp.UnsignedShort;
 
-import java.lang.reflect.Array;
-import java.nio.ByteBuffer;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
 public class DecoderImpl implements ByteBufferDecoder
 {
     private ReadableBuffer _buffer;
@@ -90,11 +96,11 @@
 
             if (EncodingCodes.SMALLULONG == encoding || EncodingCodes.ULONG == encoding)
             {
-                descriptor = readUnsignedLong();
+                descriptor = readUnsignedLong(null);
             }
             else if (EncodingCodes.SYM8 == encoding || EncodingCodes.SYM32 == encoding)
             {
-                descriptor = readSymbol();
+                descriptor = readSymbol(null);
             }
             else
             {
@@ -110,17 +116,19 @@
                 }
             }
 
-            TypeConstructor<?> nestedEncoding = readConstructor();
+            TypeConstructor<?> nestedEncoding = readConstructor(false);
             DescribedTypeConstructor<?> dtc = _dynamicTypeConstructors.get(descriptor);
             if(dtc == null)
             {
                 dtc = new DescribedTypeConstructor()
                 {
+                    @Override
                     public DescribedType newInstance(final Object described)
                     {
                         return new UnknownDescribedType(descriptor, described);
                     }
 
+                    @Override
                     public Class<?> getTypeClass()
                     {
                         return UnknownDescribedType.class;
@@ -136,11 +144,13 @@
         }
     }
 
+    @Override
     public void register(final Object descriptor, final FastPathDescribedTypeConstructor<?> btc)
     {
         _fastPathTypeConstructors.put(descriptor, btc);
     }
 
+    @Override
     public void register(final Object descriptor, final DescribedTypeConstructor dtc)
     {
         // Allow external type constructors to replace the built-in instances.
@@ -157,11 +167,13 @@
     }
 
 
+    @Override
     public Boolean readBoolean()
     {
         return readBoolean(null);
     }
 
+    @Override
     public Boolean readBoolean(final Boolean defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -173,7 +185,7 @@
             case EncodingCodes.BOOLEAN_FALSE:
                 return Boolean.FALSE;
             case EncodingCodes.BOOLEAN:
-                return (Boolean) _constructors[EncodingCodes.BOOLEAN & 0xff].readValue();
+                return readRawByte() == 0 ? Boolean.FALSE : Boolean.TRUE;
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -181,6 +193,7 @@
         }
     }
 
+    @Override
     public boolean readBoolean(final boolean defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -192,7 +205,7 @@
             case EncodingCodes.BOOLEAN_FALSE:
                 return false;
             case EncodingCodes.BOOLEAN:
-                return (Boolean) _constructors[EncodingCodes.BOOLEAN & 0xff].readValue();
+                return readRawByte() != 0;
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -200,18 +213,20 @@
         }
     }
 
+    @Override
     public Byte readByte()
     {
         return readByte(null);
     }
 
+    @Override
     public Byte readByte(final Byte defaultVal)
     {
         byte encodingCode = _buffer.get();
 
         switch (encodingCode) {
             case EncodingCodes.BYTE:
-                return (Byte) _constructors[EncodingCodes.BYTE & 0xff].readValue();
+                return (Byte) readRawByte();
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -219,9 +234,10 @@
         }
     }
 
+    @Override
     public byte readByte(final byte defaultVal)
     {
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof ByteType.ByteEncoding)
         {
             return ((ByteType.ByteEncoding)constructor).readPrimitiveValue();
@@ -240,11 +256,13 @@
         }
     }
 
+    @Override
     public Short readShort()
     {
         return readShort(null);
     }
 
+    @Override
     public Short readShort(final Short defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -252,7 +270,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.SHORT:
-                return (Short) _constructors[EncodingCodes.SHORT & 0xff].readValue();
+                return Short.valueOf(readRawShort());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -260,10 +278,10 @@
         }
     }
 
+    @Override
     public short readShort(final short defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof ShortType.ShortEncoding)
         {
             return ((ShortType.ShortEncoding)constructor).readPrimitiveValue();
@@ -282,11 +300,13 @@
         }
     }
 
+    @Override
     public Integer readInteger()
     {
         return readInteger(null);
     }
 
+    @Override
     public Integer readInteger(final Integer defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -294,9 +314,9 @@
         switch (encodingCode)
         {
             case EncodingCodes.SMALLINT:
-                return (Integer) _constructors[EncodingCodes.SMALLINT & 0xff].readValue();
+                return Integer.valueOf(readRawByte());
             case EncodingCodes.INT:
-                return (Integer) _constructors[EncodingCodes.INT & 0xff].readValue();
+                return Integer.valueOf(readRawInt());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -304,10 +324,10 @@
         }
     }
 
+    @Override
     public int readInteger(final int defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof IntegerType.IntegerEncoding)
         {
             return ((IntegerType.IntegerEncoding)constructor).readPrimitiveValue();
@@ -326,11 +346,13 @@
         }
     }
 
+    @Override
     public Long readLong()
     {
         return readLong(null);
     }
 
+    @Override
     public Long readLong(final Long defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -338,9 +360,9 @@
         switch (encodingCode)
         {
             case EncodingCodes.SMALLLONG:
-                return (Long) _constructors[EncodingCodes.SMALLLONG & 0xff].readValue();
+                return Long.valueOf(readRawByte());
             case EncodingCodes.LONG:
-                return (Long) _constructors[EncodingCodes.LONG & 0xff].readValue();
+                return Long.valueOf(readRawLong());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -348,10 +370,10 @@
         }
     }
 
+    @Override
     public long readLong(final long defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof LongType.LongEncoding)
         {
             return ((LongType.LongEncoding)constructor).readPrimitiveValue();
@@ -370,11 +392,13 @@
         }
     }
 
+    @Override
     public UnsignedByte readUnsignedByte()
     {
         return readUnsignedByte(null);
     }
 
+    @Override
     public UnsignedByte readUnsignedByte(final UnsignedByte defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -382,7 +406,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.UBYTE:
-                return (UnsignedByte) _constructors[EncodingCodes.UBYTE & 0xff].readValue();
+                return UnsignedByte.valueOf(readRawByte());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -390,11 +414,13 @@
         }
     }
 
+    @Override
     public UnsignedShort readUnsignedShort()
     {
         return readUnsignedShort(null);
     }
 
+    @Override
     public UnsignedShort readUnsignedShort(final UnsignedShort defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -402,7 +428,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.USHORT:
-                return (UnsignedShort) _constructors[EncodingCodes.USHORT & 0xff].readValue();
+                return UnsignedShort.valueOf(readRawShort());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -410,11 +436,13 @@
         }
     }
 
+    @Override
     public UnsignedInteger readUnsignedInteger()
     {
         return readUnsignedInteger(null);
     }
 
+    @Override
     public UnsignedInteger readUnsignedInteger(final UnsignedInteger defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -424,9 +452,9 @@
             case EncodingCodes.UINT0:
                 return UnsignedInteger.ZERO;
             case EncodingCodes.SMALLUINT:
-                return (UnsignedInteger) _constructors[EncodingCodes.SMALLUINT & 0xff].readValue();
+                return UnsignedInteger.valueOf(((int) readRawByte()) & 0xff);
             case EncodingCodes.UINT:
-                return (UnsignedInteger) _constructors[EncodingCodes.UINT & 0xff].readValue();
+                return UnsignedInteger.valueOf(readRawInt());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -434,11 +462,13 @@
         }
     }
 
+    @Override
     public UnsignedLong readUnsignedLong()
     {
         return readUnsignedLong(null);
     }
 
+    @Override
     public UnsignedLong readUnsignedLong(final UnsignedLong defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -448,9 +478,9 @@
             case EncodingCodes.ULONG0:
                 return UnsignedLong.ZERO;
             case EncodingCodes.SMALLULONG:
-                return (UnsignedLong) _constructors[EncodingCodes.SMALLULONG & 0xff].readValue();
+                return UnsignedLong.valueOf(((long) readRawByte())&0xffl);
             case EncodingCodes.ULONG:
-                return (UnsignedLong) _constructors[EncodingCodes.ULONG & 0xff].readValue();
+                return UnsignedLong.valueOf(readRawLong());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -458,11 +488,13 @@
         }
     }
 
+    @Override
     public Character readCharacter()
     {
         return readCharacter(null);
     }
 
+    @Override
     public Character readCharacter(final Character defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -470,7 +502,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.CHAR:
-                return (Character) _constructors[EncodingCodes.CHAR & 0xff].readValue();
+                return Character.valueOf((char) (readRawInt() & 0xffff));
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -478,6 +510,7 @@
         }
     }
 
+    @Override
     public char readCharacter(final char defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -485,7 +518,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.CHAR:
-                return (Character) _constructors[EncodingCodes.CHAR & 0xff].readValue();
+                return (char) (readRawInt() & 0xffff);
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -493,11 +526,13 @@
         }
     }
 
+    @Override
     public Float readFloat()
     {
         return readFloat(null);
     }
 
+    @Override
     public Float readFloat(final Float defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -505,7 +540,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.FLOAT:
-                return (Float) _constructors[EncodingCodes.FLOAT & 0xff].readValue();
+                return Float.valueOf(readRawFloat());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -513,10 +548,10 @@
         }
     }
 
+    @Override
     public float readFloat(final float defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof FloatType.FloatEncoding)
         {
             return ((FloatType.FloatEncoding)constructor).readPrimitiveValue();
@@ -535,11 +570,13 @@
         }
     }
 
+    @Override
     public Double readDouble()
     {
         return readDouble(null);
     }
 
+    @Override
     public Double readDouble(final Double defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -547,7 +584,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.DOUBLE:
-                return (Double) _constructors[EncodingCodes.DOUBLE & 0xff].readValue();
+                return Double.valueOf(readRawDouble());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -555,10 +592,10 @@
         }
     }
 
+    @Override
     public double readDouble(final double defaultVal)
     {
-
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor instanceof DoubleType.DoubleEncoding)
         {
             return ((DoubleType.DoubleEncoding)constructor).readPrimitiveValue();
@@ -577,11 +614,13 @@
         }
     }
 
+    @Override
     public UUID readUUID()
     {
         return readUUID(null);
     }
 
+    @Override
     public UUID readUUID(final UUID defaultVal)
     {
         byte encodingCode = _buffer.get();
@@ -589,7 +628,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.UUID:
-                return (UUID) _constructors[EncodingCodes.UUID & 0xff].readValue();
+                return new UUID(readRawLong(), readRawLong());
             case EncodingCodes.NULL:
                 return defaultVal;
             default:
@@ -597,11 +636,13 @@
         }
     }
 
+    @Override
     public Decimal32 readDecimal32()
     {
         return readDecimal32(null);
     }
 
+    @Override
     public Decimal32 readDecimal32(final Decimal32 defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -617,11 +658,13 @@
         }
     }
 
+    @Override
     public Decimal64 readDecimal64()
     {
         return readDecimal64(null);
     }
 
+    @Override
     public Decimal64 readDecimal64(final Decimal64 defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -637,11 +680,13 @@
         }
     }
 
+    @Override
     public Decimal128 readDecimal128()
     {
         return readDecimal128(null);
     }
 
+    @Override
     public Decimal128 readDecimal128(final Decimal128 defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -657,11 +702,13 @@
         }
     }
 
+    @Override
     public Date readTimestamp()
     {
         return readTimestamp(null);
     }
 
+    @Override
     public Date readTimestamp(final Date defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -669,7 +716,7 @@
         switch (encodingCode)
         {
             case EncodingCodes.TIMESTAMP:
-                return (Date) _constructors[EncodingCodes.TIMESTAMP & 0xff].readValue();
+                return new Date(readRawLong());
             case EncodingCodes.NULL:
                 return defaultValue;
             default:
@@ -677,11 +724,13 @@
         }
     }
 
+    @Override
     public Binary readBinary()
     {
         return readBinary(null);
     }
 
+    @Override
     public Binary readBinary(final Binary defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -699,11 +748,13 @@
         }
     }
 
+    @Override
     public Symbol readSymbol()
     {
         return readSymbol(null);
     }
 
+    @Override
     public Symbol readSymbol(final Symbol defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -721,11 +772,13 @@
         }
     }
 
+    @Override
     public String readString()
     {
         return readString(null);
     }
 
+    @Override
     public String readString(final String defaultValue)
     {
         byte encodingCode = _buffer.get();
@@ -743,6 +796,7 @@
         }
     }
 
+    @Override
     @SuppressWarnings("rawtypes")
     public List readList()
     {
@@ -763,11 +817,13 @@
         }
     }
 
+    @Override
     public <T> void readList(final ListProcessor<T> processor)
     {
         //TODO.
     }
 
+    @Override
     @SuppressWarnings("rawtypes")
     public Map readMap()
     {
@@ -786,57 +842,68 @@
         }
     }
 
+    @Override
     public <T> T[] readArray(final Class<T> clazz)
     {
         return null;  //TODO.
     }
 
+    @Override
     public Object[] readArray()
     {
         return (Object[]) readConstructor().readValue();
 
     }
 
+    @Override
     public boolean[] readBooleanArray()
     {
         return (boolean[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public byte[] readByteArray()
     {
         return (byte[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public short[] readShortArray()
     {
         return (short[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public int[] readIntegerArray()
     {
         return (int[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public long[] readLongArray()
     {
         return (long[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public float[] readFloatArray()
     {
         return (float[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public double[] readDoubleArray()
     {
         return (double[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public char[] readCharacterArray()
     {
         return (char[]) ((ArrayType.ArrayEncoding)readConstructor()).readValueArray();
     }
 
+    @Override
     public <T> T[] readMultiple(final Class<T> clazz)
     {
         Object val = readObject();
@@ -867,6 +934,7 @@
         }
     }
 
+    @Override
     public Object[] readMultiple()
     {
         Object val = readObject();
@@ -886,41 +954,49 @@
         }
     }
 
+    @Override
     public byte[] readByteMultiple()
     {
         return new byte[0];  //TODO.
     }
 
+    @Override
     public short[] readShortMultiple()
     {
         return new short[0];  //TODO.
     }
 
+    @Override
     public int[] readIntegerMultiple()
     {
         return new int[0];  //TODO.
     }
 
+    @Override
     public long[] readLongMultiple()
     {
         return new long[0];  //TODO.
     }
 
+    @Override
     public float[] readFloatMultiple()
     {
         return new float[0];  //TODO.
     }
 
+    @Override
     public double[] readDoubleMultiple()
     {
         return new double[0];  //TODO.
     }
 
+    @Override
     public char[] readCharacterMultiple()
     {
         return new char[0];  //TODO.
     }
 
+    @Override
     public Object readObject()
     {
         boolean arrayType = false;
@@ -932,7 +1008,7 @@
                 arrayType = true;
         }
 
-        TypeConstructor constructor = readConstructor();
+        TypeConstructor<?> constructor = readConstructor();
         if(constructor== null)
         {
             throw new DecodeException("Unknown constructor");
@@ -945,6 +1021,7 @@
         }
     }
 
+    @Override
     public Object readObject(final Object defaultValue)
     {
         Object val = readObject();
@@ -1004,6 +1081,7 @@
         return decode;
     }
 
+    @Override
     public void setByteBuffer(final ByteBuffer buffer)
     {
         _buffer = new ReadableBuffer.ByteBufferReader(buffer);
@@ -1045,11 +1123,13 @@
             _described = described;
         }
 
+        @Override
         public Object getDescriptor()
         {
             return _descriptor;
         }
 
+        @Override
         public Object getDescribed()
         {
             return _described;
@@ -1070,6 +1150,7 @@
 
     }
 
+    @Override
     public int getByteBufferRemaining() {
         return _buffer.remaining();
     }
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java
index 512805b..164a77d 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/EncoderImpl.java
@@ -157,48 +157,56 @@
         return getTypeFromClass(clazz, null);
     }
 
-    private AMQPType getTypeFromClass(final Class clazz, Object instance)
+    private AMQPType<?> getTypeFromClass(final Class<?> clazz, final Object instance)
     {
-        AMQPType amqpType = _typeRegistry.get(clazz);
+        AMQPType<?> amqpType = _typeRegistry.get(clazz);
         if(amqpType == null)
         {
-            if(clazz.isArray())
-            {
-                amqpType = _arrayType;
-            }
-            else
-            {
-                if(List.class.isAssignableFrom(clazz))
-                {
-                    amqpType = _listType;
-                }
-                else if(Map.class.isAssignableFrom(clazz))
-                {
-                    amqpType = _mapType;
-                }
-                else if(DescribedType.class.isAssignableFrom(clazz))
-                {
-                    amqpType = _describedTypesClassRegistry.get(clazz);
-                    if(amqpType == null && instance != null)
-                    {
-                        Object descriptor = ((DescribedType) instance).getDescriptor();
-                        amqpType = _describedDescriptorRegistry.get(descriptor);
-                        if(amqpType == null)
-                        {
-                            amqpType = new DynamicDescribedType(this, descriptor);
-                            _describedDescriptorRegistry.put(descriptor, amqpType);
-                        }
-                    }
-
-                    return amqpType;
-                }
-            }
-            _typeRegistry.put(clazz, amqpType);
+            amqpType = deduceTypeFromClass(clazz, instance);
         }
 
         return amqpType;
     }
 
+    private AMQPType<?> deduceTypeFromClass(final Class<?> clazz, final Object instance) {
+        AMQPType<?> amqpType = null;
+
+        if(clazz.isArray())
+        {
+            amqpType = _arrayType;
+        }
+        else
+        {
+            if(List.class.isAssignableFrom(clazz))
+            {
+                amqpType = _listType;
+            }
+            else if(Map.class.isAssignableFrom(clazz))
+            {
+                amqpType = _mapType;
+            }
+            else if(DescribedType.class.isAssignableFrom(clazz))
+            {
+                amqpType = _describedTypesClassRegistry.get(clazz);
+                if(amqpType == null && instance != null)
+                {
+                    Object descriptor = ((DescribedType) instance).getDescriptor();
+                    amqpType = _describedDescriptorRegistry.get(descriptor);
+                    if(amqpType == null)
+                    {
+                        amqpType = new DynamicDescribedType(this, descriptor);
+                        _describedDescriptorRegistry.put(descriptor, amqpType);
+                    }
+                }
+
+                return amqpType;
+            }
+        }
+        _typeRegistry.put(clazz, amqpType);
+
+        return amqpType;
+    }
+
     @Override
     public <V> void register(AMQPType<V> type)
     {
@@ -212,7 +220,7 @@
 
     public void registerDescribedType(Class clazz, Object descriptor)
     {
-        AMQPType type = _describedDescriptorRegistry.get(descriptor);
+        AMQPType<?> type = _describedDescriptorRegistry.get(descriptor);
         if(type == null)
         {
             type = new DynamicDescribedType(this, descriptor);
@@ -513,7 +521,6 @@
         {
             _uuidType.fastWrite(this, uuid);
         }
-
     }
 
     @Override
@@ -553,7 +560,6 @@
         {
             _symbolType.fastWrite(this, s);
         }
-
     }
 
     @Override
@@ -715,44 +721,51 @@
         }
     }
 
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public void writeObject(final Object o)
     {
-        if (o == null)
+        if (o != null)
         {
-            getBuffer().put(EncodingCodes.NULL);
-            return;
-        }
+            AMQPType type = _typeRegistry.get(o.getClass());
 
-        AMQPType type = _typeRegistry.get(o.getClass());
-
-        if(type == null)
-        {
-            if(o.getClass().isArray())
+            if(type != null)
             {
-                writeArrayType(o);
-            }
-            else if(o instanceof List)
-            {
-                writeList((List)o);
-            }
-            else if(o instanceof Map)
-            {
-                writeMap((Map)o);
-            }
-            else if(o instanceof DescribedType)
-            {
-                writeDescribedType((DescribedType)o);
+                type.write(o);
             }
             else
             {
-                throw new IllegalArgumentException(
-                    "Do not know how to write Objects of class " + o.getClass().getName());
+                writeUnregisteredType(o);
             }
         }
         else
         {
-            type.write(o);
+            _buffer.put(EncodingCodes.NULL);
+        }
+    }
+
+    private void writeUnregisteredType(final Object o)
+    {
+        if(o.getClass().isArray())
+        {
+            writeArrayType(o);
+        }
+        else if(o instanceof List)
+        {
+            writeList((List<?>)o);
+        }
+        else if(o instanceof Map)
+        {
+            writeMap((Map<?, ?>)o);
+        }
+        else if(o instanceof DescribedType)
+        {
+            writeDescribedType((DescribedType)o);
+        }
+        else
+        {
+            throw new IllegalArgumentException(
+                "Do not know how to write Objects of class " + o.getClass().getName());
         }
     }
 
@@ -843,7 +856,7 @@
         _buffer.put(string);
     }
 
-    AMQPType getNullTypeEncoder()
+    AMQPType<?> getNullTypeEncoder()
     {
         return _nullType;
     }
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java
index 2562e57..b60d53e 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathHeaderType.java
@@ -28,6 +28,7 @@
 import org.apache.qpid.proton.codec.EncoderImpl;
 import org.apache.qpid.proton.codec.EncodingCodes;
 import org.apache.qpid.proton.codec.FastPathDescribedTypeConstructor;
+import org.apache.qpid.proton.codec.ReadableBuffer;
 import org.apache.qpid.proton.codec.TypeEncoding;
 import org.apache.qpid.proton.codec.WritableBuffer;
 
@@ -57,6 +58,7 @@
     @Override
     public Header readValue() {
         DecoderImpl decoder = getDecoder();
+        ReadableBuffer buffer = decoder.getBuffer();
         byte typeCode = decoder.getBuffer().get();
 
         @SuppressWarnings("unused")
@@ -67,12 +69,12 @@
             case EncodingCodes.LIST0:
                 break;
             case EncodingCodes.LIST8:
-                size = ((int)decoder.getBuffer().get()) & 0xff;
-                count = ((int)decoder.getBuffer().get()) & 0xff;
+                size = buffer.get() & 0xff;
+                count = buffer.get() & 0xff;
                 break;
             case EncodingCodes.LIST32:
-                size = decoder.getBuffer().getInt();
-                count = decoder.getBuffer().getInt();
+                size = buffer.getInt();
+                count = buffer.getInt();
                 break;
             default:
                 throw new DecodeException("Incorrect type found in Header encoding: " + typeCode);
@@ -83,19 +85,19 @@
         for (int index = 0; index < count; ++index) {
             switch (index) {
                 case 0:
-                    header.setDurable(decoder.readBoolean());
+                    header.setDurable(decoder.readBoolean(null));
                     break;
                 case 1:
-                    header.setPriority(decoder.readUnsignedByte());
+                    header.setPriority(decoder.readUnsignedByte(null));
                     break;
                 case 2:
-                    header.setTtl(decoder.readUnsignedInteger());
+                    header.setTtl(decoder.readUnsignedInteger(null));
                     break;
                 case 3:
-                    header.setFirstAcquirer(decoder.readBoolean());
+                    header.setFirstAcquirer(decoder.readBoolean(null));
                     break;
                 case 4:
-                    header.setDeliveryCount(decoder.readUnsignedInteger());
+                    header.setDeliveryCount(decoder.readUnsignedInteger(null));
                     break;
                 default:
                     throw new IllegalStateException("To many entries in Header encoding");
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java
index 3d5c7c4..22b30d1 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/messaging/FastPathPropertiesType.java
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one or more
+  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
@@ -28,6 +28,7 @@
 import org.apache.qpid.proton.codec.EncoderImpl;
 import org.apache.qpid.proton.codec.EncodingCodes;
 import org.apache.qpid.proton.codec.FastPathDescribedTypeConstructor;
+import org.apache.qpid.proton.codec.ReadableBuffer;
 import org.apache.qpid.proton.codec.TypeEncoding;
 import org.apache.qpid.proton.codec.WritableBuffer;
 
@@ -57,6 +58,7 @@
     @Override
     public Properties readValue() {
         DecoderImpl decoder = getDecoder();
+        ReadableBuffer buffer = decoder.getBuffer();
         byte typeCode = decoder.getBuffer().get();
 
         @SuppressWarnings("unused")
@@ -67,12 +69,12 @@
             case EncodingCodes.LIST0:
                 break;
             case EncodingCodes.LIST8:
-                size = ((int)decoder.getBuffer().get()) & 0xff;
-                count = ((int)decoder.getBuffer().get()) & 0xff;
+                size = buffer.get() & 0xff;
+                count = buffer.get() & 0xff;
                 break;
             case EncodingCodes.LIST32:
-                size = decoder.getBuffer().getInt();
-                count = decoder.getBuffer().getInt();
+                size = buffer.getInt();
+                count = buffer.getInt();
                 break;
             default:
                 throw new DecodeException("Incorrect type found in Properties encoding: " + typeCode);
@@ -86,40 +88,40 @@
                     properties.setMessageId(decoder.readObject());
                     break;
                 case 1:
-                    properties.setUserId(decoder.readBinary());
+                    properties.setUserId(decoder.readBinary(null));
                     break;
                 case 2:
-                    properties.setTo(decoder.readString());
+                    properties.setTo(decoder.readString(null));
                     break;
                 case 3:
-                    properties.setSubject(decoder.readString());
+                    properties.setSubject(decoder.readString(null));
                     break;
                 case 4:
-                    properties.setReplyTo(decoder.readString());
+                    properties.setReplyTo(decoder.readString(null));
                     break;
                 case 5:
                     properties.setCorrelationId(decoder.readObject());
                     break;
                 case 6:
-                    properties.setContentType(decoder.readSymbol());
+                    properties.setContentType(decoder.readSymbol(null));
                     break;
                 case 7:
-                    properties.setContentEncoding(decoder.readSymbol());
+                    properties.setContentEncoding(decoder.readSymbol(null));
                     break;
                 case 8:
-                    properties.setAbsoluteExpiryTime(decoder.readTimestamp());
+                    properties.setAbsoluteExpiryTime(decoder.readTimestamp(null));
                     break;
                 case 9:
-                    properties.setCreationTime(decoder.readTimestamp());
+                    properties.setCreationTime(decoder.readTimestamp(null));
                     break;
                 case 10:
-                    properties.setGroupId(decoder.readString());
+                    properties.setGroupId(decoder.readString(null));
                     break;
                 case 11:
-                    properties.setGroupSequence(decoder.readUnsignedInteger());
+                    properties.setGroupSequence(decoder.readUnsignedInteger(null));
                     break;
                 case 12:
-                    properties.setReplyToGroupId(decoder.readString());
+                    properties.setReplyToGroupId(decoder.readString(null));
                     break;
                 default:
                     throw new IllegalStateException("To many entries in Properties encoding");
@@ -300,8 +302,7 @@
 
     public static void register(Decoder decoder, EncoderImpl encoder) {
         FastPathPropertiesType type = new FastPathPropertiesType(encoder);
-        for(Object descriptor : DESCRIPTORS)
-        {
+        for(Object descriptor : DESCRIPTORS) {
             decoder.register(descriptor, (FastPathDescribedTypeConstructor<?>) type);
         }
         encoder.register(type);
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java
index 4424cfa..32bed2b 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathDispositionType.java
@@ -124,10 +124,10 @@
                     disposition.setRole(Boolean.TRUE.equals(decoder.readBoolean()) ? Role.RECEIVER : Role.SENDER);
                     break;
                 case 1:
-                    disposition.setFirst(decoder.readUnsignedInteger());
+                    disposition.setFirst(decoder.readUnsignedInteger(null));
                     break;
                 case 2:
-                    disposition.setLast(decoder.readUnsignedInteger());
+                    disposition.setLast(decoder.readUnsignedInteger(null));
                     break;
                 case 3:
                     disposition.setSettled(decoder.readBoolean(false));
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java
index 7ed89e4..534ab0c 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathFlowType.java
@@ -109,28 +109,28 @@
         for (int index = 0; index < count; ++index) {
             switch (index) {
                 case 0:
-                    flow.setNextIncomingId(decoder.readUnsignedInteger());
+                    flow.setNextIncomingId(decoder.readUnsignedInteger(null));
                     break;
                 case 1:
-                    flow.setIncomingWindow(decoder.readUnsignedInteger());
+                    flow.setIncomingWindow(decoder.readUnsignedInteger(null));
                     break;
                 case 2:
-                    flow.setNextOutgoingId(decoder.readUnsignedInteger());
+                    flow.setNextOutgoingId(decoder.readUnsignedInteger(null));
                     break;
                 case 3:
-                    flow.setOutgoingWindow(decoder.readUnsignedInteger());
+                    flow.setOutgoingWindow(decoder.readUnsignedInteger(null));
                     break;
                 case 4:
-                    flow.setHandle(decoder.readUnsignedInteger());
+                    flow.setHandle(decoder.readUnsignedInteger(null));
                     break;
                 case 5:
-                    flow.setDeliveryCount(decoder.readUnsignedInteger());
+                    flow.setDeliveryCount(decoder.readUnsignedInteger(null));
                     break;
                 case 6:
-                    flow.setLinkCredit(decoder.readUnsignedInteger());
+                    flow.setLinkCredit(decoder.readUnsignedInteger(null));
                     break;
                 case 7:
-                    flow.setAvailable(decoder.readUnsignedInteger());
+                    flow.setAvailable(decoder.readUnsignedInteger(null));
                     break;
                 case 8:
                     flow.setDrain(decoder.readBoolean(false));
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java
index d27e59c..b37c5b6 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/transport/FastPathTransferType.java
@@ -90,19 +90,19 @@
         for (int index = 0; index < count; ++index) {
             switch (index) {
                 case 0:
-                    transfer.setHandle(decoder.readUnsignedInteger());
+                    transfer.setHandle(decoder.readUnsignedInteger(null));
                     break;
                 case 1:
-                    transfer.setDeliveryId(decoder.readUnsignedInteger());
+                    transfer.setDeliveryId(decoder.readUnsignedInteger(null));
                     break;
                 case 2:
-                    transfer.setDeliveryTag(decoder.readBinary());
+                    transfer.setDeliveryTag(decoder.readBinary(null));
                     break;
                 case 3:
-                    transfer.setMessageFormat(decoder.readUnsignedInteger());
+                    transfer.setMessageFormat(decoder.readUnsignedInteger(null));
                     break;
                 case 4:
-                    transfer.setSettled(decoder.readBoolean());
+                    transfer.setSettled(decoder.readBoolean(null));
                     break;
                 case 5:
                     transfer.setMore(decoder.readBoolean(false));
