diff --git a/build.gradle b/build.gradle
index 126e4af..09bfafb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -24,7 +24,7 @@
   mainClassName = 'org.qi4j.container.Main'
   groovycMain_mx = "700m"
   groovycMain_permSize = "512m"
-  groovycMain_maxPermSize = "512m"
+  groovycMain_maxPermSize = "1G"
 }
 
 buildscript {
diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueBuilderFactory.java b/core/api/src/main/java/org/qi4j/api/value/ValueBuilderFactory.java
index 57c4e29..4867113 100644
--- a/core/api/src/main/java/org/qi4j/api/value/ValueBuilderFactory.java
+++ b/core/api/src/main/java/org/qi4j/api/value/ValueBuilderFactory.java
@@ -96,5 +96,4 @@
      * @throws ConstructionException if the value could not be instantiated
      */
     <T> T newValueFromSerializedState( Class<T> valueType, String serializedState );
-
 }
diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java b/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java
index 175b176..5740849 100644
--- a/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java
+++ b/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java
@@ -69,7 +69,6 @@
  */
 public interface ValueDeserializer
 {
-
     /**
      * Factory method for a typed deserialize function.
      *
diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueSerialization.java b/core/api/src/main/java/org/qi4j/api/value/ValueSerialization.java
index 503aa5c..33a3590 100644
--- a/core/api/src/main/java/org/qi4j/api/value/ValueSerialization.java
+++ b/core/api/src/main/java/org/qi4j/api/value/ValueSerialization.java
@@ -23,7 +23,6 @@
 public interface ValueSerialization
     extends ValueSerializer, ValueDeserializer
 {
-
     /**
      * Serialization format @Service tags.
      *
@@ -34,7 +33,6 @@
      */
     interface Formats
     {
-
         /**
          * Tag a ValueSerialization service that support the JSON format.
          */
@@ -44,5 +42,4 @@
          */
         String XML = "xml";
     }
-
 }
diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java b/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
index 337c37e..be60eee 100644
--- a/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
+++ b/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
@@ -70,7 +70,6 @@
  */
 public interface ValueSerializer
 {
-
     /**
      * Factory method for a serialize function.
      *
@@ -83,15 +82,6 @@
      * Factory method for a serialize function.
      *
      * @param <T> the parametrized function input type
-     * @param options ValueSerializer Options
-     * @return a serialization function.
-     */
-    <T> Function<T, String> serialize( Options options );
-
-    /**
-     * Factory method for a serialize function.
-     *
-     * @param <T> the parametrized function input type
      * @param includeTypeInfo if type information should be included in the output
      * @return a serialization function.
      */
@@ -111,17 +101,6 @@
     /**
      * Serialize the state of a value.
      *
-     * @param options ValueSerializer Options
-     * @param object an Object to serialize
-     * @return the state
-     * @throws ValueSerializationException if the Value serialization failed
-     */
-    String serialize( Options options, Object object )
-        throws ValueSerializationException;
-
-    /**
-     * Serialize the state of a value.
-     *
      * @param object an Object to serialize
      * @param includeTypeInfo if type information should be included in the output
      * @return the state
@@ -144,17 +123,6 @@
     /**
      * Serialize the state of a value.
      *
-     * @param options ValueSerializer Options
-     * @param object an Object to serialize
-     * @param output that will be used as output
-     * @throws ValueSerializationException if the Value serialization failed
-     */
-    void serialize( Options options, Object object, OutputStream output )
-        throws ValueSerializationException;
-
-    /**
-     * Serialize the state of a value.
-     *
      * @param object an Object to serialize
      * @param output that will be used as output
      * @param includeTypeInfo if type information should be included in the output
@@ -221,11 +189,12 @@
          */
         public Boolean getBoolean( String option )
         {
-            if( !options.containsKey( option ) )
+            String value = options.get( option );
+            if( value == null )
             {
-                return null;
+                return false;
             }
-            return Boolean.valueOf( options.get( option ) );
+            return Boolean.valueOf( value );
         }
 
         /**
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
index 1612089..aa7fa45 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java
@@ -657,6 +657,7 @@
                 }
                 catch( NoSuchServiceException e )
                 {
+//                    valueSerialization = newObject( OrgJsonValueSerialization.class );
                     valueSerialization = new OrgJsonValueSerialization( layer.applicationInstance(), this, this );
                 }
             }
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java
index b20bd79..68b49bd 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java
@@ -54,6 +54,7 @@
 import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.api.value.ValueDeserializer;
 import org.qi4j.api.value.ValueSerializationException;
+import org.qi4j.api.value.ValueSerializer;
 import org.qi4j.functional.Function;
 import org.qi4j.functional.Function2;
 
@@ -1015,21 +1016,54 @@
 
     /**
      * A Map&lt;K,V&gt; is serialized in an array of entries objects.
-     *
-     * <p>Here is an example in JSON:</p>
+     * <p>
+     *     If {@link ValueSerializer.Options#MAP_ENTRIES_AS_OBJECTS} is @{code false}, then the format is key/value
+     *     explicit, such as follows;
+     * </p>
      * <pre>
      * [
      *     { "key": "foo",       "value": "bar"   },
      *     { "key": "cathedral", "value": "bazar" }
      * ]
      * </pre>
-     * <p>And an empty Map:</p>
-     * <pre>[]</pre>
+     * <p>
+     *     An empty Map is an empty JSON array, i.e;
+     * </p>
+     * <pre>
+     * []
+     * </pre>
+     * <p>
+     *     <b>
+     *         NOTE: This was default in Qi4j ver 2.0 and Zest ver 2.1. In Zest 3.0 and later, the
+     *         {@link ValueSerializer.Options#MAP_ENTRIES_AS_OBJECTS} must be set to @{code false} explicitly in
+     *         the assmebly.
+     *     </b>
+     * </p>
      * <p>
      *     This allow to use any type as keys and values while keeping the Map order at the cost of having
      *     non-predictible order of key/value inside an entry object.
      * </p>
-     *
+     * <p>
+     * If the {@link ValueSerializer.Options#MAP_ENTRIES_AS_OBJECTS} is {@code true}, then the format is
+     * object-oriented, as in regular javascript objects, such as;
+     * </p>
+     * <pre>
+     * {
+     *     { "foo" : "bar"   },
+     *     { "cathedral" : "bazar" }
+     * }
+     * </pre>
+     * <p>
+     *     <b>
+     *         NOTE: This was NOT default in Qi4j ver 2.0 and Zest ver 2.1. In those versions, the
+     *         {@link ValueSerializer.Options#MAP_ENTRIES_AS_OBJECTS} must be set to @{code true} explicitly in
+     *         the assembly to enable this format.
+     *     </b>
+     * </p>
+     * <p>
+     * This has the advantage of smaller serialized format, and easier use in javascript, where the dot notation
+     * can be used directly.
+     * </p>
      * @param <K> Parameterized map key type
      * @param <V> Parameterized map value type
      * @param input Input
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
index 004745a..ab75cb8 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
@@ -38,6 +38,8 @@
 import org.qi4j.api.entity.EntityComposite;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.entity.Identity;
+import org.qi4j.api.injection.scope.Structure;
+import org.qi4j.api.injection.scope.This;
 import org.qi4j.api.property.Property;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.util.Base64Encoder;
@@ -47,7 +49,6 @@
 import org.qi4j.api.value.ValueSerializationException;
 import org.qi4j.api.value.ValueSerializer;
 import org.qi4j.functional.Function;
-import org.qi4j.functional.Function2;
 
 import static org.qi4j.functional.Iterables.first;
 
@@ -86,29 +87,37 @@
     implements ValueSerializer
 {
 
-    public static interface ComplexSerializer<T, OutputType>
+    public static final Options DEFAULT_OPTIONS = new Options();
+
+    public interface ComplexSerializer<T, OutputType>
     {
-        void serialize( Options options, T object, OutputType output )
+        void serialize( T object, OutputType output )
             throws Exception;
     }
 
     private static final String UTF_8 = "UTF-8";
 
-    private static <TO, FROM extends TO> Function2<Options, FROM, TO> identitySerializer()
+    private static <TO, FROM extends TO> Function<FROM, TO> identitySerializer()
     {
-        return new Function2<Options, FROM, TO>()
+        return new Function<FROM, TO>()
         {
             @Override
-            public TO map( Options options, FROM from )
+            public TO map( FROM from )
             {
                 return from;
             }
         };
     }
 
-    private final Map<Class<?>, Function2<Options, Object, Object>> serializers = new HashMap<>( 16 );
+    private final Map<Class<?>, Function<Object, Object>> serializers = new HashMap<>( 16 );
     private final Map<Class<?>, ComplexSerializer<Object, OutputType>> complexSerializers = new HashMap<>( 2 );
 
+    @Structure
+    private Qi4j api;
+
+    @This
+    private ValueSerializer me;
+
     /**
      * Register a Plain Value type serialization Function.
      *
@@ -117,9 +126,9 @@
      * @param serializer Serialization Function
      */
     @SuppressWarnings( "unchecked" )
-    protected final <T> void registerSerializer( Class<T> type, Function2<Options, T, Object> serializer )
+    protected final <T> void registerSerializer( Class<T> type, Function<T, Object> serializer )
     {
-        serializers.put( type, (Function2<Options, Object, Object>) serializer );
+        serializers.put( type, (Function<Object, Object>) serializer );
     }
 
     /**
@@ -149,62 +158,62 @@
         registerSerializer( Double.class, ValueSerializerAdapter.<Object, Double>identitySerializer() );
 
         // Number types
-        registerSerializer( BigDecimal.class, new Function2<Options, BigDecimal, Object>()
+        registerSerializer( BigDecimal.class, new Function<BigDecimal, Object>()
         {
             @Override
-            public Object map( Options options, BigDecimal bigDecimal )
+            public Object map( BigDecimal bigDecimal )
             {
                 return bigDecimal.toString();
             }
         } );
-        registerSerializer( BigInteger.class, new Function2<Options, BigInteger, Object>()
+        registerSerializer( BigInteger.class, new Function<BigInteger, Object>()
         {
             @Override
-            public Object map( Options options, BigInteger bigInteger )
+            public Object map( BigInteger bigInteger )
             {
                 return bigInteger.toString();
             }
         } );
 
         // Date types
-        registerSerializer( Date.class, new Function2<Options, Date, Object>()
+        registerSerializer( Date.class, new Function<Date, Object>()
         {
             @Override
-            public Object map( Options options, Date date )
+            public Object map( Date date )
             {
                 return Dates.toUtcString( date );
             }
         } );
-        registerSerializer( DateTime.class, new Function2<Options, DateTime, Object>()
+        registerSerializer( DateTime.class, new Function<DateTime, Object>()
         {
             @Override
-            public Object map( Options options, DateTime date )
+            public Object map( DateTime date )
             {
                 return date.toString();
             }
         } );
-        registerSerializer( LocalDateTime.class, new Function2<Options, LocalDateTime, Object>()
+        registerSerializer( LocalDateTime.class, new Function<LocalDateTime, Object>()
         {
             @Override
-            public Object map( Options options, LocalDateTime date )
+            public Object map( LocalDateTime date )
             {
                 return date.toString();
             }
         } );
-        registerSerializer( LocalDate.class, new Function2<Options, LocalDate, Object>()
+        registerSerializer( LocalDate.class, new Function<LocalDate, Object>()
         {
             @Override
-            public Object map( Options options, LocalDate date )
+            public Object map( LocalDate date )
             {
                 return date.toString();
             }
         } );
 
         // Other supported types
-        registerSerializer( EntityReference.class, new Function2<Options, EntityReference, Object>()
+        registerSerializer( EntityReference.class, new Function<EntityReference, Object>()
         {
             @Override
-            public Object map( Options options, EntityReference ref )
+            public Object map( EntityReference ref )
             {
                 return ref.toString();
             }
@@ -225,19 +234,6 @@
     }
 
     @Override
-    public final <T> Function<T, String> serialize( final Options options )
-    {
-        return new Function<T, String>()
-        {
-            @Override
-            public String map( T object )
-            {
-                return serialize( options, object );
-            }
-        };
-    }
-
-    @Override
     @Deprecated
     public final <T> Function<T, String> serialize( final boolean includeTypeInfo )
     {
@@ -246,8 +242,7 @@
             @Override
             public String map( T object )
             {
-                return serialize( includeTypeInfo ? new Options().withTypeInfo() : new Options().withoutTypeInfo(),
-                                  object );
+                return serialize( object );
             }
         };
     }
@@ -256,17 +251,10 @@
     public final String serialize( Object object )
         throws ValueSerializationException
     {
-        return serialize( new Options(), object );
-    }
-
-    @Override
-    public final String serialize( Options options, Object object )
-        throws ValueSerializationException
-    {
         try
         {
             ByteArrayOutputStream output = new ByteArrayOutputStream();
-            serializeRoot( options, object, output );
+            serializeRoot( object, output );
             return output.toString( UTF_8 );
         }
         catch( ValueSerializationException ex )
@@ -284,24 +272,16 @@
     public final String serialize( Object object, boolean includeTypeInfo )
         throws ValueSerializationException
     {
-        return serialize( includeTypeInfo ? new Options().withTypeInfo() : new Options().withoutTypeInfo(),
-                          object );
+        return serialize( object );
     }
 
     @Override
     public final void serialize( Object object, OutputStream output )
         throws ValueSerializationException
     {
-        serialize( new Options(), object, output );
-    }
-
-    @Override
-    public final void serialize( Options options, Object object, OutputStream output )
-        throws ValueSerializationException
-    {
         try
         {
-            serializeRoot( options, object, output );
+            serializeRoot( object, output );
         }
         catch( ValueSerializationException ex )
         {
@@ -318,11 +298,10 @@
     public final void serialize( Object object, OutputStream output, boolean includeTypeInfo )
         throws ValueSerializationException
     {
-        serialize( includeTypeInfo ? new Options().withTypeInfo() : new Options().withoutTypeInfo(),
-                   object, output );
+        serialize( object, output );
     }
 
-    private void serializeRoot( Options options, Object object, OutputStream output )
+    private void serializeRoot( Object object, OutputStream output )
         throws Exception
     {
         if( object != null )
@@ -330,7 +309,7 @@
             if( serializers.get( object.getClass() ) != null )
             {
                 // Plain Value
-                Object serialized = serializers.get( object.getClass() ).map( options, object );
+                Object serialized = serializers.get( object.getClass() ).map( object );
                 output.write( serialized.toString().getBytes( UTF_8 ) );
             }
             else if( object.getClass().isEnum() )
@@ -348,13 +327,13 @@
                 // Complex Value
                 OutputType adaptedOutput = adaptOutput( output );
                 onSerializationStart( object, adaptedOutput );
-                doSerialize( options, object, adaptedOutput, true );
+                doSerialize( object, adaptedOutput, true );
                 onSerializationEnd( object, adaptedOutput );
             }
         }
     }
 
-    private void doSerialize( Options options, Object object, OutputType output, boolean rootPass )
+    private void doSerialize( Object object, OutputType output, boolean rootPass )
         throws Exception
     {
         // Null
@@ -362,54 +341,48 @@
         {
             onValue( output, null );
         }
-        else // Registered serializer
-            if( serializers.get( object.getClass() ) != null )
-            {
-                onValue( output, serializers.get( object.getClass() ).map( options, object ) );
-            }
-            else if( complexSerializers.get( object.getClass() ) != null )
-            {
-                complexSerializers.get( object.getClass() ).serialize( options, object, output );
-            }
-            else // ValueComposite
-                if( ValueComposite.class.isAssignableFrom( object.getClass() ) )
-                {
-                    serializeValueComposite( options, object, output, rootPass );
-                }
-                else // EntityComposite
-                    if( EntityComposite.class.isAssignableFrom( object.getClass() ) )
-                    {
-                        serializeEntityComposite( object, output );
-                    }
-                    else // Collection - Iterable
-                        if( Iterable.class.isAssignableFrom( object.getClass() ) )
-                        {
-                            serializeIterable( options, object, output );
-                        }
-                        else // Array - QUID Remove this and use java serialization for arrays?
-                            if( object.getClass().isArray() )
-                            {
-                                serializeBase64Serializable( object, output );
-                            }
-                            else // Map
-                                if( Map.class.isAssignableFrom( object.getClass() ) )
-                                {
-                                    serializeMap( options, object, output );
-                                }
-                                else // Enum
-                                    if( object.getClass().isEnum() )
-                                    {
-                                        onValue( output, object.toString() );
-                                    }
-                                    else // Fallback to Base64 encoded Java Serialization
-                                    {
-                                        serializeBase64Serializable( object, output );
-                                    }
+        else if( serializers.get( object.getClass() ) != null ) // Registered serializer
+        {
+            onValue( output, serializers.get( object.getClass() ).map( object ) );
+        }
+        else if( complexSerializers.get( object.getClass() ) != null )
+        {
+            complexSerializers.get( object.getClass() ).serialize( object, output );
+        }
+        else if( ValueComposite.class.isAssignableFrom( object.getClass() ) ) // ValueComposite
+        {
+            serializeValueComposite( object, output, rootPass );
+        }
+        else if( EntityComposite.class.isAssignableFrom( object.getClass() ) ) // EntityComposite
+        {
+            serializeEntityComposite( object, output );
+        }
+        else if( Iterable.class.isAssignableFrom( object.getClass() ) ) // Collection - Iterable
+        {
+            serializeIterable( object, output );
+        }
+        else if( object.getClass().isArray() ) // Array - QUID Remove this and use java serialization for arrays?
+        {
+            serializeBase64Serializable( object, output );
+        }
+        else if( Map.class.isAssignableFrom( object.getClass() ) ) // Map
+        {
+            serializeMap( object, output );
+        }
+        else if( object.getClass().isEnum() )// Enum
+        {
+            onValue( output, object.toString() );
+        }
+        else // Fallback to Base64 encoded Java Serialization
+        {
+            serializeBase64Serializable( object, output );
+        }
     }
 
-    private void serializeValueComposite( Options options, Object object, OutputType output, boolean rootPass )
+    private void serializeValueComposite( Object object, OutputType output, boolean rootPass )
         throws Exception
     {
+        boolean includeTypeInfo = options().getBoolean( Options.INCLUDE_TYPE_INFO );
         CompositeInstance valueInstance = Qi4j.FUNCTION_COMPOSITE_INSTANCE_OF.map( (ValueComposite) object );
         ValueDescriptor descriptor = (ValueDescriptor) valueInstance.descriptor();
         AssociationStateHolder state = (AssociationStateHolder) valueInstance.state();
@@ -417,7 +390,7 @@
         onObjectStart( output );
 
         //noinspection ConstantConditions
-        if( options.getBoolean( Options.INCLUDE_TYPE_INFO ) && !rootPass )
+        if( includeTypeInfo && !rootPass )
         {
             onFieldStart( output, "_type" );
             onValueStart( output );
@@ -431,7 +404,7 @@
             Property<?> property = state.propertyFor( persistentProperty.accessor() );
             onFieldStart( output, persistentProperty.qualifiedName().name() );
             onValueStart( output );
-            doSerialize( options, property.get(), output, false );
+            doSerialize( property.get(), output, false );
             onValueEnd( output );
             onFieldEnd( output );
         }
@@ -491,13 +464,31 @@
         onObjectEnd( output );
     }
 
+    private Options options()
+    {
+        Options options;
+        if( api == null ) // fallback is in progress and no injection has happened.
+        {
+            options = DEFAULT_OPTIONS;
+        }
+        else
+        {
+            options = api.compositeDescriptorFor( me ).metaInfo( Options.class );
+            if( options == null )
+            {
+                options = DEFAULT_OPTIONS;
+            }
+        }
+        return options;
+    }
+
     private void serializeEntityComposite( Object object, OutputType output )
         throws Exception
     {
         onValue( output, EntityReference.entityReferenceFor( object ) );
     }
 
-    private void serializeIterable( Options options, Object object, OutputType output )
+    private void serializeIterable( Object object, OutputType output )
         throws Exception
     {
         @SuppressWarnings( "unchecked" )
@@ -506,25 +497,26 @@
         for( Object item : collection )
         {
             onValueStart( output );
-            doSerialize( options, item, output, false );
+            doSerialize( item, output, false );
             onValueEnd( output );
         }
         onArrayEnd( output );
     }
 
-    private void serializeMap( Options options, Object object, OutputType output )
+    private void serializeMap( Object object, OutputType output )
         throws Exception
     {
+        boolean mapEntriesAsObjects = options().getBoolean( Options.MAP_ENTRIES_AS_OBJECTS );
         @SuppressWarnings( "unchecked" )
         Map<Object, Object> map = (Map<Object, Object>) object;
-        if( options.getBoolean( Options.MAP_ENTRIES_AS_OBJECTS ) )
+        if( mapEntriesAsObjects )
         {
             onObjectStart( output );
             for( Map.Entry<Object, Object> entry : map.entrySet() )
             {
                 onFieldStart( output, entry.getKey().toString() );
                 onValueStart( output );
-                doSerialize( options, entry.getValue(), output, false );
+                doSerialize( entry.getValue(), output, false );
                 onValueEnd( output );
                 onFieldEnd( output );
             }
@@ -545,7 +537,7 @@
 
                 onFieldStart( output, "value" );
                 onValueStart( output );
-                doSerialize( options, entry.getValue(), output, false );
+                doSerialize( entry.getValue(), output, false );
                 onValueEnd( output );
                 onFieldEnd( output );
 
@@ -565,7 +557,7 @@
         throws Exception
     {
         ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        try (ObjectOutputStream out = new ObjectOutputStream( bout ))
+        try( ObjectOutputStream out = new ObjectOutputStream( bout ) )
         {
             out.writeUnshared( object );
         }
diff --git a/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerialization.java b/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerialization.java
index 2e5413f..f86da50 100644
--- a/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerialization.java
+++ b/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerialization.java
@@ -17,6 +17,7 @@
 
 import java.io.InputStream;
 import java.io.OutputStream;
+import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.structure.Application;
 import org.qi4j.api.structure.Module;
 import org.qi4j.api.type.ValueType;
@@ -43,7 +44,7 @@
     private final OrgJsonValueSerializer serializer;
     private final OrgJsonValueDeserializer deserializer;
 
-    public OrgJsonValueSerialization( Application application, Module module, final Module valuesModule )
+    public OrgJsonValueSerialization( @Structure Application application, @Structure Module module, @Structure final Module valuesModule )
     {
         this.serializer = new OrgJsonValueSerializer();
         this.deserializer = new OrgJsonValueDeserializer( application, module, new Function<Application, Module>()
@@ -63,12 +64,6 @@
     }
 
     @Override
-    public <T> Function<T, String> serialize( Options options )
-    {
-        return serializer.serialize( options );
-    }
-
-    @Override
     @Deprecated
     public <T> Function<T, String> serialize( boolean includeTypeInfo )
     {
@@ -83,13 +78,6 @@
     }
 
     @Override
-    public String serialize( Options options, Object object )
-        throws ValueSerializationException
-    {
-        return serializer.serialize( options, object );
-    }
-
-    @Override
     @Deprecated
     public String serialize( Object object, boolean includeTypeInfo )
         throws ValueSerializationException
@@ -105,13 +93,6 @@
     }
 
     @Override
-    public void serialize( Options options, Object object, OutputStream output )
-        throws ValueSerializationException
-    {
-        serializer.serialize( options, object, output );
-    }
-
-    @Override
     @Deprecated
     public void serialize( Object object, OutputStream output, boolean includeTypeInfo )
         throws ValueSerializationException
diff --git a/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerializer.java b/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerializer.java
index ddf2fb1..435ba9e 100644
--- a/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerializer.java
+++ b/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerializer.java
@@ -21,6 +21,9 @@
 import java.io.OutputStreamWriter;
 import java.io.Writer;
 import org.json.JSONWriter;
+import org.qi4j.api.injection.scope.This;
+import org.qi4j.api.value.ValueSerializer;
+import org.qi4j.spi.Qi4jSPI;
 import org.qi4j.spi.value.ValueSerializerAdapter;
 import org.qi4j.valueserialization.orgjson.OrgJsonValueSerializer.OrgJsonOutput;
 
@@ -30,7 +33,6 @@
 public class OrgJsonValueSerializer
     extends ValueSerializerAdapter<OrgJsonOutput>
 {
-
     /**
      * Helper to pass around the Writer alongside the JSONWriter so we can flush it onSerializationEnd.
      *
diff --git a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
index b3615af..ce84d66 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
@@ -34,6 +34,7 @@
 import org.qi4j.api.association.ManyAssociation;
 import org.qi4j.api.common.Optional;
 import org.qi4j.api.common.UseDefaults;
+import org.qi4j.api.composite.CompositeDescriptor;
 import org.qi4j.api.entity.EntityBuilder;
 import org.qi4j.api.entity.EntityComposite;
 import org.qi4j.api.entity.EntityReference;
@@ -45,6 +46,7 @@
 import org.qi4j.api.value.ValueBuilder;
 import org.qi4j.api.value.ValueComposite;
 import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.api.value.ValueSerializer;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
 import org.qi4j.bootstrap.ServiceDeclaration;
@@ -66,7 +68,6 @@
 public abstract class AbstractValueCompositeSerializationTest
     extends AbstractQi4jTest
 {
-
     @Rule
     @SuppressWarnings( "PublicField" )
     public TestName testName = new TestName();
@@ -87,14 +88,18 @@
     {
         module.injectTo( this );
     }
+
     @Service
     @SuppressWarnings( "ProtectedField" )
     protected ValueSerialization valueSerialization;
 
     @Test
-    public void givenValueCompositeWhenSerializingAndDeserializingExpectEquals()
+    public void givenValueCompositeAndOldMapFormatWhenSerializingAndDeserializingExpectEquals()
         throws Exception
     {
+        CompositeDescriptor descriptor = spi.compositeDescriptorFor( valueSerialization );
+        ValueSerializer.Options options = descriptor.metaInfo( ValueSerializer.Options.class );
+        options.put( ValueSerializer.Options.MAP_ENTRIES_AS_OBJECTS, Boolean.FALSE );
         UnitOfWork uow = module.newUnitOfWork();
         try
         {
@@ -128,6 +133,47 @@
         }
     }
 
+    @Test
+    public void givenValueCompositeAndNewMapFormatWhenSerializingAndDeserializingExpectEquals()
+        throws Exception
+    {
+        CompositeDescriptor descriptor = spi.compositeDescriptorFor( valueSerialization );
+        ValueSerializer.Options options = descriptor.metaInfo( ValueSerializer.Options.class );
+        options.put( ValueSerializer.Options.MAP_ENTRIES_AS_OBJECTS, Boolean.TRUE );
+        UnitOfWork uow = module.newUnitOfWork();
+        try
+        {
+            SomeValue some = buildSomeValue();
+
+            // Serialize using injected service
+            ByteArrayOutputStream output = new ByteArrayOutputStream();
+            valueSerialization.serialize( some, output );
+            String stateString = output.toString( "UTF-8" );
+
+            // Deserialize using Module API
+            SomeValue some2 = module.newValueFromSerializedState( SomeValue.class, stateString );
+
+            assertThat( "Same value toString", some.toString(), equalTo( some2.toString() ) );
+//            assertThat( "Same value", some, equalTo( some2 ) );
+            assertThat( "Same JSON value toString", stateString, equalTo( some2.toString() ) );
+            assertThat( "Same JSON value", some.customFoo().get() instanceof CustomFooValue, is( true ) );
+            assertThat( "Same JSON value explicit", some.customFooValue().get() instanceof CustomFooValue, is( true ) );
+
+            assertThat( "String Integer Map", some2.stringIntMap().get().get( "foo" ), equalTo( 42 ) );
+            assertThat( "String Value Map", some2.stringValueMap().get().get( "foo" ).internalVal(), equalTo( "Bar" ) );
+            assertThat( "Nested Entities", some2.barAssociation().get().cathedral().get(), equalTo( "bazar in barAssociation" ) );
+        }
+        catch( Exception ex )
+        {
+            throw ex;
+        }
+        finally
+        {
+            uow.discard();
+        }
+    }
+
+
     /**
      * @return a SomeValue ValueComposite whose state is populated with test data.
      */
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
index 329c8e5..bda3e30 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/qi4j/index/elasticsearch/ElasticSearchIndexer.java
@@ -211,7 +211,7 @@
                         }
                         else
                         {
-                            String serialized = valueSerializer.serialize( new Options().withoutTypeInfo(), value );
+                            String serialized = valueSerializer.serialize( value );
                             // TODO Theses tests are pretty fragile, find a better way to fix this, Jackson API should behave better
                             if( serialized.startsWith( "{" ) )
                             {
diff --git a/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/query/internal/RdfQueryParserImpl.java b/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/query/internal/RdfQueryParserImpl.java
index 122ce01..37d733d 100644
--- a/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/query/internal/RdfQueryParserImpl.java
+++ b/extensions/indexing-rdf/src/main/java/org/qi4j/index/rdf/query/internal/RdfQueryParserImpl.java
@@ -341,7 +341,7 @@
 
     private String createAndEscapeJSONString( Object value )
     {
-        return escapeJSONString( valueSerializer.serialize( new Options().withoutTypeInfo(), value ) );
+        return escapeJSONString( valueSerializer.serialize( value ) );
     }
 
     private String createRegexStringForContaining( String valueVariable, String containedString )
diff --git a/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueSerializationAssembler.java b/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueSerializationAssembler.java
index a0ee430..f37e53b 100644
--- a/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueSerializationAssembler.java
+++ b/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueSerializationAssembler.java
@@ -18,6 +18,7 @@
 import org.qi4j.api.structure.Application;
 import org.qi4j.api.structure.Module;
 import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.api.value.ValueSerializer;
 import org.qi4j.bootstrap.Assemblers;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
@@ -30,6 +31,7 @@
     extends Assemblers.Visibility<JacksonValueSerializationAssembler>
 {
     private Function<Application, Module> valuesModuleFinder;
+    private ValueSerializer.Options options = new ValueSerializer.Options();
 
     public JacksonValueSerializationAssembler withValuesModuleFinder( Function<Application, Module> valuesModuleFinder )
     {
@@ -37,22 +39,32 @@
         return this;
     }
 
+    public JacksonValueSerializationAssembler withOptions( ValueSerializer.Options options )
+    {
+        this.options = options;
+        return this;
+    }
+
     @Override
     public void assemble( ModuleAssembly module )
         throws AssemblyException
     {
         if( valuesModuleFinder == null )
         {
-            module.services( JacksonValueSerializationService.class ).
-                visibleIn( visibility() ).
-                taggedWith( ValueSerialization.Formats.JSON );
+            module.services( JacksonValueSerializationService.class )
+                .visibleIn( visibility() )
+                .taggedWith( ValueSerialization.Formats.JSON )
+                .setMetaInfo( options )
+            ;
         }
         else
         {
-            module.services( JacksonValueSerializationService.class ).
-                visibleIn( visibility() ).
-                taggedWith( ValueSerialization.Formats.JSON ).
-                setMetaInfo( valuesModuleFinder );
+            module.services( JacksonValueSerializationService.class )
+                .visibleIn( visibility() )
+                .taggedWith( ValueSerialization.Formats.JSON )
+                .setMetaInfo( valuesModuleFinder )
+                .setMetaInfo( options )
+            ;
         }
     }
 }
diff --git a/extensions/valueserialization-orgjson/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerializationAssembler.java b/extensions/valueserialization-orgjson/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerializationAssembler.java
index 82ed416..075d4ab 100644
--- a/extensions/valueserialization-orgjson/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerializationAssembler.java
+++ b/extensions/valueserialization-orgjson/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueSerializationAssembler.java
@@ -18,6 +18,7 @@
 import org.qi4j.api.structure.Application;
 import org.qi4j.api.structure.Module;
 import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.api.value.ValueSerializer;
 import org.qi4j.bootstrap.Assemblers;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
@@ -30,6 +31,7 @@
     extends Assemblers.Visibility<OrgJsonValueSerializationAssembler>
 {
     private Function<Application, Module> valuesModuleFinder;
+    private ValueSerializer.Options options = new ValueSerializer.Options();
 
     public OrgJsonValueSerializationAssembler withValuesModuleFinder( Function<Application, Module> valuesModuleFinder )
     {
@@ -37,22 +39,33 @@
         return this;
     }
 
+    public OrgJsonValueSerializationAssembler withOptions( ValueSerializer.Options options )
+    {
+        this.options = options;
+        return this;
+    }
+
+
     @Override
     public void assemble( ModuleAssembly module )
         throws AssemblyException
     {
         if( valuesModuleFinder == null )
         {
-            module.services( OrgJsonValueSerializationService.class ).
-                visibleIn( visibility() ).
-                taggedWith( ValueSerialization.Formats.JSON );
+            module.services( OrgJsonValueSerializationService.class )
+                .visibleIn( visibility() )
+                .taggedWith( ValueSerialization.Formats.JSON )
+                .setMetaInfo( options )
+            ;
         }
         else
         {
-            module.services( OrgJsonValueSerializationService.class ).
-                visibleIn( visibility() ).
-                taggedWith( ValueSerialization.Formats.JSON ).
-                setMetaInfo( valuesModuleFinder );
+            module.services( OrgJsonValueSerializationService.class )
+                .visibleIn( visibility() )
+                .taggedWith( ValueSerialization.Formats.JSON )
+                .setMetaInfo( valuesModuleFinder )
+                .setMetaInfo( options )
+            ;
         }
     }
 }
diff --git a/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueSerializationAssembler.java b/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueSerializationAssembler.java
index 84c8f21..b6371c3 100644
--- a/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueSerializationAssembler.java
+++ b/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueSerializationAssembler.java
@@ -18,6 +18,7 @@
 import org.qi4j.api.structure.Application;
 import org.qi4j.api.structure.Module;
 import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.api.value.ValueSerializer;
 import org.qi4j.bootstrap.Assemblers;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.ModuleAssembly;
@@ -30,6 +31,7 @@
     extends Assemblers.Visibility<StaxValueSerializationAssembler>
 {
     private Function<Application, Module> valuesModuleFinder;
+    private ValueSerializer.Options options = new ValueSerializer.Options();
 
     public StaxValueSerializationAssembler withValuesModuleFinder( Function<Application, Module> valuesModuleFinder )
     {
@@ -37,22 +39,32 @@
         return this;
     }
 
+    public StaxValueSerializationAssembler withOptions( ValueSerializer.Options options )
+    {
+        this.options = options;
+        return this;
+    }
+
     @Override
     public void assemble( ModuleAssembly module )
         throws AssemblyException
     {
         if( valuesModuleFinder == null )
         {
-            module.services( StaxValueSerializationService.class ).
-                visibleIn( visibility() ).
-                taggedWith( ValueSerialization.Formats.XML );
+            module.services( StaxValueSerializationService.class )
+                .visibleIn( visibility() )
+                .taggedWith( ValueSerialization.Formats.XML )
+                .setMetaInfo( options )
+            ;
         }
         else
         {
-            module.services( StaxValueSerializationService.class ).
-                visibleIn( visibility() ).
-                taggedWith( ValueSerialization.Formats.XML ).
-                setMetaInfo( valuesModuleFinder );
+            module.services( StaxValueSerializationService.class )
+                .visibleIn( visibility() )
+                .taggedWith( ValueSerialization.Formats.XML )
+                .setMetaInfo( valuesModuleFinder )
+                .setMetaInfo( options )
+            ;
         }
     }
 }
diff --git a/libraries/rdf/src/main/java/org/qi4j/library/rdf/entity/EntityStateSerializer.java b/libraries/rdf/src/main/java/org/qi4j/library/rdf/entity/EntityStateSerializer.java
index b26fade..a7d403d 100644
--- a/libraries/rdf/src/main/java/org/qi4j/library/rdf/entity/EntityStateSerializer.java
+++ b/libraries/rdf/src/main/java/org/qi4j/library/rdf/entity/EntityStateSerializer.java
@@ -148,7 +148,7 @@
         }
         else
         {
-            String stringProperty = valueSerializer.serialize( new Options().withoutTypeInfo(), property );
+            String stringProperty = valueSerializer.serialize( property );
             final Literal object = valueFactory.createLiteral( stringProperty );
             graph.add( subject, predicate, object );
         }
