Trying to untangle the Options from all the methods call.
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 );
         }