http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserBuilder.java
new file mode 100644
index 0000000..be8cc9c
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserBuilder.java
@@ -0,0 +1,484 @@
+// 
***************************************************************************************************************************
+// * 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.html;
+
+import java.util.*;
+
+import javax.xml.stream.*;
+import javax.xml.stream.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.xml.*;
+
+/**
+ * Builder class for building instances of HTML parsers.
+ */
+public class HtmlParserBuilder extends XmlParserBuilder {
+
+       /**
+        * Constructor, default settings.
+        */
+       public HtmlParserBuilder() {
+               super();
+       }
+
+       /**
+        * Constructor.
+        * @param propertyStore The initial configuration settings for this 
builder.
+        */
+       public HtmlParserBuilder(PropertyStore propertyStore) {
+               super(propertyStore);
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParser build() {
+               return new HtmlParser(propertyStore);
+       }
+
+
+       
//--------------------------------------------------------------------------------
+       // Properties
+       
//--------------------------------------------------------------------------------
+
+       @Override /* XmlParserBuilder */
+       public HtmlParserBuilder validating(boolean value) {
+               super.validating(value);
+               return this;
+       }
+
+       @Override /* XmlParserBuilder */
+       public HtmlParserBuilder reporter(XMLReporter value) {
+               super.reporter(value);
+               return this;
+       }
+
+       @Override /* XmlParserBuilder */
+       public HtmlParserBuilder resolver(XMLResolver value) {
+               super.resolver(value);
+               return this;
+       }
+
+       @Override /* XmlParserBuilder */
+       public HtmlParserBuilder eventAllocator(XMLEventAllocator value) {
+               super.eventAllocator(value);
+               return this;
+       }
+
+       @Override /* ParserBuilder */
+       public HtmlParserBuilder trimStrings(boolean value) {
+               super.trimStrings(value);
+               return this;
+       }
+
+       @Override /* ParserBuilder */
+       public HtmlParserBuilder strict(boolean value) {
+               super.strict(value);
+               return this;
+       }
+
+       @Override /* ParserBuilder */
+       public HtmlParserBuilder strict() {
+               super.strict();
+               return this;
+       }
+
+       @Override /* ParserBuilder */
+       public HtmlParserBuilder inputStreamCharset(String value) {
+               super.inputStreamCharset(value);
+               return this;
+       }
+
+       @Override /* ParserBuilder */
+       public HtmlParserBuilder fileCharset(String value) {
+               super.fileCharset(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beansRequireDefaultConstructor(boolean value) {
+               super.beansRequireDefaultConstructor(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beansRequireSerializable(boolean value) {
+               super.beansRequireSerializable(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beansRequireSettersForGetters(boolean value) {
+               super.beansRequireSettersForGetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beansRequireSomeProperties(boolean value) {
+               super.beansRequireSomeProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanMapPutReturnsOldValue(boolean value) {
+               super.beanMapPutReturnsOldValue(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanConstructorVisibility(Visibility value) {
+               super.beanConstructorVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanClassVisibility(Visibility value) {
+               super.beanClassVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanFieldVisibility(Visibility value) {
+               super.beanFieldVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder methodVisibility(Visibility value) {
+               super.methodVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder useJavaBeanIntrospector(boolean value) {
+               super.useJavaBeanIntrospector(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder useInterfaceProxies(boolean value) {
+               super.useInterfaceProxies(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder ignoreUnknownBeanProperties(boolean value) {
+               super.ignoreUnknownBeanProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder ignoreUnknownNullBeanProperties(boolean value) 
{
+               super.ignoreUnknownNullBeanProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder ignorePropertiesWithoutSetters(boolean value) {
+               super.ignorePropertiesWithoutSetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder ignoreInvocationExceptionsOnGetters(boolean 
value) {
+               super.ignoreInvocationExceptionsOnGetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder ignoreInvocationExceptionsOnSetters(boolean 
value) {
+               super.ignoreInvocationExceptionsOnSetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder sortProperties(boolean value) {
+               super.sortProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder notBeanPackages(String...values) {
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder notBeanPackages(Collection<String> values) {
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setNotBeanPackages(String...values) {
+               super.setNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setNotBeanPackages(Collection<String> values) {
+               super.setNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeNotBeanPackages(String...values) {
+               super.removeNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeNotBeanPackages(Collection<String> 
values) {
+               super.removeNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder notBeanClasses(Class<?>...values) {
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder notBeanClasses(Collection<Class<?>> values) {
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setNotBeanClasses(Class<?>...values) {
+               super.setNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setNotBeanClasses(Collection<Class<?>> values) 
{
+               super.setNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeNotBeanClasses(Class<?>...values) {
+               super.removeNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeNotBeanClasses(Collection<Class<?>> 
values) {
+               super.removeNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanFilters(Class<?>...values) {
+               super.beanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanFilters(Collection<Class<?>> values) {
+               super.beanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setBeanFilters(Class<?>...values) {
+               super.setBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setBeanFilters(Collection<Class<?>> values) {
+               super.setBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeBeanFilters(Class<?>...values) {
+               super.removeBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeBeanFilters(Collection<Class<?>> values) 
{
+               super.removeBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder pojoSwaps(Class<?>...values) {
+               super.pojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder pojoSwaps(Collection<Class<?>> values) {
+               super.pojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setPojoSwaps(Class<?>...values) {
+               super.setPojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setPojoSwaps(Collection<Class<?>> values) {
+               super.setPojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removePojoSwaps(Class<?>...values) {
+               super.removePojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removePojoSwaps(Collection<Class<?>> values) {
+               super.removePojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder implClasses(Map<Class<?>,Class<?>> values) {
+               super.implClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public <T> CoreObjectBuilder implClass(Class<T> interfaceClass, Class<? 
extends T> implClass) {
+               super.implClass(interfaceClass, implClass);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanDictionary(Class<?>...values) {
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanDictionary(Collection<Class<?>> values) {
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setBeanDictionary(Class<?>...values) {
+               super.setBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder setBeanDictionary(Collection<Class<?>> values) 
{
+               super.setBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeFromBeanDictionary(Class<?>...values) {
+               super.removeFromBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeFromBeanDictionary(Collection<Class<?>> 
values) {
+               super.removeFromBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder beanTypePropertyName(String value) {
+               super.beanTypePropertyName(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder defaultParser(Class<?> value) {
+               super.defaultParser(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder locale(Locale value) {
+               super.locale(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder timeZone(TimeZone value) {
+               super.timeZone(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder mediaType(MediaType value) {
+               super.mediaType(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder debug(boolean value) {
+               super.debug(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder property(String name, Object value) {
+               super.property(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder properties(Map<String,Object> properties) {
+               super.properties(properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder addToProperty(String name, Object value) {
+               super.addToProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder putToProperty(String name, Object key, Object 
value) {
+               super.putToProperty(name, key, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder putToProperty(String name, Object value) {
+               super.putToProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder removeFromProperty(String name, Object value) {
+               super.removeFromProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder classLoader(ClassLoader classLoader) {
+               super.classLoader(classLoader);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlParserBuilder 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/html/HtmlParserContext.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
index 8ea06a2..b71eae0 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
@@ -18,10 +18,10 @@ import org.apache.juneau.xml.*;
 /**
  * Configurable properties on the {@link HtmlParser} 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'>
@@ -36,12 +36,12 @@ public final class HtmlParserContext extends 
XmlParserContext {
        /**
         * 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 HtmlParserContext(ContextFactory cf) {
-               super(cf);
+       public HtmlParserContext(PropertyStore ps) {
+               super(ps);
        }
 
        @Override /* Context */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
index 0223623..582abcd 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.html;
 
 import static org.apache.juneau.internal.ClassUtils.*;
+import static org.apache.juneau.serializer.SerializerContext.*;
 
 import java.lang.reflect.*;
 import java.util.*;
@@ -44,28 +45,36 @@ import org.apache.juneau.transform.*;
 @Produces(value="text/html+schema", contentType="text/html")
 public final class HtmlSchemaDocSerializer extends HtmlDocSerializer {
 
+       @SuppressWarnings("hiding")
+       final HtmlDocSerializerContext ctx;
+
        /**
         * Constructor.
+        * @param propertyStore The property store to use for creating the 
context for this serializer.
         */
-       public HtmlSchemaDocSerializer() {
-               setDetectRecursions(true);
-               setIgnoreRecursions(true);
+       public HtmlSchemaDocSerializer(PropertyStore propertyStore) {
+               super(propertyStore);
+               this.ctx = createContext(HtmlDocSerializerContext.class);
        }
 
        /**
         * Constructor.
-        *
-        * @param cf The context factory to use for creating the context for 
this serializer.
+        * @param propertyStore The property store to use for creating the 
context for this serializer.
+        * @param overrideProperties
         */
-       public HtmlSchemaDocSerializer(ContextFactory cf) {
-               getContextFactory().copyFrom(cf);
-               setDetectRecursions(true);
-               setIgnoreRecursions(true);
+       public HtmlSchemaDocSerializer(PropertyStore propertyStore, 
Map<String,Object> overrideProperties) {
+               super(propertyStore);
+               this.ctx = 
this.propertyStore.create(overrideProperties).getContext(HtmlDocSerializerContext.class);
+       }
+
+       @Override /* CoreObject */
+       protected ObjectMap getOverrideProperties() {
+               return 
super.getOverrideProperties().append(SERIALIZER_detectRecursions, 
true).append(SERIALIZER_ignoreRecursions, true);
        }
 
        @Override /* Serializer */
        public HtmlDocSerializerSession createSession(Object output, ObjectMap 
op, Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType) {
-               return new 
HtmlDocSerializerSession(getContext(HtmlDocSerializerContext.class), op, 
output, javaMethod, locale, timeZone, mediaType);
+               return new HtmlDocSerializerSession(ctx, op, output, 
javaMethod, locale, timeZone, mediaType);
        }
 
        @Override /* ISchemaSerializer */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index f66d57f..de4768e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.html;
 
 import static org.apache.juneau.html.HtmlSerializer.ContentResult.*;
-import static org.apache.juneau.html.HtmlSerializerContext.*;
+import static org.apache.juneau.serializer.SerializerContext.*;
 
 import java.io.*;
 import java.lang.reflect.*;
@@ -71,12 +71,10 @@ import org.apache.juneau.xml.annotation.*;
  *             String html = 
HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(someObject);
  *
  *             <jc>// Create a custom serializer that doesn't use whitespace 
and newlines</jc>
- *             HtmlSerializer serializer = <jk>new</jk> HtmlSerializer()
- *                     .setUseIndentation(<jk>false</jk>);
+ *             HtmlSerializer serializer = <jk>new</jk> 
HtmlSerializerBuider().ws().build();
  *
  *             <jc>// Same as above, except uses cloning</jc>
- *             HtmlSerializer serializer = 
HtmlSerializer.<jsf>DEFAULT</jsf>.clone()
- *                     .setUseIndentation(<jk>false</jk>);
+ *             HtmlSerializer serializer = 
HtmlSerializer.<jsf>DEFAULT</jsf>.builder().ws().build();
  *
  *             <jc>// Serialize POJOs to HTML</jc>
  *
@@ -132,30 +130,68 @@ import org.apache.juneau.xml.annotation.*;
 public class HtmlSerializer extends XmlSerializer {
 
        /** Default serializer, all default settings. */
-       public static final HtmlSerializer DEFAULT = new 
HtmlSerializer().lock();
+       public static final HtmlSerializer DEFAULT = new 
HtmlSerializer(PropertyStore.create());
 
        /** Default serializer, single quotes. */
-       public static final HtmlSerializer DEFAULT_SQ = new 
HtmlSerializer.Sq().lock();
+       public static final HtmlSerializer DEFAULT_SQ = new 
HtmlSerializer.Sq(PropertyStore.create());
 
        /** Default serializer, single quotes, whitespace added. */
-       public static final HtmlSerializer DEFAULT_SQ_READABLE = new 
HtmlSerializer.SqReadable().lock();
+       public static final HtmlSerializer DEFAULT_SQ_READABLE = new 
HtmlSerializer.SqReadable(PropertyStore.create());
+
 
        /** Default serializer, single quotes. */
        public static class Sq extends HtmlSerializer {
-               /** Constructor */
-               public Sq() {
-                       setQuoteChar('\'');
+
+               /**
+                * Constructor.
+                * @param propertyStore The property store containing all the 
settings for this object.
+                */
+               public Sq(PropertyStore propertyStore) {
+                       super(propertyStore);
+               }
+
+
+               @Override /* CoreObject */
+               protected ObjectMap getOverrideProperties() {
+                       return 
super.getOverrideProperties().append(SERIALIZER_quoteChar, '\'');
                }
        }
 
        /** Default serializer, single quotes, whitespace added. */
-       public static class SqReadable extends Sq {
-               /** Constructor */
-               public SqReadable() {
-                       setUseWhitespace(true);
+       public static class SqReadable extends HtmlSerializer {
+
+               /**
+                * Constructor.
+                * @param propertyStore The property store containing all the 
settings for this object.
+                */
+               public SqReadable(PropertyStore propertyStore) {
+                       super(propertyStore);
+               }
+
+               @Override /* CoreObject */
+               protected ObjectMap getOverrideProperties() {
+                       return 
super.getOverrideProperties().append(SERIALIZER_quoteChar, 
'\'').append(SERIALIZER_useWhitespace, true);
                }
        }
 
+
+       final HtmlSerializerContext ctx;
+       private volatile HtmlSchemaDocSerializer schemaSerializer;
+
+       /**
+        * Constructor.
+        * @param propertyStore The property store containing all the settings 
for this object.
+        */
+       public HtmlSerializer(PropertyStore propertyStore) {
+               super(propertyStore);
+               this.ctx = createContext(HtmlSerializerContext.class);
+       }
+
+       @Override /* CoreObject */
+       public HtmlSerializerBuilder builder() {
+               return new HtmlSerializerBuilder(propertyStore);
+       }
+
        /**
         * Main serialization routine.
         * @param session The serialization context object.
@@ -633,12 +669,9 @@ public class HtmlSerializer extends XmlSerializer {
         */
        @Override /* XmlSerializer */
        public HtmlSerializer getSchemaSerializer() {
-               try {
-                       return new 
HtmlSchemaDocSerializer(getContextFactory().clone());
-               } catch (CloneNotSupportedException e) {
-                       // Should never happen.
-                       throw new RuntimeException(e);
-               }
+               if (schemaSerializer == null)
+                       schemaSerializer = new 
HtmlSchemaDocSerializer(propertyStore, getOverrideProperties());
+               return schemaSerializer;
        }
 
 
@@ -648,7 +681,7 @@ public class HtmlSerializer extends XmlSerializer {
 
        @Override /* Serializer */
        public HtmlSerializerSession createSession(Object output, ObjectMap op, 
Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType) {
-               return new 
HtmlSerializerSession(getContext(HtmlSerializerContext.class), op, output, 
javaMethod, locale, timeZone, mediaType);
+               return new HtmlSerializerSession(ctx, op, output, javaMethod, 
locale, timeZone, mediaType);
        }
 
        @Override /* Serializer */
@@ -656,632 +689,4 @@ public class HtmlSerializer extends XmlSerializer {
                HtmlSerializerSession s = (HtmlSerializerSession)session;
                doSerialize(s, o, s.getWriter());
        }
-
-
-       
//--------------------------------------------------------------------------------
-       // Properties
-       
//--------------------------------------------------------------------------------
-
-       /**
-        * <b>Configuration property:</b>  Anchor text source.
-        * <p>
-        * <ul>
-        *      <li><b>Name:</b> <js>"HtmlSerializer.uriAnchorText"</js>
-        *      <li><b>Data type:</b> <code>String</code>
-        *      <li><b>Default:</b> <js>"toString"</js>
-        *      <li><b>Session-overridable:</b> <jk>true</jk>
-        * </ul>
-        * <p>
-        * When creating anchor tags (e.g. <code><xt>&lt;a</xt> 
<xa>href</xa>=<xs>'...'</xs><xt>&gt;</xt>text<xt>&lt;/a&gt;</xt></code>)
-        *      in HTML, this setting defines what to set the inner text to.
-        * <p>
-        * Possible values:
-        * <ul class='spaced-list'>
-        *      <li>{@link HtmlSerializerContext#TO_STRING} / 
<js>"toString"</js> - Set to whatever is returned by {@link #toString()} on the 
object.
-        *      <li>{@link HtmlSerializerContext#URI} / <js>"uri"</js> - Set to 
the URI value.
-        *      <li>{@link HtmlSerializerContext#LAST_TOKEN} / 
<js>"lastToken"</js> - Set to the last token of the URI value.
-        *      <li>{@link HtmlSerializerContext#PROPERTY_NAME} / 
<js>"propertyName"</js> - Set to the bean property name.
-        *      <li>{@link HtmlSerializerContext#URI_ANCHOR} / 
<js>"uriAnchor"</js> - Set to the anchor of the URL.  (e.g. 
<js>"http://localhost:9080/foobar#anchorTextHere";</js>)
-        * </ul>
-        * <p>
-        * <h5 class='section'>Notes:</h5>
-        * <ul>
-        *      <li>This is equivalent to calling 
<code>setProperty(<jsf>HTML_uriAnchorText</jsf>, value)</code>.
-        *      <li>This introduces a slight performance penalty.
-        * </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 HtmlSerializerContext#HTML_uriAnchorText
-        */
-       public HtmlSerializer setUriAnchorText(String value) throws 
LockedException {
-               return setProperty(HTML_uriAnchorText, value);
-       }
-
-       /**
-        * <b>Configuration property:</b>  Look for URLs in {@link String 
Strings}.
-        * <p>
-        * <ul>
-        *      <li><b>Name:</b> <js>"HtmlSerializer.detectLinksInStrings"</js>
-        *      <li><b>Data type:</b> <code>Boolean</code>
-        *      <li><b>Default:</b> <jk>true</jk>
-        *      <li><b>Session-overridable:</b> <jk>true</jk>
-        * </ul>
-        * <p>
-        * If a string looks like a URL (e.g. starts with <js>"http://";</js> or 
<js>"https://";</js>, then treat it like a URL
-        *      and make it into a hyperlink based on the rules specified by 
{@link HtmlSerializerContext#HTML_uriAnchorText}.
-        * <p>
-        * <h5 class='section'>Notes:</h5>
-        * <ul>
-        *      <li>This is equivalent to calling 
<code>setProperty(<jsf>HTML_detectLinksInStrings</jsf>, value)</code>.
-        *      <li>This introduces a slight performance penalty.
-        * </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 HtmlSerializerContext#HTML_detectLinksInStrings
-        */
-       public HtmlSerializer setDetectLinksInStrings(boolean value) throws 
LockedException {
-               return setProperty(HTML_detectLinksInStrings, value);
-       }
-
-       /**
-        * <b>Configuration property:</b>  Look for link labels in the 
<js>"label"</js> parameter of the URL.
-        * <p>
-        * <ul>
-        *      <li><b>Name:</b> 
<js>"HtmlSerializer.lookForLabelParameters"</js>
-        *      <li><b>Data type:</b> <code>Boolean</code>
-        *      <li><b>Default:</b> <jk>true</jk>
-        *      <li><b>Session-overridable:</b> <jk>true</jk>
-        * </ul>
-        * <p>
-        * If the URL has a label parameter (e.g. <js>"?label=foobar"</js>), 
then use that as the anchor text of the link.
-        * <p>
-        * The parameter name can be changed via the {@link 
HtmlSerializerContext#HTML_labelParameter} property.
-        * <p>
-        * <h5 class='section'>Notes:</h5>
-        * <ul>
-        *      <li>This is equivalent to calling 
<code>setProperty(<jsf>HTML_lookForLabelParameters</jsf>, value)</code>.
-        *      <li>This introduces a slight performance penalty.
-        * </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 HtmlSerializerContext#HTML_lookForLabelParameters
-        */
-       public HtmlSerializer setLookForLabelParameters(boolean value) throws 
LockedException {
-               return setProperty(HTML_lookForLabelParameters, value);
-       }
-
-       /**
-        * <b>Configuration property:</b>  The parameter name to use when using 
{@link HtmlSerializerContext#HTML_lookForLabelParameters}.
-        * <p>
-        * <ul>
-        *      <li><b>Name:</b> <js>"HtmlSerializer.labelParameter"</js>
-        *      <li><b>Data type:</b> <code>String</code>
-        *      <li><b>Default:</b> <js>"label"</js>
-        *      <li><b>Session-overridable:</b> <jk>true</jk>
-        * </ul>
-        * <p>
-        * <h5 class='section'>Notes:</h5>
-        * <ul>
-        *      <li>This is equivalent to calling 
<code>setProperty(<jsf>HTML_labelParameter</jsf>, value)</code>.
-        *      <li>This introduces a slight performance penalty.
-        * </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 HtmlSerializerContext#HTML_labelParameter
-        */
-       public HtmlSerializer setLabelParameter(String value) throws 
LockedException {
-               return setProperty(HTML_labelParameter, value);
-       }
-
-       /**
-        * <b>Configuration property:</b>  Add key/value headers on bean/map 
tables.
-        * <p>
-        * <ul>
-        *      <li><b>Name:</b> 
<js>"HtmlSerializer.addKeyValueTableHeaders"</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>
-        * <h5 class='section'>Notes:</h5>
-        * <ul>
-        *      <li>This is equivalent to calling 
<code>setProperty(<jsf>HTML_addKeyValueTableHeaders</jsf>, value)</code>.
-        *      <li>This introduces a slight performance penalty.
-        * </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 HtmlSerializerContext#HTML_addKeyValueTableHeaders
-        */
-       public HtmlSerializer setAddKeyValueTableHeaders(boolean value) throws 
LockedException {
-               return setProperty(HTML_addKeyValueTableHeaders, value);
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setMaxDepth(int value) throws LockedException {
-               super.setMaxDepth(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setInitialDepth(int value) throws LockedException 
{
-               super.setInitialDepth(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setDetectRecursions(boolean value) throws 
LockedException {
-               super.setDetectRecursions(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setIgnoreRecursions(boolean value) throws 
LockedException {
-               super.setIgnoreRecursions(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setUseWhitespace(boolean value) throws 
LockedException {
-               super.setUseWhitespace(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setAddBeanTypeProperties(boolean value) throws 
LockedException {
-               super.setAddBeanTypeProperties(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setQuoteChar(char value) throws LockedException {
-               super.setQuoteChar(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setTrimNullProperties(boolean value) throws 
LockedException {
-               super.setTrimNullProperties(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setTrimEmptyCollections(boolean value) throws 
LockedException {
-               super.setTrimEmptyCollections(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setTrimEmptyMaps(boolean value) throws 
LockedException {
-               super.setTrimEmptyMaps(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setTrimStrings(boolean value) throws 
LockedException {
-               super.setTrimStrings(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setRelativeUriBase(String value) throws 
LockedException {
-               super.setRelativeUriBase(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setAbsolutePathUriBase(String value) throws 
LockedException {
-               super.setAbsolutePathUriBase(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setSortCollections(boolean value) throws 
LockedException {
-               super.setSortCollections(value);
-               return this;
-       }
-
-       @Override /* Serializer */
-       public HtmlSerializer setSortMaps(boolean value) throws LockedException 
{
-               super.setSortMaps(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeansRequireDefaultConstructor(boolean value) 
throws LockedException {
-               super.setBeansRequireDefaultConstructor(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeansRequireSerializable(boolean value) throws 
LockedException {
-               super.setBeansRequireSerializable(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeansRequireSettersForGetters(boolean value) 
throws LockedException {
-               super.setBeansRequireSettersForGetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeansRequireSomeProperties(boolean value) 
throws LockedException {
-               super.setBeansRequireSomeProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeanMapPutReturnsOldValue(boolean value) 
throws LockedException {
-               super.setBeanMapPutReturnsOldValue(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeanConstructorVisibility(Visibility value) 
throws LockedException {
-               super.setBeanConstructorVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeanClassVisibility(Visibility value) throws 
LockedException {
-               super.setBeanClassVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeanFieldVisibility(Visibility value) throws 
LockedException {
-               super.setBeanFieldVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setMethodVisibility(Visibility value) throws 
LockedException {
-               super.setMethodVisibility(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setUseJavaBeanIntrospector(boolean value) throws 
LockedException {
-               super.setUseJavaBeanIntrospector(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setUseInterfaceProxies(boolean value) throws 
LockedException {
-               super.setUseInterfaceProxies(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setIgnoreUnknownBeanProperties(boolean value) 
throws LockedException {
-               super.setIgnoreUnknownBeanProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setIgnoreUnknownNullBeanProperties(boolean value) 
throws LockedException {
-               super.setIgnoreUnknownNullBeanProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setIgnorePropertiesWithoutSetters(boolean value) 
throws LockedException {
-               super.setIgnorePropertiesWithoutSetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setIgnoreInvocationExceptionsOnGetters(boolean 
value) throws LockedException {
-               super.setIgnoreInvocationExceptionsOnGetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setIgnoreInvocationExceptionsOnSetters(boolean 
value) throws LockedException {
-               super.setIgnoreInvocationExceptionsOnSetters(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setSortProperties(boolean value) throws 
LockedException {
-               super.setSortProperties(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setNotBeanPackages(String...values) throws 
LockedException {
-               super.setNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.setNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addNotBeanPackages(String...values) throws 
LockedException {
-               super.addNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.addNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeNotBeanPackages(String...values) throws 
LockedException {
-               super.removeNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeNotBeanPackages(Collection<String> values) 
throws LockedException {
-               super.removeNotBeanPackages(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.setNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.setNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.addNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.addNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeNotBeanClasses(Class<?>...values) throws 
LockedException {
-               super.removeNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeNotBeanClasses(Collection<Class<?>> values) 
throws LockedException {
-               super.removeNotBeanClasses(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeanFilters(Class<?>...values) throws 
LockedException {
-               super.setBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeanFilters(Collection<Class<?>> values) 
throws LockedException {
-               super.setBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addBeanFilters(Class<?>...values) throws 
LockedException {
-               super.addBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addBeanFilters(Collection<Class<?>> values) 
throws LockedException {
-               super.addBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeBeanFilters(Class<?>...values) throws 
LockedException {
-               super.removeBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeBeanFilters(Collection<Class<?>> values) 
throws LockedException {
-               super.removeBeanFilters(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setPojoSwaps(Class<?>...values) throws 
LockedException {
-               super.setPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setPojoSwaps(Collection<Class<?>> values) throws 
LockedException {
-               super.setPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addPojoSwaps(Class<?>...values) throws 
LockedException {
-               super.addPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addPojoSwaps(Collection<Class<?>> values) throws 
LockedException {
-               super.addPojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removePojoSwaps(Class<?>...values) throws 
LockedException {
-               super.removePojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removePojoSwaps(Collection<Class<?>> values) 
throws LockedException {
-               super.removePojoSwaps(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer 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 HtmlSerializer setBeanDictionary(Class<?>...values) throws 
LockedException {
-               super.setBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeanDictionary(Collection<Class<?>> values) 
throws LockedException {
-               super.setBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addToBeanDictionary(Class<?>...values) throws 
LockedException {
-               super.addToBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addToBeanDictionary(Collection<Class<?>> values) 
throws LockedException {
-               super.addToBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeFromBeanDictionary(Class<?>...values) 
throws LockedException {
-               super.removeFromBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeFromBeanDictionary(Collection<Class<?>> 
values) throws LockedException {
-               super.removeFromBeanDictionary(values);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setBeanTypePropertyName(String value) throws 
LockedException {
-               super.setBeanTypePropertyName(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setDefaultParser(Class<?> value) throws 
LockedException {
-               super.setDefaultParser(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setLocale(Locale value) throws LockedException {
-               super.setLocale(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setTimeZone(TimeZone value) throws 
LockedException {
-               super.setTimeZone(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setMediaType(MediaType value) throws 
LockedException {
-               super.setMediaType(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setDebug(boolean value) throws LockedException {
-               super.setDebug(value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setProperty(String name, Object value) throws 
LockedException {
-               super.setProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer setProperties(ObjectMap properties) throws 
LockedException {
-               super.setProperties(properties);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer addToProperty(String name, Object value) throws 
LockedException {
-               super.addToProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer putToProperty(String name, Object key, Object 
value) throws LockedException {
-               super.putToProperty(name, key, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer putToProperty(String name, Object value) throws 
LockedException {
-               super.putToProperty(name, value);
-               return this;
-       }
-
-       @Override /* CoreApi */
-       public HtmlSerializer removeFromProperty(String name, Object value) 
throws LockedException {
-               super.removeFromProperty(name, value);
-               return this;
-       }
-
-
-       
//--------------------------------------------------------------------------------
-       // Overridden methods
-       
//--------------------------------------------------------------------------------
-
-       @Override /* CoreApi */
-       public HtmlSerializer setClassLoader(ClassLoader classLoader) throws 
LockedException {
-               super.setClassLoader(classLoader);
-               return this;
-       }
-
-       @Override /* Lockable */
-       public HtmlSerializer lock() {
-               super.lock();
-               return this;
-       }
-
-       @Override /* Lockable */
-       public HtmlSerializer clone() {
-               HtmlSerializer c = (HtmlSerializer)super.clone();
-               return c;
-       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
new file mode 100644
index 0000000..7c9a923
--- /dev/null
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
@@ -0,0 +1,706 @@
+// 
***************************************************************************************************************************
+// * 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.html;
+
+import static org.apache.juneau.html.HtmlSerializerContext.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.xml.*;
+
+/**
+ * Builder class for building instances of HTML serializers.
+ */
+public class HtmlSerializerBuilder extends XmlSerializerBuilder {
+
+       /**
+        * Constructor, default settings.
+        */
+       public HtmlSerializerBuilder() {
+               super();
+       }
+
+       /**
+        * Constructor.
+        * @param propertyStore The initial configuration settings for this 
builder.
+        */
+       public HtmlSerializerBuilder(PropertyStore propertyStore) {
+               super(propertyStore);
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializer build() {
+               return new HtmlSerializer(propertyStore);
+       }
+
+
+       
//--------------------------------------------------------------------------------
+       // Properties
+       
//--------------------------------------------------------------------------------
+
+       /**
+        * <b>Configuration property:</b>  Anchor text source.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"HtmlSerializer.uriAnchorText"</js>
+        *      <li><b>Data type:</b> <code>String</code>
+        *      <li><b>Default:</b> <js>"toString"</js>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * When creating anchor tags (e.g. <code><xt>&lt;a</xt> 
<xa>href</xa>=<xs>'...'</xs><xt>&gt;</xt>text<xt>&lt;/a&gt;</xt></code>)
+        *      in HTML, this setting defines what to set the inner text to.
+        * <p>
+        * Possible values:
+        * <ul class='spaced-list'>
+        *      <li>{@link HtmlSerializerContext#TO_STRING} / 
<js>"toString"</js> - Set to whatever is returned by {@link #toString()} on the 
object.
+        *      <li>{@link HtmlSerializerContext#URI} / <js>"uri"</js> - Set to 
the URI value.
+        *      <li>{@link HtmlSerializerContext#LAST_TOKEN} / 
<js>"lastToken"</js> - Set to the last token of the URI value.
+        *      <li>{@link HtmlSerializerContext#PROPERTY_NAME} / 
<js>"propertyName"</js> - Set to the bean property name.
+        *      <li>{@link HtmlSerializerContext#URI_ANCHOR} / 
<js>"uriAnchor"</js> - Set to the anchor of the URL.  (e.g. 
<js>"http://localhost:9080/foobar#anchorTextHere";</js>)
+        * </ul>
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>HTML_uriAnchorText</jsf>, value)</code>.
+        *      <li>This introduces a slight performance penalty.
+        * </ul>
+        *
+        * @param value The new value for this property.
+        * @return This object (for method chaining).
+        * @see HtmlSerializerContext#HTML_uriAnchorText
+        */
+       public HtmlSerializerBuilder uriAnchorText(String value) {
+               return property(HTML_uriAnchorText, value);
+       }
+
+       /**
+        * <b>Configuration property:</b>  Look for URLs in {@link String 
Strings}.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"HtmlSerializer.detectLinksInStrings"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>true</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If a string looks like a URL (e.g. starts with <js>"http://";</js> or 
<js>"https://";</js>, then treat it like a URL
+        *      and make it into a hyperlink based on the rules specified by 
{@link HtmlSerializerContext#HTML_uriAnchorText}.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>HTML_detectLinksInStrings</jsf>, value)</code>.
+        *      <li>This introduces a slight performance penalty.
+        * </ul>
+        *
+        * @param value The new value for this property.
+        * @return This object (for method chaining).
+        * @see HtmlSerializerContext#HTML_detectLinksInStrings
+        */
+       public HtmlSerializerBuilder detectLinksInStrings(boolean value) {
+               return property(HTML_detectLinksInStrings, value);
+       }
+
+       /**
+        * <b>Configuration property:</b>  Look for link labels in the 
<js>"label"</js> parameter of the URL.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> 
<js>"HtmlSerializer.lookForLabelParameters"</js>
+        *      <li><b>Data type:</b> <code>Boolean</code>
+        *      <li><b>Default:</b> <jk>true</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * If the URL has a label parameter (e.g. <js>"?label=foobar"</js>), 
then use that as the anchor text of the link.
+        * <p>
+        * The parameter name can be changed via the {@link 
HtmlSerializerContext#HTML_labelParameter} property.
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>HTML_lookForLabelParameters</jsf>, value)</code>.
+        *      <li>This introduces a slight performance penalty.
+        * </ul>
+        *
+        * @param value The new value for this property.
+        * @return This object (for method chaining).
+        * @see HtmlSerializerContext#HTML_lookForLabelParameters
+        */
+       public HtmlSerializerBuilder lookForLabelParameters(boolean value) {
+               return property(HTML_lookForLabelParameters, value);
+       }
+
+       /**
+        * <b>Configuration property:</b>  The parameter name to use when using 
{@link HtmlSerializerContext#HTML_lookForLabelParameters}.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"HtmlSerializer.labelParameter"</js>
+        *      <li><b>Data type:</b> <code>String</code>
+        *      <li><b>Default:</b> <js>"label"</js>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>HTML_labelParameter</jsf>, value)</code>.
+        *      <li>This introduces a slight performance penalty.
+        * </ul>
+        *
+        * @param value The new value for this property.
+        * @return This object (for method chaining).
+        * @see HtmlSerializerContext#HTML_labelParameter
+        */
+       public HtmlSerializerBuilder labelParameter(String value) {
+               return property(HTML_labelParameter, value);
+       }
+
+       /**
+        * <b>Configuration property:</b>  Add key/value headers on bean/map 
tables.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> 
<js>"HtmlSerializer.addKeyValueTableHeaders"</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>
+        * <h5 class='section'>Notes:</h5>
+        * <ul>
+        *      <li>This is equivalent to calling 
<code>property(<jsf>HTML_addKeyValueTableHeaders</jsf>, value)</code>.
+        *      <li>This introduces a slight performance penalty.
+        * </ul>
+        *
+        * @param value The new value for this property.
+        * @return This object (for method chaining).
+        * @see HtmlSerializerContext#HTML_addKeyValueTableHeaders
+        */
+       public HtmlSerializerBuilder addKeyValueTableHeaders(boolean value) {
+               return property(HTML_addKeyValueTableHeaders, value);
+       }
+
+       @Override /* XmlSerializerBuilder */
+       public HtmlSerializerBuilder enableNamespaces(boolean value) {
+               super.enableNamespaces(value);
+               return this;
+       }
+
+       @Override /* XmlSerializerBuilder */
+       public HtmlSerializerBuilder autoDetectNamespaces(boolean value) {
+               super.autoDetectNamespaces(value);
+               return this;
+       }
+
+       @Override /* XmlSerializerBuilder */
+       public HtmlSerializerBuilder addNamespaceUrisToRoot(boolean value) {
+               super.addNamespaceUrisToRoot(value);
+               return this;
+       }
+
+       @Override /* XmlSerializerBuilder */
+       public HtmlSerializerBuilder defaultNamespace(String value) {
+               super.defaultNamespace(value);
+               return this;
+       }
+
+       @Override /* XmlSerializerBuilder */
+       public HtmlSerializerBuilder xsNamespace(Namespace value) {
+               super.xsNamespace(value);
+               return this;
+       }
+
+       @Override /* XmlSerializerBuilder */
+       public HtmlSerializerBuilder namespaces(Namespace...values) {
+               super.namespaces(values);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder maxDepth(int value) {
+               super.maxDepth(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder initialDepth(int value) {
+               super.initialDepth(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder detectRecursions(boolean value) {
+               super.detectRecursions(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder ignoreRecursions(boolean value) {
+               super.ignoreRecursions(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder useWhitespace(boolean value) {
+               super.useWhitespace(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder ws() {
+               super.ws();
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder addBeanTypeProperties(boolean value) {
+               super.addBeanTypeProperties(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder quoteChar(char value) {
+               super.quoteChar(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder sq() {
+               super.sq();
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder trimNullProperties(boolean value) {
+               super.trimNullProperties(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder trimEmptyCollections(boolean value) {
+               super.trimEmptyCollections(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder trimEmptyMaps(boolean value) {
+               super.trimEmptyMaps(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder trimStrings(boolean value) {
+               super.trimStrings(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder relativeUriBase(String value) {
+               super.relativeUriBase(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder absolutePathUriBase(String value) {
+               super.absolutePathUriBase(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder sortCollections(boolean value) {
+               super.sortCollections(value);
+               return this;
+       }
+
+       @Override /* SerializerBuilder */
+       public HtmlSerializerBuilder sortMaps(boolean value) {
+               super.sortMaps(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beansRequireDefaultConstructor(boolean 
value) {
+               super.beansRequireDefaultConstructor(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beansRequireSerializable(boolean value) {
+               super.beansRequireSerializable(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beansRequireSettersForGetters(boolean 
value) {
+               super.beansRequireSettersForGetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beansRequireSomeProperties(boolean value) {
+               super.beansRequireSomeProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanMapPutReturnsOldValue(boolean value) {
+               super.beanMapPutReturnsOldValue(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanConstructorVisibility(Visibility 
value) {
+               super.beanConstructorVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanClassVisibility(Visibility value) {
+               super.beanClassVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanFieldVisibility(Visibility value) {
+               super.beanFieldVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder methodVisibility(Visibility value) {
+               super.methodVisibility(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder useJavaBeanIntrospector(boolean value) {
+               super.useJavaBeanIntrospector(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder useInterfaceProxies(boolean value) {
+               super.useInterfaceProxies(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder ignoreUnknownBeanProperties(boolean value) 
{
+               super.ignoreUnknownBeanProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder ignoreUnknownNullBeanProperties(boolean 
value) {
+               super.ignoreUnknownNullBeanProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder ignorePropertiesWithoutSetters(boolean 
value) {
+               super.ignorePropertiesWithoutSetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder 
ignoreInvocationExceptionsOnGetters(boolean value) {
+               super.ignoreInvocationExceptionsOnGetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder 
ignoreInvocationExceptionsOnSetters(boolean value) {
+               super.ignoreInvocationExceptionsOnSetters(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder sortProperties(boolean value) {
+               super.sortProperties(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder notBeanPackages(String...values) {
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder notBeanPackages(Collection<String> values) 
{
+               super.notBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setNotBeanPackages(String...values) {
+               super.setNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setNotBeanPackages(Collection<String> 
values) {
+               super.setNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removeNotBeanPackages(String...values) {
+               super.removeNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removeNotBeanPackages(Collection<String> 
values) {
+               super.removeNotBeanPackages(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder notBeanClasses(Class<?>...values) {
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder notBeanClasses(Collection<Class<?>> 
values) {
+               super.notBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setNotBeanClasses(Class<?>...values) {
+               super.setNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setNotBeanClasses(Collection<Class<?>> 
values) {
+               super.setNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removeNotBeanClasses(Class<?>...values) {
+               super.removeNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removeNotBeanClasses(Collection<Class<?>> 
values) {
+               super.removeNotBeanClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanFilters(Class<?>...values) {
+               super.beanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanFilters(Collection<Class<?>> values) {
+               super.beanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setBeanFilters(Class<?>...values) {
+               super.setBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setBeanFilters(Collection<Class<?>> 
values) {
+               super.setBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removeBeanFilters(Class<?>...values) {
+               super.removeBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removeBeanFilters(Collection<Class<?>> 
values) {
+               super.removeBeanFilters(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder pojoSwaps(Class<?>...values) {
+               super.pojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder pojoSwaps(Collection<Class<?>> values) {
+               super.pojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setPojoSwaps(Class<?>...values) {
+               super.setPojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setPojoSwaps(Collection<Class<?>> values) {
+               super.setPojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removePojoSwaps(Class<?>...values) {
+               super.removePojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removePojoSwaps(Collection<Class<?>> 
values) {
+               super.removePojoSwaps(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder implClasses(Map<Class<?>,Class<?>> values) 
{
+               super.implClasses(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public <T> HtmlSerializerBuilder implClass(Class<T> interfaceClass, 
Class<? extends T> implClass) {
+               super.implClass(interfaceClass, implClass);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanDictionary(Class<?>...values) {
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanDictionary(Collection<Class<?>> 
values) {
+               super.beanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setBeanDictionary(Class<?>...values) {
+               super.setBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder setBeanDictionary(Collection<Class<?>> 
values) {
+               super.setBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder 
removeFromBeanDictionary(Class<?>...values) {
+               super.removeFromBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder 
removeFromBeanDictionary(Collection<Class<?>> values) {
+               super.removeFromBeanDictionary(values);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder beanTypePropertyName(String value) {
+               super.beanTypePropertyName(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder defaultParser(Class<?> value) {
+               super.defaultParser(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder locale(Locale value) {
+               super.locale(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder timeZone(TimeZone value) {
+               super.timeZone(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder mediaType(MediaType value) {
+               super.mediaType(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder debug(boolean value) {
+               super.debug(value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder property(String name, Object value) {
+               super.property(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder properties(Map<String,Object> properties) {
+               super.properties(properties);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder addToProperty(String name, Object value) {
+               super.addToProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder putToProperty(String name, Object key, 
Object value) {
+               super.putToProperty(name, key, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder putToProperty(String name, Object value) {
+               super.putToProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder removeFromProperty(String name, Object 
value) {
+               super.removeFromProperty(name, value);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder classLoader(ClassLoader classLoader) {
+               super.classLoader(classLoader);
+               return this;
+       }
+
+       @Override /* CoreObjectBuilder */
+       public HtmlSerializerBuilder 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/html/HtmlSerializerContext.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
index b2096c1..948ee18 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
@@ -19,10 +19,10 @@ import org.apache.juneau.xml.*;
 /**
  * Configurable properties on the {@link HtmlSerializer} 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'>
@@ -158,18 +158,18 @@ public class HtmlSerializerContext extends 
XmlSerializerContext {
        /**
         * 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 HtmlSerializerContext(ContextFactory cf) {
-               super(cf);
-               uriAnchorText = cf.getProperty(HTML_uriAnchorText, 
String.class, TO_STRING);
-               lookForLabelParameters = 
cf.getProperty(HTML_lookForLabelParameters, Boolean.class, true);
-               detectLinksInStrings = 
cf.getProperty(HTML_detectLinksInStrings, Boolean.class, true);
-               labelParameter = cf.getProperty(HTML_labelParameter, 
String.class, "label");
-               addKeyValueTableHeaders = 
cf.getProperty(HTML_addKeyValueTableHeaders, Boolean.class, false);
-               addBeanTypeProperties = 
cf.getProperty(HTML_addBeanTypeProperties, boolean.class, 
cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true));
+       public HtmlSerializerContext(PropertyStore ps) {
+               super(ps);
+               uriAnchorText = ps.getProperty(HTML_uriAnchorText, 
String.class, TO_STRING);
+               lookForLabelParameters = 
ps.getProperty(HTML_lookForLabelParameters, Boolean.class, true);
+               detectLinksInStrings = 
ps.getProperty(HTML_detectLinksInStrings, Boolean.class, true);
+               labelParameter = ps.getProperty(HTML_labelParameter, 
String.class, "label");
+               addKeyValueTableHeaders = 
ps.getProperty(HTML_addKeyValueTableHeaders, Boolean.class, false);
+               addBeanTypeProperties = 
ps.getProperty(HTML_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/html/HtmlSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index 1ce2efc..4c1ee2f 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -55,7 +55,7 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
         * @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/html/HtmlStrippedDocSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
index 7efdfa0..29f4c78 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializer.java
@@ -15,6 +15,7 @@ package org.apache.juneau.html;
 import java.lang.reflect.*;
 import java.util.*;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.serializer.*;
 
@@ -35,6 +36,14 @@ import org.apache.juneau.serializer.*;
 @Produces(value="text/html+stripped",contentType="text/html")
 public class HtmlStrippedDocSerializer extends HtmlSerializer {
 
+       /**
+        * Constructor.
+        * @param propertyStore The property store containing all the settings 
for this object.
+        */
+       public HtmlStrippedDocSerializer(PropertyStore propertyStore) {
+               super(propertyStore);
+       }
+
        
//---------------------------------------------------------------------------
        // Overridden methods
        
//---------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileImpl.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileImpl.java 
b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileImpl.java
index a4b2f89..e8da4c3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileImpl.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileImpl.java
@@ -705,7 +705,12 @@ public final class ConfigFileImpl extends ConfigFile {
 
        @Override /* ConfigFile */
        public ConfigFile getResolving() {
-               return 
getResolving(VarResolver.DEFAULT.clone().addVars(ConfigFileVar.class,IfVar.class,SwitchVar.class).setContextObject(ConfigFileVar.SESSION_config,
 this));
+               return getResolving(
+                       new VarResolverBuilder()
+                               .vars(SystemPropertiesVar.class, 
EnvVariablesVar.class, SwitchVar.class, IfVar.class, 
ConfigFileVar.class,IfVar.class,SwitchVar.class)
+                               .contextObject(ConfigFileVar.SESSION_config, 
this)
+                               .build()
+               );
        }
 
        /*
@@ -730,7 +735,7 @@ public final class ConfigFileImpl extends ConfigFile {
                }
        }
 
-       private void addChange(Set<String> changes, String section, String key, 
String oldVal, String newVal) {
+       private static void addChange(Set<String> changes, String section, 
String key, String oldVal, String newVal) {
                if (! StringUtils.isEquals(oldVal, newVal))
                        changes.add(getFullKey(section, key));
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileWrapped.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileWrapped.java 
b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileWrapped.java
index 44fdd0d..62f3899 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileWrapped.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigFileWrapped.java
@@ -39,9 +39,10 @@ public final class ConfigFileWrapped extends ConfigFile {
 
        ConfigFileWrapped(ConfigFileImpl cf, VarResolver vr) {
                this.cf = cf;
-               this.vs = vr.clone()
-                       .addVars(ConfigFileVar.class)
-                       .setContextObject(ConfigFileVar.SESSION_config, cf)
+               this.vs = vr.builder()
+                       .vars(ConfigFileVar.class)
+                       .contextObject(ConfigFileVar.SESSION_config, cf)
+                       .build()
                        .createSession();
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/ini/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ini/package.html 
b/juneau-core/src/main/java/org/apache/juneau/ini/package.html
index 4b0e158..a35c338 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ini/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/ini/package.html
@@ -596,7 +596,7 @@
        </p>
        <p class='bcode'>
        <jc>// Create a new REST client with JSON support</jc>
-       RestClient c = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, 
JsonParser.<jk>class</jk>);
+       RestClient c = <jk>new</jk> RestClientBuilder().build();
 
        <jc>// Retrieve config file through REST interface</jc>
        ConfigFile cf = 
c.doGet(<js>"http://localhost:10000/sample/config";</js>).getResponse(ConfigFileImpl.<jk>class</jk>);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/internal/JuneauLogger.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/internal/JuneauLogger.java 
b/juneau-core/src/main/java/org/apache/juneau/internal/JuneauLogger.java
index 021e4c3..b89e32c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/JuneauLogger.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/JuneauLogger.java
@@ -28,13 +28,15 @@ import org.apache.juneau.transforms.*;
  */
 public class JuneauLogger extends java.util.logging.Logger {
 
-       private static final WriterSerializer serializer = 
JsonSerializer.DEFAULT_LAX.clone()
-               .addPojoSwaps(
+       private static final WriterSerializer serializer = new 
JsonSerializerBuilder()
+               .pojoSwaps(
                        CalendarSwap.ISO8601DTZ.class,
                        DateSwap.ISO8601DTZ.class,
                        EnumerationSwap.class,
                        IteratorSwap.class
-               );
+               )
+               .simple()
+               .build();
 
        private static final ConcurrentHashMap<Class<?>,String> rbMap = new 
ConcurrentHashMap<Class<?>,String>();
 
@@ -120,7 +122,7 @@ public class JuneauLogger extends java.util.logging.Logger {
 
        /**
         * Logs a message with the specified {@link MessageFormat}-style 
arguments at {@link Level#INFO} level.
-        * 
+        *
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
@@ -131,7 +133,7 @@ public class JuneauLogger extends java.util.logging.Logger {
 
        /**
         * Logs a message with the specified {@link MessageFormat}-style 
arguments at {@link Level#CONFIG} level.
-        * 
+        *
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
@@ -142,7 +144,7 @@ public class JuneauLogger extends java.util.logging.Logger {
 
        /**
         * Logs a message with the specified {@link MessageFormat}-style 
arguments at {@link Level#FINE} level.
-        * 
+        *
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
@@ -153,7 +155,7 @@ public class JuneauLogger extends java.util.logging.Logger {
 
        /**
         * Logs a message with the specified {@link MessageFormat}-style 
arguments at {@link Level#FINER} level.
-        * 
+        *
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */
@@ -164,7 +166,7 @@ public class JuneauLogger extends java.util.logging.Logger {
 
        /**
         * Logs a message with the specified {@link MessageFormat}-style 
arguments at {@link Level#FINEST} level.
-        * 
+        *
         * @param msg The message to log.
         * @param args Optional {@link MessageFormat}-style arguments.
         */

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-core/src/main/java/org/apache/juneau/jso/JavaSerializedObjectParser.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/jso/JavaSerializedObjectParser.java
 
b/juneau-core/src/main/java/org/apache/juneau/jso/JavaSerializedObjectParser.java
deleted file mode 100644
index 92181bc..0000000
--- 
a/juneau-core/src/main/java/org/apache/juneau/jso/JavaSerializedObjectParser.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// 
***************************************************************************************************************************
-// * 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.jso;
-
-import java.io.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.parser.*;
-
-/**
- * Parses POJOs from HTTP responses as Java {@link ObjectInputStream 
ObjectInputStreams}.
- *
- * <h5 class='section'>Media types:</h5>
- * <p>
- * Consumes <code>Content-Type</code> types: 
<code>application/x-java-serialized-object</code>
- */
-@Consumes("application/x-java-serialized-object")
-public final class JavaSerializedObjectParser extends InputStreamParser {
-
-       
//--------------------------------------------------------------------------------
-       // Overridden methods
-       
//--------------------------------------------------------------------------------
-
-       @SuppressWarnings("unchecked")
-       @Override /* InputStreamParser */
-       protected <T> T doParse(ParserSession session, ClassMeta<T> type) 
throws Exception {
-               ObjectInputStream ois = new 
ObjectInputStream(session.getInputStream());
-               return (T)ois.readObject();
-       }
-
-
-       @Override /* Lockable */
-       public JavaSerializedObjectParser clone() {
-               try {
-                       return (JavaSerializedObjectParser)super.clone();
-               } 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/jso/JavaSerializedObjectSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/jso/JavaSerializedObjectSerializer.java
 
b/juneau-core/src/main/java/org/apache/juneau/jso/JavaSerializedObjectSerializer.java
deleted file mode 100644
index 4cfde6a..0000000
--- 
a/juneau-core/src/main/java/org/apache/juneau/jso/JavaSerializedObjectSerializer.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// 
***************************************************************************************************************************
-// * 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.jso;
-
-import java.io.*;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Serializes POJOs to HTTP responses as Java {@link ObjectOutputStream 
ObjectOutputStreams}.
- *
- * <h5 class='section'>Media types:</h5>
- * <p>
- * Handles <code>Accept</code> types: 
<code>application/x-java-serialized-object</code>
- * <p>
- * Produces <code>Content-Type</code> types: 
<code>application/x-java-serialized-object</code>
- */
-@Produces("application/x-java-serialized-object")
-public final class JavaSerializedObjectSerializer extends 
OutputStreamSerializer {
-
-       
//--------------------------------------------------------------------------------
-       // Overridden methods
-       
//--------------------------------------------------------------------------------
-
-       @Override /* OutputStreamSerializer */
-       protected void doSerialize(SerializerSession session, Object o) throws 
Exception {
-               ObjectOutputStream oos = new 
ObjectOutputStream(session.getOutputStream());
-               oos.writeObject(o);
-               oos.flush();
-               oos.close();
-       }
-
-       @Override /* Serializer */
-       public JavaSerializedObjectSerializer clone() {
-               try {
-                       return (JavaSerializedObjectSerializer)super.clone();
-               } catch (CloneNotSupportedException e) {
-                       throw new RuntimeException(e); // Shouldn't happen
-               }
-       }
-}

Reply via email to