http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
new file mode 100644
index 0000000..aab5768
--- /dev/null
+++ 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
@@ -0,0 +1,545 @@
+// 
***************************************************************************************************************************
+// * 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 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.json;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+
+/**
+ * Builder class for building instances of JSON Schema serializers.
+ */
+public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
+
+       /**
+        * Constructor, default settings.
+        */
+       public JsonSchemaSerializerBuilder() {
+               super();
+       }
+
+       /**
+        * Constructor.
+        * @param propertyStore The initial configuration settings for this 
builder.
+        */
+       public JsonSchemaSerializerBuilder(PropertyStore propertyStore) {
+               super(propertyStore);
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializer build() {
+               return new JsonSchemaSerializer(propertyStore);
+       }
+
+
+       
//--------------------------------------------------------------------------------
+       // Properties
+       
//--------------------------------------------------------------------------------
+
+       @Override /* JsonSerializerBuilder */
+       public JsonSchemaSerializerBuilder simple(boolean value) {
+               super.simple(value);
+               return this;
+       }
+
+       @Override /* JsonSerializerBuilder */
+       public JsonSchemaSerializerBuilder simple() {
+               super.simple();
+               return this;
+       }
+
+       @Override /* JsonSerializerBuilder */
+       public JsonSchemaSerializerBuilder escapeSolidus(boolean value) {
+               super.escapeSolidus(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder maxDepth(int value) {
+               super.maxDepth(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder initialDepth(int value) {
+               super.initialDepth(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder detectRecursions(boolean value) {
+               super.detectRecursions(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder ignoreRecursions(boolean value) {
+               super.ignoreRecursions(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder useWhitespace(boolean value) {
+               super.useWhitespace(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder ws() {
+               super.ws();
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder addBeanTypeProperties(boolean value) 
{
+               super.addBeanTypeProperties(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder quoteChar(char value) {
+               super.quoteChar(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder sq() {
+               super.sq();
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder trimNullProperties(boolean value) {
+               super.trimNullProperties(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder trimEmptyCollections(boolean value) {
+               super.trimEmptyCollections(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder trimEmptyMaps(boolean value) {
+               super.trimEmptyMaps(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder trimStrings(boolean value) {
+               super.trimStrings(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder relativeUriBase(String value) {
+               super.relativeUriBase(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder absolutePathUriBase(String value) {
+               super.absolutePathUriBase(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder sortCollections(boolean value) {
+               super.sortCollections(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSchemaSerializerBuilder sortMaps(boolean value) {
+               super.sortMaps(value);
+               return this;
+       }
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
beansRequireDefaultConstructor(boolean value) {
+               super.beansRequireDefaultConstructor(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beansRequireSerializable(boolean 
value) {
+               super.beansRequireSerializable(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
beansRequireSettersForGetters(boolean value) {
+               super.beansRequireSettersForGetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beansRequireSomeProperties(boolean 
value) {
+               super.beansRequireSomeProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanMapPutReturnsOldValue(boolean 
value) {
+               super.beanMapPutReturnsOldValue(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanConstructorVisibility(Visibility 
value) {
+               super.beanConstructorVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanClassVisibility(Visibility 
value) {
+               super.beanClassVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanFieldVisibility(Visibility 
value) {
+               super.beanFieldVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder methodVisibility(Visibility value) {
+               super.methodVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder useJavaBeanIntrospector(boolean 
value) {
+               super.useJavaBeanIntrospector(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder useInterfaceProxies(boolean value) {
+               super.useInterfaceProxies(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder ignoreUnknownBeanProperties(boolean 
value) {
+               super.ignoreUnknownBeanProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
ignoreUnknownNullBeanProperties(boolean value) {
+               super.ignoreUnknownNullBeanProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
ignorePropertiesWithoutSetters(boolean value) {
+               super.ignorePropertiesWithoutSetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
ignoreInvocationExceptionsOnGetters(boolean value) {
+               super.ignoreInvocationExceptionsOnGetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
ignoreInvocationExceptionsOnSetters(boolean value) {
+               super.ignoreInvocationExceptionsOnSetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder sortProperties(boolean value) {
+               super.sortProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder notBeanPackages(String...values) {
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder notBeanPackages(Collection<String> 
values) {
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder setNotBeanPackages(String...values) {
+               super.setNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
setNotBeanPackages(Collection<String> values) {
+               super.setNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
removeNotBeanPackages(String...values) {
+               super.removeNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
removeNotBeanPackages(Collection<String> values) {
+               super.removeNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder notBeanClasses(Class<?>...values) {
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder notBeanClasses(Collection<Class<?>> 
values) {
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder setNotBeanClasses(Class<?>...values) 
{
+               super.setNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
setNotBeanClasses(Collection<Class<?>> values) {
+               super.setNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
removeNotBeanClasses(Class<?>...values) {
+               super.removeNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
removeNotBeanClasses(Collection<Class<?>> values) {
+               super.removeNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanFilters(Class<?>...values) {
+               super.beanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanFilters(Collection<Class<?>> 
values) {
+               super.beanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder setBeanFilters(Class<?>...values) {
+               super.setBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder setBeanFilters(Collection<Class<?>> 
values) {
+               super.setBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder removeBeanFilters(Class<?>...values) 
{
+               super.removeBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
removeBeanFilters(Collection<Class<?>> values) {
+               super.removeBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder pojoSwaps(Class<?>...values) {
+               super.pojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder pojoSwaps(Collection<Class<?>> 
values) {
+               super.pojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder setPojoSwaps(Class<?>...values) {
+               super.setPojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder setPojoSwaps(Collection<Class<?>> 
values) {
+               super.setPojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder removePojoSwaps(Class<?>...values) {
+               super.removePojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder removePojoSwaps(Collection<Class<?>> 
values) {
+               super.removePojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder implClasses(Map<Class<?>,Class<?>> 
values) {
+               super.implClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public <T> JsonSchemaSerializerBuilder implClass(Class<T> 
interfaceClass, Class<? extends T> implClass) {
+               super.implClass(interfaceClass, implClass);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanDictionary(Class<?>...values) {
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanDictionary(Collection<Class<?>> 
values) {
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder setBeanDictionary(Class<?>...values) 
{
+               super.setBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
setBeanDictionary(Collection<Class<?>> values) {
+               super.setBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
removeFromBeanDictionary(Class<?>...values) {
+               super.removeFromBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder 
removeFromBeanDictionary(Collection<Class<?>> values) {
+               super.removeFromBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder beanTypePropertyName(String value) {
+               super.beanTypePropertyName(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder defaultParser(Class<?> value) {
+               super.defaultParser(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder locale(Locale value) {
+               super.locale(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder timeZone(TimeZone value) {
+               super.timeZone(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder mediaType(MediaType value) {
+               super.mediaType(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder debug(boolean value) {
+               super.debug(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder property(String name, Object value) {
+               super.property(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder properties(Map<String,Object> 
properties) {
+               super.properties(properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder addToProperty(String name, Object 
value) {
+               super.addToProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder putToProperty(String name, Object 
key, Object value) {
+               super.putToProperty(name, key, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder putToProperty(String name, Object 
value) {
+               super.putToProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder removeFromProperty(String name, 
Object value) {
+               super.removeFromProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder classLoader(ClassLoader classLoader) 
{
+               super.classLoader(classLoader);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSchemaSerializerBuilder apply(PropertyStore copyFrom) {
+               super.apply(copyFrom);
+               return this;
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
index 35c2b05..7464495 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -46,7 +46,7 @@ import org.apache.juneau.transform.*;
  * </ul>
  * <p>
  * The types above are considered "JSON-primitive" object types.  Any 
non-JSON-primitive object types are transformed
- *     into JSON-primitive object types through {@link 
org.apache.juneau.transform.PojoSwap PojoSwaps} associated through the {@link 
CoreApi#addPojoSwaps(Class...)}
+ *     into JSON-primitive object types through {@link 
org.apache.juneau.transform.PojoSwap PojoSwaps} associated through the {@link 
CoreObjectBuilder#pojoSwaps(Class...)}
  *     method.  Several default transforms are provided for transforming 
Dates, Enums, Iterators, etc...
  * <p>
  * This serializer provides several serialization options.  Typically, one of 
the predefined DEFAULT serializers will be sufficient.
@@ -75,13 +75,10 @@ import org.apache.juneau.transform.*;
  *     String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(someObject);
  *
  *     <jc>// Create a custom serializer for lax syntax using single quote 
characters</jc>
- *     JsonSerializer serializer = <jk>new</jk> JsonSerializer()
- *             .setSimpleMode(<jk>true</jk>)
- *             .setQuoteChar(<js>'\''</js>);
+ *     JsonSerializer serializer = <jk>new</jk> 
JsonSerializerBuilder().simple().sq().build();
  *
  *     <jc>// Clone an existing serializer and modify it to use 
single-quotes</jc>
- *     JsonSerializer serializer = JsonSerializer.<jsf>DEFAULT</jsf>.clone()
- *             .setQuoteChar(<js>'\''</js>);
+ *     JsonSerializer serializer = 
JsonSerializer.<jsf>DEFAULT</jsf>.builder().sq().build();
  *
  *     <jc>// Serialize a POJO to JSON</jc>
  *     String json = serializer.serialize(someObject);
@@ -91,46 +88,73 @@ import org.apache.juneau.transform.*;
 public class JsonSerializer extends WriterSerializer {
 
        /** Default serializer, all default settings.*/
-       public static final JsonSerializer DEFAULT = new 
JsonSerializer().lock();
+       public static final JsonSerializer DEFAULT = new 
JsonSerializer(PropertyStore.create());
 
        /** Default serializer, all default settings.*/
-       public static final JsonSerializer DEFAULT_READABLE = new 
Readable().lock();
+       public static final JsonSerializer DEFAULT_READABLE = new 
Readable(PropertyStore.create());
 
        /** Default serializer, single quotes, simple mode. */
-       public static final JsonSerializer DEFAULT_LAX = new Simple().lock();
+       public static final JsonSerializer DEFAULT_LAX = new 
Simple(PropertyStore.create());
 
        /** Default serializer, single quotes, simple mode, with whitespace. */
-       public static final JsonSerializer DEFAULT_LAX_READABLE = new 
SimpleReadable().lock();
+       public static final JsonSerializer DEFAULT_LAX_READABLE = new 
SimpleReadable(PropertyStore.create());
 
        /**
         * Default serializer, single quotes, simple mode, with whitespace and 
recursion detection.
         * Note that recursion detection introduces a small performance penalty.
         */
-       public static final JsonSerializer DEFAULT_LAX_READABLE_SAFE = new 
SimpleReadableSafe().lock();
+       public static final JsonSerializer DEFAULT_LAX_READABLE_SAFE = new 
SimpleReadableSafe(PropertyStore.create());
+
 
        /** Default serializer, with whitespace. */
        public static class Readable extends JsonSerializer {
-               /** Constructor */
-               public Readable() {
-                       setUseWhitespace(true);
+
+               /**
+                * Constructor.
+                * @param propertyStore The property store containing all the 
settings for this object.
+                */
+               public Readable(PropertyStore propertyStore) {
+                       super(propertyStore);
+               }
+
+               @Override /* CoreObject */
+               protected ObjectMap getOverrideProperties() {
+                       return 
super.getOverrideProperties().append(SERIALIZER_useWhitespace, true);
                }
        }
 
        /** Default serializer, single quotes, simple mode. */
        
@Produces(value="application/json+simple,text/json+simple",contentType="application/json")
        public static class Simple extends JsonSerializer {
-               /** Constructor */
-               public Simple() {
-                       setSimpleMode(true);
-                       setQuoteChar('\'');
+
+               /**
+                * Constructor.
+                * @param propertyStore The property store containing all the 
settings for this object.
+                */
+               public Simple(PropertyStore propertyStore) {
+                       super(propertyStore);
+               }
+
+               @Override /* CoreObject */
+               protected ObjectMap getOverrideProperties() {
+                       return 
super.getOverrideProperties().append(JSON_simpleMode, 
true).append(SERIALIZER_quoteChar, '\'');
                }
        }
 
        /** Default serializer, single quotes, simple mode, with whitespace. */
-       public static class SimpleReadable extends Simple {
-               /** Constructor */
-               public SimpleReadable() {
-                       setUseWhitespace(true);
+       public static class SimpleReadable extends JsonSerializer {
+
+               /**
+                * Constructor.
+                * @param propertyStore The property store containing all the 
settings for this object.
+                */
+               public SimpleReadable(PropertyStore propertyStore) {
+                       super(propertyStore);
+               }
+
+               @Override /* CoreObject */
+               protected ObjectMap getOverrideProperties() {
+                       return 
super.getOverrideProperties().append(JSON_simpleMode, 
true).append(SERIALIZER_quoteChar, '\'').append(SERIALIZER_useWhitespace, true);
                }
        }
 
@@ -138,13 +162,41 @@ public class JsonSerializer extends WriterSerializer {
         * Default serializer, single quotes, simple mode, with whitespace and 
recursion detection.
         * Note that recursion detection introduces a small performance penalty.
         */
-       public static class SimpleReadableSafe extends SimpleReadable {
-               /** Constructor */
-               public SimpleReadableSafe() {
-                       setDetectRecursions(true);
+       public static class SimpleReadableSafe extends JsonSerializer {
+
+               /**
+                * Constructor.
+                * @param propertyStore The property store containing all the 
settings for this object.
+                */
+               public SimpleReadableSafe(PropertyStore propertyStore) {
+                       super(propertyStore);
+               }
+
+               @Override /* CoreObject */
+               protected ObjectMap getOverrideProperties() {
+                       return 
super.getOverrideProperties().append(JSON_simpleMode, 
true).append(SERIALIZER_quoteChar, '\'').append(SERIALIZER_useWhitespace, 
true).append(SERIALIZER_detectRecursions, true);
                }
        }
 
+
+       private final JsonSerializerContext ctx;
+       private volatile JsonSchemaSerializer schemaSerializer;
+
+       /**
+        * Constructor.
+        * @param propertyStore The property store containing all the settings 
for this object.
+        */
+       public JsonSerializer(PropertyStore propertyStore) {
+               super(propertyStore);
+               this.ctx = createContext(JsonSerializerContext.class);
+//             this.schemaSerializer = new JsonSchemaSerializer(propertyStore, 
getOverrideProperties());
+       }
+
+       @Override /* CoreObject */
+       public JsonSerializerBuilder builder() {
+               return new JsonSerializerBuilder(propertyStore);
+       }
+
        /**
         * Workhorse method. Determines the type of object, and then calls the
         * appropriate type-specific serialization method.
@@ -317,8 +369,9 @@ public class JsonSerializer extends WriterSerializer {
         * @return The schema serializer.
         */
        public JsonSchemaSerializer getSchemaSerializer() {
-               JsonSchemaSerializer s = new 
JsonSchemaSerializer(getContextFactory());
-               return s;
+               if (schemaSerializer == null)
+                       schemaSerializer = new 
JsonSchemaSerializer(propertyStore, getOverrideProperties());
+               return schemaSerializer;
        }
 
 
@@ -328,7 +381,7 @@ public class JsonSerializer extends WriterSerializer {
 
        @Override /* Serializer */
        public JsonSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType) {
-               return new 
JsonSerializerSession(getContext(JsonSerializerContext.class), op, output, 
javaMethod, locale, timeZone, mediaType);
+               return new JsonSerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType);
        }
 
        @Override /* Serializer */
@@ -336,547 +389,4 @@ public class JsonSerializer extends WriterSerializer {
                JsonSerializerSession s = (JsonSerializerSession)session;
                serializeAnything(s, s.getWriter(), o, null, "root", null);
        }
-
-
-       
//--------------------------------------------------------------------------------
-       // Properties
-       
//--------------------------------------------------------------------------------
-
-       /**
-        * <b>Configuration property:</b>  Simple JSON mode.
-        * <p>
-        * <ul>
-        *      <li><b>Name:</b> <js>"JsonSerializer.simpleMode"</js>
-        *      <li><b>Data type:</b> <code>Boolean</code>
-        *      <li><b>Default:</b> <jk>false</jk>
-        *      <li><b>Session-overridable:</b> <jk>true</jk>
-        * </ul>
-        * <p>
-        * If <jk>true</jk>, JSON attribute names will only be quoted when 
necessary.
-        * Otherwise, they are always quoted.
-        * <p>
-        * <h5 class='section'>Notes:</h5>
-        * <ul>
-        *      <li>This is equivalent to calling 
<code>setProperty(<jsf>JSON_simpleMode</jsf>, value)</code>.
-        * </ul>
-        *
-        * @param value The new value for this property.
-        * @return This object (for method chaining).
-        * @throws LockedException If {@link #lock()} was called on this class.
-        * @see JsonSerializerContext#JSON_simpleMode
-        */
-       public JsonSerializer setSimpleMode(boolean value) throws 
LockedException {
-               return setProperty(JSON_simpleMode, value);
-       }
-
-       /**
-        * <b>Configuration property:</b>  Prefix solidus <js>'/'</js> 
characters with escapes.
-        * <p>
-        * <ul>
-        *      <li><b>Name:</b> <js>"JsonSerializer.escapeSolidus"</js>
-        *      <li><b>Data type:</b> <code>Boolean</code>
-        *      <li><b>Default:</b> <jk>false</jk>
-        *      <li><b>Session-overridable:</b> <jk>true</jk>
-        * </ul>
-        * <p>
-        * If <jk>true</jk>, solidus (e.g. slash) characters should be escaped.
-        * The JSON specification allows for either format.
-        * However, if you're embedding JSON in an HTML script tag, this 
setting prevents
-        *      confusion when trying to serialize <xt>&lt;\/script&gt;</xt>.
-        * <p>
-        * <h5 class='section'>Notes:</h5>
-        * <ul>
-        *      <li>This is equivalent to calling 
<code>setProperty(<jsf>JSON_escapeSolidus</jsf>, value)</code>.
-        * </ul>
-        *
-        * @param value The new value for this property.
-        * @return This object (for method chaining).
-        * @throws LockedException If {@link #lock()} was called on this class.
-        * @see JsonSerializerContext#JSON_escapeSolidus
-        */
-       public JsonSerializer setEscapeSolidus(boolean value) throws 
LockedException {
-               return setProperty(JSON_escapeSolidus, value);
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setMaxDepth(int value) throws LockedException {
-               super.setMaxDepth(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setInitialDepth(int value) throws LockedException 
{
-               super.setInitialDepth(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setDetectRecursions(boolean value) throws 
LockedException {
-               super.setDetectRecursions(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setIgnoreRecursions(boolean value) throws 
LockedException {
-               super.setIgnoreRecursions(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setUseWhitespace(boolean value) throws 
LockedException {
-               super.setUseWhitespace(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setAddBeanTypeProperties(boolean value) throws 
LockedException {
-               super.setAddBeanTypeProperties(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setQuoteChar(char value) throws LockedException {
-               super.setQuoteChar(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setTrimNullProperties(boolean value) throws 
LockedException {
-               super.setTrimNullProperties(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setTrimEmptyCollections(boolean value) throws 
LockedException {
-               super.setTrimEmptyCollections(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setTrimEmptyMaps(boolean value) throws 
LockedException {
-               super.setTrimEmptyMaps(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setTrimStrings(boolean value) throws 
LockedException {
-               super.setTrimStrings(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setRelativeUriBase(String value) throws 
LockedException {
-               super.setRelativeUriBase(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setAbsolutePathUriBase(String value) throws 
LockedException {
-               super.setAbsolutePathUriBase(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setSortCollections(boolean value) throws 
LockedException {
-               super.setSortCollections(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public JsonSerializer setSortMaps(boolean value) throws LockedException 
{
-               super.setSortMaps(value);
-               return this;
-       }
-       @Override /* CoreApi */
-       public JsonSerializer setBeansRequireDefaultConstructor(boolean value) 
throws LockedException {
-               super.setBeansRequireDefaultConstructor(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeansRequireSerializable(boolean value) throws 
LockedException {
-               super.setBeansRequireSerializable(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeansRequireSettersForGetters(boolean value) 
throws LockedException {
-               super.setBeansRequireSettersForGetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeansRequireSomeProperties(boolean value) 
throws LockedException {
-               super.setBeansRequireSomeProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanMapPutReturnsOldValue(boolean value) 
throws LockedException {
-               super.setBeanMapPutReturnsOldValue(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanConstructorVisibility(Visibility value) 
throws LockedException {
-               super.setBeanConstructorVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanClassVisibility(Visibility value) throws 
LockedException {
-               super.setBeanClassVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanFieldVisibility(Visibility value) throws 
LockedException {
-               super.setBeanFieldVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setMethodVisibility(Visibility value) throws 
LockedException {
-               super.setMethodVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setUseJavaBeanIntrospector(boolean value) throws 
LockedException {
-               super.setUseJavaBeanIntrospector(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setUseInterfaceProxies(boolean value) throws 
LockedException {
-               super.setUseInterfaceProxies(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setIgnoreUnknownBeanProperties(boolean value) 
throws LockedException {
-               super.setIgnoreUnknownBeanProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setIgnoreUnknownNullBeanProperties(boolean value) 
throws LockedException {
-               super.setIgnoreUnknownNullBeanProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setIgnorePropertiesWithoutSetters(boolean value) 
throws LockedException {
-               super.setIgnorePropertiesWithoutSetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setIgnoreInvocationExceptionsOnGetters(boolean 
value) throws LockedException {
-               super.setIgnoreInvocationExceptionsOnGetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setIgnoreInvocationExceptionsOnSetters(boolean 
value) throws LockedException {
-               super.setIgnoreInvocationExceptionsOnSetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setSortProperties(boolean value) throws 
LockedException {
-               super.setSortProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setNotBeanPackages(String...values) throws 
LockedException {
-               super.setNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.setNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addNotBeanPackages(String...values) throws 
LockedException {
-               super.addNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.addNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeNotBeanPackages(String...values) throws 
LockedException {
-               super.removeNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.removeNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.setNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.setNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.addNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.addNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.removeNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.removeNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanFilters(Class<?>...values) throws 
LockedException {
-               super.setBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanFilters(Collection<Class<?>> values) 
throws LockedException {
-               super.setBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addBeanFilters(Class<?>...values) throws 
LockedException {
-               super.addBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addBeanFilters(Collection<Class<?>> values) 
throws LockedException {
-               super.addBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeBeanFilters(Class<?>...values) throws 
LockedException {
-               super.removeBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeBeanFilters(Collection<Class<?>> values) 
throws LockedException {
-               super.removeBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setPojoSwaps(Class<?>...values) throws 
LockedException {
-               super.setPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setPojoSwaps(Collection<Class<?>> values) throws 
LockedException {
-               super.setPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addPojoSwaps(Class<?>...values) throws 
LockedException {
-               super.addPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addPojoSwaps(Collection<Class<?>> values) throws 
LockedException {
-               super.addPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removePojoSwaps(Class<?>...values) throws 
LockedException {
-               super.removePojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removePojoSwaps(Collection<Class<?>> values) 
throws LockedException {
-               super.removePojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setImplClasses(Map<Class<?>,Class<?>> values) 
throws LockedException {
-               super.setImplClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public <T> CoreApi addImplClass(Class<T> interfaceClass, Class<? 
extends T> implClass) throws LockedException {
-               super.addImplClass(interfaceClass, implClass);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanDictionary(Class<?>...values) throws 
LockedException {
-               super.setBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanDictionary(Collection<Class<?>> values) 
throws LockedException {
-               super.setBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addToBeanDictionary(Class<?>...values) throws 
LockedException {
-               super.addToBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addToBeanDictionary(Collection<Class<?>> values) 
throws LockedException {
-               super.addToBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeFromBeanDictionary(Class<?>...values) 
throws LockedException {
-               super.removeFromBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeFromBeanDictionary(Collection<Class<?>> 
values) throws LockedException {
-               super.removeFromBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setBeanTypePropertyName(String value) throws 
LockedException {
-               super.setBeanTypePropertyName(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setDefaultParser(Class<?> value) throws 
LockedException {
-               super.setDefaultParser(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setLocale(Locale value) throws LockedException {
-               super.setLocale(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setTimeZone(TimeZone value) throws 
LockedException {
-               super.setTimeZone(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setMediaType(MediaType value) throws 
LockedException {
-               super.setMediaType(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setDebug(boolean value) throws LockedException {
-               super.setDebug(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setProperty(String name, Object value) throws 
LockedException {
-               super.setProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer setProperties(ObjectMap properties) throws 
LockedException {
-               super.setProperties(properties);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer addToProperty(String name, Object value) throws 
LockedException {
-               super.addToProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer putToProperty(String name, Object key, Object 
value) throws LockedException {
-               super.putToProperty(name, key, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer putToProperty(String name, Object value) throws 
LockedException {
-               super.putToProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public JsonSerializer removeFromProperty(String name, Object value) 
throws LockedException {
-               super.removeFromProperty(name, value);
-               return this;
-       }
-
-
-       
//--------------------------------------------------------------------------------
-       // Overridden methods
-       
//--------------------------------------------------------------------------------
-
-       @Override /* CoreApi */
-       public JsonSerializer setClassLoader(ClassLoader classLoader) throws 
LockedException {
-               super.setClassLoader(classLoader);
-               return this;
-       }
-
-       @Override /* Lockable */
-       public JsonSerializer lock() {
-               super.lock();
-               return this;
-       }
-
-       @Override /* Lockable */
-       public JsonSerializer clone() {
-               try {
-                       JsonSerializer c = (JsonSerializer)super.clone();
-                       return c;
-               } catch (CloneNotSupportedException e) {
-                       throw new RuntimeException(e); // Shouldn't happen
-               }
-       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
new file mode 100644
index 0000000..b226459
--- /dev/null
+++ 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
@@ -0,0 +1,594 @@
+// 
***************************************************************************************************************************
+// * 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 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.json;
+
+import static org.apache.juneau.json.JsonSerializerContext.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * Builder class for building instances of JSON serializers.
+ */
+public class JsonSerializerBuilder extends SerializerBuilder {
+
+       /**
+        * Constructor, default settings.
+        */
+       public JsonSerializerBuilder() {
+               super();
+       }
+
+       /**
+        * Constructor.
+        * @param propertyStore The initial configuration settings for this 
builder.
+        */
+       public JsonSerializerBuilder(PropertyStore propertyStore) {
+               super(propertyStore);
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializer build() {
+               return new JsonSerializer(propertyStore);
+       }
+
+
+       
//--------------------------------------------------------------------------------
+       // Properties
+       
//--------------------------------------------------------------------------------
+
+       /**
+        * <b>Configuration property:</b>  Simple JSON mode.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"JsonSerializer.simpleMode"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>false</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If <jk>true</jk>, JSON attribute names will only be quoted when 
necessary.
+        * Otherwise, they are always quoted.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>JSON_simpleMode</jsf>, value)</code>.
+        * </ul>
+        *
+        * @param value The new value for this property.
+        * @return This object (for method chaining).
+        * @see JsonSerializerContext#JSON_simpleMode
+        */
+       public JsonSerializerBuilder simple(boolean value) {
+               return property(JSON_simpleMode, value);
+       }
+
+       /**
+        * Shortcut for calling <code>setSimpleMode(<jk>true</jk>).sq()</code>.
+        *
+        * @return This object (for method chaining).
+        */
+       public JsonSerializerBuilder simple() {
+               return simple(true).sq();
+       }
+
+       /**
+        * <b>Configuration property:</b>  Prefix solidus <js>'/'</js> 
characters with escapes.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"JsonSerializer.escapeSolidus"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>false</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If <jk>true</jk>, solidus (e.g. slash) characters should be escaped.
+        * The JSON specification allows for either format.
+        * However, if you're embedding JSON in an HTML script tag, this 
setting prevents
+        *      confusion when trying to serialize <xt>&lt;\/script&gt;</xt>.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>JSON_escapeSolidus</jsf>, value)</code>.
+        * </ul>
+        *
+        * @param value The new value for this property.
+        * @return This object (for method chaining).
+        * @see JsonSerializerContext#JSON_escapeSolidus
+        */
+       public JsonSerializerBuilder escapeSolidus(boolean value) {
+               return property(JSON_escapeSolidus, value);
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder maxDepth(int value) {
+               super.maxDepth(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder initialDepth(int value) {
+               super.initialDepth(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder detectRecursions(boolean value) {
+               super.detectRecursions(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder ignoreRecursions(boolean value) {
+               super.ignoreRecursions(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder useWhitespace(boolean value) {
+               super.useWhitespace(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder ws() {
+               super.ws();
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder addBeanTypeProperties(boolean value) {
+               super.addBeanTypeProperties(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder quoteChar(char value) {
+               super.quoteChar(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder sq() {
+               super.sq();
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder trimNullProperties(boolean value) {
+               super.trimNullProperties(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder trimEmptyCollections(boolean value) {
+               super.trimEmptyCollections(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder trimEmptyMaps(boolean value) {
+               super.trimEmptyMaps(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder trimStrings(boolean value) {
+               super.trimStrings(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder relativeUriBase(String value) {
+               super.relativeUriBase(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder absolutePathUriBase(String value) {
+               super.absolutePathUriBase(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder sortCollections(boolean value) {
+               super.sortCollections(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public JsonSerializerBuilder sortMaps(boolean value) {
+               super.sortMaps(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beansRequireDefaultConstructor(boolean 
value) {
+               super.beansRequireDefaultConstructor(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beansRequireSerializable(boolean value) {
+               super.beansRequireSerializable(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beansRequireSettersForGetters(boolean 
value) {
+               super.beansRequireSettersForGetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beansRequireSomeProperties(boolean value) {
+               super.beansRequireSomeProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanMapPutReturnsOldValue(boolean value) {
+               super.beanMapPutReturnsOldValue(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanConstructorVisibility(Visibility 
value) {
+               super.beanConstructorVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanClassVisibility(Visibility value) {
+               super.beanClassVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanFieldVisibility(Visibility value) {
+               super.beanFieldVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder methodVisibility(Visibility value) {
+               super.methodVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder useJavaBeanIntrospector(boolean value) {
+               super.useJavaBeanIntrospector(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder useInterfaceProxies(boolean value) {
+               super.useInterfaceProxies(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder ignoreUnknownBeanProperties(boolean value) 
{
+               super.ignoreUnknownBeanProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder ignoreUnknownNullBeanProperties(boolean 
value) {
+               super.ignoreUnknownNullBeanProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder ignorePropertiesWithoutSetters(boolean 
value) {
+               super.ignorePropertiesWithoutSetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder 
ignoreInvocationExceptionsOnGetters(boolean value) {
+               super.ignoreInvocationExceptionsOnGetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder 
ignoreInvocationExceptionsOnSetters(boolean value) {
+               super.ignoreInvocationExceptionsOnSetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder sortProperties(boolean value) {
+               super.sortProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder notBeanPackages(String...values) {
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder notBeanPackages(Collection<String> values) 
{
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setNotBeanPackages(String...values) {
+               super.setNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setNotBeanPackages(Collection<String> 
values) {
+               super.setNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removeNotBeanPackages(String...values) {
+               super.removeNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removeNotBeanPackages(Collection<String> 
values) {
+               super.removeNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder notBeanClasses(Class<?>...values) {
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder notBeanClasses(Collection<Class<?>> 
values) {
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setNotBeanClasses(Class<?>...values) {
+               super.setNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setNotBeanClasses(Collection<Class<?>> 
values) {
+               super.setNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removeNotBeanClasses(Class<?>...values) {
+               super.removeNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removeNotBeanClasses(Collection<Class<?>> 
values) {
+               super.removeNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanFilters(Class<?>...values) {
+               super.beanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanFilters(Collection<Class<?>> values) {
+               super.beanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setBeanFilters(Class<?>...values) {
+               super.setBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setBeanFilters(Collection<Class<?>> 
values) {
+               super.setBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removeBeanFilters(Class<?>...values) {
+               super.removeBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removeBeanFilters(Collection<Class<?>> 
values) {
+               super.removeBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder pojoSwaps(Class<?>...values) {
+               super.pojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder pojoSwaps(Collection<Class<?>> values) {
+               super.pojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setPojoSwaps(Class<?>...values) {
+               super.setPojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setPojoSwaps(Collection<Class<?>> values) {
+               super.setPojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removePojoSwaps(Class<?>...values) {
+               super.removePojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removePojoSwaps(Collection<Class<?>> 
values) {
+               super.removePojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder implClasses(Map<Class<?>,Class<?>> values) 
{
+               super.implClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public <T> JsonSerializerBuilder implClass(Class<T> interfaceClass, 
Class<? extends T> implClass) {
+               super.implClass(interfaceClass, implClass);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanDictionary(Class<?>...values) {
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanDictionary(Collection<Class<?>> 
values) {
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setBeanDictionary(Class<?>...values) {
+               super.setBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder setBeanDictionary(Collection<Class<?>> 
values) {
+               super.setBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder 
removeFromBeanDictionary(Class<?>...values) {
+               super.removeFromBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder 
removeFromBeanDictionary(Collection<Class<?>> values) {
+               super.removeFromBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder beanTypePropertyName(String value) {
+               super.beanTypePropertyName(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder defaultParser(Class<?> value) {
+               super.defaultParser(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder locale(Locale value) {
+               super.locale(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder timeZone(TimeZone value) {
+               super.timeZone(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder mediaType(MediaType value) {
+               super.mediaType(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder debug(boolean value) {
+               super.debug(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder property(String name, Object value) {
+               super.property(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder properties(Map<String,Object> properties) {
+               super.properties(properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder addToProperty(String name, Object value) {
+               super.addToProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder putToProperty(String name, Object key, 
Object value) {
+               super.putToProperty(name, key, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder putToProperty(String name, Object value) {
+               super.putToProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder removeFromProperty(String name, Object 
value) {
+               super.removeFromProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder classLoader(ClassLoader classLoader) {
+               super.classLoader(classLoader);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public JsonSerializerBuilder apply(PropertyStore copyFrom) {
+               super.apply(copyFrom);
+               return this;
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
index 9b0afc5..b8ecde8 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
@@ -18,10 +18,10 @@ import org.apache.juneau.serializer.*;
 /**
  * Configurable properties on the {@link JsonSerializer} class.
  * <p>
- * Context properties are set by calling {@link 
ContextFactory#setProperty(String, Object)} on the context factory
- * returned {@link CoreApi#getContextFactory()}.
+ * Context properties are set by calling {@link 
PropertyStore#setProperty(String, Object)} on the property store
+ * passed into the constructor.
  * <p>
- * See {@link ContextFactory} for more information about context properties.
+ * See {@link PropertyStore} for more information about context properties.
  *
  * <h5 class='section'>Inherited configurable properties:</h5>
  * <ul class='javahierarchy'>
@@ -92,15 +92,15 @@ public final class JsonSerializerContext extends 
SerializerContext {
        /**
         * Constructor.
         * <p>
-        * Typically only called from {@link ContextFactory#getContext(Class)}.
+        * Typically only called from {@link PropertyStore#getContext(Class)}.
         *
-        * @param cf The factory that created this context.
+        * @param ps The property store that created this context.
         */
-       public JsonSerializerContext(ContextFactory cf) {
-               super(cf);
-               simpleMode = cf.getProperty(JSON_simpleMode, boolean.class, 
false);
-               escapeSolidus = cf.getProperty(JSON_escapeSolidus, 
boolean.class, false);
-               addBeanTypeProperties = 
cf.getProperty(JSON_addBeanTypeProperties, boolean.class, 
cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
+       public JsonSerializerContext(PropertyStore ps) {
+               super(ps);
+               simpleMode = ps.getProperty(JSON_simpleMode, boolean.class, 
false);
+               escapeSolidus = ps.getProperty(JSON_escapeSolidus, 
boolean.class, false);
+               addBeanTypeProperties = 
ps.getProperty(JSON_addBeanTypeProperties, boolean.class, 
ps.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
        }
 
        @Override /* Context */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index ec5498f..dd8b8a1 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -40,7 +40,7 @@ public final class JsonSerializerSession extends 
SerializerSession {
         * @param output The output object.  See {@link 
JsonSerializerSession#getWriter()} for valid class types.
         * @param op The override properties.
         * These override any context properties defined in the context.
-        * @param javaMethod The java method that called this parser, usually 
the method in a REST servlet.
+        * @param javaMethod The java method that called this serializer, 
usually the method in a REST servlet.
         * @param locale The session locale.
         * If <jk>null</jk>, then the locale defined on the context is used.
         * @param timeZone The session timezone.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/json/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/package.html 
b/juneau-core/src/main/java/org/apache/juneau/json/package.html
index 50443bb..06e6db6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/json/package.html
@@ -276,11 +276,7 @@
                We could have also created a new serializer with the same 
settings using the following code:
        </p>
        <p class='bcode'>
-       JsonSerializer s = <jk>new</jk> JsonSerializer()
-               .setUseIndentation(<jk>true</jk>)
-               .setUseWhitespace(<jk>true</jk>)
-               .setSimpleMode(<jk>true</jk>)
-               .setQuoteChar(<js>'\''</js>);
+       JsonSerializer s = <jk>new</jk> 
JsonSerializerBuilder().simple().ws().sq().build();
        </p>
        
        <p>
@@ -648,7 +644,7 @@
                </p>
                <p class='bcode'>
        <jc>// Clone an existing serializer and set property for detecting 
recursions.</jc>
-       JsonSerializer s = 
JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.clone().setDetectRecursions(<jk>true</jk>);
+       JsonSerializer s = 
JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.builder().detectRecursions(<jk>true</jk>).build();
 
        <jc>// Create a recursive loop.</jc>
        A a = <jk>new</jk> A();
@@ -1277,7 +1273,7 @@
                </p>
                <p class='bcode'>
        <jc>// Create a client to handle JSON requests and responses.</jc>
-       RestClient client = <jk>new</jk> 
RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>);
+       RestClient client = <jk>new</jk> RestClientBuilder().build();
                </p>
                <p>
                        The client handles all content negotiation based on the 
registered serializers and parsers.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java 
b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
index 358f3d2..ce4db63 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
@@ -38,10 +38,27 @@ import org.apache.juneau.transform.*;
  */
 @SuppressWarnings({ "rawtypes", "unchecked" })
 @Consumes("octal/msgpack")
-public final class MsgPackParser extends InputStreamParser {
+public class MsgPackParser extends InputStreamParser {
 
        /** Default parser, all default settings.*/
-       public static final MsgPackParser DEFAULT = new MsgPackParser().lock();
+       public static final MsgPackParser DEFAULT = new 
MsgPackParser(PropertyStore.create());
+
+
+       private final MsgPackParserContext ctx;
+
+       /**
+        * Constructor.
+        * @param propertyStore The property store containing all the settings 
for this object.
+        */
+       public MsgPackParser(PropertyStore propertyStore) {
+               super(propertyStore);
+               this.ctx = createContext(MsgPackParserContext.class);
+       }
+
+       @Override /* CoreObject */
+       public MsgPackParserBuilder builder() {
+               return new MsgPackParserBuilder(propertyStore);
+       }
 
        /**
         * Workhorse method.
@@ -186,7 +203,7 @@ public final class MsgPackParser extends InputStreamParser {
 
        @Override /* Parser */
        public MsgPackParserSession createSession(Object input, ObjectMap op, 
Method javaMethod, Object outer, Locale locale, TimeZone timeZone, MediaType 
mediaType) {
-               return new 
MsgPackParserSession(getContext(MsgPackParserContext.class), op, input, 
javaMethod, outer, locale, timeZone, mediaType);
+               return new MsgPackParserSession(ctx, op, input, javaMethod, 
outer, locale, timeZone, mediaType);
        }
 
        @Override /* Parser */
@@ -196,425 +213,4 @@ public final class MsgPackParser extends 
InputStreamParser {
                T o = parseAnything(s, type, is, s.getOuter(), null);
                return o;
        }
-
-
-       
//--------------------------------------------------------------------------------
-       // Properties
-       
//--------------------------------------------------------------------------------
-
-       @Override /* Parser */
-       public MsgPackParser setTrimStrings(boolean value) throws 
LockedException {
-               super.setTrimStrings(value);
-               return this;
-       }
-
-       @Override /* Parser */
-       public MsgPackParser setStrict(boolean value) throws LockedException {
-               super.setStrict(value);
-               return this;
-       }
-
-       @Override /* Parser */
-       public MsgPackParser setInputStreamCharset(String value) throws 
LockedException {
-               super.setInputStreamCharset(value);
-               return this;
-       }
-
-       @Override /* Parser */
-       public MsgPackParser setFileCharset(String value) throws 
LockedException {
-               super.setFileCharset(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeansRequireDefaultConstructor(boolean value) 
throws LockedException {
-               super.setBeansRequireDefaultConstructor(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeansRequireSerializable(boolean value) throws 
LockedException {
-               super.setBeansRequireSerializable(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeansRequireSettersForGetters(boolean value) 
throws LockedException {
-               super.setBeansRequireSettersForGetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeansRequireSomeProperties(boolean value) 
throws LockedException {
-               super.setBeansRequireSomeProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanMapPutReturnsOldValue(boolean value) throws 
LockedException {
-               super.setBeanMapPutReturnsOldValue(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanConstructorVisibility(Visibility value) 
throws LockedException {
-               super.setBeanConstructorVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanClassVisibility(Visibility value) throws 
LockedException {
-               super.setBeanClassVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanFieldVisibility(Visibility value) throws 
LockedException {
-               super.setBeanFieldVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setMethodVisibility(Visibility value) throws 
LockedException {
-               super.setMethodVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setUseJavaBeanIntrospector(boolean value) throws 
LockedException {
-               super.setUseJavaBeanIntrospector(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setUseInterfaceProxies(boolean value) throws 
LockedException {
-               super.setUseInterfaceProxies(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setIgnoreUnknownBeanProperties(boolean value) 
throws LockedException {
-               super.setIgnoreUnknownBeanProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setIgnoreUnknownNullBeanProperties(boolean value) 
throws LockedException {
-               super.setIgnoreUnknownNullBeanProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setIgnorePropertiesWithoutSetters(boolean value) 
throws LockedException {
-               super.setIgnorePropertiesWithoutSetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setIgnoreInvocationExceptionsOnGetters(boolean 
value) throws LockedException {
-               super.setIgnoreInvocationExceptionsOnGetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setIgnoreInvocationExceptionsOnSetters(boolean 
value) throws LockedException {
-               super.setIgnoreInvocationExceptionsOnSetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setSortProperties(boolean value) throws 
LockedException {
-               super.setSortProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setNotBeanPackages(String...values) throws 
LockedException {
-               super.setNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.setNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addNotBeanPackages(String...values) throws 
LockedException {
-               super.addNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.addNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeNotBeanPackages(String...values) throws 
LockedException {
-               super.removeNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.removeNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.setNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.setNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.addNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.addNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.removeNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.removeNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanFilters(Class<?>...values) throws 
LockedException {
-               super.setBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanFilters(Collection<Class<?>> values) throws 
LockedException {
-               super.setBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addBeanFilters(Class<?>...values) throws 
LockedException {
-               super.addBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addBeanFilters(Collection<Class<?>> values) throws 
LockedException {
-               super.addBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeBeanFilters(Class<?>...values) throws 
LockedException {
-               super.removeBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeBeanFilters(Collection<Class<?>> values) 
throws LockedException {
-               super.removeBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setPojoSwaps(Class<?>...values) throws 
LockedException {
-               super.setPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setPojoSwaps(Collection<Class<?>> values) throws 
LockedException {
-               super.setPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addPojoSwaps(Class<?>...values) throws 
LockedException {
-               super.addPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addPojoSwaps(Collection<Class<?>> values) throws 
LockedException {
-               super.addPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removePojoSwaps(Class<?>...values) throws 
LockedException {
-               super.removePojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removePojoSwaps(Collection<Class<?>> values) 
throws LockedException {
-               super.removePojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setImplClasses(Map<Class<?>,Class<?>> values) 
throws LockedException {
-               super.setImplClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public <T> CoreApi addImplClass(Class<T> interfaceClass, Class<? 
extends T> implClass) throws LockedException {
-               super.addImplClass(interfaceClass, implClass);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanDictionary(Class<?>...values) throws 
LockedException {
-               super.setBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanDictionary(Collection<Class<?>> values) 
throws LockedException {
-               super.setBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addToBeanDictionary(Class<?>...values) throws 
LockedException {
-               super.addToBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addToBeanDictionary(Collection<Class<?>> values) 
throws LockedException {
-               super.addToBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeFromBeanDictionary(Class<?>...values) throws 
LockedException {
-               super.removeFromBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeFromBeanDictionary(Collection<Class<?>> 
values) throws LockedException {
-               super.removeFromBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setBeanTypePropertyName(String value) throws 
LockedException {
-               super.setBeanTypePropertyName(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setDefaultParser(Class<?> value) throws 
LockedException {
-               super.setDefaultParser(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setLocale(Locale value) throws LockedException {
-               super.setLocale(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setTimeZone(TimeZone value) throws LockedException 
{
-               super.setTimeZone(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setMediaType(MediaType value) throws 
LockedException {
-               super.setMediaType(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setDebug(boolean value) throws LockedException {
-               super.setDebug(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setProperty(String name, Object value) throws 
LockedException {
-               super.setProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser setProperties(ObjectMap properties) throws 
LockedException {
-               super.setProperties(properties);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser addToProperty(String name, Object value) throws 
LockedException {
-               super.addToProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser putToProperty(String name, Object key, Object 
value) throws LockedException {
-               super.putToProperty(name, key, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser putToProperty(String name, Object value) throws 
LockedException {
-               super.putToProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public MsgPackParser removeFromProperty(String name, Object value) 
throws LockedException {
-               super.removeFromProperty(name, value);
-               return this;
-       }
-
-
-       
//--------------------------------------------------------------------------------
-       // Overridden methods
-       
//--------------------------------------------------------------------------------
-
-       @Override /* CoreApi */
-       public MsgPackParser setClassLoader(ClassLoader classLoader) throws 
LockedException {
-               super.setClassLoader(classLoader);
-               return this;
-       }
-
-       @Override /* Lockable */
-       public MsgPackParser lock() {
-               super.lock();
-               return this;
-       }
-
-       @Override /* Lockable */
-       public MsgPackParser clone() {
-               try {
-                       return (MsgPackParser)super.clone();
-               } catch (CloneNotSupportedException e) {
-                       throw new RuntimeException(e); // Shouldn't happen
-               }
-       }
 }

Reply via email to