You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2018/08/13 21:16:55 UTC

[juneau] branch master updated: JsonSchemaSerializer improvements.

This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 86bd487  JsonSchemaSerializer improvements.
86bd487 is described below

commit 86bd487e3f3c730331ba99784fbe96e5131033d2
Author: JamesBognar <ja...@apache.org>
AuthorDate: Mon Aug 13 17:16:16 2018 -0400

    JsonSchemaSerializer improvements.
---
 .../org/apache/juneau/a/rttests/RoundTripTest.java |   1 -
 .../java/org/apache/juneau/html/CommonTest.java    |   2 +-
 .../HtmlSchemaSerializerTest.java                  |   5 +-
 .../java/org/apache/juneau/jena/CommonTest.java    |   2 +-
 .../java/org/apache/juneau/json/CommonTest.java    |  12 +-
 .../juneau/json/JsonSchemaSerializerTest.java}     | 109 ++-
 ...lizerTest.java => JsonSchemaGeneratorTest.java} | 355 +++------
 .../java/org/apache/juneau/uon/Common_UonTest.java |   2 +-
 .../juneau/urlencoding/Common_UrlEncodingTest.java |   2 +-
 .../java/org/apache/juneau/xml/CommonTest.java     |   2 +-
 .../main/java/org/apache/juneau/BeanContext.java   |   2 +-
 .../java/org/apache/juneau/BeanContextBuilder.java |   2 +-
 ...ckage-info.java => BeanRecursionException.java} |  51 +-
 .../org/apache/juneau/BeanTraverseBuilder.java     | 559 ++++++++++++++
 .../org/apache/juneau/BeanTraverseContext.java     | 304 ++++++++
 .../org/apache/juneau/BeanTraverseSession.java     | 290 +++++++
 .../org/apache/juneau/html/HtmlDocSerializer.java  |   1 -
 .../HtmlSchemaDocSerializer.java                   |  20 +-
 .../HtmlSchemaDocSerializerSession.java            |  15 +-
 .../{htmlschema => html}/HtmlSchemaSerializer.java |  66 +-
 .../HtmlSchemaSerializerBuilder.java               |  30 +-
 .../HtmlSchemaSerializerSession.java               |  25 +-
 .../org/apache/juneau/html/HtmlSerializer.java     |   1 -
 .../org/apache/juneau/http/annotation/Body.java    |   4 +-
 .../apache/juneau/http/annotation/FormData.java    |   5 +-
 .../org/apache/juneau/http/annotation/Header.java  |   5 +-
 .../org/apache/juneau/http/annotation/Path.java    |   5 +-
 .../org/apache/juneau/http/annotation/Query.java   |   5 +-
 .../apache/juneau/http/annotation/Response.java    |   4 +-
 .../JsonSchemaSerializer.java}                     | 123 ++-
 .../JsonSchemaSerializerBuilder.java               |  29 +-
 .../JsonSchemaSerializerSession.java}              |  27 +-
 .../org/apache/juneau/json/JsonSerializer.java     |   3 +-
 .../apache/juneau/json/JsonSerializerSession.java  |   1 -
 ...emaSerializer.java => JsonSchemaGenerator.java} | 841 ++++++++++-----------
 .../JsonSchemaGeneratorBuilder.java}               | 371 +++------
 ...ession.java => JsonSchemaGeneratorSession.java} |  64 +-
 .../org/apache/juneau/jsonschema/TypeCategory.java |   4 +-
 .../juneau/jsonschema/annotation/JsonSchema.java   |   2 +-
 .../org/apache/juneau/serializer/Serializer.java   | 236 +-----
 .../juneau/serializer/SerializerBuilder.java       | 167 +---
 .../apache/juneau/serializer/SerializerGroup.java  |   2 +-
 .../juneau/serializer/SerializerGroupBuilder.java  | 167 +---
 .../juneau/serializer/SerializerSession.java       | 224 +-----
 .../apache/juneau/xml/XmlSerializerSession.java    |   7 +-
 juneau-doc/src/main/javadoc/overview.html          |  89 ++-
 .../src/main/resources/ReleaseNotes/5.1.0.07.html  |   2 +-
 .../src/main/resources/ReleaseNotes/7.2.0.html     |   7 -
 .../Topics/02.juneau-marshall/01.Serializers.html  |   5 +-
 .../02.CommonSerializer.html                       |  55 +-
 .../Topics/02.juneau-marshall/13.Recursion.html    |   4 +-
 .../19.JsonDetails/06.JsonSchema.html              |   2 +-
 .../21.HtmlDetails/09.HtmlSchema.html              |   4 +-
 .../02.juneau-marshall/29.BestPractices.html       |   2 +-
 .../06.RequestEchoResource.html                    |   4 +-
 .../juneau/examples/rest/RequestEchoResource.java  |   4 +-
 .../juneau/rest/client/RestClientBuilder.java      |  25 +-
 .../apache/juneau/rest/jaxrs/BasicProvider.java    |   1 -
 .../org/apache/juneau/rest/BasicRestConfig.java    |   2 -
 .../org/apache/juneau/rest/BasicRestServlet.java   |   3 +-
 .../java/org/apache/juneau/rest/RestContext.java   |   9 +-
 .../org/apache/juneau/rest/SwaggerGenerator.java   |   4 +-
 62 files changed, 2243 insertions(+), 2133 deletions(-)

diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
index f13617b..05574e7 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
@@ -22,7 +22,6 @@ import org.apache.juneau.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.jena.*;
 import org.apache.juneau.json.*;
-import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.msgpack.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
index 5d45719..88e24c1 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
@@ -394,7 +394,7 @@ public class CommonTest {
 			fail("Exception expected!");
 		} catch (Exception e) {
 			String msg = e.getLocalizedMessage();
-			assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+			assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
 		}
 
 		// Recursion detection, no ignore
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlSchemaSerializerTest.java
similarity index 96%
rename from juneau-core/juneau-core-test/src/test/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerTest.java
rename to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlSchemaSerializerTest.java
index 1fa78bb..48646cb 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/html/HtmlSchemaSerializerTest.java
@@ -10,7 +10,7 @@
 // * "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.htmlschema;
+package org.apache.juneau.html;
 
 import static org.junit.Assert.*;
 
@@ -19,6 +19,9 @@ import java.util.*;
 import org.apache.juneau.testutils.pojos.*;
 import org.junit.*;
 
+/**
+ * Most of the heavy testing for HtmlSchemaSerializer is done in JsonSchemaGeneratorTest.
+ */
 public class HtmlSchemaSerializerTest {
 
 	//====================================================================================================
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
index 2a4eadc..b7cbb6a 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
@@ -314,7 +314,7 @@ public class CommonTest {
 			fail("Exception expected!");
 		} catch (Exception e) {
 			String msg = e.getLocalizedMessage();
-			assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+			assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
 		}
 
 		// Recursion detection, no ignore
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
index bbf2bb0..b83767d 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/CommonTest.java
@@ -274,7 +274,7 @@ public class CommonTest {
 			fail("Exception expected!");
 		} catch (Exception e) {
 			String msg = e.getLocalizedMessage();
-			assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+			assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
 		}
 
 		// Recursion detection, no ignore
@@ -284,10 +284,12 @@ public class CommonTest {
 			fail("Exception expected!");
 		} catch (Exception e) {
 			String msg = e.getLocalizedMessage();
-			assertTrue(msg.contains("[0]root:org.apache.juneau.json.CommonTest$R1"));
-			assertTrue(msg.contains("->[1]r2:org.apache.juneau.json.CommonTest$R2"));
-			assertTrue(msg.contains("->[2]r3:org.apache.juneau.json.CommonTest$R3"));
-			assertTrue(msg.contains("->[3]r1:org.apache.juneau.json.CommonTest$R1"));
+			assertContains(msg,
+				"[0]root:org.apache.juneau.json.CommonTest$R1",
+				"->[1]r2:org.apache.juneau.json.CommonTest$R2",
+				"->[2]r3:org.apache.juneau.json.CommonTest$R3",
+				"->[3]r1:org.apache.juneau.json.CommonTest$R1"
+			);
 		}
 
 		s.ignoreRecursions();
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
old mode 100644
new mode 100755
similarity index 50%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
index 92f2dcc..ad4b494
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
@@ -1,59 +1,50 @@
-// ***************************************************************************************************************************
-// * 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.htmlschema;
-
-import java.lang.reflect.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.html.*;
-import org.apache.juneau.jsonschema.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Context object that lives for the duration of a single serialization of {@link HtmlSchemaDocSerializer} and its subclasses.
- *
- * <p>
- * This class is NOT thread safe.  It is meant to be discarded after one-time use.
- */
-public class HtmlSchemaSerializerSession extends HtmlSerializerSession {
-
-	private final JsonSchemaSerializerSession js;
-
-	/**
-	 * Create a new session using properties specified in the context.
-	 *
-	 * @param jsctx
-	 * 	The JSON-Schema serializer used to convert a POJO into JSON-Schema metadata.
-	 * @param ctx
-	 * 	The context creating this session object.
-	 * 	The context contains all the configuration settings for this object.
-	 * @param args
-	 * 	Runtime arguments.
-	 */
-	protected HtmlSchemaSerializerSession(JsonSchemaSerializer jsctx, HtmlSchemaSerializer ctx, SerializerSessionArgs args) {
-		super(ctx, args);
-		this.js = jsctx.createSession(args);
-	}
-
-	@Override /* SerializerSession */
-	protected void doSerialize(SerializerPipe out, Object o) throws Exception {
-		ObjectMap schema = js.getSchema(toClassMeta(o));
-		super.doSerialize(out, schema);
-	}
-
-	private ClassMeta<?> toClassMeta(Object o) {
-		if (o instanceof Type)
-			return getClassMeta((Type)o);
-		return getClassMetaForObject(o);
-	}
-}
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              *
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.json;
+
+import static org.junit.Assert.*;
+
+import org.apache.juneau.testutils.pojos.*;
+import org.junit.*;
+
+/**
+ * Most of the heavy testing for JsonSchemaSerializer is done in JsonSchemaGeneratorTest.
+ */
+public class JsonSchemaSerializerTest {
+
+	//====================================================================================================
+	// Simple objects
+	//====================================================================================================
+
+	@Test
+	public void simpleObjects() throws Exception {
+		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
+
+		assertEquals("{type:'integer',format:'int16'}", s.serialize((short)1));
+		assertEquals("{type:'integer',format:'int32'}", s.serialize(1));
+		assertEquals("{type:'integer',format:'int64'}", s.serialize(1l));
+		assertEquals("{type:'number',format:'float'}", s.serialize(1f));
+		assertEquals("{type:'number',format:'double'}", s.serialize(1d));
+		assertEquals("{type:'boolean'}", s.serialize(true));
+		assertEquals("{type:'string'}", s.serialize("foo"));
+		assertEquals("{type:'string'}", s.serialize(new StringBuilder("foo")));
+		assertEquals("{type:'string'}", s.serialize('c'));
+		assertEquals("{type:'string','enum':['one','two','three']}", s.serialize(TestEnumToString.ONE));
+		assertEquals("{type:'object',properties:{f1:{type:'string'}}}", s.serialize(new SimpleBean()));
+	}
+
+	public static class SimpleBean {
+		public String f1;
+	}
+
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaSerializerTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
similarity index 71%
rename from juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaSerializerTest.java
rename to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
index 6305dc6..3e478b0 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaSerializerTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.jsonschema;
 
 import static org.apache.juneau.testutils.TestUtils.*;
-import static org.junit.Assert.*;
 
 import java.util.*;
 
@@ -24,31 +23,15 @@ import org.apache.juneau.testutils.pojos.*;
 import org.apache.juneau.transform.*;
 import org.junit.*;
 
-public class JsonSchemaSerializerTest {
+public class JsonSchemaGeneratorTest {
 
 	//====================================================================================================
 	// Simple objects
 	//====================================================================================================
-	@Test
-	public void simpleObjects() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-
-		assertEquals("{type:'integer',format:'int16'}", s.serialize((short)1));
-		assertEquals("{type:'integer',format:'int32'}", s.serialize(1));
-		assertEquals("{type:'integer',format:'int64'}", s.serialize(1l));
-		assertEquals("{type:'number',format:'float'}", s.serialize(1f));
-		assertEquals("{type:'number',format:'double'}", s.serialize(1d));
-		assertEquals("{type:'boolean'}", s.serialize(true));
-		assertEquals("{type:'string'}", s.serialize("foo"));
-		assertEquals("{type:'string'}", s.serialize(new StringBuilder("foo")));
-		assertEquals("{type:'string'}", s.serialize('c'));
-		assertEquals("{type:'string','enum':['one','two','three']}", s.serialize(TestEnumToString.ONE));
-		assertEquals("{type:'object',properties:{f1:{type:'string'}}}", s.serialize(new SimpleBean()));
-	}
 
 	@Test
-	public void simpleObjects_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+	public void simpleObjects() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 
 		assertObjectEquals("{type:'integer',format:'int16'}", s.getSchema(short.class));
 		assertObjectEquals("{type:'integer',format:'int16'}", s.getSchema(Short.class));
@@ -80,31 +63,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void arrays1d() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-
-		assertEquals("{type:'array',items:{type:'integer',format:'int16'}}", s.serialize(new short[]{(short)1}));
-		assertEquals("{type:'array',items:{type:'integer',format:'int16'}}", s.serialize(new Short[]{(short)1}));
-		assertEquals("{type:'array',items:{type:'integer',format:'int32'}}", s.serialize(new int[]{1}));
-		assertEquals("{type:'array',items:{type:'integer',format:'int32'}}", s.serialize(new Integer[]{1}));
-		assertEquals("{type:'array',items:{type:'integer',format:'int64'}}", s.serialize(new long[]{1l}));
-		assertEquals("{type:'array',items:{type:'integer',format:'int64'}}", s.serialize(new Long[]{1l}));
-		assertEquals("{type:'array',items:{type:'number',format:'float'}}", s.serialize(new float[]{1f}));
-		assertEquals("{type:'array',items:{type:'number',format:'float'}}", s.serialize(new Float[]{1f}));
-		assertEquals("{type:'array',items:{type:'number',format:'double'}}", s.serialize(new double[]{1d}));
-		assertEquals("{type:'array',items:{type:'number',format:'double'}}", s.serialize(new Double[]{1d}));
-		assertEquals("{type:'array',items:{type:'boolean'}}", s.serialize(new boolean[]{true}));
-		assertEquals("{type:'array',items:{type:'boolean'}}", s.serialize(new Boolean[]{true}));
-		assertEquals("{type:'array',items:{type:'string'}}", s.serialize(new String[]{"foo"}));
-		assertEquals("{type:'array',items:{type:'string'}}", s.serialize(new StringBuilder[]{new StringBuilder("foo")}));
-		assertEquals("{type:'array',items:{type:'string'}}", s.serialize(new char[]{'c'}));
-		assertEquals("{type:'array',items:{type:'string'}}", s.serialize(new Character[]{'c'}));
-		assertEquals("{type:'array',items:{type:'string','enum':['one','two','three']}}", s.serialize(new TestEnumToString[]{TestEnumToString.ONE}));
-		assertEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}", s.serialize(new SimpleBean[]{new SimpleBean()}));
-	}
-
-	@Test
-	public void arrays1d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 
 		assertObjectEquals("{type:'array',items:{type:'integer',format:'int16'}}", s.getSchema(short[].class));
 		assertObjectEquals("{type:'array',items:{type:'integer',format:'int16'}}", s.getSchema(Short[].class));
@@ -128,31 +87,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void arrays2d() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-
-		assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16'}}}", s.serialize(new short[][]{{(short)1}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16'}}}", s.serialize(new Short[][]{{(short)1}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32'}}}", s.serialize(new int[][]{{1}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32'}}}", s.serialize(new Integer[][]{{1}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int64'}}}", s.serialize(new long[][]{{1l}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int64'}}}", s.serialize(new Long[][]{{1l}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'number',format:'float'}}}", s.serialize(new float[][]{{1f}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'number',format:'float'}}}", s.serialize(new Float[][]{{1f}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'number',format:'double'}}}", s.serialize(new double[][]{{1d}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'number',format:'double'}}}", s.serialize(new Double[][]{{1d}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'boolean'}}}", s.serialize(new boolean[][]{{true}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'boolean'}}}", s.serialize(new Boolean[][]{{true}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'string'}}}", s.serialize(new String[][]{{"foo"}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'string'}}}", s.serialize(new StringBuilder[][]{{new StringBuilder("foo")}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'string'}}}", s.serialize(new char[][]{{'c'}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'string'}}}", s.serialize(new Character[][]{{'c'}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['one','two','three']}}}", s.serialize(new TestEnumToString[][]{{TestEnumToString.ONE}}));
-		assertEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}}", s.serialize(new SimpleBean[][]{{new SimpleBean()}}));
-	}
-
-	@Test
-	public void arrays2d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16'}}}", s.getSchema(short[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16'}}}", s.getSchema(Short[][].class));
@@ -180,13 +115,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void simpleList() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-		assertEquals("{type:'array',items:{type:'integer',format:'int32'}}", s.serialize(new SimpleList()));
-	}
-
-	@Test
-	public void simpleList_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 		assertObjectEquals("{type:'array',items:{type:'integer',format:'int32'}}", s.getSchema(SimpleList.class));
 	}
 
@@ -195,13 +124,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void simpleList2d() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-		assertEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32'}}}", s.serialize(new Simple2dList()));
-	}
-
-	@Test
-	public void simpleList2d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32'}}}", s.getSchema(Simple2dList.class));
 	}
 
@@ -214,13 +137,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void beanList() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-		assertEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}", s.serialize(new BeanList()));
-	}
-
-	@Test
-	public void beanList_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}", s.getSchema(BeanList.class));
 	}
 
@@ -229,13 +146,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void beanList2d() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-		assertEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}}", s.serialize(new BeanList2d()));
-	}
-
-	@Test
-	public void beanList2d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}}", s.getSchema(BeanList2d.class));
 	}
 
@@ -248,13 +159,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void beanMap() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-		assertEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}", s.serialize(new BeanMap()));
-	}
-
-	@Test
-	public void beanMap_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}", s.getSchema(BeanMap.class));
 	}
 
@@ -263,13 +168,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void beanMap2d() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE;
-		assertEquals("{type:'object',additionalProperties:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}}", s.serialize(new BeanMap2d()));
-	}
-
-	@Test
-	public void beanMap2d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}}", s.getSchema(BeanMap2d.class));
 	}
 
@@ -283,46 +182,28 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void useBeanDefs() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build();
-		assertEquals("{'$ref':'#/definitions/SimpleBean'}", s.serialize(new SimpleBean()));
-	}
-
-	@Test
-	public void useBeanDefs_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
 		assertObjectEquals("{'$ref':'#/definitions/SimpleBean'}", s.getSchema(SimpleBean.class));
 		assertObjectEquals("{SimpleBean:{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
 	}
 
 	@Test
 	public void useBeanDefs_beanList() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build();
-		assertEquals("{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}", s.serialize(new BeanList()));
-	}
-
-	@Test
-	public void useBeanDefs_beanList_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
 		assertObjectEquals("{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}", s.getSchema(BeanList.class));
 		assertObjectEquals("{SimpleBean:{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
 	}
 
 	@Test
 	public void useBeanDefs_beanList2d() throws Exception {
-		JsonSchemaSerializer s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build();
-		assertEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.serialize(new BeanList2d()));
-	}
-
-	@Test
-	public void useBeanDefs_beanList2d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.getSchema(BeanList2d.class));
 		assertObjectEquals("{SimpleBean:{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
 	}
 
 	@Test
-	public void useBeanDefs_beanArray2d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+	public void useBeanDefs_beanArray2d() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.getSchema(SimpleBean[][].class));
 		assertObjectEquals("{SimpleBean:{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
 	}
@@ -333,31 +214,31 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void beanDefsPreloaded() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
 		s.addBeanDef("SimpleBean", new ObjectMap().append("test", 123));
 		assertObjectEquals("{'$ref':'#/definitions/SimpleBean'}", s.getSchema(SimpleBean.class));
 		assertObjectEquals("{SimpleBean:{test:123}}", s.getBeanDefs());
 	}
 
 	@Test
-	public void useBeanDefsPreloaded_beanList_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+	public void useBeanDefsPreloaded_beanList() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
 		s.addBeanDef("SimpleBean", new ObjectMap().append("test", 123));
 		assertObjectEquals("{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}", s.getSchema(BeanList.class));
 		assertObjectEquals("{SimpleBean:{test:123}}", s.getBeanDefs());
 	}
 
 	@Test
-	public void useBeanDefsPreloaded_beanList2d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+	public void useBeanDefsPreloaded_beanList2d() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
 		s.addBeanDef("SimpleBean", new ObjectMap().append("test", 123));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.getSchema(BeanList2d.class));
 		assertObjectEquals("{SimpleBean:{test:123}}", s.getBeanDefs());
 	}
 
 	@Test
-	public void useBeanDefsPreloaded_beanArray2d_getSchema() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().build().createSession();
+	public void useBeanDefsPreloaded_beanArray2d() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().build().createSession();
 		s.addBeanDef("SimpleBean", new ObjectMap().append("test", 123));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{'$ref':'#/definitions/SimpleBean'}}}", s.getSchema(SimpleBean[][].class));
 		assertObjectEquals("{SimpleBean:{test:123}}", s.getBeanDefs());
@@ -369,16 +250,16 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void customBeanDefMapper() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().beanDefMapper(CustomBeanDefMapper.class).build().createSession();
-		assertObjectEquals("{'$ref':'#/definitions/org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
-		assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().beanDefMapper(CustomBeanDefMapper.class).build().createSession();
+		assertObjectEquals("{'$ref':'#/definitions/org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+		assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
 	}
 
 	@Test
 	public void customBeanDefMapperInstance() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().beanDefMapper(new CustomBeanDefMapper()).build().createSession();
-		assertObjectEquals("{'$ref':'#/definitions/org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
-		assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().beanDefMapper(new CustomBeanDefMapper()).build().createSession();
+		assertObjectEquals("{'$ref':'#/definitions/org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+		assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
 	}
 
 	public static class CustomBeanDefMapper extends BasicBeanDefMapper {
@@ -390,9 +271,9 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void customBeanDefMapper_customURI() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useBeanDefs().beanDefMapper(CustomBeanDefMapper2.class).build().createSession();
-		assertObjectEquals("{'$ref':'/foo/bar/org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
-		assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useBeanDefs().beanDefMapper(CustomBeanDefMapper2.class).build().createSession();
+		assertObjectEquals("{'$ref':'/foo/bar/org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+		assertObjectEquals("{'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean':{type:'object',properties:{f1:{type:'string'}}}}", s.getBeanDefs());
 	}
 
 	public static class CustomBeanDefMapper2 extends BasicBeanDefMapper {
@@ -412,13 +293,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_BEAN_noBeanExample() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", s.getSchema(SimpleBean.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleMethod() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
 	}
 
@@ -426,13 +307,13 @@ public class JsonSchemaSerializerTest {
 	public void addExample_BEAN_exampleMethod_wDefault() throws Exception {
 		SimpleBeanWithExampleMethod b = new SimpleBeanWithExampleMethod();
 		b.f1 = "baz";
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").example(SimpleBeanWithExampleMethod.class, b).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(SimpleBeanWithExampleMethod.class, b).build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleMethod_array2d() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleMethod[][].class));
 	}
 
@@ -448,13 +329,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_BEAN_exampleField() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleField.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleField_array2d() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleField[][].class));
 	}
 
@@ -472,13 +353,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_BEAN_exampleBeanAnnotation() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleAnnotation.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleBeanAnnotation_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleAnnotation[][].class));
 	}
 
@@ -489,7 +370,7 @@ public class JsonSchemaSerializerTest {
 	public void addExample_BEAN_exampleBeanProperty() throws Exception {
 		SimpleBean b = new SimpleBean();
 		b.f1 = "foobar";
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBean.class));
 	}
 
@@ -497,7 +378,7 @@ public class JsonSchemaSerializerTest {
 	public void addExample_BEAN_exampleBeanProperty_2darray() throws Exception {
 		SimpleBean b = new SimpleBean();
 		b.f1 = "foobar";
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBean[][].class));
 	}
 
@@ -507,13 +388,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_MAP_noExample() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}}}", s.getSchema(BeanMap.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleMethod() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
 	}
 
@@ -521,7 +402,7 @@ public class JsonSchemaSerializerTest {
 	public void addExample_MAP_exampleMethod_wDefault() throws Exception {
 		BeanMapWithExampleMethod b = new BeanMapWithExampleMethod();
 		b.put(456, SimpleBeanWithExampleMethod.example());
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").example(BeanMapWithExampleMethod.class, b).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMapWithExampleMethod.class, b).build().createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'456':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
 	}
 
@@ -538,13 +419,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_MAP_exampleField() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleField.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleField_array2d() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMapWithExampleField[][].class));
 	}
 
@@ -563,13 +444,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_MAP_exampleBeanAnnotation() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}", s.getSchema(BeanMapWithExampleAnnotation.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleBeanAnnotation_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}}}", s.getSchema(BeanMapWithExampleAnnotation[][].class));
 	}
 
@@ -579,13 +460,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_MAP_exampleBeanProperty() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMap.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleBeanProperty_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMap[][].class));
 	}
 
@@ -595,13 +476,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_COLLECTION_noExample() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}", s.getSchema(BeanList.class));
 	}
 
 	@Test
 	public void addExample_COLLECTION_exampleMethod() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
 	}
 
@@ -611,7 +492,7 @@ public class JsonSchemaSerializerTest {
 		SimpleBean sb = new SimpleBean();
 		sb.f1 = "baz";
 		b.add(sb);
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").example(BeanListWithExampleMethod.class, b).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").example(BeanListWithExampleMethod.class, b).build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(BeanListWithExampleMethod.class));
 	}
 
@@ -628,13 +509,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_COLLECTION_exampleField() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleField.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleField_array2d() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("array").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanListWithExampleField[][].class));
 	}
 
@@ -653,13 +534,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_COLLECTION_exampleBeanAnnotation() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(BeanListWithExampleAnnotation.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleBeanAnnotation_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("array").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'baz'}]]]}", s.getSchema(BeanListWithExampleAnnotation[][].class));
 	}
 
@@ -669,13 +550,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_COLLECTION_exampleBeanProperty() throws Exception {
-		JsonSchemaSerializerSession s =JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("collection").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
+		JsonSchemaGeneratorSession s =JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanList.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleBeanProperty_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("array").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanList[][].class));
 	}
 
@@ -684,14 +565,14 @@ public class JsonSchemaSerializerTest {
 	//====================================================================================================
 	@Test
 	public void addExample_BOOLEAN() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("boolean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("boolean").build().createSession();
 		assertObjectEquals("{type:'boolean','x-example':true}", s.getSchema(boolean.class));
 		assertObjectEquals("{type:'boolean','x-example':true}", s.getSchema(Boolean.class));
 	}
 
 	@Test
 	public void addExample_BOOLEAN_wDefault() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("boolean")
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("boolean")
 			.example(boolean.class, false)
 			.example(Boolean.class, false)
 			.build().createSession();
@@ -701,7 +582,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_BOOLEAN_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("boolean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("boolean").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean','x-example':true}}}", s.getSchema(boolean[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean','x-example':true}}}", s.getSchema(Boolean[][].class));
 	}
@@ -711,7 +592,7 @@ public class JsonSchemaSerializerTest {
 	//====================================================================================================
 	@Test
 	public void addExample_NUMBER() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("number").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("number").build().createSession();
 		assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(short.class));
 		assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(Short.class));
 		assertObjectEquals("{type:'integer',format:'int32','x-example':1}", s.getSchema(int.class));
@@ -726,7 +607,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_NUMBER_wDefault() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("number")
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("number")
 			.example(short.class, (short)2)
 			.example(Short.class, (short)3)
 			.example(int.class, 4)
@@ -752,7 +633,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_NUMBER_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("number").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("number").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16','x-example':1}}}", s.getSchema(short[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16','x-example':1}}}", s.getSchema(Short[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32','x-example':1}}}", s.getSchema(int[][].class));
@@ -771,7 +652,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_STRING() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("string").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("string").build().createSession();
 		assertObjectEquals("{type:'string','x-example':'foo'}", s.getSchema(String.class));
 		assertObjectEquals("{type:'string','x-example':'foo'}", s.getSchema(StringBuilder.class));
 		assertObjectEquals("{type:'string','x-example':'a'}", s.getSchema(Character.class));
@@ -780,7 +661,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_STRING_wDefault() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("string")
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("string")
 			.example(String.class, "bar1")
 			.example(StringBuilder.class, new StringBuilder("bar2"))
 			.example(Character.class, 'b')
@@ -794,7 +675,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_STRING_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("string").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("string").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'foo'}}}", s.getSchema(String[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'foo'}}}", s.getSchema(StringBuilder[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'a'}}}", s.getSchema(Character[][].class));
@@ -803,7 +684,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_STRING_2darray_wDefault() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("string")
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("string")
 			.example(String.class, "bar1")
 			.example(StringBuilder.class, new StringBuilder("bar2"))
 			.example(Character.class, 'b')
@@ -821,37 +702,37 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addExample_ENUM() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("enum").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("enum").build().createSession();
 		assertObjectEquals("{type:'string','enum':['one','two','three'],'x-example':'one'}", s.getSchema(TestEnumToString.class));
 	}
 
 	@Test
 	public void addExample_ENUM_wDefault() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("enum").example(TestEnumToString.class, TestEnumToString.TWO).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("enum").example(TestEnumToString.class, TestEnumToString.TWO).build().createSession();
 		assertObjectEquals("{type:'string','enum':['one','two','three'],'x-example':'two'}", s.getSchema(TestEnumToString.class));
 	}
 
 	@Test
 	public void addExample_ENUM_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("enum").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("enum").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['one','two','three'],'x-example':'one'}}}", s.getSchema(TestEnumToString[][].class));
 	}
 
 	@Test
 	public void addExample_ENUM_useEnumNames() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useEnumNames().addExamplesTo("enum").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useEnumNames().addExamplesTo("enum").build().createSession();
 		assertObjectEquals("{type:'string','enum':['ONE','TWO','THREE'],'x-example':'ONE'}", s.getSchema(TestEnumToString.class));
 	}
 
 	@Test
 	public void addExample_ENUM_wDefault_useEnumNames() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useEnumNames().addExamplesTo("enum").example(TestEnumToString.class, TestEnumToString.TWO).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useEnumNames().addExamplesTo("enum").example(TestEnumToString.class, TestEnumToString.TWO).build().createSession();
 		assertObjectEquals("{type:'string','enum':['ONE','TWO','THREE'],'x-example':'TWO'}", s.getSchema(TestEnumToString.class));
 	}
 
 	@Test
 	public void addExample_ENUM_2darray_useEnumNames() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().useEnumNames().addExamplesTo("enum").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().useEnumNames().addExamplesTo("enum").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['ONE','TWO','THREE'],'x-example':'ONE'}}}", s.getSchema(TestEnumToString[][].class));
 	}
 
@@ -860,7 +741,7 @@ public class JsonSchemaSerializerTest {
 	//====================================================================================================
 	@Test
 	public void addExample_ANY() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addExamplesTo("any").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("any").build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string','x-example':'foo'}}}", s.getSchema(SimpleBean.class));
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
@@ -889,14 +770,14 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addDescription_BEAN() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("bean").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("bean").build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
 	}
 
 	@Test
 	public void addDescription_BEAN_array2d() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("bean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}}}", s.getSchema(SimpleBean[][].class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("bean").build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}}}", s.getSchema(SimpleBean[][].class));
 	}
 
 	//====================================================================================================
@@ -905,14 +786,14 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addDescription_MAP() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("map").build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanMap.class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("map").build().createSession();
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanMap.class));
 	}
 
 	@Test
 	public void addDescription_MAP_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("map").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}}}", s.getSchema(BeanMap[][].class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("map").build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}}}", s.getSchema(BeanMap[][].class));
 	}
 
 	//====================================================================================================
@@ -921,20 +802,20 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addDescription_COLLECTION() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("collection").build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanList.class));
 	}
 
 	@Test
 	public void addDescription_COLLECTION_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}}}", s.getSchema(BeanList[][].class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("collection").build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}}}", s.getSchema(BeanList[][].class));
 	}
 
 	@Test
 	public void addDescription_ARRAY() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("array").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("array").build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
 	}
 
 	//====================================================================================================
@@ -942,14 +823,14 @@ public class JsonSchemaSerializerTest {
 	//====================================================================================================
 	@Test
 	public void addDescription_BOOLEAN() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("boolean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("boolean").build().createSession();
 		assertObjectEquals("{type:'boolean',description:'boolean'}", s.getSchema(boolean.class));
 		assertObjectEquals("{type:'boolean',description:'java.lang.Boolean'}", s.getSchema(Boolean.class));
 	}
 
 	@Test
 	public void addDescription_BOOLEAN_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("boolean").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("boolean").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean',description:'boolean'}}}", s.getSchema(boolean[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean',description:'java.lang.Boolean'}}}", s.getSchema(Boolean[][].class));
 	}
@@ -959,7 +840,7 @@ public class JsonSchemaSerializerTest {
 	//====================================================================================================
 	@Test
 	public void addDescription_NUMBER() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("number").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("number").build().createSession();
 		assertObjectEquals("{type:'integer',format:'int16',description:'short'}", s.getSchema(short.class));
 		assertObjectEquals("{type:'integer',format:'int16',description:'java.lang.Short'}", s.getSchema(Short.class));
 		assertObjectEquals("{type:'integer',format:'int32',description:'int'}", s.getSchema(int.class));
@@ -974,7 +855,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addDescription_NUMBER_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("number").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("number").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16',description:'short'}}}", s.getSchema(short[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16',description:'java.lang.Short'}}}", s.getSchema(Short[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32',description:'int'}}}", s.getSchema(int[][].class));
@@ -993,7 +874,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addDescription_STRING() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("string").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("string").build().createSession();
 		assertObjectEquals("{type:'string',description:'java.lang.String'}", s.getSchema(String.class));
 		assertObjectEquals("{type:'string',description:'java.lang.StringBuilder'}", s.getSchema(StringBuilder.class));
 		assertObjectEquals("{type:'string',description:'java.lang.Character'}", s.getSchema(Character.class));
@@ -1002,7 +883,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addDescription_STRING_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("string").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("string").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',description:'java.lang.String'}}}", s.getSchema(String[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',description:'java.lang.StringBuilder'}}}", s.getSchema(StringBuilder[][].class));
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',description:'java.lang.Character'}}}", s.getSchema(Character[][].class));
@@ -1015,13 +896,13 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void addDescription_ENUM() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("enum").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("enum").build().createSession();
 		assertObjectEquals("{type:'string','enum':['one','two','three'],description:'org.apache.juneau.testutils.pojos.TestEnumToString'}", s.getSchema(TestEnumToString.class));
 	}
 
 	@Test
 	public void addDescription_ENUM_2darray() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("enum").build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("enum").build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['one','two','three'],description:'org.apache.juneau.testutils.pojos.TestEnumToString'}}}", s.getSchema(TestEnumToString[][].class));
 	}
 
@@ -1030,11 +911,11 @@ public class JsonSchemaSerializerTest {
 	//====================================================================================================
 	@Test
 	public void addDescription_ANY() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().addDescriptionsTo("any").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanMap.class));
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addDescriptionsTo("any").build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'}", s.getSchema(SimpleBean.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanMap<java.lang.Integer,org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanMap.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
 		assertObjectEquals("{type:'boolean',description:'boolean'}", s.getSchema(boolean.class));
 		assertObjectEquals("{type:'boolean',description:'java.lang.Boolean'}", s.getSchema(Boolean.class));
 		assertObjectEquals("{type:'integer',format:'int16',description:'short'}", s.getSchema(short.class));
@@ -1061,7 +942,7 @@ public class JsonSchemaSerializerTest {
 	// If default schema contains 'type', it's considered complete.
 	@Test
 	public void defaultSchemas() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
 			.defaultSchema(SimpleBean.class, new ObjectMap().append("type", "bar"))
 			.defaultSchema(BeanMap.class, new ObjectMap().append("type", "bar"))
 			.defaultSchema(BeanList.class, new ObjectMap().append("type", "bar"))
@@ -1110,7 +991,7 @@ public class JsonSchemaSerializerTest {
 	// If default schema does not contain 'type', the value is augmented
 	@Test
 	public void defaultSchemasNoType() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
 			.defaultSchema(SimpleBean.class, new ObjectMap().append("foo", "bar"))
 			.defaultSchema(BeanMap.class, new ObjectMap().append("foo", "bar"))
 			.defaultSchema(BeanList.class, new ObjectMap().append("foo", "bar"))
@@ -1162,7 +1043,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void allowNestedExamples_enabled() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
 			.allowNestedExamples()
 			.example(BeanList.class, new BeanList())
 			.example(SimpleBean.class, new SimpleBean())
@@ -1174,7 +1055,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void allowNestedExamples_disabled() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
 			.example(BeanList.class, new BeanList())
 			.example(SimpleBean.class, new SimpleBean())
 			.addExamplesTo("collection,bean")
@@ -1189,21 +1070,21 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void allowNestedDescriptions_enabled() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
 			.allowNestedDescriptions()
 			.addDescriptionsTo("collection,bean")
 			.build().createSession();
 
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean'},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean'},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanList.class));
 	}
 
 	@Test
 	public void allowNestedDescriptions_disabled() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
 			.addDescriptionsTo("collection,bean")
 			.build().createSession();
 
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaSerializerTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$BeanList<org.apache.juneau.jsonschema.JsonSchemaGeneratorTest$SimpleBean>'}", s.getSchema(BeanList.class));
 	}
 
 	//====================================================================================================
@@ -1212,7 +1093,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void swaps_int() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
 			.pojoSwaps(IntSwap.class)
 			.build().createSession();
 		assertObjectEquals("{type:'integer',format:'int32'}", s.getSchema(SimpleBean.class));
@@ -1228,7 +1109,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void jsonSchema_onclass() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();
 		assertObjectEquals("{type:'foo',format:'bar',properties:{f1:{type:'integer',format:'int32'}},description:'baz','x-example':{f1:123}}", s.getSchema(A1.class));
 	}
 
@@ -1239,7 +1120,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void jsonSchema_onbeanfield() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A2.class));
 	}
 
@@ -1250,7 +1131,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void jsonSchema_onbeangetter() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A3.class));
 	}
 
@@ -1263,7 +1144,7 @@ public class JsonSchemaSerializerTest {
 	@Test
 
 	public void jsonSchema_onbeansetter() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder().build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A4.class));
 	}
 
@@ -1282,7 +1163,7 @@ public class JsonSchemaSerializerTest {
 
 	@Test
 	public void jsonschema_onpojoswap() throws Exception {
-		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_SIMPLE.builder()
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder()
 			.pojoSwaps(SwapWithAnnotation.class)
 			.build().createSession();
 		assertObjectEquals("{type:'foo',format:'bar',description:'baz','x-example':123}", s.getSchema(SimpleBean.class));
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/uon/Common_UonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/uon/Common_UonTest.java
index 3144405..57d80e7 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/uon/Common_UonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/uon/Common_UonTest.java
@@ -266,7 +266,7 @@ public class Common_UonTest {
 			fail("Exception expected!");
 		} catch (Exception e) {
 			String msg = e.getLocalizedMessage();
-			assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+			assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
 		}
 
 		// Recursion detection, no ignore
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
index f740f79..c7472c0 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
@@ -268,7 +268,7 @@ public class Common_UrlEncodingTest {
 			fail("Exception expected!");
 		} catch (Exception e) {
 			String msg = e.getLocalizedMessage();
-			assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+			assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
 		}
 
 		// Recursion detection, no ignore
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/CommonTest.java
index b866d09..611d3dc 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/CommonTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/xml/CommonTest.java
@@ -285,7 +285,7 @@ public class CommonTest {
 			fail("Exception expected!");
 		} catch (Exception e) {
 			String msg = e.getLocalizedMessage();
-			assertTrue(msg.contains("It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop."));
+			assertContains(msg, "It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.");
 		}
 
 		// Recursion detection, no ignore
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index f62fbc0..032adde 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -764,7 +764,7 @@ public class BeanContext extends Context {
 	 * 		When bean getters throws exceptions, the exception includes the object stack information
 	 * 		in order to determine how that method was invoked.
 	 * 	<li>
-	 * 		Enables {@link Serializer#SERIALIZER_detectRecursions}.
+	 * 		Enables {@link Serializer#BEANTRAVERSE_detectRecursions}.
 	 * </ul>
 	 *
 	 * <p>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
index 138f2d9..64df07b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
@@ -555,7 +555,7 @@ public class BeanContextBuilder extends ContextBuilder {
 	 * 		When bean getters throws exceptions, the exception includes the object stack information
 	 * 		in order to determine how that method was invoked.
 	 * 	<li>
-	 * 		Enables {@link Serializer#SERIALIZER_detectRecursions}.
+	 * 		Enables {@link Serializer#BEANTRAVERSE_detectRecursions}.
 	 * </ul>
 	 *
 	 * <h5 class='section'>See Also:</h5>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/package-info.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRecursionException.java
old mode 100755
new mode 100644
similarity index 75%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/package-info.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRecursionException.java
index c900607..798feb0
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/package-info.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRecursionException.java
@@ -1,18 +1,33 @@
-// ***************************************************************************************************************************
-// * 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.                                              *
-// ***************************************************************************************************************************
-
-/**
- * HTML-Schema Marshalling Support
- */
-package org.apache.juneau.htmlschema;
-
+// ***************************************************************************************************************************
+// * 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;
+
+import java.text.*;
+
+/**
+ * Exception that indicates that a recursion was detected while traversing a POJO model.
+ */
+public class BeanRecursionException extends FormattedException {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param message The {@link MessageFormat}-style message.
+	 * @param args Optional {@link MessageFormat}-style arguments.
+	 */
+	public BeanRecursionException(String message, Object...args) {
+		super(message, args);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
new file mode 100644
index 0000000..0f48737
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
@@ -0,0 +1,559 @@
+// ***************************************************************************************************************************
+// * 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;
+
+import static org.apache.juneau.BeanTraverseContext.*;
+
+import java.util.*;
+
+import org.apache.juneau.http.*;
+
+/**
+ * Builder class for building instances of bean traversals.
+ */
+public class BeanTraverseBuilder extends BeanContextBuilder {
+
+	/**
+	 * Constructor, default settings.
+	 */
+	public BeanTraverseBuilder() {
+		super();
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param ps The initial configuration settings for this builder.
+	 */
+	public BeanTraverseBuilder(PropertyStore ps) {
+		super(ps);
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Properties
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Configuration property:  Automatically detect POJO recursions.
+	 *
+	 * <p>
+	 * Specifies that recursions should be checked for during traversal.
+	 *
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Checking for recursion can cause a small performance penalty.
+	 * </ul>
+	 *
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
+	 * </ul>
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>The default is <jk>false</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public BeanTraverseBuilder detectRecursions(boolean value) {
+		return set(BEANTRAVERSE_detectRecursions, value);
+	}
+
+	/**
+	 * Configuration property:  Automatically detect POJO recursions.
+	 *
+	 * <p>
+	 * Shortcut for calling <code>detectRecursions(<jk>true</jk>)</code>.
+	 *
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
+	 * </ul>
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public BeanTraverseBuilder detectRecursions() {
+		return set(BEANTRAVERSE_detectRecursions, true);
+	}
+
+	/**
+	 * Configuration property:  Ignore recursion errors.
+	 *
+	 * <p>
+	 * If <jk>true</jk>, when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+	 * Otherwise, an exception is thrown.
+	 *
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Checking for recursion can cause a small performance penalty.
+	 * </ul>
+	 *
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
+	 * </ul>
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>The default is <jk>false</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public BeanTraverseBuilder ignoreRecursions(boolean value) {
+		return set(BEANTRAVERSE_ignoreRecursions, value);
+	}
+
+	/**
+	 * Configuration property:  Ignore recursion errors.
+	 *
+	 * <p>
+	 * Shortcut for calling <code>ignoreRecursions(<jk>true</jk>)</code>.
+	 *
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
+	 * </ul>
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public BeanTraverseBuilder ignoreRecursions() {
+		return set(BEANTRAVERSE_ignoreRecursions, true);
+	}
+
+	/**
+	 * Configuration property:  Initial depth.
+	 *
+	 * <p>
+	 * The initial indentation level at the root.
+	 *
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
+	 * </ul>
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>The default is <code>0</code>.
+	 * @return This object (for method chaining).
+	 */
+	public BeanTraverseBuilder initialDepth(int value) {
+		return set(BEANTRAVERSE_initialDepth, value);
+	}
+
+	/**
+	 * Configuration property:  Max traversal depth.
+	 *
+	 * <p>
+	 * Abort traversal if specified depth is reached in the POJO tree.
+	 * <br>If this depth is exceeded, an exception is thrown.
+	 * <br>This prevents stack overflows from occurring when trying to traverse models with recursive references.
+	 *
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
+	 * </ul>
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>The default is <code>100</code>.
+	 * @return This object (for method chaining).
+	 */
+	public BeanTraverseBuilder maxDepth(int value) {
+		return set(BEANTRAVERSE_maxDepth, value);
+	}
+
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanClassVisibility(Visibility value) {
+		super.beanClassVisibility(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanConstructorVisibility(Visibility value) {
+		super.beanConstructorVisibility(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanDictionary(boolean append, Object...values) {
+		super.beanDictionary(append, values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanDictionary(Class<?>...values) {
+		super.beanDictionary(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanDictionary(Object...values) {
+		super.beanDictionary(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanDictionaryRemove(Object...values) {
+		super.beanDictionaryRemove(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanFieldVisibility(Visibility value) {
+		super.beanFieldVisibility(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanFilters(boolean append, Object...values) {
+		super.beanFilters(append, values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanFilters(Class<?>...values) {
+		super.beanFilters(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanFilters(Object...values) {
+		super.beanFilters(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanFiltersRemove(Object...values) {
+		super.beanFiltersRemove(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanMapPutReturnsOldValue(boolean value) {
+		super.beanMapPutReturnsOldValue(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanMapPutReturnsOldValue() {
+		super.beanMapPutReturnsOldValue();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanMethodVisibility(Visibility value) {
+		super.beanMethodVisibility(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beansRequireDefaultConstructor(boolean value) {
+		super.beansRequireDefaultConstructor(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beansRequireDefaultConstructor() {
+		super.beansRequireDefaultConstructor();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beansRequireSerializable(boolean value) {
+		super.beansRequireSerializable(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beansRequireSerializable() {
+		super.beansRequireSerializable();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beansRequireSettersForGetters(boolean value) {
+		super.beansRequireSettersForGetters(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beansRequireSettersForGetters() {
+		super.beansRequireSettersForGetters();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beansRequireSomeProperties(boolean value) {
+		super.beansRequireSomeProperties(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder beanTypePropertyName(String value) {
+		super.beanTypePropertyName(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder debug() {
+		super.debug();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public <T> BeanTraverseBuilder example(Class<T> c, T o) {
+		super.example(c, o);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
+		super.ignoreInvocationExceptionsOnGetters(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder ignoreInvocationExceptionsOnGetters() {
+		super.ignoreInvocationExceptionsOnGetters();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
+		super.ignoreInvocationExceptionsOnSetters(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder ignoreInvocationExceptionsOnSetters() {
+		super.ignoreInvocationExceptionsOnSetters();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder ignorePropertiesWithoutSetters(boolean value) {
+		super.ignorePropertiesWithoutSetters(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder ignoreUnknownBeanProperties(boolean value) {
+		super.ignoreUnknownBeanProperties(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder ignoreUnknownBeanProperties() {
+		super.ignoreUnknownBeanProperties();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder ignoreUnknownNullBeanProperties(boolean value) {
+		super.ignoreUnknownNullBeanProperties(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public <T> BeanTraverseBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+		super.implClass(interfaceClass, implClass);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder implClasses(Map<String,Class<?>> values) {
+		super.implClasses(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder locale(Locale value) {
+		super.locale(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder mediaType(MediaType value) {
+		super.mediaType(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder notBeanClasses(boolean append, Object...values) {
+		super.notBeanClasses(append, values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder notBeanClasses(Class<?>...values) {
+		super.notBeanClasses(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder notBeanClasses(Object...values) {
+		super.notBeanClasses(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder notBeanClassesRemove(Object...values) {
+		super.notBeanClassesRemove(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder notBeanPackages(boolean append, Object...values) {
+		super.notBeanPackages(append, values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder notBeanPackages(Object...values) {
+		super.notBeanPackages(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder notBeanPackages(String...values) {
+		super.notBeanPackages(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder notBeanPackagesRemove(Object...values) {
+		super.notBeanPackagesRemove(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder pojoSwaps(boolean append, Object...values) {
+		super.pojoSwaps(append, values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder pojoSwaps(Class<?>...values) {
+		super.pojoSwaps(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder pojoSwaps(Object...values) {
+		super.pojoSwaps(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder pojoSwapsRemove(Object...values) {
+		super.pojoSwapsRemove(values);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder sortProperties(boolean value) {
+		super.sortProperties(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder sortProperties() {
+		super.sortProperties();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder timeZone(TimeZone value) {
+		super.timeZone(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder useEnumNames() {
+		super.useEnumNames();
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder useInterfaceProxies(boolean value) {
+		super.useInterfaceProxies(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder useJavaBeanIntrospector(boolean value) {
+		super.useJavaBeanIntrospector(value);
+		return this;
+	}
+
+	@Override /* BeanContextBuilder */
+	public BeanTraverseBuilder useJavaBeanIntrospector() {
+		super.useJavaBeanIntrospector();
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public BeanTraverseBuilder set(String name, Object value) {
+		super.set(name, value);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public BeanTraverseBuilder set(boolean append, String name, Object value) {
+		super.set(append, name, value);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public BeanTraverseBuilder set(Map<String,Object> properties) {
+		super.set(properties);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public BeanTraverseBuilder add(Map<String,Object> properties) {
+		super.add(properties);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public BeanTraverseBuilder addTo(String name, Object value) {
+		super.addTo(name, value);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public BeanTraverseBuilder addTo(String name, String key, Object value) {
+		super.addTo(name, key, value);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public BeanTraverseBuilder removeFrom(String name, Object value) {
+		super.removeFrom(name, value);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public BeanTraverseBuilder apply(PropertyStore copyFrom) {
+		super.apply(copyFrom);
+		return this;
+	}
+
+	@Override /* Context */
+	public BeanTraverseContext build() {
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java
new file mode 100644
index 0000000..f69ee5a
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java
@@ -0,0 +1,304 @@
+// ***************************************************************************************************************************
+// * 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;
+
+
+import org.apache.juneau.parser.*;
+
+/**
+ * Parent class for all classes that traverse POJOs.
+ *
+ * <h5 class='topic'>Description</h5>
+ *
+ * Base class that serves as the parent class for all serializers and other classes that traverse POJOs.
+ */
+public abstract class BeanTraverseContext extends BeanContext {
+
+	//-------------------------------------------------------------------------------------------------------------------
+	// Configurable properties
+	//-------------------------------------------------------------------------------------------------------------------
+
+	private static final String PREFIX = "BeanTraverseContext.";
+
+	/**
+	 * Configuration property:  Automatically detect POJO recursions.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"BeanTraverseContext.detectRecursions.b"</js>
+	 * 	<li><b>Data type:</b>  <code>Boolean</code>
+	 * 	<li><b>Default:</b>  <jk>false</jk>
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link BeanTraverseBuilder#detectRecursions(boolean)}
+	 * 			<li class='jm'>{@link BeanTraverseBuilder#detectRecursions()}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Specifies that recursions should be checked for during traversal.
+	 *
+	 * <p>
+	 * Recursions can occur when traversing models that aren't true trees but rather contain loops.
+	 * <br>In general, unchecked recursions cause stack-overflow-errors.
+	 * <br>These show up as {@link ParseException ParseExceptions} with the message <js>"Depth too deep.  Stack overflow occurred."</js>.
+	 *
+	 * <p>
+	 * The behavior when recursions are detected depends on the value for {@link #BEANTRAVERSE_ignoreRecursions}.
+	 *
+	 * <p>
+	 * For example, if a model contains the links A-&gt;B-&gt;C-&gt;A, then the JSON generated will look like
+	 * 	the following when <jsf>BEANTRAVERSE_ignoreRecursions</jsf> is <jk>true</jk>...
+	 *
+	 * <p class='bcode w800'>
+	 * 	{A:{B:{C:<jk>null</jk>}}}
+	 * </p>
+	 *
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Checking for recursion can cause a small performance penalty.
+	 * </ul>
+	 *
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Create a serializer that never adds _type to nodes.</jc>
+	 * 	WriterSerializer s = JsonSerializer
+	 * 		.<jsm>create</jsm>()
+	 * 		.detectRecursions()
+	 * 		.ignoreRecursions()
+	 * 		.build();
+	 *
+	 * 	<jc>// Same, but use property.</jc>
+	 * 	WriterSerializer s = JsonSerializer
+	 * 		.<jsm>create</jsm>()
+	 * 		.set(<jsf>BEANTRAVERSE_detectRecursions</jsf>, <jk>true</jk>)
+	 * 		.set(<jsf>BEANTRAVERSE_ignoreRecursions</jsf>, <jk>true</jk>)
+	 * 		.build();
+	 *
+	 * 	<jc>// Create a POJO model with a recursive loop.</jc>
+	 * 	<jk>public class</jk> A {
+	 * 		<jk>public</jk> Object <jf>f</jf>;
+	 * 	}
+	 * 	A a = <jk>new</jk> A();
+	 * 	a.<jf>f</jf> = a;
+	 *
+	 * 	<jc>// Produces "{f:null}"</jc>
+	 * 	String json = s.serialize(a);
+	 * </p>
+	 */
+	public static final String BEANTRAVERSE_detectRecursions = PREFIX + "detectRecursions.b";
+
+	/**
+	 * Configuration property:  Ignore recursion errors.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"BeanTraverseContext.ignoreRecursions.b"</js>
+	 * 	<li><b>Data type:</b>  <code>Boolean</code>
+	 * 	<li><b>Default:</b>  <jk>false</jk>
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link BeanTraverseBuilder#ignoreRecursions(boolean)}
+	 * 			<li class='jm'>{@link BeanTraverseBuilder#ignoreRecursions()}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Used in conjunction with {@link #BEANTRAVERSE_detectRecursions}.
+	 * <br>Setting is ignored if <jsf>BEANTRAVERSE_detectRecursions</jsf> is <jk>false</jk>.
+	 *
+	 * <p>
+	 * If <jk>true</jk>, when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+	 * <br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
+	 */
+	public static final String BEANTRAVERSE_ignoreRecursions = PREFIX + "ignoreRecursions.b";
+
+	/**
+	 * Configuration property:  Initial depth.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"BeanTraverseContext.initialDepth.i"</js>
+	 * 	<li><b>Data type:</b>  <code>Integer</code>
+	 * 	<li><b>Default:</b>  <code>0</code>
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link BeanTraverseBuilder#initialDepth(int)}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * The initial indentation level at the root.
+	 * <br>Useful when constructing document fragments that need to be indented at a certain level.
+	 *
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Create a serializer with whitespace enabled and an initial depth of 2.</jc>
+	 * 	WriterSerializer s = JsonSerializer
+	 * 		.<jsm>create</jsm>()
+	 * 		.ws()
+	 * 		.initialDepth(2)
+	 * 		.build();
+	 *
+	 * 	<jc>// Same, but use property.</jc>
+	 * 	WriterSerializer s = JsonSerializer
+	 * 		.<jsm>create</jsm>()
+	 * 		.set(<jsf>BEANTRAVERSE_useWhitespace</jsf>, <jk>true</jk>)
+	 * 		.set(<jsf>BEANTRAVERSE_initialDepth</jsf>, 2)
+	 * 		.build();
+	 *
+	 * 	<jc>// Produces "\t\t{\n\t\t\t'foo':'bar'\n\t\t}\n"</jc>
+	 * 	String json = s.serialize(<jk>new</jk> MyBean());
+	 * </p>
+	 */
+	public static final String BEANTRAVERSE_initialDepth = PREFIX + "initialDepth.i";
+
+	/**
+	 * Configuration property:  Max traversal depth.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"BeanTraverseContext.maxDepth.i"</js>
+	 * 	<li><b>Data type:</b>  <code>Integer</code>
+	 * 	<li><b>Default:</b>  <code>100</code>
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link BeanTraverseBuilder#maxDepth(int)}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Abort traversal if specified depth is reached in the POJO tree.
+	 * <br>If this depth is exceeded, an exception is thrown.
+	 *
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Create a serializer that throws an exception if the depth is greater than 20.</jc>
+	 * 	WriterSerializer s = JsonSerializer
+	 * 		.<jsm>create</jsm>()
+	 * 		.maxDepth(20)
+	 * 		.build();
+	 *
+	 * 	<jc>// Same, but use property.</jc>
+	 * 	WriterSerializer s = JsonSerializer
+	 * 		.<jsm>create</jsm>()
+	 * 		.set(<jsf>BEANTRAVERSE_maxDepth</jsf>, 20)
+	 * 		.build();
+	 * </p>
+	 */
+	public static final String BEANTRAVERSE_maxDepth = PREFIX + "maxDepth.i";
+
+	//-------------------------------------------------------------------------------------------------------------------
+	// Instance
+	//-------------------------------------------------------------------------------------------------------------------
+
+	private final int initialDepth, maxDepth;
+	private final boolean
+		detectRecursions,
+		ignoreRecursions;
+
+	/**
+	 * Constructor
+	 *
+	 * @param ps
+	 * 	The property store containing all the settings for this object.
+	 */
+	protected BeanTraverseContext(PropertyStore ps) {
+		super(ps);
+
+		maxDepth = getIntegerProperty(BEANTRAVERSE_maxDepth, 100);
+		initialDepth = getIntegerProperty(BEANTRAVERSE_initialDepth, 0);
+		detectRecursions = getBooleanProperty(BEANTRAVERSE_detectRecursions, false);
+		ignoreRecursions = getBooleanProperty(BEANTRAVERSE_ignoreRecursions, false);
+	}
+
+	@Override /* Context */
+	public BeanTraverseBuilder builder() {
+		return null;
+	}
+
+	@Override /* Context */
+	public BeanTraverseSession createSession(BeanSessionArgs args) {
+		return new BeanTraverseSession(this, args);
+	}
+
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Properties
+	//-----------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Configuration property:  Initial depth.
+	 *
+	 * @see #BEANTRAVERSE_initialDepth
+	 * @return
+	 * 	The initial indentation level at the root.
+	 */
+	protected final int getInitialDepth() {
+		return initialDepth;
+	}
+
+	/**
+	 * Configuration property:  Max traversal depth.
+	 *
+	 * @see #BEANTRAVERSE_maxDepth
+	 * @return
+	 * 	The depth at which traversal is aborted if depth is reached in the POJO tree.
+	 *	<br>If this depth is exceeded, an exception is thrown.
+	 */
+	protected final int getMaxDepth() {
+		return maxDepth;
+	}
+
+	/**
+	 * Configuration property:  Automatically detect POJO recursions.
+	 * @see #BEANTRAVERSE_detectRecursions
+	 * @return
+	 * 	<jk>true</jk> if recursions should be checked for during traversal.
+	 */
+	protected final boolean isDetectRecursions() {
+		return detectRecursions;
+	}
+
+	/**
+	 * Configuration property:  Ignore recursion errors.
+	 *
+	 * @see #BEANTRAVERSE_ignoreRecursions
+	 * @return
+	 * 	<jk>true</jk> if when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+	 * 	<br>Otherwise, an exception is thrown with the message <js>"Recursion occurred, stack=..."</js>.
+	 */
+	protected final boolean isIgnoreRecursions() {
+		return ignoreRecursions;
+	}
+
+	@Override /* Context */
+	public ObjectMap asMap() {
+		return super.asMap()
+			.append("BeanTraverseContext", new ObjectMap()
+				.append("maxDepth", maxDepth)
+				.append("initialDepth", initialDepth)
+				.append("detectRecursions", detectRecursions)
+				.append("ignoreRecursions", ignoreRecursions)
+			);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
new file mode 100644
index 0000000..d5f2db6
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
@@ -0,0 +1,290 @@
+// ***************************************************************************************************************************
+// * 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;
+
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.text.*;
+import java.util.*;
+
+/**
+ * Session that lives for the duration of a single use of {@link BeanTraverseContext}.
+ *
+ * <p>
+ * Used by serializers and other classes that traverse POJOs for the following purposes:
+ * <ul class='spaced-list'>
+ * 	<li>
+ * 		Keeping track of how deep it is in a model for indentation purposes.
+ * 	<li>
+ * 		Ensuring infinite loops don't occur by setting a limit on how deep to traverse a model.
+ * 	<li>
+ * 		Ensuring infinite loops don't occur from loops in the model (when detectRecursions is enabled.
+ * </ul>
+ *
+ * <p>
+ * This class is NOT thread safe.
+ * It is typically discarded after one-time use although it can be reused within the same thread.
+ */
+public class BeanTraverseSession extends BeanSession {
+
+	private final BeanTraverseContext ctx;
+	private final Map<Object,Object> set;                                           // Contains the current objects in the current branch of the model.
+	private final LinkedList<StackElement> stack = new LinkedList<>();              // Contains the current objects in the current branch of the model.
+
+	// Writable properties
+	private boolean isBottom;                                                       // If 'true', then we're at a leaf in the model (i.e. a String, Number, Boolean, or null).
+	private BeanPropertyMeta currentProperty;
+	private ClassMeta<?> currentClass;
+
+	/** The current indentation depth into the model. */
+	public int indent;
+
+
+	/**
+	 * Create a new session using properties specified in the context.
+	 *
+	 * @param ctx
+	 * 	The context creating this session object.
+	 * 	The context contains all the configuration settings for this object.
+	 * 	Can be <jk>null</jk>.
+	 * @param args
+	 * 	Runtime arguments.
+	 * 	These specify session-level information such as locale and URI context.
+	 * 	It also include session-level properties that override the properties defined on the bean and
+	 * 	serializer contexts.
+	 */
+	protected BeanTraverseSession(BeanTraverseContext ctx, BeanSessionArgs args) {
+		super(ctx, args == null ? BeanSessionArgs.DEFAULT : args);
+		args = args == null ? BeanSessionArgs.DEFAULT : args;
+		this.ctx = ctx;
+		this.indent = getInitialDepth();
+		if (isDetectRecursions() || isDebug()) {
+			set = new IdentityHashMap<>();
+		} else {
+			set = Collections.emptyMap();
+		}
+	}
+
+	/**
+	 * Sets the current bean property being traversed for proper error messages.
+	 *
+	 * @param currentProperty The current property being traversed.
+	 */
+	protected final void setCurrentProperty(BeanPropertyMeta currentProperty) {
+		this.currentProperty = currentProperty;
+	}
+
+	/**
+	 * Sets the current class being traversed for proper error messages.
+	 *
+	 * @param currentClass The current class being traversed.
+	 */
+	protected final void setCurrentClass(ClassMeta<?> currentClass) {
+		this.currentClass = currentClass;
+	}
+
+	/**
+	 * Push the specified object onto the stack.
+	 *
+	 * @param attrName The attribute name.
+	 * @param o The current object being traversed.
+	 * @param eType The expected class type.
+	 * @return
+	 * 	The {@link ClassMeta} of the object so that <code>instanceof</code> operations only need to be performed
+	 * 	once (since they can be expensive).
+	 * @throws BeanRecursionException If recursion occurred.
+	 */
+	protected final ClassMeta<?> push(String attrName, Object o, ClassMeta<?> eType) throws BeanRecursionException {
+		indent++;
+		isBottom = true;
+		if (o == null)
+			return null;
+		Class<?> c = o.getClass();
+		ClassMeta<?> cm = (eType != null && c == eType.getInnerClass()) ? eType : getClassMeta(c);
+		if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
+			return cm;
+		if (isDetectRecursions() || isDebug()) {
+			if (stack.size() > getMaxDepth())
+				return null;
+			if (willRecurse(attrName, o, cm))
+				return null;
+			isBottom = false;
+			stack.add(new StackElement(stack.size(), attrName, o, cm));
+			if (isDebug())
+				getLogger().info(getStack(false));
+			set.put(o, o);
+		}
+		return cm;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if {@link BeanTraverseContext#BEANTRAVERSE_detectRecursions} is enabled, and the specified
+	 * object is already higher up in the traversal chain.
+	 *
+	 * @param attrName The bean property attribute name, or some other identifier.
+	 * @param o The object to check for recursion.
+	 * @param cm The metadata on the object class.
+	 * @return <jk>true</jk> if recursion detected.
+	 * @throws BeanRecursionException If recursion occurred.
+	 */
+	protected final boolean willRecurse(String attrName, Object o, ClassMeta<?> cm) throws BeanRecursionException {
+		if (! (isDetectRecursions() || isDebug()))
+			return false;
+		if (! set.containsKey(o))
+			return false;
+		if (isIgnoreRecursions() && ! isDebug())
+			return true;
+
+		stack.add(new StackElement(stack.size(), attrName, o, cm));
+		throw new BeanRecursionException("Recursion occurred, stack={0}", getStack(true));
+	}
+
+	/**
+	 * Pop an object off the stack.
+	 */
+	protected final void pop() {
+		indent--;
+		if ((isDetectRecursions() || isDebug()) && ! isBottom)  {
+			Object o = stack.removeLast().o;
+			Object o2 = set.remove(o);
+			if (o2 == null)
+				onError(null, "Couldn't remove object of type ''{0}'' on attribute ''{1}'' from object stack.",
+					o.getClass().getName(), stack);
+		}
+		isBottom = false;
+	}
+
+	/**
+	 * Logs a warning message.
+	 *
+	 * @param t The throwable that was thrown (if there was one).
+	 * @param msg The warning message.
+	 * @param args Optional {@link MessageFormat}-style arguments.
+	 */
+	protected void onError(Throwable t, String msg, Object... args) {
+		super.addWarning(msg, args);
+	}
+
+	private static final class StackElement {
+		final int depth;
+		final String name;
+		final Object o;
+		final ClassMeta<?> aType;
+
+		StackElement(int depth, String name, Object o, ClassMeta<?> aType) {
+			this.depth = depth;
+			this.name = name;
+			this.o = o;
+			this.aType = aType;
+		}
+
+		String toString(boolean simple) {
+			StringBuilder sb = new StringBuilder().append('[').append(depth).append(']');
+			sb.append(isEmpty(name) ? "<noname>" : name).append(':');
+			sb.append(aType.toString(simple));
+			if (aType != aType.getSerializedClassMeta(null))
+				sb.append('/').append(aType.getSerializedClassMeta(null).toString(simple));
+			return sb.toString();
+		}
+	}
+
+	/**
+	 * Returns the current stack trace.
+	 *
+	 * @param full
+	 * 	If <jk>true</jk>, returns a full stack trace.
+	 * @return The current stack trace.
+	 */
+	protected String getStack(boolean full) {
+		StringBuilder sb = new StringBuilder();
+		for (StackElement e : stack) {
+			if (full) {
+				sb.append("\n\t");
+				for (int i = 1; i < e.depth; i++)
+					sb.append("  ");
+				if (e.depth > 0)
+					sb.append("->");
+				sb.append(e.toString(false));
+			} else {
+				sb.append(" > ").append(e.toString(true));
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Returns information used to determine at what location in the parse a failure occurred.
+	 *
+	 * @return A map, typically containing something like <code>{line:123,column:456,currentProperty:"foobar"}</code>
+	 */
+	public final ObjectMap getLastLocation() {
+		ObjectMap m = new ObjectMap();
+		if (currentClass != null)
+			m.put("currentClass", currentClass);
+		if (currentProperty != null)
+			m.put("currentProperty", currentProperty);
+		if (stack != null && ! stack.isEmpty())
+			m.put("stack", stack);
+		return m;
+	}
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Properties
+	//-----------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Configuration property:  Initial depth.
+	 *
+	 * @see BeanTraverseContext#BEANTRAVERSE_initialDepth
+	 * @return
+	 * 	The initial indentation level at the root.
+	 */
+	protected final int getInitialDepth() {
+		return ctx.getInitialDepth();
+	}
+
+	/**
+	 * Configuration property:  Max traversal depth.
+	 *
+	 * @see BeanTraverseContext#BEANTRAVERSE_maxDepth
+	 * @return
+	 * 	The depth at which traversal is aborted if depth is reached in the POJO tree.
+	 *	<br>If this depth is exceeded, an exception is thrown.
+	 */
+	protected final int getMaxDepth() {
+		return ctx.getMaxDepth();
+	}
+
+	/**
+	 * Configuration property:  Automatically detect POJO recursions.
+	 *
+	 * @see BeanTraverseContext#BEANTRAVERSE_detectRecursions
+	 * @return
+	 * 	<jk>true</jk> if recursions should be checked for during traversal.
+	 */
+	protected final boolean isDetectRecursions() {
+		return ctx.isDetectRecursions();
+	}
+
+	/**
+	 * Configuration property:  Ignore recursion errors.
+	 *
+	 * @see BeanTraverseContext#BEANTRAVERSE_ignoreRecursions
+	 * @return
+	 * 	<jk>true</jk> if when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+	 * 	<br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
+	 */
+	protected final boolean isIgnoreRecursions() {
+		return ctx.isIgnoreRecursions();
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
index bee49d7..92a1f35 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.html;
 
 import org.apache.juneau.*;
-import org.apache.juneau.htmlschema.*;
 import org.apache.juneau.serializer.*;
 
 /**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
similarity index 86%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializer.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
index 2e1a172..5e698c4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializer.java
@@ -10,10 +10,9 @@
 // * "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.htmlschema;
+package org.apache.juneau.html;
 
 import org.apache.juneau.*;
-import org.apache.juneau.html.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
@@ -28,7 +27,7 @@ import org.apache.juneau.serializer.*;
  *
  * <h5 class='topic'>Description</h5>
  *
- * Essentially the same as {@link HtmlSerializer}, except serializes the POJO metamodel instead of the model itself.
+ * Essentially the same as {@link HtmlDocSerializer}, except serializes the POJO metamodel instead of the model itself.
  *
  * <p>
  * Produces output that describes the POJO metamodel similar to an XML schema document.
@@ -39,7 +38,7 @@ import org.apache.juneau.serializer.*;
  */
 public final class HtmlSchemaDocSerializer extends HtmlDocSerializer {
 
-	private final JsonSchemaSerializer jsctx;
+	private final JsonSchemaGenerator generator;
 
 	/**
 	 * Constructor.
@@ -81,17 +80,22 @@ public final class HtmlSchemaDocSerializer extends HtmlDocSerializer {
 	public HtmlSchemaDocSerializer(PropertyStore ps, String produces, String accept) {
 		super(
 			ps.builder()
-				.set(SERIALIZER_detectRecursions, true)
-				.set(SERIALIZER_ignoreRecursions, true)
+				.set(BEANTRAVERSE_detectRecursions, true)
+				.set(BEANTRAVERSE_ignoreRecursions, true)
 				.build(),
 			produces,
 			accept
 		);
-		this.jsctx = new JsonSchemaSerializer(ps);
+
+		generator = JsonSchemaGenerator.create().apply(getPropertyStore()).build();
 	}
 
 	@Override /* Serializer */
 	public HtmlSchemaDocSerializerSession createSession(SerializerSessionArgs args) {
-		return new HtmlSchemaDocSerializerSession(jsctx, this, args);
+		return new HtmlSchemaDocSerializerSession(this, args);
+	}
+
+	JsonSchemaGenerator getGenerator() {
+		return generator;
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerSession.java
similarity index 81%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerSession.java
index 4363073..b566092 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaDocSerializerSession.java
@@ -10,10 +10,8 @@
 // * "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.htmlschema;
+package org.apache.juneau.html;
 
-import org.apache.juneau.*;
-import org.apache.juneau.html.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
@@ -25,27 +23,24 @@ import org.apache.juneau.serializer.*;
  */
 public class HtmlSchemaDocSerializerSession extends HtmlDocSerializerSession {
 
-	private final JsonSchemaSerializerSession js;
+	private final JsonSchemaGeneratorSession genSession;
 
 	/**
 	 * Create a new session using properties specified in the context.
 	 *
-	 * @param jsctx
-	 * 	The JSON-Schema serializer used to convert a POJO into JSON-Schema metadata.
 	 * @param ctx
 	 * 	The context creating this session object.
 	 * 	The context contains all the configuration settings for this object.
 	 * @param args
 	 * 	Runtime arguments.
 	 */
-	protected HtmlSchemaDocSerializerSession(JsonSchemaSerializer jsctx, HtmlSchemaDocSerializer ctx, SerializerSessionArgs args) {
+	protected HtmlSchemaDocSerializerSession(HtmlSchemaDocSerializer ctx, SerializerSessionArgs args) {
 		super(ctx, args);
-		this.js = jsctx.createSession(args);
+		this.genSession = ctx.getGenerator().createSession(args);
 	}
 
 	@Override /* SerializerSession */
 	protected void doSerialize(SerializerPipe out, Object o) throws Exception {
-		ObjectMap schema = js.getSchema(getClassMetaForObject(o));
-		super.doSerialize(out, schema);
+		super.doSerialize(out, genSession.getSchema(o));
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializer.java
similarity index 74%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializer.java
index 6c298a4..1a4ff99 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializer.java
@@ -10,10 +10,9 @@
 // * "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.htmlschema;
+package org.apache.juneau.html;
 
 import org.apache.juneau.*;
-import org.apache.juneau.html.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
@@ -51,8 +50,6 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 	/** Default serializer, single quotes, simple mode, with whitespace. */
 	public static final HtmlSchemaSerializer DEFAULT_SIMPLE_READABLE = new SimpleReadable(PropertyStore.DEFAULT);
 
-	private final JsonSchemaSerializer jsctx;
-
 	//-------------------------------------------------------------------------------------------------------------------
 	// Predefined subclasses
 	//-------------------------------------------------------------------------------------------------------------------
@@ -107,6 +104,12 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 		}
 	}
 
+	//-------------------------------------------------------------------------------------------------------------------
+	// Instance
+	//-------------------------------------------------------------------------------------------------------------------
+
+	private final JsonSchemaGenerator generator;
+
 	/**
 	 * Constructor.
 	 *
@@ -114,7 +117,15 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 	 * 	The property store to use for creating the context for this serializer.
 	 */
 	public HtmlSchemaSerializer(PropertyStore ps) {
-		this(ps, "text/html", "text/html+schema");
+		super(
+			ps.builder()
+				.set(BEANTRAVERSE_detectRecursions, true)
+				.set(BEANTRAVERSE_ignoreRecursions, true)
+				.build(),
+			"text/html", "text/html+schema"
+		);
+
+		generator = JsonSchemaGenerator.create().apply(getPropertyStore()).build();
 	}
 
 	@Override /* Context */
@@ -122,52 +133,17 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 		return new HtmlSchemaSerializerBuilder(getPropertyStore());
 	}
 
-	/**
-	 * Constructor.
-	 *
-	 * @param ps
-	 * 	The property store containing all the settings for this object.
-	 * @param produces
-	 * 	The media type that this serializer produces.
-	 * @param accept
-	 * 	The accept media types that the serializer can handle.
-	 * 	<p>
-	 * 	Can contain meta-characters per the <code>media-type</code> specification of
-	 * 	<a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a>
-	 * 	<p>
-	 * 	If empty, then assumes the only media type supported is <code>produces</code>.
-	 * 	<p>
-	 * 	For example, if this serializer produces <js>"application/json"</js> but should handle media types of
-	 * 	<js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be:
-	 * 	<p class='bcode w800'>
-	 * 	<jk>super</jk>(ps, <js>"application/json"</js>, <js>"application/json,text/json"</js>);
-	 * 	</p>
-	 * 	<br>...or...
-	 * 	<p class='bcode w800'>
-	 * 	<jk>super</jk>(ps, <js>"application/json"</js>, <js>"*&#8203;/json"</js>);
-	 * 	</p>
-	 * <p>
-	 * The accept value can also contain q-values.
-	 */
-	public HtmlSchemaSerializer(PropertyStore ps, String produces, String accept) {
-		super(
-			ps.builder()
-				.set(SERIALIZER_detectRecursions, true)
-				.set(SERIALIZER_ignoreRecursions, true)
-				.build(),
-			produces,
-			accept
-		);
-		this.jsctx = new JsonSchemaSerializer(ps);
-	}
-
 	@Override /* Serializer */
 	public HtmlSchemaSerializerSession createSession(SerializerSessionArgs args) {
-		return new HtmlSchemaSerializerSession(jsctx, this, args);
+		return new HtmlSchemaSerializerSession(this, args);
 	}
 
 	@Override /* Context */
 	public HtmlSchemaSerializerSession createSession() {
 		return createSession(createDefaultSessionArgs());
 	}
+
+	JsonSchemaGenerator getGenerator() {
+		return generator;
+	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
similarity index 94%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
index a5d0b47..e1c9c04 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
@@ -10,21 +10,20 @@
 // * "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.htmlschema;
+package org.apache.juneau.html;
 
-import static org.apache.juneau.jsonschema.JsonSchemaSerializer.*;
+import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
 
 import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
-import org.apache.juneau.html.*;
 import org.apache.juneau.http.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
 /**
- * Builder class for building instances of JSON Schema serializers.
+ * Builder class for building instances of HTML Schema serializers.
  */
 public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 
@@ -64,7 +63,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
 	 * </ul>
 	 *
 	 * @param value
@@ -91,7 +90,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
 	 * </ul>
 	 *
 	 * @param value
@@ -111,7 +110,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedDescriptions}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions}
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
@@ -128,7 +127,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples}
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
@@ -145,11 +144,11 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * <p>
 	 * Used primarily for defining common definition sections for beans in Swagger JSON.
 	 * <p>
-	 * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+	 * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
 	 * </ul>
 	 *
 	 * @param value
@@ -169,11 +168,11 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * <p>
 	 * Used primarily for defining common definition sections for beans in Swagger JSON.
 	 * <p>
-	 * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+	 * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
 	 * </ul>
 	 *
 	 * @param value
@@ -195,7 +194,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_defaultSchemas}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_defaultSchemas}
 	 * </ul>
 	 *
 	 * @param c
@@ -220,11 +219,6 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * 	}
 	 * </p>
 	 *
-	 * <p>
-	 * The definitions can then be retrieved from the session using {@link JsonSchemaSerializerSession#getBeanDefs()}.
-	 * <p>
-	 * Definitions can also be added programmatically using {@link JsonSchemaSerializerSession#addBeanDef(String, ObjectMap)}.
-	 *
 	 * @return This object (for method chaining).
 	 */
 	public HtmlSchemaSerializerBuilder useBeanDefs() {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerSession.java
similarity index 75%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerSession.java
index 92f2dcc..0a53944 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerSession.java
@@ -10,50 +10,37 @@
 // * "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.htmlschema;
+package org.apache.juneau.html;
 
-import java.lang.reflect.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.html.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
 /**
- * Context object that lives for the duration of a single serialization of {@link HtmlSchemaDocSerializer} and its subclasses.
+ * Context object that lives for the duration of a single serialization of {@link HtmlSchemaSerializer} and its subclasses.
  *
  * <p>
  * This class is NOT thread safe.  It is meant to be discarded after one-time use.
  */
 public class HtmlSchemaSerializerSession extends HtmlSerializerSession {
 
-	private final JsonSchemaSerializerSession js;
+	private final JsonSchemaGeneratorSession genSession;
 
 	/**
 	 * Create a new session using properties specified in the context.
 	 *
-	 * @param jsctx
-	 * 	The JSON-Schema serializer used to convert a POJO into JSON-Schema metadata.
 	 * @param ctx
 	 * 	The context creating this session object.
 	 * 	The context contains all the configuration settings for this object.
 	 * @param args
 	 * 	Runtime arguments.
 	 */
-	protected HtmlSchemaSerializerSession(JsonSchemaSerializer jsctx, HtmlSchemaSerializer ctx, SerializerSessionArgs args) {
+	protected HtmlSchemaSerializerSession(HtmlSchemaSerializer ctx, SerializerSessionArgs args) {
 		super(ctx, args);
-		this.js = jsctx.createSession(args);
+		this.genSession = ctx.getGenerator().createSession(args);
 	}
 
 	@Override /* SerializerSession */
 	protected void doSerialize(SerializerPipe out, Object o) throws Exception {
-		ObjectMap schema = js.getSchema(toClassMeta(o));
-		super.doSerialize(out, schema);
-	}
-
-	private ClassMeta<?> toClassMeta(Object o) {
-		if (o instanceof Type)
-			return getClassMeta((Type)o);
-		return getClassMetaForObject(o);
+		super.doSerialize(out, genSession.getSchema(o));
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index 182c009..d7f384d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -16,7 +16,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.htmlschema.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.*;
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
index a63cfd1..423d572 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
@@ -472,8 +472,8 @@ public @interface Body {
 	 * 	</ul>
 	 * 	<li class='jc'>{@link JsonSchemaSerializer}
 	 * 	<ul>
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
 	 * 	</ul>
 	 * </ul>
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
index cd875e4..f7e84db 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
@@ -22,6 +22,7 @@ import java.util.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.httppart.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.*;
 
 /**
@@ -1002,8 +1003,8 @@ public @interface FormData {
 	 * 	</ul>
 	 * 	<li class='jc'>{@link JsonSchemaSerializer}
 	 * 	<ul>
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
 	 * 	</ul>
 	 * </ul>
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
index 46fa2f6..e358b59 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
@@ -21,6 +21,7 @@ import java.util.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.httppart.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.*;
 
 /**
@@ -963,8 +964,8 @@ public @interface Header {
 	 * 	</ul>
 	 * 	<li class='jc'>{@link JsonSchemaSerializer}
 	 * 	<ul>
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
 	 * 	</ul>
 	 * </ul>
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
index e66e310..8dcc4b2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
@@ -20,6 +20,7 @@ import java.lang.annotation.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.httppart.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.*;
 
 /**
@@ -820,8 +821,8 @@ public @interface Path {
 	 * 	</ul>
 	 * 	<li class='jc'>{@link JsonSchemaSerializer}
 	 * 	<ul>
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
 	 * 	</ul>
 	 * </ul>
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
index 51f95bf..c1856b1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
@@ -22,6 +22,7 @@ import java.util.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.httppart.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.*;
 
 /**
@@ -998,8 +999,8 @@ public @interface Query {
 	 * 	</ul>
 	 * 	<li class='jc'>{@link JsonSchemaSerializer}
 	 * 	<ul>
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
 	 * 	</ul>
 	 * </ul>
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
index 0503a67..6cf9c9d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
@@ -241,8 +241,8 @@ public @interface Response {
 	 * 	</ul>
 	 * 	<li class='jc'>{@link JsonSchemaSerializer}
 	 * 	<ul>
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
-	 * 		<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+	 * 		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
 	 * 	</ul>
 	 * </ul>
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
similarity index 53%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
index 6c298a4..a067ac4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
@@ -10,55 +10,51 @@
 // * "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.htmlschema;
+package org.apache.juneau.json;
 
 import org.apache.juneau.*;
-import org.apache.juneau.html.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
 /**
- * Serializes POJO metamodels to HTML.
+ * Serializes POJO metadata to HTTP responses as JSON-Schema.
  *
  * <h5 class='topic'>Media types</h5>
  *
- * Handles <code>Accept</code> types:  <code><b>text/html+schema</b></code>
+ * Handles <code>Accept</code> types:  <code><b>application/json+schema, text/json+schema</b></code>
  * <p>
- * Produces <code>Content-Type</code> types:  <code><b>text/html</b></code>
+ * Produces <code>Content-Type</code> types:  <code><b>application/json</b></code>
  *
  * <h5 class='topic'>Description</h5>
  *
- * Essentially the same as {@link HtmlSerializer}, except serializes the POJO metamodel instead of the model itself.
- *
- * <p>
- * Produces output that describes the POJO metamodel similar to an XML schema document.
- *
- * <p>
- * The easiest way to create instances of this class is through the {@link HtmlSerializer#getSchemaSerializer()},
- * which will create a schema serializer with the same settings as the originating serializer.
+ * Produces the JSON-schema for the JSON produced by the {@link JsonSerializer} class with the same properties.
  */
-public class HtmlSchemaSerializer extends HtmlSerializer {
+public class JsonSchemaSerializer extends JsonSerializer {
+
+
+	//-------------------------------------------------------------------------------------------------------------------
+	// Predefined instances
+	//-------------------------------------------------------------------------------------------------------------------
 
 	/** Default serializer, all default settings.*/
-	public static final HtmlSchemaSerializer DEFAULT = new HtmlSchemaSerializer(PropertyStore.DEFAULT);
+	public static final JsonSchemaSerializer DEFAULT = new JsonSchemaSerializer(PropertyStore.DEFAULT);
 
 	/** Default serializer, all default settings.*/
-	public static final HtmlSchemaSerializer DEFAULT_READABLE = new Readable(PropertyStore.DEFAULT);
+	public static final JsonSchemaSerializer DEFAULT_READABLE = new Readable(PropertyStore.DEFAULT);
 
 	/** Default serializer, single quotes, simple mode. */
-	public static final HtmlSchemaSerializer DEFAULT_SIMPLE = new Simple(PropertyStore.DEFAULT);
+	public static final JsonSchemaSerializer DEFAULT_SIMPLE = new Simple(PropertyStore.DEFAULT);
 
 	/** Default serializer, single quotes, simple mode, with whitespace. */
-	public static final HtmlSchemaSerializer DEFAULT_SIMPLE_READABLE = new SimpleReadable(PropertyStore.DEFAULT);
+	public static final JsonSchemaSerializer DEFAULT_SIMPLE_READABLE = new SimpleReadable(PropertyStore.DEFAULT);
 
-	private final JsonSchemaSerializer jsctx;
 
 	//-------------------------------------------------------------------------------------------------------------------
 	// Predefined subclasses
 	//-------------------------------------------------------------------------------------------------------------------
 
 	/** Default serializer, with whitespace. */
-	public static class Readable extends HtmlSchemaSerializer {
+	public static class Readable extends JsonSchemaSerializer {
 
 		/**
 		 * Constructor.
@@ -73,7 +69,7 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 	}
 
 	/** Default serializer, single quotes, simple mode. */
-	public static class Simple extends HtmlSchemaSerializer {
+	public static class Simple extends JsonSchemaSerializer {
 
 		/**
 		 * Constructor.
@@ -83,6 +79,7 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 		public Simple(PropertyStore ps) {
 			super(
 				ps.builder()
+					.set(JSON_simpleMode, true)
 					.set(WSERIALIZER_quoteChar, '\'')
 					.build()
 				);
@@ -90,7 +87,7 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 	}
 
 	/** Default serializer, single quotes, simple mode, with whitespace. */
-	public static class SimpleReadable extends HtmlSchemaSerializer {
+	public static class SimpleReadable extends JsonSchemaSerializer {
 
 		/**
 		 * Constructor.
@@ -100,6 +97,7 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 		public SimpleReadable(PropertyStore ps) {
 			super(
 				ps.builder()
+					.set(JSON_simpleMode, true)
 					.set(WSERIALIZER_quoteChar, '\'')
 					.set(SERIALIZER_useWhitespace, true)
 					.build()
@@ -107,67 +105,58 @@ public class HtmlSchemaSerializer extends HtmlSerializer {
 		}
 	}
 
+
+	//-------------------------------------------------------------------------------------------------------------------
+	// Instance
+	//-------------------------------------------------------------------------------------------------------------------
+
+	private final JsonSchemaGenerator generator;
+
 	/**
 	 * Constructor.
 	 *
-	 * @param ps
-	 * 	The property store to use for creating the context for this serializer.
+	 * @param ps Initialize with the specified config property store.
 	 */
-	public HtmlSchemaSerializer(PropertyStore ps) {
-		this(ps, "text/html", "text/html+schema");
+	public JsonSchemaSerializer(PropertyStore ps) {
+		super(
+			ps.builder()
+				.set(BEANTRAVERSE_detectRecursions, true)
+				.set(BEANTRAVERSE_ignoreRecursions, true)
+				.build(),
+			"application/json", "application/json+schema,text/json+schema"
+		);
+
+		generator = JsonSchemaGenerator.create().apply(getPropertyStore()).build();
 	}
 
 	@Override /* Context */
-	public HtmlSchemaSerializerBuilder builder() {
-		return new HtmlSchemaSerializerBuilder(getPropertyStore());
+	public JsonSchemaSerializerBuilder builder() {
+		return new JsonSchemaSerializerBuilder(getPropertyStore());
 	}
 
 	/**
-	 * Constructor.
+	 * Instantiates a new clean-slate {@link JsonSerializerBuilder} object.
 	 *
-	 * @param ps
-	 * 	The property store containing all the settings for this object.
-	 * @param produces
-	 * 	The media type that this serializer produces.
-	 * @param accept
-	 * 	The accept media types that the serializer can handle.
-	 * 	<p>
-	 * 	Can contain meta-characters per the <code>media-type</code> specification of
-	 * 	<a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a>
-	 * 	<p>
-	 * 	If empty, then assumes the only media type supported is <code>produces</code>.
-	 * 	<p>
-	 * 	For example, if this serializer produces <js>"application/json"</js> but should handle media types of
-	 * 	<js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be:
-	 * 	<p class='bcode w800'>
-	 * 	<jk>super</jk>(ps, <js>"application/json"</js>, <js>"application/json,text/json"</js>);
-	 * 	</p>
-	 * 	<br>...or...
-	 * 	<p class='bcode w800'>
-	 * 	<jk>super</jk>(ps, <js>"application/json"</js>, <js>"*&#8203;/json"</js>);
-	 * 	</p>
 	 * <p>
-	 * The accept value can also contain q-values.
+	 * This is equivalent to simply calling <code><jk>new</jk> JsonSerializerBuilder()</code>.
+	 *
+	 * @return A new {@link JsonSerializerBuilder} object.
 	 */
-	public HtmlSchemaSerializer(PropertyStore ps, String produces, String accept) {
-		super(
-			ps.builder()
-				.set(SERIALIZER_detectRecursions, true)
-				.set(SERIALIZER_ignoreRecursions, true)
-				.build(),
-			produces,
-			accept
-		);
-		this.jsctx = new JsonSchemaSerializer(ps);
+	public static JsonSchemaSerializerBuilder create() {
+		return new JsonSchemaSerializerBuilder();
+	}
+
+	@Override /* Context */
+	public JsonSchemaSerializerSession createSession() {
+		return createSession(createDefaultSessionArgs());
 	}
 
 	@Override /* Serializer */
-	public HtmlSchemaSerializerSession createSession(SerializerSessionArgs args) {
-		return new HtmlSchemaSerializerSession(jsctx, this, args);
+	public JsonSchemaSerializerSession createSession(SerializerSessionArgs args) {
+		return new JsonSchemaSerializerSession(this, args);
 	}
 
-	@Override /* Context */
-	public HtmlSchemaSerializerSession createSession() {
-		return createSession(createDefaultSessionArgs());
+	JsonSchemaGenerator getGenerator() {
+		return generator;
 	}
-}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
similarity index 95%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerBuilder.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
index 119f7f7..de998c9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
@@ -10,16 +10,16 @@
 // * "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.jsonschema;
+package org.apache.juneau.json;
 
-import static org.apache.juneau.jsonschema.JsonSchemaSerializer.*;
+import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
 
 import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.json.*;
+import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -63,7 +63,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
 	 * </ul>
 	 *
 	 * @param value
@@ -90,7 +90,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
 	 * </ul>
 	 *
 	 * @param value
@@ -110,7 +110,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedDescriptions}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions}
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
@@ -127,7 +127,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples}
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
@@ -144,11 +144,11 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 	 * <p>
 	 * Used primarily for defining common definition sections for beans in Swagger JSON.
 	 * <p>
-	 * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+	 * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
 	 * </ul>
 	 *
 	 * @param value
@@ -168,11 +168,11 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 	 * <p>
 	 * Used primarily for defining common definition sections for beans in Swagger JSON.
 	 * <p>
-	 * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+	 * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
 	 * </ul>
 	 *
 	 * @param value
@@ -194,7 +194,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_defaultSchemas}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_defaultSchemas}
 	 * </ul>
 	 *
 	 * @param c
@@ -219,11 +219,6 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 	 * 	}
 	 * </p>
 	 *
-	 * <p>
-	 * The definitions can then be retrieved from the session using {@link JsonSchemaSerializerSession#getBeanDefs()}.
-	 * <p>
-	 * Definitions can also be added programmatically using {@link JsonSchemaSerializerSession#addBeanDef(String, ObjectMap)}.
-	 *
 	 * @return This object (for method chaining).
 	 */
 	public JsonSchemaSerializerBuilder useBeanDefs() {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
similarity index 71%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
index 4363073..b7a5ccf 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaDocSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
@@ -10,42 +10,41 @@
 // * "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.htmlschema;
+package org.apache.juneau.json;
 
-import org.apache.juneau.*;
-import org.apache.juneau.html.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
 /**
- * Context object that lives for the duration of a single serialization of {@link HtmlSchemaDocSerializer} and its subclasses.
+ * Session object that lives for the duration of a single use of {@link JsonSchemaSerializer}.
  *
  * <p>
- * This class is NOT thread safe.  It is meant to be discarded after one-time use.
+ * This class is NOT thread safe.
+ * It is typically discarded after one-time use although it can be reused within the same thread.
  */
-public class HtmlSchemaDocSerializerSession extends HtmlDocSerializerSession {
+public class JsonSchemaSerializerSession extends JsonSerializerSession {
 
-	private final JsonSchemaSerializerSession js;
+	private final JsonSchemaGeneratorSession genSession;
 
 	/**
 	 * Create a new session using properties specified in the context.
 	 *
-	 * @param jsctx
-	 * 	The JSON-Schema serializer used to convert a POJO into JSON-Schema metadata.
 	 * @param ctx
 	 * 	The context creating this session object.
 	 * 	The context contains all the configuration settings for this object.
 	 * @param args
 	 * 	Runtime arguments.
+	 * 	These specify session-level information such as locale and URI context.
+	 * 	It also include session-level properties that override the properties defined on the bean and
+	 * 	serializer contexts.
 	 */
-	protected HtmlSchemaDocSerializerSession(JsonSchemaSerializer jsctx, HtmlSchemaDocSerializer ctx, SerializerSessionArgs args) {
+	protected JsonSchemaSerializerSession(JsonSchemaSerializer ctx, SerializerSessionArgs args) {
 		super(ctx, args);
-		this.js = jsctx.createSession(args);
+		genSession = ctx.getGenerator().createSession(args);
 	}
 
 	@Override /* SerializerSession */
 	protected void doSerialize(SerializerPipe out, Object o) throws Exception {
-		ObjectMap schema = js.getSchema(getClassMetaForObject(o));
-		super.doSerialize(out, schema);
+		super.doSerialize(out, genSession.getSchema(o));
 	}
-}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
index e5f83ef..77b2600 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -15,7 +15,6 @@ package org.apache.juneau.json;
 import java.util.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -295,7 +294,7 @@ public class JsonSerializer extends WriterSerializer {
 					.set(JSON_simpleMode, true)
 					.set(WSERIALIZER_quoteChar, '\'')
 					.set(SERIALIZER_useWhitespace, true)
-					.set(SERIALIZER_detectRecursions, true)
+					.set(BEANTRAVERSE_detectRecursions, true)
 					.build()
 			);
 		}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index 2aab6b9..7c3a3e3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -17,7 +17,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
-import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
similarity index 76%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializer.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
index c860398..bc265d1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
@@ -1,459 +1,382 @@
-// ***************************************************************************************************************************
-// * 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.jsonschema;
-
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.json.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Serializes POJO metadata to HTTP responses as JSON.
- *
- * <h5 class='topic'>Media types</h5>
- *
- * Handles <code>Accept</code> types:  <code><b>application/json+schema, text/json+schema</b></code>
- * <p>
- * Produces <code>Content-Type</code> types:  <code><b>application/json</b></code>
- *
- * <h5 class='topic'>Description</h5>
- *
- * Produces the JSON-schema for the JSON produced by the {@link JsonSerializer} class with the same properties.
- */
-public class JsonSchemaSerializer extends JsonSerializer {
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Configurable properties
-	//-------------------------------------------------------------------------------------------------------------------
-
-	private static final String PREFIX = "JsonSchemaSerializer.";
-
-	/**
-	 * Configuration property:  Add descriptions to types.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.addDescriptionsTo.s"</js>
-	 * 	<li><b>Data type:</b>  <code>String</code>
-	 * 	<li><b>Default:</b>  Empty string.
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#addDescriptionsTo(String)}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Identifies which categories of types that descriptions should be automatically added to generated schemas.
-	 * <p>
-	 * The description is the result of calling {@link ClassMeta#getReadableName()}.
-	 * <p>
-	 * The format is a comma-delimited list of any of the following values:
-	 *
-	 * <ul class='doctree'>
-	 * 	<li class='jf'>{@link TypeCategory#BEAN BEAN}
-	 * 	<li class='jf'>{@link TypeCategory#COLLECTION COLLECTION}
-	 * 	<li class='jf'>{@link TypeCategory#ARRAY ARRAY}
-	 * 	<li class='jf'>{@link TypeCategory#MAP MAP}
-	 * 	<li class='jf'>{@link TypeCategory#STRING STRING}
-	 * 	<li class='jf'>{@link TypeCategory#NUMBER NUMBER}
-	 * 	<li class='jf'>{@link TypeCategory#BOOLEAN BOOLEAN}
-	 * 	<li class='jf'>{@link TypeCategory#ANY ANY}
-	 * 	<li class='jf'>{@link TypeCategory#OTHER OTHER}
-	 * </ul>
-	 */
-	public static final String JSONSCHEMA_addDescriptionsTo = PREFIX + "addDescriptionsTo.s";
-
-	/**
-	 * Configuration property:  Add examples.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.addExamplesTo.s"</js>
-	 * 	<li><b>Data type:</b>  <code>String</code>
-	 * 	<li><b>Default:</b>  Empty string.
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#addExamplesTo(String)}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Identifies which categories of types that examples should be automatically added to generated schemas.
-	 * <p>
-	 * The examples come from calling {@link ClassMeta#getExample(BeanSession)} which in turn gets examples
-	 * from the following:
-	 * <ul class='doctree'>
-	 * 	<li class='ja'>{@link Example}
-	 * 	<li class='jf'>{@link BeanContext#BEAN_examples}
-	 * </ul>
-	 *
-	 * <p>
-	 * The format is a comma-delimited list of any of the following values:
-	 *
-	 * <ul class='doctree'>
-	 * 	<li class='jf'>{@link TypeCategory#BEAN BEAN}
-	 * 	<li class='jf'>{@link TypeCategory#COLLECTION COLLECTION}
-	 * 	<li class='jf'>{@link TypeCategory#ARRAY ARRAY}
-	 * 	<li class='jf'>{@link TypeCategory#MAP MAP}
-	 * 	<li class='jf'>{@link TypeCategory#STRING STRING}
-	 * 	<li class='jf'>{@link TypeCategory#NUMBER NUMBER}
-	 * 	<li class='jf'>{@link TypeCategory#BOOLEAN BOOLEAN}
-	 * 	<li class='jf'>{@link TypeCategory#ANY ANY}
-	 * 	<li class='jf'>{@link TypeCategory#OTHER OTHER}
-	 * </ul>
-	 */
-	public static final String JSONSCHEMA_addExamplesTo = PREFIX + "addExamplesTo.s";
-
-	/**
-	 * Configuration property:  Allow nested descriptions.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.allowNestedDescriptions.b"</js>
-	 * 	<li><b>Data type:</b>  <code>Boolean</code>
-	 * 	<li><b>Default:</b>  <jk>false</jk>
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#allowNestedDescriptions()}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Identifies whether nested descriptions are allowed in schema definitions.
-	 */
-	public static final String JSONSCHEMA_allowNestedDescriptions = PREFIX + "allowNestedDescriptions.b";
-
-	/**
-	 * Configuration property:  Allow nested examples.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.allowNestedExamples.b"</js>
-	 * 	<li><b>Data type:</b>  <code>Boolean</code>
-	 * 	<li><b>Default:</b>  <jk>false</jk>
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#allowNestedExamples()}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Identifies whether nested examples are allowed in schema definitions.
-	 */
-	public static final String JSONSCHEMA_allowNestedExamples = PREFIX + "allowNestedExamples.b";
-
-	/**
-	 * Configuration property:  Bean schema definition mapper.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.beanDefMapper.o"</js>
-	 * 	<li><b>Data type:</b>  {@link BeanDefMapper}
-	 * 	<li><b>Default:</b>  {@link BasicBeanDefMapper}
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#beanDefMapper(Class)}
-	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#beanDefMapper(BeanDefMapper)}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Interface to use for converting Bean classes to definition IDs and URIs.
-	 * <p>
-	 * Used primarily for defining common definition sections for beans in Swagger JSON.
-	 * <p>
-	 * This setting is ignored if {@link #JSONSCHEMA_useBeanDefs} is not enabled.
-	 */
-	public static final String JSONSCHEMA_beanDefMapper = PREFIX + "beanDefMapper.o";
-
-	/**
-	 * Configuration property:  Default schemas.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.defaultSchema.smo"</js>
-	 * 	<li><b>Data type:</b>  <code>Map&lt;String,ObjectMap&gt;</code>
-	 * 	<li><b>Default:</b>  Empty map.
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#defaultSchema(Class,ObjectMap)}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Allows you to override or provide custom schema information for particular class types.
-	 * <p>
-	 * Keys are full class names.
-	 */
-	public static final String JSONSCHEMA_defaultSchemas = PREFIX + "defaultSchemas.smo";
-
-	/**
-	 * Configuration property:  Use bean definitions.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.useBeanDefs.o"</js>
-	 * 	<li><b>Data type:</b>  <code>Boolean</code>
-	 * 	<li><b>Default:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#useBeanDefs()}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * When enabled, schemas on beans will be serialized as the following:
-	 * <p class='bcode w800'>
-	 * 	{
-	 * 		type: <js>'object'</js>,
-	 * 		<js>'$ref'</js>: <js>'#/definitions/TypeId'</js>
-	 * 	}
-	 * </p>
-	 *
-	 * <p>
-	 * The definitions can then be retrieved from the session using {@link JsonSchemaSerializerSession#getBeanDefs()}.
-	 * <p>
-	 * Definitions can also be added programmatically using {@link JsonSchemaSerializerSession#addBeanDef(String, ObjectMap)}.
-	 */
-	public static final String JSONSCHEMA_useBeanDefs = PREFIX + "useBeanDefs.b";
-
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Predefined instances
-	//-------------------------------------------------------------------------------------------------------------------
-
-	/** Default serializer, all default settings.*/
-	public static final JsonSchemaSerializer DEFAULT = new JsonSchemaSerializer(PropertyStore.DEFAULT);
-
-	/** Default serializer, all default settings.*/
-	public static final JsonSchemaSerializer DEFAULT_READABLE = new Readable(PropertyStore.DEFAULT);
-
-	/** Default serializer, single quotes, simple mode. */
-	public static final JsonSchemaSerializer DEFAULT_SIMPLE = new Simple(PropertyStore.DEFAULT);
-
-	/** Default serializer, single quotes, simple mode, with whitespace. */
-	public static final JsonSchemaSerializer DEFAULT_SIMPLE_READABLE = new SimpleReadable(PropertyStore.DEFAULT);
-
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Predefined subclasses
-	//-------------------------------------------------------------------------------------------------------------------
-
-	/** Default serializer, with whitespace. */
-	public static class Readable extends JsonSchemaSerializer {
-
-		/**
-		 * Constructor.
-		 *
-		 * @param ps The property store containing all the settings for this object.
-		 */
-		public Readable(PropertyStore ps) {
-			super(
-				ps.builder().set(SERIALIZER_useWhitespace, true).build()
-			);
-		}
-	}
-
-	/** Default serializer, single quotes, simple mode. */
-	public static class Simple extends JsonSchemaSerializer {
-
-		/**
-		 * Constructor.
-		 *
-		 * @param ps The property store containing all the settings for this object.
-		 */
-		public Simple(PropertyStore ps) {
-			super(
-				ps.builder()
-					.set(JSON_simpleMode, true)
-					.set(WSERIALIZER_quoteChar, '\'')
-					.build()
-				);
-		}
-	}
-
-	/** Default serializer, single quotes, simple mode, with whitespace. */
-	public static class SimpleReadable extends JsonSchemaSerializer {
-
-		/**
-		 * Constructor.
-		 *
-		 * @param ps The property store containing all the settings for this object.
-		 */
-		public SimpleReadable(PropertyStore ps) {
-			super(
-				ps.builder()
-					.set(JSON_simpleMode, true)
-					.set(WSERIALIZER_quoteChar, '\'')
-					.set(SERIALIZER_useWhitespace, true)
-					.build()
-			);
-		}
-	}
-
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Instance
-	//-------------------------------------------------------------------------------------------------------------------
-
-	private final boolean useBeanDefs, allowNestedExamples, allowNestedDescriptions;
-	private final BeanDefMapper beanDefMapper;
-	private final Set<TypeCategory> addExamplesTo, addDescriptionsTo;
-	private final Map<String,ObjectMap> defaultSchemas;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param ps Initialize with the specified config property store.
-	 */
-	public JsonSchemaSerializer(PropertyStore ps) {
-		super(
-			ps.builder()
-				.set(SERIALIZER_detectRecursions, true)
-				.set(SERIALIZER_ignoreRecursions, true)
-				.build(),
-			"application/json", "application/json+schema,text/json+schema"
-		);
-
-		useBeanDefs = getBooleanProperty(JSONSCHEMA_useBeanDefs, false);
-		allowNestedExamples = getBooleanProperty(JSONSCHEMA_allowNestedExamples, false);
-		allowNestedDescriptions = getBooleanProperty(JSONSCHEMA_allowNestedDescriptions, false);
-		beanDefMapper = getInstanceProperty(JSONSCHEMA_beanDefMapper, BeanDefMapper.class, BasicBeanDefMapper.class);
-		addExamplesTo = TypeCategory.parse(getStringProperty(JSONSCHEMA_addExamplesTo, null));
-		addDescriptionsTo = TypeCategory.parse(getStringProperty(JSONSCHEMA_addDescriptionsTo, null));
-		defaultSchemas = getMapProperty(JSONSCHEMA_defaultSchemas, ObjectMap.class);
-	}
-
-	@Override /* Context */
-	public JsonSchemaSerializerBuilder builder() {
-		return new JsonSchemaSerializerBuilder(getPropertyStore());
-	}
-
-	/**
-	 * Instantiates a new clean-slate {@link JsonSerializerBuilder} object.
-	 *
-	 * <p>
-	 * This is equivalent to simply calling <code><jk>new</jk> JsonSerializerBuilder()</code>.
-	 *
-	 * @return A new {@link JsonSerializerBuilder} object.
-	 */
-	public static JsonSchemaSerializerBuilder create() {
-		return new JsonSchemaSerializerBuilder();
-	}
-
-	@Override /* Context */
-	public JsonSchemaSerializerSession createSession() {
-		return createSession(createDefaultSessionArgs());
-	}
-
-	@Override /* Serializer */
-	public JsonSchemaSerializerSession createSession(SerializerSessionArgs args) {
-		return new JsonSchemaSerializerSession(this, args);
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Properties
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Configuration property:  Use bean definitions.
-	 *
-	 * @see #JSONSCHEMA_useBeanDefs
-	 * @return
-	 * 	<jk>true</jk> if schemas on beans will be serialized with <js>'$ref'</js> tags.
-	 */
-	protected final boolean isUseBeanDefs() {
-		return useBeanDefs;
-	}
-
-	/**
-	 * Configuration property:  Allow nested examples.
-	 *
-	 * @see #JSONSCHEMA_allowNestedExamples
-	 * @return
-	 * 	<jk>true</jk> if nested examples are allowed in schema definitions.
-	 */
-	protected final boolean isAllowNestedExamples() {
-		return allowNestedExamples;
-	}
-
-	/**
-	 * Configuration property:  Allow nested descriptions.
-	 *
-	 * @see #JSONSCHEMA_allowNestedDescriptions
-	 * @return
-	 * 	<jk>true</jk> if nested descriptions are allowed in schema definitions.
-	 */
-	protected final boolean isAllowNestedDescriptions() {
-		return allowNestedDescriptions;
-	}
-
-	/**
-	 * Configuration property:  Bean schema definition mapper.
-	 *
-	 * @see #JSONSCHEMA_beanDefMapper
-	 * @return
-	 * 	Interface to use for converting Bean classes to definition IDs and URIs.
-	 */
-	protected final BeanDefMapper getBeanDefMapper() {
-		return beanDefMapper;
-	}
-
-	/**
-	 * Configuration property:  Add examples.
-	 *
-	 * @see #JSONSCHEMA_addExamplesTo
-	 * @return
-	 * 	Set of categories of types that examples should be automatically added to generated schemas.
-	 */
-	protected final Set<TypeCategory> getAddExamplesTo() {
-		return addExamplesTo;
-	}
-
-	/**
-	 * Configuration property:  Add descriptions to types.
-	 *
-	 * @see #JSONSCHEMA_addDescriptionsTo
-	 * @return
-	 * 	Set of categories of types that descriptions should be automatically added to generated schemas.
-	 */
-	protected final Set<TypeCategory> getAddDescriptionsTo() {
-		return addDescriptionsTo;
-	}
-
-	/**
-	 * Configuration property:  Default schemas.
-	 *
-	 * @see #JSONSCHEMA_defaultSchemas
-	 * @return
-	 * 	Custom schema information for particular class types.
-	 */
-	protected final Map<String,ObjectMap> getDefaultSchemas() {
-		return defaultSchemas;
-	}
-}
\ No newline at end of file
+// ***************************************************************************************************************************
+// * 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.jsonschema;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.json.*;
+
+/**
+ * Generates JSON-schema metadata about POJOs.
+ */
+public class JsonSchemaGenerator extends BeanTraverseContext {
+
+	//-------------------------------------------------------------------------------------------------------------------
+	// Configurable properties
+	//-------------------------------------------------------------------------------------------------------------------
+
+	private static final String PREFIX = "JsonSchemaGenerator.";
+
+	/**
+	 * Configuration property:  Add descriptions to types.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.addDescriptionsTo.s"</js>
+	 * 	<li><b>Data type:</b>  <code>String</code>
+	 * 	<li><b>Default:</b>  Empty string.
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#addDescriptionsTo(String)}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Identifies which categories of types that descriptions should be automatically added to generated schemas.
+	 * <p>
+	 * The description is the result of calling {@link ClassMeta#getReadableName()}.
+	 * <p>
+	 * The format is a comma-delimited list of any of the following values:
+	 *
+	 * <ul class='doctree'>
+	 * 	<li class='jf'>{@link TypeCategory#BEAN BEAN}
+	 * 	<li class='jf'>{@link TypeCategory#COLLECTION COLLECTION}
+	 * 	<li class='jf'>{@link TypeCategory#ARRAY ARRAY}
+	 * 	<li class='jf'>{@link TypeCategory#MAP MAP}
+	 * 	<li class='jf'>{@link TypeCategory#STRING STRING}
+	 * 	<li class='jf'>{@link TypeCategory#NUMBER NUMBER}
+	 * 	<li class='jf'>{@link TypeCategory#BOOLEAN BOOLEAN}
+	 * 	<li class='jf'>{@link TypeCategory#ANY ANY}
+	 * 	<li class='jf'>{@link TypeCategory#OTHER OTHER}
+	 * </ul>
+	 */
+	public static final String JSONSCHEMA_addDescriptionsTo = PREFIX + "addDescriptionsTo.s";
+
+	/**
+	 * Configuration property:  Add examples.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.addExamplesTo.s"</js>
+	 * 	<li><b>Data type:</b>  <code>String</code>
+	 * 	<li><b>Default:</b>  Empty string.
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#addExamplesTo(String)}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Identifies which categories of types that examples should be automatically added to generated schemas.
+	 * <p>
+	 * The examples come from calling {@link ClassMeta#getExample(BeanSession)} which in turn gets examples
+	 * from the following:
+	 * <ul class='doctree'>
+	 * 	<li class='ja'>{@link Example}
+	 * 	<li class='jf'>{@link BeanContext#BEAN_examples}
+	 * </ul>
+	 *
+	 * <p>
+	 * The format is a comma-delimited list of any of the following values:
+	 *
+	 * <ul class='doctree'>
+	 * 	<li class='jf'>{@link TypeCategory#BEAN BEAN}
+	 * 	<li class='jf'>{@link TypeCategory#COLLECTION COLLECTION}
+	 * 	<li class='jf'>{@link TypeCategory#ARRAY ARRAY}
+	 * 	<li class='jf'>{@link TypeCategory#MAP MAP}
+	 * 	<li class='jf'>{@link TypeCategory#STRING STRING}
+	 * 	<li class='jf'>{@link TypeCategory#NUMBER NUMBER}
+	 * 	<li class='jf'>{@link TypeCategory#BOOLEAN BOOLEAN}
+	 * 	<li class='jf'>{@link TypeCategory#ANY ANY}
+	 * 	<li class='jf'>{@link TypeCategory#OTHER OTHER}
+	 * </ul>
+	 */
+	public static final String JSONSCHEMA_addExamplesTo = PREFIX + "addExamplesTo.s";
+
+	/**
+	 * Configuration property:  Allow nested descriptions.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.allowNestedDescriptions.b"</js>
+	 * 	<li><b>Data type:</b>  <code>Boolean</code>
+	 * 	<li><b>Default:</b>  <jk>false</jk>
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#allowNestedDescriptions()}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Identifies whether nested descriptions are allowed in schema definitions.
+	 */
+	public static final String JSONSCHEMA_allowNestedDescriptions = PREFIX + "allowNestedDescriptions.b";
+
+	/**
+	 * Configuration property:  Allow nested examples.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.allowNestedExamples.b"</js>
+	 * 	<li><b>Data type:</b>  <code>Boolean</code>
+	 * 	<li><b>Default:</b>  <jk>false</jk>
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#allowNestedExamples()}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Identifies whether nested examples are allowed in schema definitions.
+	 */
+	public static final String JSONSCHEMA_allowNestedExamples = PREFIX + "allowNestedExamples.b";
+
+	/**
+	 * Configuration property:  Bean schema definition mapper.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.beanDefMapper.o"</js>
+	 * 	<li><b>Data type:</b>  {@link BeanDefMapper}
+	 * 	<li><b>Default:</b>  {@link BasicBeanDefMapper}
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#beanDefMapper(Class)}
+	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#beanDefMapper(BeanDefMapper)}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Interface to use for converting Bean classes to definition IDs and URIs.
+	 * <p>
+	 * Used primarily for defining common definition sections for beans in Swagger JSON.
+	 * <p>
+	 * This setting is ignored if {@link #JSONSCHEMA_useBeanDefs} is not enabled.
+	 */
+	public static final String JSONSCHEMA_beanDefMapper = PREFIX + "beanDefMapper.o";
+
+	/**
+	 * Configuration property:  Default schemas.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.defaultSchema.smo"</js>
+	 * 	<li><b>Data type:</b>  <code>Map&lt;String,ObjectMap&gt;</code>
+	 * 	<li><b>Default:</b>  Empty map.
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#defaultSchema(Class,ObjectMap)}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * Allows you to override or provide custom schema information for particular class types.
+	 * <p>
+	 * Keys are full class names.
+	 */
+	public static final String JSONSCHEMA_defaultSchemas = PREFIX + "defaultSchemas.smo";
+
+	/**
+	 * Configuration property:  Use bean definitions.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul>
+	 * 	<li><b>Name:</b>  <js>"JsonSchemaSerializer.useBeanDefs.o"</js>
+	 * 	<li><b>Data type:</b>  <code>Boolean</code>
+	 * 	<li><b>Default:</b>  <jk>false</jk>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link JsonSchemaSerializerBuilder#useBeanDefs()}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * When enabled, schemas on beans will be serialized as the following:
+	 * <p class='bcode w800'>
+	 * 	{
+	 * 		type: <js>'object'</js>,
+	 * 		<js>'$ref'</js>: <js>'#/definitions/TypeId'</js>
+	 * 	}
+	 * </p>
+	 *
+	 * <p>
+	 * The definitions can then be retrieved from the session using {@link JsonSchemaGeneratorSession#getBeanDefs()}.
+	 * <p>
+	 * Definitions can also be added programmatically using {@link JsonSchemaGeneratorSession#addBeanDef(String, ObjectMap)}.
+	 */
+	public static final String JSONSCHEMA_useBeanDefs = PREFIX + "useBeanDefs.b";
+
+
+	//-------------------------------------------------------------------------------------------------------------------
+	// Predefined instances
+	//-------------------------------------------------------------------------------------------------------------------
+
+	/** Default serializer, all default settings.*/
+	public static final JsonSchemaGenerator DEFAULT = new JsonSchemaGenerator(PropertyStore.DEFAULT);
+
+
+	//-------------------------------------------------------------------------------------------------------------------
+	// Instance
+	//-------------------------------------------------------------------------------------------------------------------
+
+	private final boolean useBeanDefs, allowNestedExamples, allowNestedDescriptions;
+	private final BeanDefMapper beanDefMapper;
+	private final Set<TypeCategory> addExamplesTo, addDescriptionsTo;
+	private final Map<String,ObjectMap> defaultSchemas;
+	private final JsonSerializer jsonSerializer;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param ps Initialize with the specified config property store.
+	 */
+	public JsonSchemaGenerator(PropertyStore ps) {
+		super(ps);
+
+		useBeanDefs = getBooleanProperty(JSONSCHEMA_useBeanDefs, false);
+		allowNestedExamples = getBooleanProperty(JSONSCHEMA_allowNestedExamples, false);
+		allowNestedDescriptions = getBooleanProperty(JSONSCHEMA_allowNestedDescriptions, false);
+		beanDefMapper = getInstanceProperty(JSONSCHEMA_beanDefMapper, BeanDefMapper.class, BasicBeanDefMapper.class);
+		addExamplesTo = TypeCategory.parse(getStringProperty(JSONSCHEMA_addExamplesTo, null));
+		addDescriptionsTo = TypeCategory.parse(getStringProperty(JSONSCHEMA_addDescriptionsTo, null));
+		defaultSchemas = getMapProperty(JSONSCHEMA_defaultSchemas, ObjectMap.class);
+		jsonSerializer = new JsonSerializer(ps);
+	}
+
+	@Override /* Context */
+	public JsonSchemaGeneratorBuilder builder() {
+		return new JsonSchemaGeneratorBuilder(getPropertyStore());
+	}
+
+	/**
+	 * Instantiates a new clean-slate {@link JsonSerializerBuilder} object.
+	 *
+	 * <p>
+	 * This is equivalent to simply calling <code><jk>new</jk> JsonSerializerBuilder()</code>.
+	 *
+	 * @return A new {@link JsonSerializerBuilder} object.
+	 */
+	public static JsonSchemaGeneratorBuilder create() {
+		return new JsonSchemaGeneratorBuilder();
+	}
+
+	@Override
+	public JsonSchemaGeneratorSession createSession(BeanSessionArgs args) {
+		return new JsonSchemaGeneratorSession(this, args);
+	}
+
+	@Override
+	public JsonSchemaGeneratorSession createSession() {
+		return new JsonSchemaGeneratorSession(this, null);
+	}
+
+	JsonSerializer getJsonSerializer() {
+		return jsonSerializer;
+	}
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Properties
+	//-----------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Configuration property:  Use bean definitions.
+	 *
+	 * @see #JSONSCHEMA_useBeanDefs
+	 * @return
+	 * 	<jk>true</jk> if schemas on beans will be serialized with <js>'$ref'</js> tags.
+	 */
+	protected final boolean isUseBeanDefs() {
+		return useBeanDefs;
+	}
+
+	/**
+	 * Configuration property:  Allow nested examples.
+	 *
+	 * @see #JSONSCHEMA_allowNestedExamples
+	 * @return
+	 * 	<jk>true</jk> if nested examples are allowed in schema definitions.
+	 */
+	protected final boolean isAllowNestedExamples() {
+		return allowNestedExamples;
+	}
+
+	/**
+	 * Configuration property:  Allow nested descriptions.
+	 *
+	 * @see #JSONSCHEMA_allowNestedDescriptions
+	 * @return
+	 * 	<jk>true</jk> if nested descriptions are allowed in schema definitions.
+	 */
+	protected final boolean isAllowNestedDescriptions() {
+		return allowNestedDescriptions;
+	}
+
+	/**
+	 * Configuration property:  Bean schema definition mapper.
+	 *
+	 * @see #JSONSCHEMA_beanDefMapper
+	 * @return
+	 * 	Interface to use for converting Bean classes to definition IDs and URIs.
+	 */
+	protected final BeanDefMapper getBeanDefMapper() {
+		return beanDefMapper;
+	}
+
+	/**
+	 * Configuration property:  Add examples.
+	 *
+	 * @see #JSONSCHEMA_addExamplesTo
+	 * @return
+	 * 	Set of categories of types that examples should be automatically added to generated schemas.
+	 */
+	protected final Set<TypeCategory> getAddExamplesTo() {
+		return addExamplesTo;
+	}
+
+	/**
+	 * Configuration property:  Add descriptions to types.
+	 *
+	 * @see #JSONSCHEMA_addDescriptionsTo
+	 * @return
+	 * 	Set of categories of types that descriptions should be automatically added to generated schemas.
+	 */
+	protected final Set<TypeCategory> getAddDescriptionsTo() {
+		return addDescriptionsTo;
+	}
+
+	/**
+	 * Configuration property:  Default schemas.
+	 *
+	 * @see #JSONSCHEMA_defaultSchemas
+	 * @return
+	 * 	Custom schema information for particular class types.
+	 */
+	protected final Map<String,ObjectMap> getDefaultSchemas() {
+		return defaultSchemas;
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
similarity index 52%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
index a5d0b47..8c4a1cd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/htmlschema/HtmlSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
@@ -10,28 +10,25 @@
 // * "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.htmlschema;
+package org.apache.juneau.jsonschema;
 
-import static org.apache.juneau.jsonschema.JsonSchemaSerializer.*;
+import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
 
 import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
-import org.apache.juneau.html.*;
 import org.apache.juneau.http.*;
-import org.apache.juneau.jsonschema.*;
-import org.apache.juneau.serializer.*;
 
 /**
- * Builder class for building instances of JSON Schema serializers.
+ * Builder class for building instances of JSON Schema generators.
  */
-public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
+public class JsonSchemaGeneratorBuilder extends BeanTraverseBuilder {
 
 	/**
 	 * Constructor, default settings.
 	 */
-	public HtmlSchemaSerializerBuilder() {
+	public JsonSchemaGeneratorBuilder() {
 		super();
 	}
 
@@ -40,13 +37,13 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * @param ps The initial configuration settings for this builder.
 	 */
-	public HtmlSchemaSerializerBuilder(PropertyStore ps) {
+	public JsonSchemaGeneratorBuilder(PropertyStore ps) {
 		super(ps);
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializer build() {
-		return build(HtmlSchemaSerializer.class);
+	public JsonSchemaGenerator build() {
+		return build(JsonSchemaGenerator.class);
 	}
 
 
@@ -64,7 +61,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
 	 * </ul>
 	 *
 	 * @param value
@@ -72,7 +69,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * 	<br>The default is <jk>false</jk>.
 	 * @return This object (for method chaining).
 	 */
-	public HtmlSchemaSerializerBuilder addDescriptionsTo(String value) {
+	public JsonSchemaGeneratorBuilder addDescriptionsTo(String value) {
 		return set(JSONSCHEMA_addDescriptionsTo, value);
 	}
 
@@ -91,7 +88,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
 	 * </ul>
 	 *
 	 * @param value
@@ -99,7 +96,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * 	<br>The default is <jk>false</jk>.
 	 * @return This object (for method chaining).
 	 */
-	public HtmlSchemaSerializerBuilder addExamplesTo(String value) {
+	public JsonSchemaGeneratorBuilder addExamplesTo(String value) {
 		return set(JSONSCHEMA_addExamplesTo, value);
 	}
 
@@ -111,12 +108,12 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedDescriptions}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions}
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
 	 */
-	public HtmlSchemaSerializerBuilder allowNestedDescriptions() {
+	public JsonSchemaGeneratorBuilder allowNestedDescriptions() {
 		return set(JSONSCHEMA_allowNestedDescriptions, true);
 	}
 
@@ -128,12 +125,12 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples}
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
 	 */
-	public HtmlSchemaSerializerBuilder allowNestedExamples() {
+	public JsonSchemaGeneratorBuilder allowNestedExamples() {
 		return set(JSONSCHEMA_allowNestedExamples, true);
 	}
 
@@ -145,11 +142,11 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * <p>
 	 * Used primarily for defining common definition sections for beans in Swagger JSON.
 	 * <p>
-	 * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+	 * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
 	 * </ul>
 	 *
 	 * @param value
@@ -157,7 +154,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * 	<br>The default is <jk>false</jk>.
 	 * @return This object (for method chaining).
 	 */
-	public HtmlSchemaSerializerBuilder beanDefMapper(Class<? extends BeanDefMapper> value) {
+	public JsonSchemaGeneratorBuilder beanDefMapper(Class<? extends BeanDefMapper> value) {
 		return set(JSONSCHEMA_beanDefMapper, value);
 	}
 
@@ -169,11 +166,11 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * <p>
 	 * Used primarily for defining common definition sections for beans in Swagger JSON.
 	 * <p>
-	 * This setting is ignored if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} is not enabled.
+	 * This setting is ignored if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} is not enabled.
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_beanDefMapper}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_beanDefMapper}
 	 * </ul>
 	 *
 	 * @param value
@@ -181,7 +178,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * 	<br>The default is <jk>false</jk>.
 	 * @return This object (for method chaining).
 	 */
-	public HtmlSchemaSerializerBuilder beanDefMapper(BeanDefMapper value) {
+	public JsonSchemaGeneratorBuilder beanDefMapper(BeanDefMapper value) {
 		return set(JSONSCHEMA_beanDefMapper, value);
 	}
 
@@ -195,7 +192,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_defaultSchemas}
+	 * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_defaultSchemas}
 	 * </ul>
 	 *
 	 * @param c
@@ -204,7 +201,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * 	The schema.
 	 * @return This object (for method chaining).
 	 */
-	public HtmlSchemaSerializerBuilder defaultSchema(Class<?> c, ObjectMap schema) {
+	public JsonSchemaGeneratorBuilder defaultSchema(Class<?> c, ObjectMap schema) {
 		return addTo(JSONSCHEMA_defaultSchemas, c.getName(), schema);
 	}
 
@@ -221,576 +218,392 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 	 * </p>
 	 *
 	 * <p>
-	 * The definitions can then be retrieved from the session using {@link JsonSchemaSerializerSession#getBeanDefs()}.
+	 * The definitions can then be retrieved from the session using {@link JsonSchemaGeneratorSession#getBeanDefs()}.
 	 * <p>
-	 * Definitions can also be added programmatically using {@link JsonSchemaSerializerSession#addBeanDef(String, ObjectMap)}.
+	 * Definitions can also be added programmatically using {@link JsonSchemaGeneratorSession#addBeanDef(String, ObjectMap)}.
 	 *
 	 * @return This object (for method chaining).
 	 */
-	public HtmlSchemaSerializerBuilder useBeanDefs() {
+	public JsonSchemaGeneratorBuilder useBeanDefs() {
 		return set(JSONSCHEMA_useBeanDefs, true);
 	}
 
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder addBeanTypes(boolean value) {
-		super.addBeanTypes(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder addBeanTypes() {
-		super.addBeanTypes();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder addRootType(boolean value) {
-		super.addRootType(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder addRootType() {
-		super.addRootType();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder detectRecursions(boolean value) {
-		super.detectRecursions(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder detectRecursions() {
-		super.detectRecursions();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder ignoreRecursions(boolean value) {
-		super.ignoreRecursions(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder ignoreRecursions() {
-		super.ignoreRecursions();
-		return this;
-	}
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder initialDepth(int value) {
-		super.initialDepth(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder listener(Class<? extends SerializerListener> value) {
-		super.listener(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder maxDepth(int value) {
-		super.maxDepth(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder maxIndent(int value) {
-		super.maxIndent(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder quoteChar(char value) {
-		super.quoteChar(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder sortCollections(boolean value) {
-		super.sortCollections(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder sortCollections() {
-		super.sortCollections();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder sortMaps(boolean value) {
-		super.sortMaps(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder sortMaps() {
-		super.sortMaps();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder sq() {
-		super.sq();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder trimEmptyCollections(boolean value) {
-		super.trimEmptyCollections(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder trimEmptyCollections() {
-		super.trimEmptyCollections();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder trimEmptyMaps(boolean value) {
-		super.trimEmptyMaps(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder trimEmptyMaps() {
-		super.trimEmptyMaps();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder trimNullProperties(boolean value) {
-		super.trimNullProperties(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder trimStrings(boolean value) {
-		super.trimStrings(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder trimStrings() {
-		super.trimStrings();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder uriContext(UriContext value) {
-		super.uriContext(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder uriRelativity(UriRelativity value) {
-		super.uriRelativity(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder uriResolution(UriResolution value) {
-		super.uriResolution(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder useWhitespace(boolean value) {
-		super.useWhitespace(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder useWhitespace() {
-		super.useWhitespace();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public HtmlSchemaSerializerBuilder ws() {
-		super.ws();
-		return this;
-	}
-
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanClassVisibility(Visibility value) {
+	public JsonSchemaGeneratorBuilder beanClassVisibility(Visibility value) {
 		super.beanClassVisibility(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanConstructorVisibility(Visibility value) {
+	public JsonSchemaGeneratorBuilder beanConstructorVisibility(Visibility value) {
 		super.beanConstructorVisibility(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanDictionary(boolean append, Object...values) {
+	public JsonSchemaGeneratorBuilder beanDictionary(boolean append, Object...values) {
 		super.beanDictionary(append, values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanDictionary(Class<?>...values) {
+	public JsonSchemaGeneratorBuilder beanDictionary(Class<?>...values) {
 		super.beanDictionary(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanDictionary(Object...values) {
+	public JsonSchemaGeneratorBuilder beanDictionary(Object...values) {
 		super.beanDictionary(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanDictionaryRemove(Object...values) {
+	public JsonSchemaGeneratorBuilder beanDictionaryRemove(Object...values) {
 		super.beanDictionaryRemove(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanFieldVisibility(Visibility value) {
+	public JsonSchemaGeneratorBuilder beanFieldVisibility(Visibility value) {
 		super.beanFieldVisibility(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanFilters(boolean append, Object...values) {
+	public JsonSchemaGeneratorBuilder beanFilters(boolean append, Object...values) {
 		super.beanFilters(append, values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanFilters(Class<?>...values) {
+	public JsonSchemaGeneratorBuilder beanFilters(Class<?>...values) {
 		super.beanFilters(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanFilters(Object...values) {
+	public JsonSchemaGeneratorBuilder beanFilters(Object...values) {
 		super.beanFilters(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanFiltersRemove(Object...values) {
+	public JsonSchemaGeneratorBuilder beanFiltersRemove(Object...values) {
 		super.beanFiltersRemove(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanMapPutReturnsOldValue(boolean value) {
+	public JsonSchemaGeneratorBuilder beanMapPutReturnsOldValue(boolean value) {
 		super.beanMapPutReturnsOldValue(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanMapPutReturnsOldValue() {
+	public JsonSchemaGeneratorBuilder beanMapPutReturnsOldValue() {
 		super.beanMapPutReturnsOldValue();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanMethodVisibility(Visibility value) {
+	public JsonSchemaGeneratorBuilder beanMethodVisibility(Visibility value) {
 		super.beanMethodVisibility(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beansRequireDefaultConstructor(boolean value) {
+	public JsonSchemaGeneratorBuilder beansRequireDefaultConstructor(boolean value) {
 		super.beansRequireDefaultConstructor(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beansRequireDefaultConstructor() {
+	public JsonSchemaGeneratorBuilder beansRequireDefaultConstructor() {
 		super.beansRequireDefaultConstructor();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beansRequireSerializable(boolean value) {
+	public JsonSchemaGeneratorBuilder beansRequireSerializable(boolean value) {
 		super.beansRequireSerializable(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beansRequireSerializable() {
+	public JsonSchemaGeneratorBuilder beansRequireSerializable() {
 		super.beansRequireSerializable();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beansRequireSettersForGetters(boolean value) {
+	public JsonSchemaGeneratorBuilder beansRequireSettersForGetters(boolean value) {
 		super.beansRequireSettersForGetters(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beansRequireSettersForGetters() {
+	public JsonSchemaGeneratorBuilder beansRequireSettersForGetters() {
 		super.beansRequireSettersForGetters();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beansRequireSomeProperties(boolean value) {
+	public JsonSchemaGeneratorBuilder beansRequireSomeProperties(boolean value) {
 		super.beansRequireSomeProperties(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder beanTypePropertyName(String value) {
+	public JsonSchemaGeneratorBuilder beanTypePropertyName(String value) {
 		super.beanTypePropertyName(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder debug() {
+	public JsonSchemaGeneratorBuilder debug() {
 		super.debug();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public <T> HtmlSchemaSerializerBuilder example(Class<T> c, T o) {
+	public <T> JsonSchemaGeneratorBuilder example(Class<T> c, T o) {
 		super.example(c, o);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
+	public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
 		super.ignoreInvocationExceptionsOnGetters(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder ignoreInvocationExceptionsOnGetters() {
+	public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnGetters() {
 		super.ignoreInvocationExceptionsOnGetters();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
+	public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
 		super.ignoreInvocationExceptionsOnSetters(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder ignoreInvocationExceptionsOnSetters() {
+	public JsonSchemaGeneratorBuilder ignoreInvocationExceptionsOnSetters() {
 		super.ignoreInvocationExceptionsOnSetters();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder ignorePropertiesWithoutSetters(boolean value) {
+	public JsonSchemaGeneratorBuilder ignorePropertiesWithoutSetters(boolean value) {
 		super.ignorePropertiesWithoutSetters(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder ignoreUnknownBeanProperties(boolean value) {
+	public JsonSchemaGeneratorBuilder ignoreUnknownBeanProperties(boolean value) {
 		super.ignoreUnknownBeanProperties(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder ignoreUnknownBeanProperties() {
+	public JsonSchemaGeneratorBuilder ignoreUnknownBeanProperties() {
 		super.ignoreUnknownBeanProperties();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder ignoreUnknownNullBeanProperties(boolean value) {
+	public JsonSchemaGeneratorBuilder ignoreUnknownNullBeanProperties(boolean value) {
 		super.ignoreUnknownNullBeanProperties(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public <T> HtmlSchemaSerializerBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
+	public <T> JsonSchemaGeneratorBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
 		super.implClass(interfaceClass, implClass);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder implClasses(Map<String,Class<?>> values) {
+	public JsonSchemaGeneratorBuilder implClasses(Map<String,Class<?>> values) {
 		super.implClasses(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder locale(Locale value) {
+	public JsonSchemaGeneratorBuilder locale(Locale value) {
 		super.locale(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder mediaType(MediaType value) {
+	public JsonSchemaGeneratorBuilder mediaType(MediaType value) {
 		super.mediaType(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder notBeanClasses(boolean append, Object...values) {
+	public JsonSchemaGeneratorBuilder notBeanClasses(boolean append, Object...values) {
 		super.notBeanClasses(append, values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder notBeanClasses(Class<?>...values) {
+	public JsonSchemaGeneratorBuilder notBeanClasses(Class<?>...values) {
 		super.notBeanClasses(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder notBeanClasses(Object...values) {
+	public JsonSchemaGeneratorBuilder notBeanClasses(Object...values) {
 		super.notBeanClasses(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder notBeanClassesRemove(Object...values) {
+	public JsonSchemaGeneratorBuilder notBeanClassesRemove(Object...values) {
 		super.notBeanClassesRemove(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder notBeanPackages(boolean append, Object...values) {
+	public JsonSchemaGeneratorBuilder notBeanPackages(boolean append, Object...values) {
 		super.notBeanPackages(append, values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder notBeanPackages(Object...values) {
+	public JsonSchemaGeneratorBuilder notBeanPackages(Object...values) {
 		super.notBeanPackages(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder notBeanPackages(String...values) {
+	public JsonSchemaGeneratorBuilder notBeanPackages(String...values) {
 		super.notBeanPackages(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder notBeanPackagesRemove(Object...values) {
+	public JsonSchemaGeneratorBuilder notBeanPackagesRemove(Object...values) {
 		super.notBeanPackagesRemove(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder pojoSwaps(boolean append, Object...values) {
+	public JsonSchemaGeneratorBuilder pojoSwaps(boolean append, Object...values) {
 		super.pojoSwaps(append, values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder pojoSwaps(Class<?>...values) {
+	public JsonSchemaGeneratorBuilder pojoSwaps(Class<?>...values) {
 		super.pojoSwaps(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder pojoSwaps(Object...values) {
+	public JsonSchemaGeneratorBuilder pojoSwaps(Object...values) {
 		super.pojoSwaps(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder pojoSwapsRemove(Object...values) {
+	public JsonSchemaGeneratorBuilder pojoSwapsRemove(Object...values) {
 		super.pojoSwapsRemove(values);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder sortProperties(boolean value) {
+	public JsonSchemaGeneratorBuilder sortProperties(boolean value) {
 		super.sortProperties(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder sortProperties() {
+	public JsonSchemaGeneratorBuilder sortProperties() {
 		super.sortProperties();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder timeZone(TimeZone value) {
+	public JsonSchemaGeneratorBuilder timeZone(TimeZone value) {
 		super.timeZone(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder useEnumNames() {
+	public JsonSchemaGeneratorBuilder useEnumNames() {
 		super.useEnumNames();
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder useInterfaceProxies(boolean value) {
+	public JsonSchemaGeneratorBuilder useInterfaceProxies(boolean value) {
 		super.useInterfaceProxies(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder useJavaBeanIntrospector(boolean value) {
+	public JsonSchemaGeneratorBuilder useJavaBeanIntrospector(boolean value) {
 		super.useJavaBeanIntrospector(value);
 		return this;
 	}
 
 	@Override /* BeanContextBuilder */
-	public HtmlSchemaSerializerBuilder useJavaBeanIntrospector() {
+	public JsonSchemaGeneratorBuilder useJavaBeanIntrospector() {
 		super.useJavaBeanIntrospector();
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder set(String name, Object value) {
+	public JsonSchemaGeneratorBuilder set(String name, Object value) {
 		super.set(name, value);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder set(boolean append, String name, Object value) {
+	public JsonSchemaGeneratorBuilder set(boolean append, String name, Object value) {
 		super.set(append, name, value);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder set(Map<String,Object> properties) {
+	public JsonSchemaGeneratorBuilder set(Map<String,Object> properties) {
 		super.set(properties);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder add(Map<String,Object> properties) {
+	public JsonSchemaGeneratorBuilder add(Map<String,Object> properties) {
 		super.add(properties);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder addTo(String name, Object value) {
+	public JsonSchemaGeneratorBuilder addTo(String name, Object value) {
 		super.addTo(name, value);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder addTo(String name, String key, Object value) {
+	public JsonSchemaGeneratorBuilder addTo(String name, String key, Object value) {
 		super.addTo(name, key, value);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder removeFrom(String name, Object value) {
+	public JsonSchemaGeneratorBuilder removeFrom(String name, Object value) {
 		super.removeFrom(name, value);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder apply(PropertyStore copyFrom) {
+	public JsonSchemaGeneratorBuilder apply(PropertyStore copyFrom) {
 		super.apply(copyFrom);
 		return this;
 	}
-}
\ No newline at end of file
+
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
similarity index 88%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
index 680afb7..3a8f4be 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
@@ -32,10 +32,11 @@ import org.apache.juneau.transform.*;
  * This class is NOT thread safe.
  * It is typically discarded after one-time use although it can be reused within the same thread.
  */
-public class JsonSchemaSerializerSession extends JsonSerializerSession {
+public class JsonSchemaGeneratorSession extends BeanTraverseSession {
 
-	private final JsonSchemaSerializer ctx;
+	private final JsonSchemaGenerator ctx;
 	private final Map<String,ObjectMap> defs;
+	private JsonSerializerSession jsSession;
 
 	/**
 	 * Create a new session using properties specified in the context.
@@ -49,22 +50,23 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	 * 	It also include session-level properties that override the properties defined on the bean and
 	 * 	serializer contexts.
 	 */
-	protected JsonSchemaSerializerSession(JsonSchemaSerializer ctx, SerializerSessionArgs args) {
+	protected JsonSchemaGeneratorSession(JsonSchemaGenerator ctx, BeanSessionArgs args) {
 		super(ctx, args);
 		this.ctx = ctx;
 		defs = isUseBeanDefs() ? new TreeMap<String,ObjectMap>() : null;
 	}
 
-	@Override /* SerializerSession */
-	protected void doSerialize(SerializerPipe out, Object o) throws Exception {
-		ObjectMap schema = getSchema(toClassMeta(o), "root", null, false, false, null);
-		serializeAnything(getJsonWriter(out), schema, getExpectedRootType(o), "root", null);
-	}
-
-	private ClassMeta<?> toClassMeta(Object o) {
-		if (o instanceof Type)
-			return getClassMeta((Type)o);
-		return getClassMetaForObject(o);
+	/**
+	 * Returns the JSON-schema for the specified object.
+	 *
+	 * @param o
+	 * 	The object.
+	 * 	<br>Can either be a POJO or a <code>Class</code>/<code>Type</code>.
+	 * @return The schema for the type.
+	 * @throws Exception
+	 */
+	public ObjectMap getSchema(Object o) throws Exception {
+		return getSchema(toClassMeta(o), "root", null, false, false, null);
 	}
 
 	/**
@@ -274,11 +276,17 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 		if (canAdd && (getAddExamplesTo().contains(t) || getAddExamplesTo().contains(ANY))) {
 			Object example = sType.getExample(this);
 			if (example != null)
-				return JsonParser.DEFAULT.parse(serializeJson(example), Object.class);
+				return JsonParser.DEFAULT.parse(toJson(example), Object.class);
 		}
 		return null;
 	}
 
+	private String toJson(Object o) throws SerializeException {
+		if (jsSession == null)
+			jsSession = ctx.getJsonSerializer().createSession(null);
+		return jsSession.serializeToString(o);
+	}
+
 	private Object getDescription(ClassMeta<?> sType, TypeCategory t, boolean descriptionAdded) {
 		boolean canAdd = isAllowNestedDescriptions() || ! descriptionAdded;
 		if (canAdd && (getAddDescriptionsTo().contains(t) || getAddDescriptionsTo().contains(ANY)))
@@ -323,7 +331,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	 * This map is modifiable and affects the map in the session.
 	 *
 	 * @return
-	 * 	The definitions that were gathered during this session, or <jk>null</jk> if {@link JsonSchemaSerializer#JSONSCHEMA_useBeanDefs} was not enabled.
+	 * 	The definitions that were gathered during this session, or <jk>null</jk> if {@link JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} was not enabled.
 	 */
 	public Map<String,ObjectMap> getBeanDefs() {
 		return defs;
@@ -336,7 +344,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	 * @param def The definition schema.
 	 * @return This object (for method chaining).
 	 */
-	public JsonSchemaSerializerSession addBeanDef(String id, ObjectMap def) {
+	public JsonSchemaGeneratorSession addBeanDef(String id, ObjectMap def) {
 		if (defs != null)
 			defs.put(id, def);
 		return this;
@@ -349,7 +357,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	/**
 	 * Configuration property:  Use bean definitions.
 	 *
-	 * @see JsonSchemaSerializer#JSONSCHEMA_useBeanDefs
+	 * @see JsonSchemaGenerator#JSONSCHEMA_useBeanDefs
 	 * @return
 	 * 	<jk>true</jk> if schemas on beans will be serialized with <js>'$ref'</js> tags.
 	 */
@@ -360,7 +368,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	/**
 	 * Configuration property:  Allow nested examples.
 	 *
-	 * @see JsonSchemaSerializer#JSONSCHEMA_allowNestedExamples
+	 * @see JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples
 	 * @return
 	 * 	<jk>true</jk> if nested examples are allowed in schema definitions.
 	 */
@@ -371,7 +379,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	/**
 	 * Configuration property:  Allow nested descriptions.
 	 *
-	 * @see JsonSchemaSerializer#JSONSCHEMA_allowNestedDescriptions
+	 * @see JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions
 	 * @return
 	 * 	<jk>true</jk> if nested descriptions are allowed in schema definitions.
 	 */
@@ -382,7 +390,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	/**
 	 * Configuration property:  Bean schema definition mapper.
 	 *
-	 * @see JsonSchemaSerializer#JSONSCHEMA_beanDefMapper
+	 * @see JsonSchemaGenerator#JSONSCHEMA_beanDefMapper
 	 * @return
 	 * 	Interface to use for converting Bean classes to definition IDs and URIs.
 	 */
@@ -393,7 +401,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	/**
 	 * Configuration property:  Add examples.
 	 *
-	 * @see JsonSchemaSerializer#JSONSCHEMA_addExamplesTo
+	 * @see JsonSchemaGenerator#JSONSCHEMA_addExamplesTo
 	 * @return
 	 * 	Set of categories of types that examples should be automatically added to generated schemas.
 	 */
@@ -404,7 +412,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	/**
 	 * Configuration property:  Add descriptions to types.
 	 *
-	 * @see JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo
+	 * @see JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo
 	 * @return
 	 * 	Set of categories of types that descriptions should be automatically added to generated schemas.
 	 */
@@ -415,11 +423,21 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	/**
 	 * Configuration property:  Default schemas.
 	 *
-	 * @see JsonSchemaSerializer#JSONSCHEMA_defaultSchemas
+	 * @see JsonSchemaGenerator#JSONSCHEMA_defaultSchemas
 	 * @return
 	 * 	Custom schema information for particular class types.
 	 */
 	protected final Map<String,ObjectMap> getDefaultSchemas() {
 		return ctx.getDefaultSchemas();
 	}
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Utility methods
+	//-----------------------------------------------------------------------------------------------------------------
+
+	private ClassMeta<?> toClassMeta(Object o) {
+		if (o instanceof Type)
+			return getClassMeta((Type)o);
+		return getClassMetaForObject(o);
+	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
index 474fd81..89b5950 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
@@ -20,8 +20,8 @@ import org.apache.juneau.internal.*;
  * Represents possible values for the following properties:
  *
  * <ul class='doctree'>
- * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addExamplesTo}
- * 	<li class='jf'>{@link JsonSchemaSerializer#JSONSCHEMA_addDescriptionsTo}
+ * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo}
+ * 	<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo}
  * </ul>
  */
 public enum TypeCategory {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
index 36df881..745b15e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
@@ -17,7 +17,7 @@ import static java.lang.annotation.RetentionPolicy.*;
 
 import java.lang.annotation.*;
 
-import org.apache.juneau.jsonschema.*;
+import org.apache.juneau.json.*;
 
 /**
  * Annotation for specifying various JSON-SCHEMA information for {@link JsonSchemaSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
index 4eb7da3..b5ca65a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -18,7 +18,6 @@ import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.http.*;
 import org.apache.juneau.internal.*;
-import org.apache.juneau.parser.*;
 
 /**
  * Parent class for all Juneau serializers.
@@ -39,7 +38,7 @@ import org.apache.juneau.parser.*;
  * Subclasses should extend directly from {@link OutputStreamSerializer} or {@link WriterSerializer} depending on
  * whether it's a stream or character based serializer.
  */
-public abstract class Serializer extends BeanContext {
+public abstract class Serializer extends BeanTraverseContext {
 
 	//-------------------------------------------------------------------------------------------------------------------
 	// Configurable properties
@@ -164,146 +163,6 @@ public abstract class Serializer extends BeanContext {
 	public static final String SERIALIZER_addRootType = PREFIX + "addRootType.b";
 
 	/**
-	 * Configuration property:  Automatically detect POJO recursions.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"Serializer.detectRecursions.b"</js>
-	 * 	<li><b>Data type:</b>  <code>Boolean</code>
-	 * 	<li><b>Default:</b>  <jk>false</jk>
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link SerializerBuilder#detectRecursions(boolean)}
-	 * 			<li class='jm'>{@link SerializerBuilder#detectRecursions()}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Specifies that recursions should be checked for during serialization.
-	 *
-	 * <p>
-	 * Recursions can occur when serializing models that aren't true trees but rather contain loops.
-	 * <br>In general, unchecked recursions cause stack-overflow-errors.
-	 * <br>These show up as {@link ParseException ParseExceptions} with the message <js>"Depth too deep.  Stack overflow occurred."</js>.
-	 *
-	 * <p>
-	 * The behavior when recursions are detected depends on the value for {@link #SERIALIZER_ignoreRecursions}.
-	 *
-	 * <p>
-	 * For example, if a model contains the links A-&gt;B-&gt;C-&gt;A, then the JSON generated will look like
-	 * 	the following when <jsf>SERIALIZER_ignoreRecursions</jsf> is <jk>true</jk>...
-	 *
-	 * <p class='bcode w800'>
-	 * 	{A:{B:{C:<jk>null</jk>}}}
-	 * </p>
-	 *
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		Checking for recursion can cause a small performance penalty.
-	 * </ul>
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Create a serializer that never adds _type to nodes.</jc>
-	 * 	WriterSerializer s = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.detectRecursions()
-	 * 		.ignoreRecursions()
-	 * 		.build();
-	 *
-	 * 	<jc>// Same, but use property.</jc>
-	 * 	WriterSerializer s = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.set(<jsf>SERIALIZER_detectRecursions</jsf>, <jk>true</jk>)
-	 * 		.set(<jsf>SERIALIZER_ignoreRecursions</jsf>, <jk>true</jk>)
-	 * 		.build();
-	 *
-	 * 	<jc>// Create a POJO model with a recursive loop.</jc>
-	 * 	<jk>public class</jk> A {
-	 * 		<jk>public</jk> Object <jf>f</jf>;
-	 * 	}
-	 * 	A a = <jk>new</jk> A();
-	 * 	a.<jf>f</jf> = a;
-	 *
-	 * 	<jc>// Produces "{f:null}"</jc>
-	 * 	String json = s.serialize(a);
-	 * </p>
-	 */
-	public static final String SERIALIZER_detectRecursions = PREFIX + "detectRecursions.b";
-
-	/**
-	 * Configuration property:  Ignore recursion errors.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"Serializer.ignoreRecursions.b"</js>
-	 * 	<li><b>Data type:</b>  <code>Boolean</code>
-	 * 	<li><b>Default:</b>  <jk>false</jk>
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link SerializerBuilder#ignoreRecursions(boolean)}
-	 * 			<li class='jm'>{@link SerializerBuilder#ignoreRecursions()}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Used in conjunction with {@link #SERIALIZER_detectRecursions}.
-	 * <br>Setting is ignored if <jsf>SERIALIZER_detectRecursions</jsf> is <jk>false</jk>.
-	 *
-	 * <p>
-	 * If <jk>true</jk>, when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
-	 * <br>Otherwise, a {@link SerializeException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
-	 */
-	public static final String SERIALIZER_ignoreRecursions = PREFIX + "ignoreRecursions.b";
-
-	/**
-	 * Configuration property:  Initial depth.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"Serializer.initialDepth.i"</js>
-	 * 	<li><b>Data type:</b>  <code>Integer</code>
-	 * 	<li><b>Default:</b>  <code>0</code>
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link SerializerBuilder#initialDepth(int)}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * The initial indentation level at the root.
-	 * <br>Useful when constructing document fragments that need to be indented at a certain level.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Create a serializer with whitespace enabled and an initial depth of 2.</jc>
-	 * 	WriterSerializer s = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.ws()
-	 * 		.initialDepth(2)
-	 * 		.build();
-	 *
-	 * 	<jc>// Same, but use property.</jc>
-	 * 	WriterSerializer s = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.set(<jsf>SERIALIZER_useWhitespace</jsf>, <jk>true</jk>)
-	 * 		.set(<jsf>SERIALIZER_initialDepth</jsf>, 2)
-	 * 		.build();
-	 *
-	 * 	<jc>// Produces "\t\t{\n\t\t\t'foo':'bar'\n\t\t}\n"</jc>
-	 * 	String json = s.serialize(<jk>new</jk> MyBean());
-	 * </p>
-	 */
-	public static final String SERIALIZER_initialDepth = PREFIX + "initialDepth.i";
-
-	/**
 	 * Configuration property:  Serializer listener.
 	 *
 	 * <h5 class='section'>Property:</h5>
@@ -367,43 +226,6 @@ public abstract class Serializer extends BeanContext {
 	public static final String SERIALIZER_listener = PREFIX + "listener.c";
 
 	/**
-	 * Configuration property:  Max serialization depth.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"Serializer.maxDepth.i"</js>
-	 * 	<li><b>Data type:</b>  <code>Integer</code>
-	 * 	<li><b>Default:</b>  <code>100</code>
-	 * 	<li><b>Session property:</b>  <jk>false</jk>
-	 * 	<li><b>Methods:</b>
-	 * 		<ul>
-	 * 			<li class='jm'>{@link SerializerBuilder#maxDepth(int)}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * Abort serialization if specified depth is reached in the POJO tree.
-	 * <br>If this depth is exceeded, an exception is thrown.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Create a serializer that throws an exception if the depth is greater than 20.</jc>
-	 * 	WriterSerializer s = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.maxDepth(20)
-	 * 		.build();
-	 *
-	 * 	<jc>// Same, but use property.</jc>
-	 * 	WriterSerializer s = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.set(<jsf>SERIALIZER_maxDepth</jsf>, 20)
-	 * 		.build();
-	 * </p>
-	 */
-	public static final String SERIALIZER_maxDepth = PREFIX + "maxDepth.i";
-
-	/**
 	 * Configuration property:  Sort arrays and collections alphabetically.
 	 *
 	 * <h5 class='section'>Property:</h5>
@@ -880,10 +702,7 @@ public abstract class Serializer extends BeanContext {
 	// Instance
 	//-------------------------------------------------------------------------------------------------------------------
 
-	private final int initialDepth, maxDepth;
 	private final boolean
-		detectRecursions,
-		ignoreRecursions,
 		addBeanTypes,
 		trimNullProperties,
 		trimEmptyCollections,
@@ -932,10 +751,6 @@ public abstract class Serializer extends BeanContext {
 	protected Serializer(PropertyStore ps, String produces, String accept) {
 		super(ps);
 
-		maxDepth = getIntegerProperty(SERIALIZER_maxDepth, 100);
-		initialDepth = getIntegerProperty(SERIALIZER_initialDepth, 0);
-		detectRecursions = getBooleanProperty(SERIALIZER_detectRecursions, false);
-		ignoreRecursions = getBooleanProperty(SERIALIZER_ignoreRecursions, false);
 		addBeanTypes = getBooleanProperty(SERIALIZER_addBeanTypes, false);
 		trimNullProperties = getBooleanProperty(SERIALIZER_trimNullProperties, true);
 		trimEmptyCollections = getBooleanProperty(SERIALIZER_trimEmptyCollections, false);
@@ -1124,51 +939,6 @@ public abstract class Serializer extends BeanContext {
 	//-----------------------------------------------------------------------------------------------------------------
 
 	/**
-	 * Configuration property:  Initial depth.
-	 *
-	 * @see #SERIALIZER_initialDepth
-	 * @return
-	 * 	The initial indentation level at the root.
-	 */
-	protected final int getInitialDepth() {
-		return initialDepth;
-	}
-
-	/**
-	 * Configuration property:  Max serialization depth.
-	 *
-	 * @see #SERIALIZER_maxDepth
-	 * @return
-	 * 	The depth at which serialization is aborted if depth is reached in the POJO tree.
-	 *	<br>If this depth is exceeded, an exception is thrown.
-	 */
-	protected final int getMaxDepth() {
-		return maxDepth;
-	}
-
-	/**
-	 * Configuration property:  Automatically detect POJO recursions.
-	 * @see #SERIALIZER_detectRecursions
-	 * @return
-	 * 	<jk>true</jk> if recursions should be checked for during serialization.
-	 */
-	protected final boolean isDetectRecursions() {
-		return detectRecursions;
-	}
-
-	/**
-	 * Configuration property:  Ignore recursion errors.
-	 *
-	 * @see #SERIALIZER_ignoreRecursions
-	 * @return
-	 * 	<jk>true</jk> if when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
-	 * 	<br>Otherwise, a {@link SerializeException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
-	 */
-	protected final boolean isIgnoreRecursions() {
-		return ignoreRecursions;
-	}
-
-	/**
 	 * Configuration property:  Add <js>"_type"</js> properties when needed.
 	 *
 	 * @see #SERIALIZER_addBeanTypes
@@ -1316,10 +1086,6 @@ public abstract class Serializer extends BeanContext {
 	public ObjectMap asMap() {
 		return super.asMap()
 			.append("Serializer", new ObjectMap()
-				.append("maxDepth", maxDepth)
-				.append("initialDepth", initialDepth)
-				.append("detectRecursions", detectRecursions)
-				.append("ignoreRecursions", ignoreRecursions)
 				.append("addBeanTypes", addBeanTypes)
 				.append("trimNullProperties", trimNullProperties)
 				.append("trimEmptyCollections", trimEmptyCollections)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
index e9e28c0..b019c46 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
@@ -22,7 +22,7 @@ import org.apache.juneau.http.*;
 /**
  * Builder class for building instances of serializers.
  */
-public class SerializerBuilder extends BeanContextBuilder {
+public class SerializerBuilder extends BeanTraverseBuilder {
 
 	/**
 	 * Constructor, default settings.
@@ -122,113 +122,6 @@ public class SerializerBuilder extends BeanContextBuilder {
 	}
 
 	/**
-	 * Configuration property:  Automatically detect POJO recursions.
-	 *
-	 * <p>
-	 * Specifies that recursions should be checked for during serialization.
-	 *
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		Checking for recursion can cause a small performance penalty.
-	 * </ul>
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
-	 * </ul>
-	 *
-	 * @param value
-	 * 	The new value for this property.
-	 * 	<br>The default is <jk>false</jk>.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerBuilder detectRecursions(boolean value) {
-		return set(SERIALIZER_detectRecursions, value);
-	}
-
-	/**
-	 * Configuration property:  Automatically detect POJO recursions.
-	 *
-	 * <p>
-	 * Shortcut for calling <code>detectRecursions(<jk>true</jk>)</code>.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
-	 * </ul>
-	 *
-	 * @return This object (for method chaining).
-	 */
-	public SerializerBuilder detectRecursions() {
-		return set(SERIALIZER_detectRecursions, true);
-	}
-
-	/**
-	 * Configuration property:  Ignore recursion errors.
-	 *
-	 * <p>
-	 * If <jk>true</jk>, when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
-	 * Otherwise, an exception is thrown.
-	 *
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		Checking for recursion can cause a small performance penalty.
-	 * </ul>
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
-	 * </ul>
-	 *
-	 * @param value
-	 * 	The new value for this property.
-	 * 	<br>The default is <jk>false</jk>.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerBuilder ignoreRecursions(boolean value) {
-		return set(SERIALIZER_ignoreRecursions, value);
-	}
-
-	/**
-	 * Configuration property:  Ignore recursion errors.
-	 *
-	 * <p>
-	 * Shortcut for calling <code>ignoreRecursions(<jk>true</jk>)</code>.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
-	 * </ul>
-	 *
-	 * @return This object (for method chaining).
-	 */
-	public SerializerBuilder ignoreRecursions() {
-		return set(SERIALIZER_ignoreRecursions, true);
-	}
-
-	/**
-	 * Configuration property:  Initial depth.
-	 *
-	 * <p>
-	 * The initial indentation level at the root.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_initialDepth}
-	 * </ul>
-	 *
-	 * @param value
-	 * 	The new value for this property.
-	 * 	<br>The default is <code>0</code>.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerBuilder initialDepth(int value) {
-		return set(SERIALIZER_initialDepth, value);
-	}
-
-	/**
 	 * Configuration property:  Serializer listener.
 	 *
 	 * <p>
@@ -248,28 +141,6 @@ public class SerializerBuilder extends BeanContextBuilder {
 	}
 
 	/**
-	 * Configuration property:  Max serialization depth.
-	 *
-	 * <p>
-	 * Abort serialization if specified depth is reached in the POJO tree.
-	 * <br>If this depth is exceeded, an exception is thrown.
-	 * <br>This prevents stack overflows from occurring when trying to serialize models with recursive references.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_maxDepth}
-	 * </ul>
-	 *
-	 * @param value
-	 * 	The new value for this property.
-	 * 	<br>The default is <code>100</code>.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerBuilder maxDepth(int value) {
-		return set(SERIALIZER_maxDepth, value);
-	}
-
-	/**
 	 * Configuration property:  Sort arrays and collections alphabetically.
 	 *
 	 * <p>
@@ -667,6 +538,42 @@ public class SerializerBuilder extends BeanContextBuilder {
 		return useWhitespace();
 	}
 
+	@Override /* BeanTraverseBuilder */
+	public SerializerBuilder detectRecursions(boolean value) {
+		super.detectRecursions(value);
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerBuilder detectRecursions() {
+		super.detectRecursions();
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerBuilder ignoreRecursions(boolean value) {
+		super.ignoreRecursions(value);
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerBuilder ignoreRecursions() {
+		super.ignoreRecursions();
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerBuilder initialDepth(int value) {
+		super.initialDepth(value);
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerBuilder maxDepth(int value) {
+		super.maxDepth(value);
+		return this;
+	}
+
 	@Override /* BeanContextBuilder */
 	public SerializerBuilder beanClassVisibility(Visibility value) {
 		super.beanClassVisibility(value);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
index 695bbb8..bc5d439 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
@@ -63,7 +63,7 @@ import org.apache.juneau.http.*;
  * 	String json = s.serialize(addressBook);
  * </p>
  */
-public final class SerializerGroup extends BeanContext {
+public final class SerializerGroup extends BeanTraverseContext {
 
 	/**
 	 * An unmodifiable empty serializer group.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
index 9f1d5c2..0d4343b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
@@ -25,7 +25,7 @@ import org.apache.juneau.internal.*;
 /**
  * Builder class for creating instances of {@link SerializerGroup}.
  */
-public class SerializerGroupBuilder extends BeanContextBuilder {
+public class SerializerGroupBuilder extends BeanTraverseBuilder {
 
 	private final List<Object> serializers;
 
@@ -208,113 +208,6 @@ public class SerializerGroupBuilder extends BeanContextBuilder {
 	}
 
 	/**
-	 * Configuration property:  Automatically detect POJO recursions.
-	 *
-	 * <p>
-	 * Specifies that recursions should be checked for during serialization.
-	 *
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		Checking for recursion can cause a small performance penalty.
-	 * </ul>
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
-	 * </ul>
-	 *
-	 * @param value
-	 * 	The new value for this property.
-	 * 	<br>The default is <jk>false</jk>.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerGroupBuilder detectRecursions(boolean value) {
-		return set(SERIALIZER_detectRecursions, value);
-	}
-
-	/**
-	 * Configuration property:  Automatically detect POJO recursions.
-	 *
-	 * <p>
-	 * Shortcut for calling <code>detectRecursions(<jk>true</jk>)</code>.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
-	 * </ul>
-	 *
-	 * @return This object (for method chaining).
-	 */
-	public SerializerGroupBuilder detectRecursions() {
-		return set(SERIALIZER_detectRecursions, true);
-	}
-
-	/**
-	 * Configuration property:  Ignore recursion errors.
-	 *
-	 * <p>
-	 * If <jk>true</jk>, when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
-	 * Otherwise, an exception is thrown.
-	 *
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		Checking for recursion can cause a small performance penalty.
-	 * </ul>
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
-	 * </ul>
-	 *
-	 * @param value
-	 * 	The new value for this property.
-	 * 	<br>The default is <jk>false</jk>.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerGroupBuilder ignoreRecursions(boolean value) {
-		return set(SERIALIZER_ignoreRecursions, value);
-	}
-
-	/**
-	 * Configuration property:  Ignore recursion errors.
-	 *
-	 * <p>
-	 * Shortcut for calling <code>ignoreRecursions(<jk>true</jk>)</code>.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
-	 * </ul>
-	 *
-	 * @return This object (for method chaining).
-	 */
-	public SerializerGroupBuilder ignoreRecursions() {
-		return set(SERIALIZER_ignoreRecursions, true);
-	}
-
-	/**
-	 * Configuration property:  Initial depth.
-	 *
-	 * <p>
-	 * The initial indentation level at the root.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_initialDepth}
-	 * </ul>
-	 *
-	 * @param value
-	 * 	The new value for this property.
-	 * 	<br>The default is <code>0</code>.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerGroupBuilder initialDepth(int value) {
-		return set(SERIALIZER_initialDepth, value);
-	}
-
-	/**
 	 * Configuration property:  Serializer listener.
 	 *
 	 * <p>
@@ -334,28 +227,6 @@ public class SerializerGroupBuilder extends BeanContextBuilder {
 	}
 
 	/**
-	 * Configuration property:  Max serialization depth.
-	 *
-	 * <p>
-	 * Abort serialization if specified depth is reached in the POJO tree.
-	 * <br>If this depth is exceeded, an exception is thrown.
-	 * <br>This prevents stack overflows from occurring when trying to serialize models with recursive references.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_maxDepth}
-	 * </ul>
-	 *
-	 * @param value
-	 * 	The new value for this property.
-	 * 	<br>The default is <code>100</code>.
-	 * @return This object (for method chaining).
-	 */
-	public SerializerGroupBuilder maxDepth(int value) {
-		return set(SERIALIZER_maxDepth, value);
-	}
-
-	/**
 	 * Configuration property:  Sort arrays and collections alphabetically.
 	 *
 	 * <h5 class='section'>See Also:</h5>
@@ -746,6 +617,42 @@ public class SerializerGroupBuilder extends BeanContextBuilder {
 		return set(OSSERIALIZER_binaryFormat, value);
 	}
 
+	@Override /* BeanTraverseBuilder */
+	public SerializerGroupBuilder detectRecursions(boolean value) {
+		super.detectRecursions(value);
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerGroupBuilder detectRecursions() {
+		super.detectRecursions();
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerGroupBuilder ignoreRecursions(boolean value) {
+		super.ignoreRecursions(value);
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerGroupBuilder ignoreRecursions() {
+		super.ignoreRecursions();
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerGroupBuilder initialDepth(int value) {
+		super.initialDepth(value);
+		return this;
+	}
+
+	@Override /* BeanTraverseBuilder */
+	public SerializerGroupBuilder maxDepth(int value) {
+		super.maxDepth(value);
+		return this;
+	}
+
 	@Override /* BeanContextBuilder */
 	public SerializerGroupBuilder beanClassVisibility(Visibility value) {
 		super.beanClassVisibility(value);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index e4a6bfc..327699d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -46,26 +46,17 @@ import org.apache.juneau.transform.*;
  * This class is NOT thread safe.
  * It is typically discarded after one-time use although it can be reused within the same thread.
  */
-public abstract class SerializerSession extends BeanSession {
+public abstract class SerializerSession extends BeanTraverseSession {
 
 	private final Serializer ctx;
 	private final UriResolver uriResolver;
 
-	private final Map<Object,Object> set;                                           // Contains the current objects in the current branch of the model.
-	private final LinkedList<StackElement> stack = new LinkedList<>();              // Contains the current objects in the current branch of the model.
 	private final Method javaMethod;                                                // Java method that invoked this serializer.
 
 	// Writable properties
-	private boolean isBottom;                                                       // If 'true', then we're at a leaf in the model (i.e. a String, Number, Boolean, or null).
-	private BeanPropertyMeta currentProperty;
-	private ClassMeta<?> currentClass;
 	private final boolean useWhitespace;
 	private final SerializerListener listener;
 
-	/** The current indentation depth into the model. */
-	public int indent;
-
-
 	/**
 	 * Create a new session using properties specified in the context.
 	 *
@@ -87,13 +78,6 @@ public abstract class SerializerSession extends BeanSession {
 		this.uriResolver = new UriResolver(ctx.getUriResolution(), ctx.getUriRelativity(), args.uriContext == null ? ctx.getUriContext() : args.uriContext);
 		this.listener = newInstance(SerializerListener.class, ctx.getListener());
 		this.useWhitespace = args.useWhitespace != null ? args.useWhitespace : ctx.isUseWhitespace();
-
-		this.indent = getInitialDepth();
-		if (isDetectRecursions() || isDebug()) {
-			set = new IdentityHashMap<>();
-		} else {
-			set = Collections.emptyMap();
-		}
 	}
 
 	/**
@@ -210,7 +194,7 @@ public abstract class SerializerSession extends BeanSession {
 			throw e;
 		} catch (StackOverflowError e) {
 			throw new SerializeException(this,
-				"Stack overflow occurred.  This can occur when trying to serialize models containing loops.  It's recommended you use the Serializer.SERIALIZER_detectRecursions setting to help locate the loop.").initCause(e);
+				"Stack overflow occurred.  This can occur when trying to serialize models containing loops.  It's recommended you use the BeanTraverseContext.BEANTRAVERSE_detectRecursions setting to help locate the loop.").initCause(e);
 		} catch (Exception e) {
 			throw new SerializeException(this, e);
 		} finally {
@@ -219,24 +203,6 @@ public abstract class SerializerSession extends BeanSession {
 	}
 
 	/**
-	 * Sets the current bean property being serialized for proper error messages.
-	 *
-	 * @param currentProperty The current property being serialized.
-	 */
-	protected final void setCurrentProperty(BeanPropertyMeta currentProperty) {
-		this.currentProperty = currentProperty;
-	}
-
-	/**
-	 * Sets the current class being serialized for proper error messages.
-	 *
-	 * @param currentClass The current class being serialized.
-	 */
-	protected final void setCurrentClass(ClassMeta<?> currentClass) {
-		this.currentClass = currentClass;
-	}
-
-	/**
 	 * Returns the Java method that invoked this serializer.
 	 *
 	 * <p>
@@ -259,77 +225,6 @@ public abstract class SerializerSession extends BeanSession {
 	}
 
 	/**
-	 * Push the specified object onto the stack.
-	 *
-	 * @param attrName The attribute name.
-	 * @param o The current object being serialized.
-	 * @param eType The expected class type.
-	 * @return
-	 * 	The {@link ClassMeta} of the object so that <code>instanceof</code> operations only need to be performed
-	 * 	once (since they can be expensive).
-	 * @throws SerializeException If recursion occurred.
-	 */
-	protected final ClassMeta<?> push(String attrName, Object o, ClassMeta<?> eType) throws SerializeException {
-		indent++;
-		isBottom = true;
-		if (o == null)
-			return null;
-		Class<?> c = o.getClass();
-		ClassMeta<?> cm = (eType != null && c == eType.getInnerClass()) ? eType : getClassMeta(c);
-		if (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
-			return cm;
-		if (isDetectRecursions() || isDebug()) {
-			if (stack.size() > getMaxDepth())
-				return null;
-			if (willRecurse(attrName, o, cm))
-				return null;
-			isBottom = false;
-			stack.add(new StackElement(stack.size(), attrName, o, cm));
-			if (isDebug())
-				getLogger().info(getStack(false));
-			set.put(o, o);
-		}
-		return cm;
-	}
-
-	/**
-	 * Returns <jk>true</jk> if {@link Serializer#SERIALIZER_detectRecursions} is enabled, and the specified
-	 * object is already higher up in the serialization chain.
-	 *
-	 * @param attrName The bean property attribute name, or some other identifier.
-	 * @param o The object to check for recursion.
-	 * @param cm The metadata on the object class.
-	 * @return <jk>true</jk> if recursion detected.
-	 * @throws SerializeException If recursion occurred.
-	 */
-	protected final boolean willRecurse(String attrName, Object o, ClassMeta<?> cm) throws SerializeException {
-		if (! (isDetectRecursions() || isDebug()))
-			return false;
-		if (! set.containsKey(o))
-			return false;
-		if (isIgnoreRecursions() && ! isDebug())
-			return true;
-
-		stack.add(new StackElement(stack.size(), attrName, o, cm));
-		throw new SerializeException("Recursion occurred, stack={0}", getStack(true));
-	}
-
-	/**
-	 * Pop an object off the stack.
-	 */
-	protected final void pop() {
-		indent--;
-		if ((isDetectRecursions() || isDebug()) && ! isBottom)  {
-			Object o = stack.removeLast().o;
-			Object o2 = set.remove(o);
-			if (o2 == null)
-				onError(null, "Couldn't remove object of type ''{0}'' on attribute ''{1}'' from object stack.",
-					o.getClass().getName(), stack);
-		}
-		isBottom = false;
-	}
-
-	/**
 	 * Specialized warning when an exception is thrown while executing a bean getter.
 	 *
 	 * @param p The bean map entry representing the bean property.
@@ -350,10 +245,11 @@ public abstract class SerializerSession extends BeanSession {
 	 * @param msg The warning message.
 	 * @param args Optional {@link MessageFormat}-style arguments.
 	 */
-	protected final void onError(Throwable t, String msg, Object... args) {
+	@Override
+	protected void onError(Throwable t, String msg, Object... args) {
 		if (listener != null)
 			listener.onError(this, t, format(msg, args));
-		super.addWarning(msg, args);
+		super.onError(t, msg, args);
 	}
 
 	/**
@@ -433,8 +329,12 @@ public abstract class SerializerSession extends BeanSession {
 			}
 		}
 
-		if (isTrimNullProperties() && willRecurse(attrName, value, cm))
-			return true;
+		try {
+			if (isTrimNullProperties() && willRecurse(attrName, value, cm))
+				return true;
+		} catch (BeanRecursionException e) {
+			throw new SerializeException(e);
+		}
 
 		return false;
 	}
@@ -585,62 +485,6 @@ public abstract class SerializerSession extends BeanSession {
 		return s;
 	}
 
-	private static final class StackElement {
-		final int depth;
-		final String name;
-		final Object o;
-		final ClassMeta<?> aType;
-
-		StackElement(int depth, String name, Object o, ClassMeta<?> aType) {
-			this.depth = depth;
-			this.name = name;
-			this.o = o;
-			this.aType = aType;
-		}
-
-		String toString(boolean simple) {
-			StringBuilder sb = new StringBuilder().append('[').append(depth).append(']');
-			sb.append(isEmpty(name) ? "<noname>" : name).append(':');
-			sb.append(aType.toString(simple));
-			if (aType != aType.getSerializedClassMeta(null))
-				sb.append('/').append(aType.getSerializedClassMeta(null).toString(simple));
-			return sb.toString();
-		}
-	}
-
-	private String getStack(boolean full) {
-		StringBuilder sb = new StringBuilder();
-		for (StackElement e : stack) {
-			if (full) {
-				sb.append("\n\t");
-				for (int i = 1; i < e.depth; i++)
-					sb.append("  ");
-				if (e.depth > 0)
-					sb.append("->");
-				sb.append(e.toString(false));
-			} else {
-				sb.append(" > ").append(e.toString(true));
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Returns information used to determine at what location in the parse a failure occurred.
-	 *
-	 * @return A map, typically containing something like <code>{line:123,column:456,currentProperty:"foobar"}</code>
-	 */
-	protected final ObjectMap getLastLocation() {
-		ObjectMap m = new ObjectMap();
-		if (currentClass != null)
-			m.put("currentClass", currentClass);
-		if (currentProperty != null)
-			m.put("currentProperty", currentProperty);
-		if (stack != null && ! stack.isEmpty())
-			m.put("stack", stack);
-		return m;
-	}
-
 	/**
 	 * Create a "_type" property that contains the dictionary name of the bean.
 	 *
@@ -774,52 +618,6 @@ public abstract class SerializerSession extends BeanSession {
 	}
 
 	/**
-	 * Configuration property:  Initial depth.
-	 *
-	 * @see Serializer#SERIALIZER_initialDepth
-	 * @return
-	 * 	The initial indentation level at the root.
-	 */
-	protected final int getInitialDepth() {
-		return ctx.getInitialDepth();
-	}
-
-	/**
-	 * Configuration property:  Max serialization depth.
-	 *
-	 * @see Serializer#SERIALIZER_maxDepth
-	 * @return
-	 * 	The depth at which serialization is aborted if depth is reached in the POJO tree.
-	 *	<br>If this depth is exceeded, an exception is thrown.
-	 */
-	protected final int getMaxDepth() {
-		return ctx.getMaxDepth();
-	}
-
-	/**
-	 * Configuration property:  Automatically detect POJO recursions.
-	 *
-	 * @see Serializer#SERIALIZER_detectRecursions
-	 * @return
-	 * 	<jk>true</jk> if recursions should be checked for during serialization.
-	 */
-	protected final boolean isDetectRecursions() {
-		return ctx.isDetectRecursions();
-	}
-
-	/**
-	 * Configuration property:  Ignore recursion errors.
-	 *
-	 * @see Serializer#SERIALIZER_ignoreRecursions
-	 * @return
-	 * 	<jk>true</jk> if when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
-	 * 	<br>Otherwise, a {@link SerializeException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
-	 */
-	protected final boolean isIgnoreRecursions() {
-		return ctx.isIgnoreRecursions();
-	}
-
-	/**
 	 * Configuration property:  Add <js>"_type"</js> properties when needed.
 	 *
 	 * @see Serializer#SERIALIZER_addBeanTypes
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index 8af3a0a..08a6e17 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -150,7 +150,12 @@ public class XmlSerializerSession extends WriterSerializerSession {
 	 */
 	protected final void findNsfMappings(Object o) throws SerializeException {
 		ClassMeta<?> aType = null;						// The actual type
-		aType = push(null, o, null);
+
+		try {
+			aType = push(null, o, null);
+		} catch (BeanRecursionException e) {
+			throw new SerializeException(e);
+		}
 
 		if (aType != null) {
 			Namespace ns = cXml(aType).getNamespace();
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 8299a9a..c529e62 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -97,7 +97,7 @@
 		<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties'>Configurable Properties</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties.Common'>Common Serializer Properties</a></p>
-			<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a></p>
+			<li><p class='updated'><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonParser'>Common Parser Properties</a></p>
 		</ol>
 		<li><p class=''><a class='doclink' href='#juneau-marshall.ObjectMap'>ObjectMap and ObjectList</a></p>
@@ -858,7 +858,7 @@
 		<ul>
 			<li class='jc'>{@link org.apache.juneau.json.JsonSerializer}
 			<ul>
-			<li class='jc'>{@link org.apache.juneau.jsonschema.JsonSchemaSerializer}
+			<li class='jc'>{@link org.apache.juneau.json.JsonSchemaSerializer}
 			<li class='jc'>{@link org.apache.juneau.json.SimpleJsonSerializer}
 			</ul>
 			<li class='jc'>{@link org.apache.juneau.plaintext.PlainTextSerializer}
@@ -883,11 +883,12 @@
 			<ul>
 				<li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}
 				<ul>
+					<li class='jc'>{@link org.apache.juneau.html.HtmlSchemaSerializer}
 					<li class='jc'>{@link org.apache.juneau.html.HtmlStrippedDocSerializer}
 					<ul>
 						<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}
 						<ul>
-							<li class='jc'>{@link org.apache.juneau.htmlschema.HtmlSchemaDocSerializer}
+							<li class='jc'>{@link org.apache.juneau.html.HtmlSchemaDocSerializer}
 						</ul>
 					</ul>
 				</ul>
@@ -1306,39 +1307,42 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.CommonSerializer' id='juneau-marshall.ConfigurableProperties.CommonSerializer'>2.6.2 - Common Serializer Properties</a></h4>
+<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.CommonSerializer' id='juneau-marshall.ConfigurableProperties.CommonSerializer'>2.6.2 - Common Serializer Properties</a></h4>
 <div class='topic'><!-- START: 2.6.2 - juneau-marshall.ConfigurableProperties.CommonSerializer -->
 <p>
 	In addition to the common properties above, the following properties are common to all serializers:
 </p>
 <ul class='doctree'>
-	<li class='jc'>{@link org.apache.juneau.serializer.Serializer}
+	<li class='jc'>{@link org.apache.juneau.BeanTraverseContext}
 	<ul>
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions SERIALIZER_ignoreRecursions}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_initialDepth SERIALIZER_initialDepth}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_maxDepth SERIALIZER_maxDepth}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace}
-		<li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
-		<ul>
-			<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
-			<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
-		</ul>
-		<li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
-		<ul>
-			<li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
+		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions}
+		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_ignoreRecursions BEANTRAVERSE_ignoreRecursions}
+		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_initialDepth BEANTRAVERSE_initialDepth}
+		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth BEANTRAVERSE_maxDepth}
+		<li class='jc'>{@link org.apache.juneau.serializer.Serializer}
+		<ul>
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace}
+			<li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
+			<ul>
+				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
+				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
+			</ul>
+			<li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
+			<ul>
+				<li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
+			</ul>
 		</ul>
 	</ul>
 </ul>
@@ -3520,12 +3524,12 @@
 	The Juneau Serializer API is designed to be used against POJO tree structures. 
 	<br>It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).
 	<br>If you try to serialize models with loops, you will usually cause a <code>StackOverflowError</code> to 
-	be thrown (if {@link org.apache.juneau.serializer.Serializer#SERIALIZER_maxDepth} is not reached 
+	be thrown (if {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth} is not reached 
 	first).
 </p>
 <p>
 	If you still want to use the Juneau serializers on such models, Juneau provides the 
-	{@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions} setting.
+	{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions} setting.
 	<br>It tells the serializer to look for instances of an object in the current branch of the tree and skip 
 	serialization when a duplicate is encountered.
 </p>
@@ -4631,7 +4635,7 @@
 <h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.JsonSchema' id='juneau-marshall.JsonDetails.JsonSchema'>2.19.6 - JSON-Schema Support</a></h4>
 <div class='topic'><!-- START: 2.19.6 - juneau-marshall.JsonDetails.JsonSchema -->
 <p>
-	Juneau provides the {@link org.apache.juneau.jsonschema.JsonSchemaSerializer} class for generating JSON-Schema 
+	Juneau provides the {@link org.apache.juneau.json.JsonSchemaSerializer} class for generating JSON-Schema 
 	documents that describe the output generated by the {@link org.apache.juneau.json.JsonSerializer} class.
 	<br>This class shares the same properties as <code>JsonSerializer</code>.
 	<br>For convenience the {@link org.apache.juneau.json.JsonSerializer#getSchemaSerializer()} method has been 
@@ -7904,8 +7908,8 @@
 <h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlSchema' id='juneau-marshall.HtmlDetails.HtmlSchema'>2.21.9 - HTML-Schema Support</a></h4>
 <div class='topic'><!-- START: 2.21.9 - juneau-marshall.HtmlDetails.HtmlSchema -->
 <p>
-	The {@link org.apache.juneau.htmlschema.HtmlSchemaSerializer} class is the HTML-equivalent to the
-	{@link org.apache.juneau.jsonschema.JsonSchemaSerializer} class.
+	The {@link org.apache.juneau.html.HtmlSchemaSerializer} class is the HTML-equivalent to the
+	{@link org.apache.juneau.json.JsonSchemaSerializer} class.
 	It's used to generate HTML versions of JSON-Schema documents that describe the output generated by the 
 	{@link org.apache.juneau.json.JsonSerializer} class.
 </p>
@@ -9556,7 +9560,7 @@ TODO(7.2.0)
 		Reuse instances of serializers and parsers whenever possible.
 		<br>They are designed to be thread safe and maintain internal caches of bean metadata to increase performance.
 	<li>
-		The {@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions} 
+		The {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions} 
 		option on the {@link org.apache.juneau.serializer.Serializer} class can cause a performance penalty of 
 		around 20%.  
 		<br>Therefore, it's recommended that this option be used only when necessary. 
@@ -22846,8 +22850,8 @@ TODO(7.2.0)
 			}
 		),
 		properties={
-			<ja>@Property</ja>(name=<jsf>SERIALIZER_maxDepth</jsf>, value=<js>"5"</js>),
-			<ja>@Property</ja>(name=<jsf>SERIALIZER_detectRecursions</jsf>, value="<js>true"</js>)
+			<ja>@Property</ja>(name=<jsf>BEANTRAVERSE_maxDepth</jsf>, value=<js>"5"</js>),
+			<ja>@Property</ja>(name=<jsf>BEANTRAVERSE_detectRecursions</jsf>, value="<js>true"</js>)
 		},
 		beanFilters={
 			<jc>// Interpret these as their parent classes, not subclasses</jc>
@@ -27232,7 +27236,7 @@ TODO(7.2.0)
 	<li>Improved error handling.  
 	<li>New <code><del>ParserContext.PARSER_debug</del></code> and <code><del>SerializerContext.SERIALIZER_debug</del></code>.
 		settings for logging additional information for debugging problems.
-	<li>New {@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions} setting for explicitely ignoring recursions when 
+	<li>New <code><del>SERIALIZER_ignoreRecursions</del></code> setting for explicitly ignoring recursions when 
 		serializing models.  Previously, the <jsf>SERIALIZER_detectRecursions</jsf> setting did this, but now it simply looks for recursions 
 		and throws exceptions when they occur.
 	<li>Improved handling of <code>StackOverflowErrors</code>.  When <jsf>SERIALIZER_detectRecursions</jsf> is enabled, a useful error message
@@ -31013,13 +31017,6 @@ TODO(7.2.0)
 		If a bean has both a <code>getX()</code> and <code>isX()</code> method, the <code>getX()</code> method takes precedence.
 		<br>The previous behavior was arbitrary.
 	<li>
-		The schema serializers have been moved into their own packages:
-		<ul class='doctree'>
-			<li class='jp'>{@link org.apache.juneau.jsonschema}
-			<li class='jp'>{@link org.apache.juneau.htmlschema}
-			<li class='jp'>{@link org.apache.juneau.xmlschema}
-		</ul>
-	<li>
 		Significant improvements to JSON-Schema serialization support.
 		<ul>
 			<li>New {@link org.apache.juneau.jsonschema.annotation.JsonSchema @JsonSchema} annotation.
diff --git a/juneau-doc/src/main/resources/ReleaseNotes/5.1.0.07.html b/juneau-doc/src/main/resources/ReleaseNotes/5.1.0.07.html
index babc3eb..0624f90 100644
--- a/juneau-doc/src/main/resources/ReleaseNotes/5.1.0.07.html
+++ b/juneau-doc/src/main/resources/ReleaseNotes/5.1.0.07.html
@@ -22,7 +22,7 @@
 	<li>Improved error handling.  
 	<li>New <code><del>ParserContext.PARSER_debug</del></code> and <code><del>SerializerContext.SERIALIZER_debug</del></code>.
 		settings for logging additional information for debugging problems.
-	<li>New {@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions} setting for explicitely ignoring recursions when 
+	<li>New <code><del>SERIALIZER_ignoreRecursions</del></code> setting for explicitly ignoring recursions when 
 		serializing models.  Previously, the <jsf>SERIALIZER_detectRecursions</jsf> setting did this, but now it simply looks for recursions 
 		and throws exceptions when they occur.
 	<li>Improved handling of <code>StackOverflowErrors</code>.  When <jsf>SERIALIZER_detectRecursions</jsf> is enabled, a useful error message
diff --git a/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html b/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
index 1539fc1..d251087 100644
--- a/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
+++ b/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
@@ -128,13 +128,6 @@
 		If a bean has both a <code>getX()</code> and <code>isX()</code> method, the <code>getX()</code> method takes precedence.
 		<br>The previous behavior was arbitrary.
 	<li>
-		The schema serializers have been moved into their own packages:
-		<ul class='doctree'>
-			<li class='jp'>{@link org.apache.juneau.jsonschema}
-			<li class='jp'>{@link org.apache.juneau.htmlschema}
-			<li class='jp'>{@link org.apache.juneau.xmlschema}
-		</ul>
-	<li>
 		Significant improvements to JSON-Schema serialization support.
 		<ul>
 			<li>New {@link org.apache.juneau.jsonschema.annotation.JsonSchema @JsonSchema} annotation.
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/01.Serializers.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/01.Serializers.html
index e8c4175..d8f4b07 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/01.Serializers.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/01.Serializers.html
@@ -108,7 +108,7 @@ Serializers
 		<ul>
 			<li class='jc'>{@link org.apache.juneau.json.JsonSerializer}
 			<ul>
-			<li class='jc'>{@link org.apache.juneau.jsonschema.JsonSchemaSerializer}
+			<li class='jc'>{@link org.apache.juneau.json.JsonSchemaSerializer}
 			<li class='jc'>{@link org.apache.juneau.json.SimpleJsonSerializer}
 			</ul>
 			<li class='jc'>{@link org.apache.juneau.plaintext.PlainTextSerializer}
@@ -133,11 +133,12 @@ Serializers
 			<ul>
 				<li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}
 				<ul>
+					<li class='jc'>{@link org.apache.juneau.html.HtmlSchemaSerializer}
 					<li class='jc'>{@link org.apache.juneau.html.HtmlStrippedDocSerializer}
 					<ul>
 						<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}
 						<ul>
-							<li class='jc'>{@link org.apache.juneau.htmlschema.HtmlSchemaDocSerializer}
+							<li class='jc'>{@link org.apache.juneau.html.HtmlSchemaDocSerializer}
 						</ul>
 					</ul>
 				</ul>
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
index ce8d031..a6e8c2c 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
@@ -13,39 +13,42 @@
  ***************************************************************************************************************************/
  -->
 
-Common Serializer Properties
+{updated} Common Serializer Properties
 
 <p>
 	In addition to the common properties above, the following properties are common to all serializers:
 </p>
 <ul class='doctree'>
-	<li class='jc'>{@link org.apache.juneau.serializer.Serializer}
+	<li class='jc'>{@link org.apache.juneau.BeanTraverseContext}
 	<ul>
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions SERIALIZER_ignoreRecursions}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_initialDepth SERIALIZER_initialDepth}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_maxDepth SERIALIZER_maxDepth}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
-		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace}
-		<li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
+		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions}
+		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_ignoreRecursions BEANTRAVERSE_ignoreRecursions}
+		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_initialDepth BEANTRAVERSE_initialDepth}
+		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth BEANTRAVERSE_maxDepth}
+		<li class='jc'>{@link org.apache.juneau.serializer.Serializer}
 		<ul>
-			<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
-			<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
-		</ul>
-		<li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
-		<ul>
-			<li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
+			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace}
+			<li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
+			<ul>
+				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
+				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
+			</ul>
+			<li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
+			<ul>
+				<li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
+			</ul>
 		</ul>
 	</ul>
 </ul>
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/13.Recursion.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/13.Recursion.html
index 498e0f3..a1cfaf4 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/13.Recursion.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/13.Recursion.html
@@ -19,12 +19,12 @@ Non-Tree Models and Recursion Detection
 	The Juneau Serializer API is designed to be used against POJO tree structures. 
 	<br>It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).
 	<br>If you try to serialize models with loops, you will usually cause a <code>StackOverflowError</code> to 
-	be thrown (if {@link org.apache.juneau.serializer.Serializer#SERIALIZER_maxDepth} is not reached 
+	be thrown (if {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth} is not reached 
 	first).
 </p>
 <p>
 	If you still want to use the Juneau serializers on such models, Juneau provides the 
-	{@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions} setting.
+	{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions} setting.
 	<br>It tells the serializer to look for instances of an object in the current branch of the tree and skip 
 	serialization when a duplicate is encountered.
 </p>
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/19.JsonDetails/06.JsonSchema.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/19.JsonDetails/06.JsonSchema.html
index da2b50a..73e4146 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/19.JsonDetails/06.JsonSchema.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/19.JsonDetails/06.JsonSchema.html
@@ -16,7 +16,7 @@
 JSON-Schema Support
 
 <p>
-	Juneau provides the {@link org.apache.juneau.jsonschema.JsonSchemaSerializer} class for generating JSON-Schema 
+	Juneau provides the {@link org.apache.juneau.json.JsonSchemaSerializer} class for generating JSON-Schema 
 	documents that describe the output generated by the {@link org.apache.juneau.json.JsonSerializer} class.
 	<br>This class shares the same properties as <code>JsonSerializer</code>.
 	<br>For convenience the {@link org.apache.juneau.json.JsonSerializer#getSchemaSerializer()} method has been 
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/21.HtmlDetails/09.HtmlSchema.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/21.HtmlDetails/09.HtmlSchema.html
index ac53781..cfe7cf1 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/21.HtmlDetails/09.HtmlSchema.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/21.HtmlDetails/09.HtmlSchema.html
@@ -16,8 +16,8 @@
 {new} HTML-Schema Support
 
 <p>
-	The {@link org.apache.juneau.htmlschema.HtmlSchemaSerializer} class is the HTML-equivalent to the
-	{@link org.apache.juneau.jsonschema.JsonSchemaSerializer} class.
+	The {@link org.apache.juneau.html.HtmlSchemaSerializer} class is the HTML-equivalent to the
+	{@link org.apache.juneau.json.JsonSchemaSerializer} class.
 	It's used to generate HTML versions of JSON-Schema documents that describe the output generated by the 
 	{@link org.apache.juneau.json.JsonSerializer} class.
 </p>
diff --git a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/29.BestPractices.html b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/29.BestPractices.html
index 9314c47..0055ee3 100644
--- a/juneau-doc/src/main/resources/Topics/02.juneau-marshall/29.BestPractices.html
+++ b/juneau-doc/src/main/resources/Topics/02.juneau-marshall/29.BestPractices.html
@@ -20,7 +20,7 @@ Best Practices
 		Reuse instances of serializers and parsers whenever possible.
 		<br>They are designed to be thread safe and maintain internal caches of bean metadata to increase performance.
 	<li>
-		The {@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions} 
+		The {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions} 
 		option on the {@link org.apache.juneau.serializer.Serializer} class can cause a performance penalty of 
 		around 20%.  
 		<br>Therefore, it's recommended that this option be used only when necessary. 
diff --git a/juneau-doc/src/main/resources/Topics/12.juneau-examples-rest/06.RequestEchoResource.html b/juneau-doc/src/main/resources/Topics/12.juneau-examples-rest/06.RequestEchoResource.html
index 25a182c..c5a5ee0 100644
--- a/juneau-doc/src/main/resources/Topics/12.juneau-examples-rest/06.RequestEchoResource.html
+++ b/juneau-doc/src/main/resources/Topics/12.juneau-examples-rest/06.RequestEchoResource.html
@@ -69,8 +69,8 @@ RequestEchoResource
 			}
 		),
 		properties={
-			<ja>@Property</ja>(name=<jsf>SERIALIZER_maxDepth</jsf>, value=<js>"5"</js>),
-			<ja>@Property</ja>(name=<jsf>SERIALIZER_detectRecursions</jsf>, value="<js>true"</js>)
+			<ja>@Property</ja>(name=<jsf>BEANTRAVERSE_maxDepth</jsf>, value=<js>"5"</js>),
+			<ja>@Property</ja>(name=<jsf>BEANTRAVERSE_detectRecursions</jsf>, value="<js>true"</js>)
 		},
 		beanFilters={
 			<jc>// Interpret these as their parent classes, not subclasses</jc>
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
index 6cfec56..6808e4d 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
@@ -53,8 +53,8 @@ import org.apache.juneau.transforms.*;
 		nowrap="false"
 	),
 	properties={
-		@Property(name=SERIALIZER_maxDepth, value="5"),
-		@Property(name=SERIALIZER_detectRecursions, value="true")
+		@Property(name=BEANTRAVERSE_maxDepth, value="5"),
+		@Property(name=BEANTRAVERSE_detectRecursions, value="true")
 	},
 	beanFilters={
 		// Interpret these as their parent classes, not subclasses
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
index 44daa6b..e624c4e 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.parser.InputStreamParser.*;
 import static org.apache.juneau.parser.ReaderParser.*;
 import static org.apache.juneau.rest.client.RestClient.*;
+import static org.apache.juneau.BeanTraverseContext.*;
 import static org.apache.juneau.serializer.OutputStreamSerializer.*;
 import static org.apache.juneau.serializer.WriterSerializer.*;
 import static org.apache.juneau.uon.UonSerializer.*;
@@ -1381,7 +1382,7 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
 	 * </ul>
 	 *
 	 * @param value
@@ -1390,7 +1391,7 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * @return This object (for method chaining).
 	 */
 	public RestClientBuilder detectRecursions(boolean value) {
-		return set(SERIALIZER_detectRecursions, value);
+		return set(BEANTRAVERSE_detectRecursions, value);
 	}
 
 	/**
@@ -1401,13 +1402,13 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_detectRecursions}
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
 	 */
 	public RestClientBuilder detectRecursions() {
-		return set(SERIALIZER_detectRecursions, true);
+		return set(BEANTRAVERSE_detectRecursions, true);
 	}
 
 	/**
@@ -1425,7 +1426,7 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
 	 * </ul>
 	 *
 	 * @param value
@@ -1434,7 +1435,7 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * @return This object (for method chaining).
 	 */
 	public RestClientBuilder ignoreRecursions(boolean value) {
-		return set(SERIALIZER_ignoreRecursions, value);
+		return set(BEANTRAVERSE_ignoreRecursions, value);
 	}
 
 	/**
@@ -1445,13 +1446,13 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_ignoreRecursions}
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
 	 */
 	public RestClientBuilder ignoreRecursions() {
-		return set(SERIALIZER_ignoreRecursions, true);
+		return set(BEANTRAVERSE_ignoreRecursions, true);
 	}
 
 	/**
@@ -1462,7 +1463,7 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_initialDepth}
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
 	 * </ul>
 	 *
 	 * @param value
@@ -1471,7 +1472,7 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * @return This object (for method chaining).
 	 */
 	public RestClientBuilder initialDepth(int value) {
-		return set(SERIALIZER_initialDepth, value);
+		return set(BEANTRAVERSE_initialDepth, value);
 	}
 
 	/**
@@ -1503,7 +1504,7 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 *
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link Serializer#SERIALIZER_maxDepth}
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
 	 * </ul>
 	 *
 	 * @param value
@@ -1512,7 +1513,7 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * @return This object (for method chaining).
 	 */
 	public RestClientBuilder maxDepth(int value) {
-		return set(SERIALIZER_maxDepth, value);
+		return set(BEANTRAVERSE_maxDepth, value);
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BasicProvider.java b/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BasicProvider.java
index e2107e6..d1476d6 100644
--- a/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BasicProvider.java
+++ b/juneau-rest/juneau-rest-server-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BasicProvider.java
@@ -18,7 +18,6 @@ import javax.ws.rs.ext.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.jso.*;
 import org.apache.juneau.json.*;
-import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.soap.*;
 import org.apache.juneau.urlencoding.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
index b02c226..b650528 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
@@ -15,9 +15,7 @@ package org.apache.juneau.rest;
 import static org.apache.juneau.serializer.Serializer.*;
 
 import org.apache.juneau.html.*;
-import org.apache.juneau.htmlschema.*;
 import org.apache.juneau.json.*;
-import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.msgpack.*;
 import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.annotation.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
index d27436e..1330195 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest;
 
 import static org.apache.juneau.http.HttpMethodName.*;
-import static org.apache.juneau.jsonschema.JsonSchemaSerializer.*;
+import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
 import static org.apache.juneau.rest.BasicRestInfoProvider.*;
 
 import org.apache.juneau.dto.swagger.*;
@@ -21,7 +21,6 @@ import org.apache.juneau.dto.swagger.ui.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.jso.*;
 import org.apache.juneau.json.*;
-import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.soap.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 273015c..161b7ad 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -35,7 +35,6 @@ import org.apache.juneau.*;
 import org.apache.juneau.config.*;
 import org.apache.juneau.encoders.*;
 import org.apache.juneau.html.*;
-import org.apache.juneau.htmlschema.*;
 import org.apache.juneau.http.*;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.httppart.*;
@@ -2991,7 +2990,7 @@ public final class RestContext extends BeanContext {
 	private final ParserGroup parsers;
 	private final HttpPartSerializer partSerializer;
 	private final HttpPartParser partParser;
-	private final JsonSchemaSerializer jsonSchemaSerializer;
+	private final JsonSchemaGenerator jsonSchemaGenerator;
 	private final EncoderGroup encoders;
 	private final List<MediaType>
 		consumes,
@@ -3154,7 +3153,7 @@ public final class RestContext extends BeanContext {
 			parsers = ParserGroup.create().append(getInstanceArrayProperty(REST_parsers, Parser.class, new Parser[0], true, resource, ps)).build();
 			partSerializer = getInstanceProperty(REST_partSerializer, HttpPartSerializer.class, OpenApiPartSerializer.class, true, resource, ps);
 			partParser = getInstanceProperty(REST_partParser, HttpPartParser.class, OpenApiPartParser.class, true, resource, ps);
-			jsonSchemaSerializer = new JsonSchemaSerializer(ps);
+			jsonSchemaGenerator = new JsonSchemaGenerator(ps);
 			encoders = new EncoderGroupBuilder().append(getInstanceArrayProperty(REST_encoders, Encoder.class, new Encoder[0], true, resource, ps)).build();
 			beanContext = BeanContext.create().apply(ps).build();
 
@@ -4254,8 +4253,8 @@ public final class RestContext extends BeanContext {
 	 * 	The JSON-Schema serializer associated with this resource.
 	 * 	<br>Never <jk>null</jk>.
 	 */
-	public JsonSchemaSerializer getJsonSchemaSerializer() {
-		return jsonSchemaSerializer;
+	public JsonSchemaGenerator getJsonSchemaGenerator() {
+		return jsonSchemaGenerator;
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
index f57923e..9a54032 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
@@ -62,7 +62,7 @@ final class SwaggerGenerator {
 	private final Locale locale;
 	private final RestContext context;
 	private final JsonParser jp = JsonParser.DEFAULT;
-	private final JsonSchemaSerializerSession js;
+	private final JsonSchemaGeneratorSession js;
 	private final Class<?> c;
 	private final Object resource;
 	private final MessageBundle mb;
@@ -79,7 +79,7 @@ final class SwaggerGenerator {
 		this.ignoreTypes = ignoreTypes;
 		this.locale = req.getLocale();
 		this.context = req.getContext();
-		this.js = context.getJsonSchemaSerializer().createSession();
+		this.js = context.getJsonSchemaGenerator().createSession();
 		this.c = context.getResource().getClass();
 		this.resource = context.getResource();
 		this.mb = context.getMessages();