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/07/27 20:21:29 UTC

[juneau] branch master updated: Marshall API support.

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 db46ed9  Marshall API support.
db46ed9 is described below

commit db46ed963193399d5d7cbe8a92195b2a81a874a5
Author: JamesBognar <ja...@apache.org>
AuthorDate: Fri Jul 27 16:21:10 2018 -0400

    Marshall API support.
---
 .../java/org/apache/juneau/marshall/HtmlTest.java} |  100 +-
 .../java/org/apache/juneau/marshall/JsoTest.java}  |   45 +-
 .../java/org/apache/juneau/marshall/JsonTest.java} |  100 +-
 .../org/apache/juneau/marshall/MsgPackTest.java}   |  100 +-
 .../java/org/apache/juneau/marshall/N3Test.java}   |   98 +-
 .../org/apache/juneau/marshall/NTripleTest.java}   |   95 +-
 .../org/apache/juneau/marshall/PlainTextTest.java} |   83 +-
 .../apache/juneau/marshall/RdfXmlAbbrevTest.java}  |  103 +-
 .../org/apache/juneau/marshall/RdfXmlTest.java}    |  103 +-
 .../apache/juneau/marshall/SimpleJsonTest.java}    |  100 +-
 .../org/apache/juneau/marshall/TurtleTest.java}    |   89 +-
 .../java/org/apache/juneau/marshall/UonTest.java}  |  100 +-
 .../apache/juneau/marshall/UrlEncodingTest.java}   |  103 +-
 .../java/org/apache/juneau/marshall/XmlTest.java}  |  100 +-
 .../apache/juneau/yaml/proto/CommonParserTest.java |  180 ----
 .../org/apache/juneau/yaml/proto/CommonTest.java   |  357 -------
 .../apache/juneau/yaml/proto/YamlParserTest.java   |  326 -------
 .../org/apache/juneau/yaml/proto/YamlTest.java     |  215 -----
 .../main/java/org/apache/juneau/marshall/N3.java}  |  111 ++-
 .../java/org/apache/juneau/marshall/NTriple.java}  |  111 ++-
 .../java/org/apache/juneau/marshall/RdfXml.java}   |  111 ++-
 .../org/apache/juneau/marshall/RdfXmlAbbrev.java}  |  111 ++-
 .../java/org/apache/juneau/marshall/Turtle.java}   |  111 ++-
 .../CharMarshall.java}                             |  102 +-
 .../YamlClassMeta.java => marshall/Html.java}      |  116 ++-
 .../proto/YamlClassMeta.java => marshall/Jso.java} |  116 ++-
 .../YamlClassMeta.java => marshall/Json.java}      |  116 ++-
 .../java/org/apache/juneau/marshall/Marshall.java  |  257 +++++
 .../java/org/apache/juneau/marshall/MsgPack.java   |   71 ++
 .../java/org/apache/juneau/marshall/PlainText.java |   76 ++
 .../org/apache/juneau/marshall/SimpleJson.java     |   71 ++
 .../StreamMarshall.java}                           |  102 +-
 .../proto/YamlClassMeta.java => marshall/Uon.java} |  116 ++-
 .../org/apache/juneau/marshall/UrlEncoding.java    |   71 ++
 .../proto/YamlClassMeta.java => marshall/Xml.java} |  116 ++-
 .../org/apache/juneau/yaml/proto/YamlParser.java   |  186 ----
 .../juneau/yaml/proto/YamlParserBuilder.java       |  501 ----------
 .../juneau/yaml/proto/YamlParserSession.java       |  675 -------------
 .../apache/juneau/yaml/proto/YamlSerializer.java   |  345 -------
 .../juneau/yaml/proto/YamlSerializerBuilder.java   |  670 -------------
 .../juneau/yaml/proto/YamlSerializerSession.java   |  248 -----
 .../org/apache/juneau/yaml/proto/YamlWriter.java   |  289 ------
 .../juneau/yaml/proto/doc-files/Example_HTML.png   |  Bin 35528 -> 0 bytes
 .../juneau/yaml/proto/doc-files/Example_JSON.png   |  Bin 26954 -> 0 bytes
 .../yaml/proto/doc-files/Example_JSONSchema.png    |  Bin 34114 -> 0 bytes
 .../yaml/proto/doc-files/Example_JSONSimple.png    |  Bin 30920 -> 0 bytes
 .../java/org/apache/juneau/yaml/proto/package.html | 1005 --------------------
 juneau-doc/juneau-doc.jar                          |  Bin 12391 -> 12598 bytes
 .../apache/juneau/doc/internal/DocGenerator.java   |   21 +-
 juneau-doc/src/main/javadoc/overview.html          |  768 ++++++++-------
 .../src/main/resources/ReleaseNotes/7.2.0.html     |   39 +
 .../Topics/02.juneau-marshall/03.Marshalls.html    |   78 ++
 ...erializers.html => 04.HttpPartSerializers.html} |    0
 ...ttpPartParsers.html => 05.HttpPartParsers.html} |    0
 .../{05.ObjectMap.html => 07.ObjectMap.html}       |    0
 .../{07.Groups.html => 08.Groups.html}             |    0
 ...09.ContextsBuildersSessionsPropertyStores.html} |    0
 .../{09.Transforms.html => 10.Transforms.html}     |    0
 .../01.PojoSwaps.html                              |    0
 .../02.PerMediaTypePojoSwaps.html                  |    0
 .../03.OneWayPojoSwaps.html                        |    0
 .../04.SwapAnnotation.html                         |    0
 .../05.TemplatedSwaps.html                         |    0
 .../06.SwapMethods.html                            |    0
 .../07.SurrogateClasses.html                       |    0
 .../08.BeanAnnotation.html                         |    0
 .../09.BeanPropertyAnnotation.html                 |    0
 .../10.BeanConstructorAnnotation.html              |    0
 .../11.BeanIgnoreAnnotation.html                   |    0
 .../12.NamePropertyAnnotation.html                 |    0
 .../13.ParentPropertyAnnotation.html               |    0
 .../14.PojoBuilders.html                           |    0
 .../{09.Transforms => 10.Transforms}/15.URIs.html  |    0
 .../16.BeanFilters.html                            |    0
 .../17.InterfaceFilters.html                       |    0
 .../18.StopClasses.html                            |    0
 .../19.BypassSerialization.html                    |    0
 ...nDictionaries.html => 11.BeanDictionaries.html} |    0
 .../01.BeanSubTypes.html                           |    0
 .../{11.VirtualBeans.html => 12.VirtualBeans.html} |    0
 .../{12.Recursion.html => 13.Recursion.html}       |    0
 ...odels.html => 14.ParsingIntoGenericModels.html} |    0
 ...reams.html => 15.ReadingContinuousStreams.html} |    0
 .../{15.URIs.html => 16.URIs.html}                 |    0
 ...onComparison.html => 17.JacksonComparison.html} |    0
 ....PojoCategories.html => 18.PojoCategories.html} |    0
 .../{18.JsonDetails.html => 19.JsonDetails.html}   |    0
 .../01.Methodology.html                            |    0
 .../02.Serializers.html                            |    0
 .../03.SimplifiedJson.html                         |    0
 .../04.Parsers.html                                |    0
 .../05.JsonAnnotation.html                         |    0
 .../06.JsonSchema.html                             |    0
 .../{19.XmlDetails.html => 20.XmlDetails.html}     |    0
 .../01.Methodology.html                            |    0
 .../02.Serializers.html                            |    0
 .../03.Parsers.html                                |    0
 .../04.BeanTypeNameAnnotation.html                 |    0
 .../05.XmlChildNameAnnotation.html                 |    0
 .../06.XmlFormatAnnotation.html                    |    0
 .../07.Namespaces.html                             |    0
 .../08.XmlSchema.html                              |    0
 .../{20.HtmlDetails.html => 21.HtmlDetails.html}   |    0
 .../01.Methodology.html                            |    0
 .../02.Serializers.html                            |    0
 .../03.Parsers.html                                |    0
 .../04.HtmlAnnotation.html                         |    0
 .../05.HtmlRenderAnnotation.html                   |    0
 .../06.HtmlDocSerializer.html                      |    0
 .../07.CustomTemplates.html                        |    0
 .../08.HtmlSchema.html                             |    0
 .../{21.UonDetails.html => 22.UonDetails.html}     |    0
 .../01.Methodology.html                            |    0
 .../02.Serializers.html                            |    0
 .../03.Parsers.html                                |    0
 ...dingDetails.html => 23.UrlEncodingDetails.html} |    0
 .../01.Methodology.html                            |    0
 .../02.Serializers.html                            |    0
 .../03.Parsers.html                                |    0
 .../04.UrlEncodingAnnotation.html                  |    0
 ....MsgPackDetails.html => 24.MsgPackDetails.html} |    0
 .../01.Methodology.html                            |    0
 .../02.Serializers.html                            |    0
 .../03.Parsers.html                                |    0
 ....OpenApiDetails.html => 25.OpenApiDetails.html} |    0
 .../01.Methodology.html                            |    0
 .../02.Serializers.html                            |    0
 .../03.Parsers.html                                |    0
 .../{25.SoapDetails.html => 26.SoapDetails.html}   |    0
 .../{26.CsvDetails.html => 27.CsvDetails.html}     |    0
 .../{27.JsoDetails.html => 28.JsoDetails.html}     |    0
 ...28.BestPractices.html => 29.BestPractices.html} |    0
 .../juneau/rest/client/RestClientBuilder.java      |   13 -
 133 files changed, 2626 insertions(+), 6494 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/HtmlTest.java
similarity index 61%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/HtmlTest.java
index 6398cfb..cebb1ec 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/HtmlTest.java
@@ -1,45 +1,55 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+import java.util.*;
+
+import org.junit.*;
+
+public class HtmlTest {
+
+	CharMarshall m = Html.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("<string>foo</string>", m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals("<string>foo</string>", sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals("<string>foo</string>", m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read("<string>foo</string>", String.class);
+		assertEquals("foo", s);
+	}
+
+	@Test
+	public void read2() throws Exception {
+		Map<?,?> o = m.read("<table><tr><td>foo</td><td>bar</td></tr></table>", Map.class, String.class, String.class);
+		assertObjectEquals("{foo:'bar'}", o);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/package-info.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/JsoTest.java
old mode 100755
new mode 100644
similarity index 84%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/package-info.java
rename to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/JsoTest.java
index 36a600b..4e4fee4
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/package-info.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/JsoTest.java
@@ -1,18 +1,27 @@
-// ***************************************************************************************************************************
-// * 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.                                              *
-// ***************************************************************************************************************************
-
-/**
- * YAML Marshalling Annotations
- */
-package org.apache.juneau.yaml.proto.annotation;
-
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.*;
+
+public class JsoTest {
+
+	StreamMarshall m = Jso.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("foo", m.read(m.write("foo"), String.class));
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/JsonTest.java
similarity index 63%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/JsonTest.java
index 6398cfb..c6b9d53 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/JsonTest.java
@@ -1,45 +1,55 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.junit.Assert.*;
+import static org.apache.juneau.testutils.TestUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+import org.junit.*;
+
+public class JsonTest {
+
+	CharMarshall m = Json.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("\"foo\"", m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals("\"foo\"", sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals("\"foo\"", m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read("'foo'", String.class);
+		assertEquals("foo", s);
+	}
+
+	@Test
+	public void read2() throws Exception {
+		Map<?,?> o = m.read("{foo:'bar'}", Map.class, String.class, String.class);
+		assertObjectEquals("{foo:'bar'}", o);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/MsgPackTest.java
similarity index 60%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/MsgPackTest.java
index 6398cfb..f78e74e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/MsgPackTest.java
@@ -1,45 +1,55 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.io.*;
+import java.util.*;
+
+import org.junit.*;
+
+public class MsgPackTest {
+
+	StreamMarshall m = MsgPack.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("A3 66 6F 6F", toSpacedHex(m.write("foo")));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		m.write("foo", baos);
+		assertEquals("A3 66 6F 6F", toSpacedHex(baos.toByteArray()));
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals("A3666F6F", m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		assertEquals("foo", m.read(fromHex("A3666F6F"), String.class));
+	}
+
+	@Test
+	public void read2() throws Exception {
+		Map<?,?> o = m.read(fromHex("81A3666F6FA3626172"), Map.class, String.class, String.class);
+		assertObjectEquals("{foo:'bar'}", o);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/N3Test.java
similarity index 64%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/N3Test.java
index 6398cfb..efd9cc2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/N3Test.java
@@ -1,45 +1,53 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+
+import org.junit.*;
+
+public class N3Test {
+
+	CharMarshall m = N3.DEFAULT;
+
+	String r = ""
+		+ "@prefix jp:      <http://www.apache.org/juneaubp/> .\n"
+		+ "@prefix j:       <http://www.apache.org/juneau/> .\n"
+		+ "\n"
+		+ "[]    j:value \"foo\" .\n";
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals(r, m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals(r, sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals(r, m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read(r, String.class);
+		assertEquals("foo", s);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/NTripleTest.java
similarity index 63%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/NTripleTest.java
index 6398cfb..22bda91 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/NTripleTest.java
@@ -1,45 +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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+
+import org.junit.*;
+
+public class NTripleTest {
+
+	CharMarshall m = NTriple.DEFAULT;
+
+	String r = "_:xxx <http://www.apache.org/juneau/value> \"foo\" .";
+
+	@Test
+	public void write1() throws Exception {
+		assertContains(m.write("foo"), "<http://www.apache.org/juneau/value> \"foo\"");
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertContains(sw.toString(), "<http://www.apache.org/juneau/value> \"foo\"");
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertContains(m.toString("foo"), "<http://www.apache.org/juneau/value> \"foo\"");
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read(r, String.class);
+		assertEquals("foo", s);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/Yaml.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/PlainTextTest.java
similarity index 70%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/Yaml.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/PlainTextTest.java
index 08e2e50..ea5c8b2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/Yaml.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/PlainTextTest.java
@@ -1,36 +1,47 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto.annotation;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-import java.lang.annotation.*;
-
-/**
- * Annotation for specifying various YAML options for the YAML serializers and parsers.
- *
- * <p>
- * Can be applied to Java types.
- *
- * <p>
- * Can be used for the following:
- * <ul class='spaced-list'>
- * </ul>
- */
-@Documented
-@Target({TYPE})
-@Retention(RUNTIME)
-@Inherited
-public @interface Yaml {
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+
+import org.junit.*;
+
+public class PlainTextTest {
+
+	CharMarshall m = PlainText.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("foo", m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals("foo", sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals("foo", m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read("foo", String.class);
+		assertEquals("foo", s);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/RdfXmlAbbrevTest.java
similarity index 59%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/RdfXmlAbbrevTest.java
index 6398cfb..cb0b22a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/RdfXmlAbbrevTest.java
@@ -1,45 +1,58 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+
+import org.junit.*;
+
+public class RdfXmlAbbrevTest {
+
+	CharMarshall m = RdfXmlAbbrev.DEFAULT;
+
+	String r = ""
+		+ "<rdf:RDF"
+		+ "    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
+		+ "    xmlns:j=\"http://www.apache.org/juneau/\""
+		+ "    xmlns:jp=\"http://www.apache.org/juneaubp/\">"
+		+ "<rdf:Description>"
+		+ "<j:value>foo</j:value>"
+		+ "</rdf:Description>"
+		+ "</rdf:RDF>";
+
+	@Test
+	public void write1() throws Exception {
+		assertContains(m.write("foo"), "<j:value>foo</j:value>");
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertContains(sw.toString(), "<j:value>foo</j:value>");
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertContains(m.toString("foo"), "<j:value>foo</j:value>");
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read(r, String.class);
+		assertEquals("foo", s);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/RdfXmlTest.java
similarity index 58%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/RdfXmlTest.java
index 6398cfb..92bc2c3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/RdfXmlTest.java
@@ -1,45 +1,58 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+
+import org.junit.*;
+
+public class RdfXmlTest {
+
+	CharMarshall m = RdfXml.DEFAULT;
+
+	String r = ""
+		+ "<rdf:RDF"
+		+ "    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
+		+ "    xmlns:j=\"http://www.apache.org/juneau/\""
+		+ "    xmlns:jp=\"http://www.apache.org/juneaubp/\" > "
+		+ "<rdf:Description rdf:nodeID=\"A0\">"
+		+ "<j:value>foo</j:value>"
+		+ "</rdf:Description>"
+		+ "</rdf:RDF>";
+
+	@Test
+	public void write1() throws Exception {
+		assertContains(m.write("foo"), "<j:value>foo</j:value>");
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertContains(sw.toString(), "<j:value>foo</j:value>");
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertContains(m.toString("foo"), "<j:value>foo</j:value>");
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read(r, String.class);
+		assertEquals("foo", s);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/SimpleJsonTest.java
similarity index 63%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/SimpleJsonTest.java
index 6398cfb..bf395e1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/SimpleJsonTest.java
@@ -1,45 +1,55 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+import java.util.*;
+
+import org.junit.*;
+
+public class SimpleJsonTest {
+
+	CharMarshall m = SimpleJson.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("'foo'", m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals("'foo'", sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals("'foo'", m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read("'foo'", String.class);
+		assertEquals("foo", s);
+	}
+
+	@Test
+	public void read2() throws Exception {
+		Map<?,?> o = m.read("{foo:'bar'}", Map.class, String.class, String.class);
+		assertObjectEquals("{foo:'bar'}", o);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/Yaml.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/TurtleTest.java
similarity index 65%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/Yaml.java
rename to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/TurtleTest.java
index 08e2e50..a3bfdb8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/annotation/Yaml.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/TurtleTest.java
@@ -1,36 +1,53 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto.annotation;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-import java.lang.annotation.*;
-
-/**
- * Annotation for specifying various YAML options for the YAML serializers and parsers.
- *
- * <p>
- * Can be applied to Java types.
- *
- * <p>
- * Can be used for the following:
- * <ul class='spaced-list'>
- * </ul>
- */
-@Documented
-@Target({TYPE})
-@Retention(RUNTIME)
-@Inherited
-public @interface Yaml {
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+
+import org.junit.*;
+
+public class TurtleTest {
+
+	CharMarshall m = Turtle.DEFAULT;
+
+	String r = ""
+		+ "@prefix jp:      <http://www.apache.org/juneaubp/> .\n"
+		+ "@prefix j:       <http://www.apache.org/juneau/> .\n"
+		+ "\n"
+		+ "[]    j:value \"foo\" .\n";
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals(r, m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals(r, sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals(r, m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read(r, String.class);
+		assertEquals("foo", s);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/UonTest.java
similarity index 63%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/UonTest.java
index 6398cfb..f8b0702 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/UonTest.java
@@ -1,45 +1,55 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+import java.util.*;
+
+import org.junit.*;
+
+public class UonTest {
+
+	CharMarshall m = Uon.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("foo", m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals("foo", sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals("foo", m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read("foo", String.class);
+		assertEquals("foo", s);
+	}
+
+	@Test
+	public void read2() throws Exception {
+		Map<?,?> o = m.read("(foo=bar)", Map.class, String.class, String.class);
+		assertObjectEquals("{foo:'bar'}", o);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/UrlEncodingTest.java
similarity index 61%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/UrlEncodingTest.java
index 6398cfb..cb45239 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/UrlEncodingTest.java
@@ -1,45 +1,58 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.junit.*;
+
+public class UrlEncodingTest {
+
+	CharMarshall m = UrlEncoding.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("_value=foo", m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals("_value=foo", sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals("_value=foo", m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read("_value=foo", String.class);
+		assertEquals("foo", s);
+	}
+
+	@Test
+	public void read2() throws Exception {
+		ObjectMap om = new ObjectMap("{foo:'bar'}");
+		m.println(om);
+		Map<?,?> o = m.read("foo=bar", Map.class, String.class, String.class);
+		assertObjectEquals("{foo:'bar'}", o);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/XmlTest.java
similarity index 61%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/XmlTest.java
index 6398cfb..4b7998c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/marshall/XmlTest.java
@@ -1,45 +1,55 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.assertEquals;
+
+import java.io.*;
+import java.util.*;
+
+import org.junit.*;
+
+public class XmlTest {
+
+	CharMarshall m = Xml.DEFAULT;
+
+	@Test
+	public void write1() throws Exception {
+		assertEquals("<string>foo</string>", m.write("foo"));
+	}
+
+	@Test
+	public void write2() throws Exception {
+		StringWriter sw = new StringWriter();
+		m.write("foo", sw);
+		assertEquals("<string>foo</string>", sw.toString());
+	}
+
+	@Test
+	public void toString1() throws Exception {
+		assertEquals("<string>foo</string>", m.toString("foo"));
+	}
+
+	@Test
+	public void read1() throws Exception {
+		String s = m.read("<string>foo</string>", String.class);
+		assertEquals("foo", s);
+	}
+
+	@Test
+	public void read2() throws Exception {
+		Map<?,?> o = m.read("<object><foo>bar</foo></object>", Map.class, String.class, String.class);
+		assertObjectEquals("{foo:'bar'}", o);
+	}
+}
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/CommonParserTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/CommonParserTest.java
deleted file mode 100755
index bca2e82..0000000
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/CommonParserTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import static org.junit.Assert.*;
-
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.parser.*;
-import org.junit.*;
-
-@SuppressWarnings({"rawtypes","serial"})
-public class CommonParserTest {
-
-	//====================================================================================================
-	// testFromSerializer
-	//====================================================================================================
-	@Test
-	public void testFromSerializer() throws Exception {
-		ReaderParser p = YamlParser.create().beanDictionary(A1.class).build();
-
-		Map m = null;
-		m = (Map)p.parse("{a:1}", Object.class);
-		assertEquals(1, m.get("a"));
-		m = (Map)p.parse("{a:1,b:\"foo bar\"}", Object.class);
-		assertEquals(1, m.get("a"));
-		assertEquals("foo bar", m.get("b"));
-		m = (Map)p.parse("{a:1,b:\"foo bar\",c:false}", Object.class);
-		assertEquals(1, m.get("a"));
-		assertEquals(false, m.get("c"));
-		m = (Map)p.parse(" { a : 1 , b : 'foo' , c : false } ", Object.class);
-		assertEquals(1, m.get("a"));
-		assertEquals("foo", m.get("b"));
-		assertEquals(false, m.get("c"));
-
-		m = (Map)p.parse("{x:\"org.apache.juneau.test.Person\",addresses:[{x:\"org.apache.juneau.test.Address\",city:\"city A\",state:\"state A\",street:\"street A\",zip:12345}]}", Object.class);
-		assertEquals("org.apache.juneau.test.Person", m.get("x"));
-		List l = (List)m.get("addresses");
-		assertNotNull(l);
-		m = (Map)l.get(0);
-		assertNotNull(m);
-		assertEquals("org.apache.juneau.test.Address", m.get("x"));
-		assertEquals("city A", m.get("city"));
-		assertEquals("state A", m.get("state"));
-		assertEquals("street A", m.get("street"));
-		assertEquals(12345, m.get("zip"));
-
-		ObjectList jl = (ObjectList)p.parse("[{attribute:'value'},{attribute:'value'}]", Object.class);
-		assertEquals("value", jl.getObjectMap(0).getString("attribute"));
-		assertEquals("value", jl.getObjectMap(1).getString("attribute"));
-
-		// Verify that all the following return null.
-		assertNull(p.parse((CharSequence)null, Object.class));
-		assertNull(p.parse("", Object.class));
-		assertNull(p.parse("   ", Object.class));
-		assertNull(p.parse("   \t", Object.class));
-		assertNull(p.parse("   /*foo*/", Object.class));
-		assertNull(p.parse("   /*foo*/   ", Object.class));
-		assertNull(p.parse("   //foo   ", Object.class));
-
-		try {
-			jl = (ObjectList)p.parse("[{attribute:'value'},{attribute:'value'}]", Object.class);
-			assertEquals("value", jl.getObjectMap(0).getString("attribute"));
-			assertEquals("value", jl.getObjectMap(1).getString("attribute"));
-		} catch (Exception e) {
-			fail(e.getLocalizedMessage());
-		}
-
-		A1 b = new A1();
-		A2 tl = new A2();
-		tl.add(new A3("name0","value0"));
-		tl.add(new A3("name1","value1"));
-		b.list = tl;
-		String json = YamlSerializer.create().addBeanTypes(true).addRootType().beanDictionary(A1.class).build().serialize(b);
-		b = (A1)p.parse(json, Object.class);
-		assertEquals("value1", b.list.get(1).value);
-
-		json = YamlSerializer.DEFAULT.serialize(b);
-		b = p.parse(json, A1.class);
-		assertEquals("value1", b.list.get(1).value);
-	}
-
-	@Bean(typeName="A1")
-	public static class A1 {
-		public A2 list;
-	}
-
-	public static class A2 extends LinkedList<A3> {
-	}
-
-	public static class A3 {
-		public String name, value;
-		public A3(){}
-		public A3(String name, String value) {
-			this.name = name;
-			this.value = value;
-		}
-	}
-
-	//====================================================================================================
-	// Correct handling of unknown properties.
-	//====================================================================================================
-	@Test
-	public void testCorrectHandlingOfUnknownProperties() throws Exception {
-		ReaderParser p = YamlParser.create().ignoreUnknownBeanProperties().build();
-		B b;
-
-		String in =  "{a:1,unknown:3,b:2}";
-		b = p.parse(in, B.class);
-		assertEquals(b.a, 1);
-		assertEquals(b.b, 2);
-
-		try {
-			p = YamlParser.DEFAULT;
-			p.parse(in, B.class);
-			fail("Exception expected");
-		} catch (ParseException e) {}
-	}
-
-	public static class B {
-		public int a, b;
-	}
-
-	//====================================================================================================
-	// Writing to Collection properties with no setters.
-	//====================================================================================================
-	@Test
-	public void testCollectionPropertiesWithNoSetters() throws Exception {
-		YamlParser p = YamlParser.DEFAULT;
-		String json = "{ints:[1,2,3],beans:[{a:1,b:2}]}";
-		C t = p.parse(json, C.class);
-		assertEquals(t.getInts().size(), 3);
-		assertEquals(t.getBeans().get(0).b, 2);
-	}
-
-	public static class C {
-		private Collection<Integer> ints = new LinkedList<>();
-		private List<B> beans = new LinkedList<>();
-		public Collection<Integer> getInts() {
-			return ints;
-		}
-		public List<B> getBeans() {
-			return beans;
-		}
-	}
-
-	//====================================================================================================
-	// Parser listeners.
-	//====================================================================================================
-	@Test
-	public void testParserListeners() throws Exception {
-		YamlParser p = YamlParser.create().ignoreUnknownBeanProperties().listener(MyParserListener.class).build();
-
-		String json = "{a:1,unknownProperty:\"/foo\",b:2}";
-		p.parse(json, B.class);
-		assertEquals(1, MyParserListener.events.size());
-		assertEquals("unknownProperty, line 1, column 22", MyParserListener.events.get(0));
-	}
-
-	public static class MyParserListener extends ParserListener {
-		static final List<String> events = new LinkedList<>();
-
-		@Override /* ParserListener */
-		public <T> void onUnknownBeanProperty(ParserSession session, String propertyName, Class<T> beanClass, T bean) {
-			events.add(propertyName + ", " + session.getPosition());
-		}
-	}
-}
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/CommonTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/CommonTest.java
deleted file mode 100755
index e75da15..0000000
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/CommonTest.java
+++ /dev/null
@@ -1,357 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import static org.apache.juneau.testutils.TestUtils.*;
-import static org.junit.Assert.*;
-
-import java.net.*;
-import java.net.URI;
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.utils.*;
-import org.junit.*;
-
-@SuppressWarnings({"serial"})
-@Ignore
-public class CommonTest {
-
-	//====================================================================================================
-	// Trim nulls from beans
-	//====================================================================================================
-	@Test
-	public void testTrimNullsFromBeans() throws Exception {
-		YamlSerializerBuilder s = YamlSerializer.create().simple();
-		YamlParser p = YamlParser.DEFAULT;
-		A t1 = A.create(), t2;
-
-		s.trimNullProperties(false);
-		String r = s.build().serialize(t1);
-		assertEquals("{s1:null,s2:'s2'}", r);
-		t2 = p.parse(r, A.class);
-		assertEqualObjects(t1, t2);
-
-		s.trimNullProperties(true);
-		r = s.build().serialize(t1);
-		assertEquals("{s2:'s2'}", r);
-		t2 = p.parse(r, A.class);
-		assertEqualObjects(t1, t2);
-	}
-
-	public static class A {
-		public String s1, s2;
-
-		public static A create() {
-			A t = new A();
-			t.s2 = "s2";
-			return t;
-		}
-	}
-
-	//====================================================================================================
-	// Trim empty maps
-	//====================================================================================================
-	@Test
-	public void testTrimEmptyMaps() throws Exception {
-		YamlSerializerBuilder s = YamlSerializer.create().simple();
-		YamlParser p = YamlParser.DEFAULT;
-		B t1 = B.create(), t2;
-		String r;
-
-		s.trimEmptyMaps(false);
-		r = s.build().serialize(t1);
-		assertEquals("{f1:{},f2:{f2a:null,f2b:{s2:'s2'}}}", r);
-		t2 = p.parse(r, B.class);
-		assertEqualObjects(t1, t2);
-
-		s.trimEmptyMaps(true);
-		r = s.build().serialize(t1);
-		assertEquals("{f2:{f2a:null,f2b:{s2:'s2'}}}", r);
-		t2 = p.parse(r, B.class);
-		assertNull(t2.f1);
-
-		s.trimEmptyMaps();
-		r = s.build().serialize(t1);
-		assertEquals("{f2:{f2a:null,f2b:{s2:'s2'}}}", r);
-		t2 = p.parse(r, B.class);
-		assertNull(t2.f1);
-	}
-
-	public static class B {
-		public TreeMap<String,A> f1, f2;
-
-		public static B create() {
-			B t = new B();
-			t.f1 = new TreeMap<>();
-			t.f2 = new TreeMap<String,A>(){{put("f2a",null);put("f2b",A.create());}};
-			return t;
-		}
-	}
-
-	//====================================================================================================
-	// Trim empty lists
-	//====================================================================================================
-	@Test
-	public void testTrimEmptyLists() throws Exception {
-		YamlSerializerBuilder s = YamlSerializer.create().simple();
-		YamlParser p = YamlParser.DEFAULT;
-		C t1 = C.create(), t2;
-		String r;
-
-		s.trimEmptyCollections(false);
-		r = s.build().serialize(t1);
-		assertEquals("{f1:[],f2:[null,{s2:'s2'}]}", r);
-		t2 = p.parse(r, C.class);
-		assertEqualObjects(t1, t2);
-
-		s.trimEmptyCollections(true);
-		r = s.build().serialize(t1);
-		assertEquals("{f2:[null,{s2:'s2'}]}", r);
-		t2 = p.parse(r, C.class);
-		assertNull(t2.f1);
-
-		s.trimEmptyCollections();
-		r = s.build().serialize(t1);
-		assertEquals("{f2:[null,{s2:'s2'}]}", r);
-		t2 = p.parse(r, C.class);
-		assertNull(t2.f1);
-	}
-
-	public static class C {
-		public List<A> f1, f2;
-
-		public static C create() {
-			C t = new C();
-			t.f1 = new AList<>();
-			t.f2 = new AList<A>().append(null).append(A.create());
-			return t;
-		}
-	}
-
-	//====================================================================================================
-	// Trim empty arrays
-	//====================================================================================================
-	@Test
-	public void testTrimEmptyArrays() throws Exception {
-		YamlSerializerBuilder s = YamlSerializer.create().simple();
-		YamlParser p = YamlParser.DEFAULT;
-		D t1 = D.create(), t2;
-		String r;
-
-		s.trimEmptyCollections(false);
-		r = s.build().serialize(t1);
-		assertEquals("{f1:[],f2:[null,{s2:'s2'}]}", r);
-		t2 = p.parse(r, D.class);
-		assertEqualObjects(t1, t2);
-
-		s.trimEmptyCollections(true);
-		r = s.build().serialize(t1);
-		assertEquals("{f2:[null,{s2:'s2'}]}", r);
-		t2 = p.parse(r, D.class);
-		assertNull(t2.f1);
-
-		s.trimEmptyCollections();
-		r = s.build().serialize(t1);
-		assertEquals("{f2:[null,{s2:'s2'}]}", r);
-		t2 = p.parse(r, D.class);
-		assertNull(t2.f1);
-	}
-
-	public static class D {
-		public A[] f1, f2;
-
-		public static D create() {
-			D t = new D();
-			t.f1 = new A[]{};
-			t.f2 = new A[]{null, A.create()};
-			return t;
-		}
-	}
-
-	//====================================================================================================
-	// @BeanProperty.properties annotation.
-	//====================================================================================================
-	@Test
-	public void testBeanPropertyProperies() throws Exception {
-		YamlSerializer s = YamlSerializer.DEFAULT;
-		E1 t = new E1();
-		String r;
-
-		r = s.serialize(t);
-		assertEquals("{x1:{f1:1},x2:{f1:1},x3:[{f1:1}],x4:[{f1:1}],x5:[{f1:1}],x6:[{f1:1}]}", r);
-	}
-
-	public static class E1 {
-		@BeanProperty(properties="f1") public E2 x1 = new E2();
-		@BeanProperty(properties="f1") public Map<String,Integer> x2 = new AMap<String,Integer>().append("f1",1).append("f2",2);
-		@BeanProperty(properties="f1") public E2[] x3 = {new E2()};
-		@BeanProperty(properties="f1") public List<E2> x4 = new AList<E2>().append(new E2());
-		@BeanProperty(properties="f1") public ObjectMap[] x5 = {new ObjectMap().append("f1",1).append("f2",2)};
-		@BeanProperty(properties="f1") public List<ObjectMap> x6 = new AList<ObjectMap>().append(new ObjectMap().append("f1",1).append("f2",2));
-	}
-
-	public static class E2 {
-		public int f1 = 1;
-		public int f2 = 2;
-	}
-
-	//====================================================================================================
-	// @BeanProperty.properties annotation on list of beans.
-	//====================================================================================================
-	@Test
-	public void testBeanPropertyProperiesOnListOfBeans() throws Exception {
-		YamlSerializer s = YamlSerializer.DEFAULT;
-		List<F> l = new LinkedList<>();
-		F t = new F();
-		t.x1.add(new F());
-		l.add(t);
-		String json = s.serialize(l);
-		assertEquals("[{x1:[{x2:2}],x2:2}]", json);
-	}
-
-	public static class F {
-		@BeanProperty(properties="x2") public List<F> x1 = new LinkedList<>();
-		public int x2 = 2;
-	}
-
-	//====================================================================================================
-	// Test that URLs and URIs are serialized and parsed correctly.
-	//====================================================================================================
-	@Test
-	public void testURIAttr() throws Exception {
-		YamlSerializer s = YamlSerializer.DEFAULT;
-		YamlParser p = YamlParser.DEFAULT;
-
-		G t = new G();
-		t.uri = new URI("http://uri");
-		t.f1 = new URI("http://f1");
-		t.f2 = new URL("http://f2");
-
-		String json = s.serialize(t);
-		t = p.parse(json, G.class);
-		assertEquals("http://uri", t.uri.toString());
-		assertEquals("http://f1", t.f1.toString());
-		assertEquals("http://f2", t.f2.toString());
-	}
-
-	public static class G {
-		public URI uri;
-		public URI f1;
-		public URL f2;
-	}
-
-
-	//====================================================================================================
-	// Recursion
-	//====================================================================================================
-	@Test
-	public void testRecursion() throws Exception {
-		YamlSerializerBuilder s = YamlSerializer.create().simple();
-
-		R1 r1 = new R1();
-		R2 r2 = new R2();
-		R3 r3 = new R3();
-		r1.r2 = r2;
-		r2.r3 = r3;
-		r3.r1 = r1;
-
-		// No recursion detection
-		try {
-			s.build().serialize(r1);
-			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."));
-		}
-
-		// Recursion detection, no ignore
-		s.detectRecursions();
-		try {
-			s.build().serialize(r1);
-			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"));
-		}
-
-		s.ignoreRecursions();
-		assertEquals("{name:'foo',r2:{name:'bar',r3:{name:'baz'}}}", s.build().serialize(r1));
-	}
-
-	public static class R1 {
-		public String name = "foo";
-		public R2 r2;
-	}
-	public static class R2 {
-		public String name = "bar";
-		public R3 r3;
-	}
-	public static class R3 {
-		public String name = "baz";
-		public R1 r1;
-	}
-
-	//====================================================================================================
-	// Basic bean
-	//====================================================================================================
-	@Test
-	public void testBasicBean() throws Exception {
-		YamlSerializer s = YamlSerializer.create().simple().trimNullProperties(false).sortProperties().build();
-
-		J a = new J();
-		a.setF1("J");
-		a.setF2(100);
-		a.setF3(true);
-		assertEquals("C1", "{f1:'J',f2:100,f3:true}", s.serialize(a));
-	}
-
-	public static class J {
-		private String f1 = null;
-		private int f2 = -1;
-		private boolean f3 = false;
-
-		public String getF1() {
-			return this.f1;
-		}
-
-		public void setF1(String f1) {
-			this.f1 = f1;
-		}
-
-		public int getF2() {
-			return this.f2;
-		}
-
-		public void setF2(int f2) {
-			this.f2 = f2;
-		}
-
-		public boolean isF3() {
-			return this.f3;
-		}
-
-		public void setF3(boolean f3) {
-			this.f3 = f3;
-		}
-
-		@Override /* Object */
-		public String toString() {
-			return ("J(f1: " + this.getF1() + ", f2: " + this.getF2() + ")");
-		}
-	}
-}
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/YamlParserTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/YamlParserTest.java
deleted file mode 100755
index 18b7b23..0000000
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/YamlParserTest.java
+++ /dev/null
@@ -1,326 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import static org.junit.Assert.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.parser.*;
-import org.apache.juneau.serializer.*;
-import org.junit.*;
-
-@SuppressWarnings({})
-@Ignore
-public class YamlParserTest {
-
-	private static final YamlParser p = YamlParser.DEFAULT;
-	private static final YamlParser sp = YamlParser.DEFAULT_STRICT;
-
-
-	//====================================================================================================
-	// Test invalid input
-	//====================================================================================================
-	@Test
-	public void testInvalidYaml() {
-		try {
-			p.parse("{\na:1,\nb:xxx\n}", Object.class);
-			fail("Exception expected.");
-		} catch (ParseException e) {}
-	}
-
-	@Test
-	public void testNonExistentAttribute() throws Exception {
-		String json = "{foo:,bar:}";
-		ObjectMap m = p.parse(json, ObjectMap.class);
-		assertEquals("{foo:null,bar:null}", m.toString());
-	}
-
-	@Test
-	public void testNonStringAsString() throws Exception {
-		String json = "123";
-		String s;
-
-		// Strict mode does not allow unquoted values.
-		try {
-			sp.parse(json, String.class);
-			fail("Exception expected");
-		} catch (Exception e) {
-			assertTrue(e.getMessage().contains("Did not find quote character"));
-		}
-
-		s = p.parse(json, String.class);
-		assertEquals("123", s);
-
-		json = " 123 ";
-		// Strict mode does not allow unquoted values.
-		try {
-			sp.parse(json, String.class);
-			fail("Exception expected");
-		} catch (Exception e) {
-			assertTrue(e.getMessage().contains("Did not find quote character"));
-		}
-
-		s = p.parse(json, String.class);
-		assertEquals("123", s);
-
-		json = "{\"fa\":123}";
-		try {
-			sp.parse(json, A.class);
-			fail("Exception expected");
-		} catch (Exception e) {
-			assertTrue(e.getMessage().contains("Did not find quote character"));
-		}
-
-		A a = p.parse(json, A.class);
-		assertEquals("123", a.fa);
-
-		json = " { \"fa\" : 123 } ";
-		try {
-			sp.parse(json, A.class);
-			fail("Exception expected");
-		} catch (Exception e) {
-			assertTrue(e.getMessage().contains("Did not find quote character"));
-		}
-
-		a = p.parse(json, A.class);
-		assertEquals("123", a.fa);
-
-		json = "'123'";
-		try {
-			sp.parse(json, String.class);
-			fail("Exception expected");
-		} catch (Exception e) {
-			assertTrue(e.getMessage().contains("Invalid quote character"));
-		}
-	}
-
-	public static class A {
-		public String fa;
-	}
-
-	@Test
-	public void testStrictMode() throws Exception {
-		YamlParser p = sp;
-
-		// Missing attribute values.
-		String json = "{\"foo\":,\"bar\":}";
-		try {
-			p.parse(json, ObjectMap.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertEquals("Parse exception occurred at {currentClass:'Object',line:1,column:7}.  Missing value detected.", e.getRootCause().getMessage());
-		}
-
-		// Single quoted values.
-		json = "{\"foo\":'bar'}";
-		try {
-			p.parse(json, ObjectMap.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertEquals("Parse exception occurred at {currentClass:'Object',line:1,column:8}.  Invalid quote character \"'\" being used.", e.getRootCause().getMessage());
-		}
-
-		// Single quoted attribute name.
-		json = "{'foo':\"bar\"}";
-		try {
-			p.parse(json, ObjectMap.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertEquals("Parse exception occurred at {currentClass:'ObjectMap<String,Object>',line:1,column:2}.  Invalid quote character \"'\" being used.", e.getRootCause().getMessage());
-		}
-
-		// Unquoted attribute name.
-		json = "{foo:\"bar\"}";
-		try {
-			p.parse(json, ObjectMap.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertEquals("Parse exception occurred at {currentClass:'ObjectMap<String,Object>',line:1,column:1}.  Unquoted attribute detected.", e.getRootCause().getMessage());
-		}
-
-		// Concatenated string
-		json = "{\"foo\":\"bar\"+\"baz\"}";
-		try {
-			p.parse(json, ObjectMap.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertEquals("Parse exception occurred at {currentClass:'Object',line:1,column:12}.  String concatenation detected.", e.getRootCause().getMessage());
-		}
-
-		// Concatenated string 2
-		json = "{\"foo\":\"bar\" + \"baz\"}";
-		try {
-			p.parse(json, ObjectMap.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertEquals("Parse exception occurred at {currentClass:'Object',line:1,column:13}.  String concatenation detected.", e.getRootCause().getMessage());
-		}
-
-		json = "{\"foo\":/*comment*/\"bar\"}";
-		try {
-			p.parse(json, ObjectMap.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertEquals("Parse exception occurred at {currentClass:'ObjectMap<String,Object>',line:1,column:8}.  Javascript comment detected.", e.getRootCause().getMessage());
-		}
-	}
-
-	/**
-	 * JSON numbers and booleans should be representable as strings and converted accordingly.
-	 */
-	@Test
-	public void testPrimitivesAsStrings() throws Exception {
-		String json;
-		ReaderParser p = YamlParser.DEFAULT;
-		WriterSerializer s = YamlSerializer.DEFAULT;
-
-		json = "{f1:'1',f2:'1',f3:'true',f4:'true',f5:'1',f6:'1',f7:'1',f8:'1',f9:'1',f10:'1'}";
-		B b = p.parse(json, B.class);
-		assertEquals("{f1:1,f2:1,f3:true,f4:true,f5:1.0,f6:1.0,f7:1,f8:1,f9:1,f10:1}", s.toString(b));
-
-		json = "{f1:'',f2:'',f3:'',f4:'',f5:'',f6:'',f7:'',f8:'',f9:'',f10:''}";
-		b = p.parse(json, B.class);
-		assertEquals("{f1:0,f2:0,f3:false,f4:false,f5:0.0,f6:0.0,f7:0,f8:0,f9:0,f10:0}", s.toString(b));
-	}
-
-	public static class B {
-		public int f1;
-		public Integer f2;
-		public boolean f3;
-		public Boolean f4;
-		public float f5;
-		public Float f6;
-		public long f7;
-		public Long f8;
-		public byte f9;
-		public Byte f10;
-	}
-
-	//====================================================================================================
-	// testInvalidYamlNumbers
-	// Lax parser allows octal and hexadecimal numbers.  Strict parser does not.
-	//====================================================================================================
-	@Test
-	public void testInvalidYamlNumbers() throws Exception {
-		YamlParser p1 = YamlParser.DEFAULT;
-		YamlParser p2 = YamlParser.DEFAULT_STRICT;
-		Number r;
-
-		// Lax allows blank strings interpreted as 0, strict does not.
-		String s = "\"\"";
-		r = p1.parse(s, Number.class);
-		assertEquals(0, r.intValue());
-		assertTrue(r instanceof Integer);
-		try {
-			r = p2.parse(s, Number.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertTrue(e.getMessage().contains("Invalid JSON number"));
-		}
-
-		// Either should allow 0 or -0.
-		s = "0";
-		r = p1.parse(s, Number.class);
-		assertEquals(0, r.intValue());
-		assertTrue(r instanceof Integer);
-		r = p2.parse(s, Number.class);
-		assertEquals(0, r.intValue());
-		assertTrue(r instanceof Integer);
-
-		s = "-0";
-		r = p1.parse(s, Number.class);
-		assertEquals(0, r.intValue());
-		assertTrue(r instanceof Integer);
-		r = p2.parse(s, Number.class);
-		assertEquals(0, r.intValue());
-		assertTrue(r instanceof Integer);
-
-		// Lax allows 0123 and -0123, strict does not.
-		s = "0123";
-		r = p1.parse(s, Number.class);
-		assertEquals(0123, r.intValue());
-		assertTrue(r instanceof Integer);
-		try {
-			r = p2.parse(s, Number.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertTrue(e.getMessage().contains("Invalid JSON number"));
-		}
-		s = "-0123";
-		r = p1.parse(s, Number.class);
-		assertEquals(-0123, r.intValue());
-		assertTrue(r instanceof Integer);
-		try {
-			r = p2.parse(s, Number.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertTrue(e.getMessage().contains("Invalid JSON number"));
-		}
-
-		// Lax allows 0x123 and -0x123, strict does not.
-		s = "0x123";
-		r = p1.parse(s, Number.class);
-		assertEquals(0x123, r.intValue());
-		assertTrue(r instanceof Integer);
-		try {
-			r = p2.parse(s, Number.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertTrue(e.getMessage().contains("Invalid JSON number"));
-		}
-		s = "-0x123";
-		r = p1.parse(s, Number.class);
-		assertEquals(-0x123, r.intValue());
-		assertTrue(r instanceof Integer);
-		try {
-			r = p2.parse(s, Number.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			assertTrue(e.getMessage().contains("Invalid JSON number"));
-		}
-	}
-
-	//====================================================================================================
-	// testUnquotedStrings
-	// Lax parser allows unquoted strings if POJO can be converted from a string.
-	//====================================================================================================
-	@Test
-	public void testUnquotedStrings() throws Exception {
-		YamlParser p1 = YamlParser.DEFAULT;
-		YamlParser p2 = YamlParser.DEFAULT_STRICT;
-
-		String s = "foobar";
-		C c = p1.parse(s, C.class);
-		assertEquals("f=foobar", c.toString());
-
-		try {
-			p2.parse(s, C.class);
-			fail("Exception expected");
-		} catch (ParseException e) {
-			// OK
-		}
-	}
-
-	public static class C {
-		String f;
-		public static C valueOf(String s) {
-			C c = new C();
-			c.f = s;
-			return c;
-		}
-		@Override /* Object */
-		public String toString() {
-			return "f="+f;
-		}
-	}
-}
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/YamlTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/YamlTest.java
deleted file mode 100755
index c295a7e..0000000
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/yaml/proto/YamlTest.java
+++ /dev/null
@@ -1,215 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import org.junit.*;
-
-@SuppressWarnings({})
-public class YamlTest {
-
-	//====================================================================================================
-	// testBasic
-	//====================================================================================================
-	@Test
-	public void testBasic() throws Exception {
-//		Map<String,Object> m = new LinkedHashMap<String,Object>();
-//		List<Object> l = new LinkedList<Object>();
-//
-//		WriterSerializer s1 = YamlSerializer.create().simple().trimNullProperties(false).build();
-//		WriterSerializer s2 = YamlSerializer.create().simple().trimNullProperties(false).quoteChar('"').build();
-//		String r;
-//
-//		// Null keys and values
-//		m.clear();
-//		m.put(null, null);
-//		m.put("aaa", "bbb");
-//		assertEquals("A1", "~: ~,\naaa: bbb\n", s1.serialize(m));
-//
-//		// Escapes.
-//		// String = ["]
-//		m.clear();
-//		m.put("x", "[\"]");
-//		assertEquals("{x:\"[\\\"]\"}", s2.serialize(m));
-//		// String = [\"]
-//		// JSON = {x:"\\\""}
-//		m.clear();
-//		m.put("x", "[\\\"]");
-//		assertEquals("{x:\"[\\\\\\\"]\"}", s2.serialize(m));
-//
-//		// String = [\w[\w\-\.]{3,}\w]
-//		// JSON = {x:"\\w[\\w\\-\\.]{3,}\\w"}
-//		m.clear();
-//		r = "\\w[\\w\\-\\.]{3,}\\w";
-//		m.put("x", r);
-//		assertEquals("{x:\"\\\\w[\\\\w\\\\-\\\\.]{3,}\\\\w\"}", s2.serialize(m));
-//		assertEquals(r, new ObjectMap(s2.serialize(m)).getString("x"));
-//
-//		// String = [foo\bar]
-//		// JSON = {x:"foo\\bar"}
-//		m.clear();
-//		m.put("x", "foo\\bar");
-//		assertEquals("{x:\"foo\\\\bar\"}", s2.serialize(m));
-//
-//		m.clear();
-//		m.put("null", null);
-//		m.put("aaa", "bbb");
-//		assertEquals("A2", "{'null':null,aaa:'bbb'}", s1.serialize(m));
-//
-//		m.clear();
-//		m.put(null, "null");
-//		m.put("aaa", "bbb");
-//		assertEquals("A3", "{null:'null',aaa:'bbb'}", s1.serialize(m));
-//
-//		// Arrays
-//		m.clear();
-//		l.clear();
-//		m.put("J", "f1");
-//		m.put("B", "b");
-//		m.put("C", "c");
-//		l.add("1");
-//		l.add("2");
-//		l.add("3");
-//		Object o = new Object[] { m, l };
-//		Object o2 = new Object[] { o, "foo", "bar", new Integer(1), new Boolean(false), new Float(1.2), null };
-//		assertEquals("K1", "[[{J:'f1',B:'b',C:'c'},['1','2','3']],'foo','bar',1,false,1.2,null]", s1.serialize(o2));
-	}
-
-//	@Test
-//	public void testReservedKeywordAttributes() throws Exception {
-//		Map<String,Object> m = new LinkedHashMap<String,Object>();
-//
-//		// Keys with reserved names.
-//		for (String attr : new String[]{"","true","false","null","try","123","1x","-123",".123"}) {
-//			m.clear();
-//			m.put(attr,1);
-//			assertObjectEquals("{'"+attr+"':1}", m);
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// Validate various backslashes in strings.
-//	//====================================================================================================
-//	@Test
-//	public void testBackslashesInStrings() throws Exception {
-//		YamlSerializer s = YamlSerializer.create().simple().trimNullProperties(false).quoteChar('"').build();
-//		String r, r2;
-//
-//		// [\\]
-//		r = "\\";
-//		r2 = s.serialize(r);
-//		assertEquals(r2, "\"\\\\\"");
-//		assertEquals(YamlParser.DEFAULT.parse(r2, Object.class), r);
-//
-//		// [\b\f\n\t]
-//		r = "\b\f\n\t";
-//		r2 = s.serialize(r);
-//		assertEquals("\"\\b\\f\\n\\t\"", r2);
-//		assertEquals(r, YamlParser.DEFAULT.parse(r2, Object.class));
-//
-//		// Special JSON case:  Forward slashes can OPTIONALLY be escaped.
-//		// [\/]
-//		assertEquals(YamlParser.DEFAULT.parse("\"\\/\"", Object.class), "/");
-//
-//		// Unicode
-//		r = "\u1234\u1ABC\u1abc";
-//		r2 = s.serialize(r);
-//		assertEquals("\"\u1234\u1ABC\u1abc\"", r2);
-//
-//		assertEquals("\u1234", YamlParser.DEFAULT.parse("\"\\u1234\"", Object.class));
-//	}
-//
-//	//====================================================================================================
-//	// Indentation
-//	//====================================================================================================
-//	@Test
-//	public void testIndentation() throws Exception {
-//		ObjectMap m = new ObjectMap("{J:{B:['c',{D:'e'},['f',{G:'h'},1,false]]},I:'j'}");
-//		String e = ""
-//			+ "{"
-//			+ "\n	J: {"
-//			+ "\n		B: ["
-//			+ "\n			'c',"
-//			+ "\n			{"
-//			+ "\n				D: 'e'"
-//			+ "\n			},"
-//			+ "\n			["
-//			+ "\n				'f',"
-//			+ "\n				{"
-//			+ "\n					G: 'h'"
-//			+ "\n				},"
-//			+ "\n				1,"
-//			+ "\n				false"
-//			+ "\n			]"
-//			+ "\n		]"
-//			+ "\n	},"
-//			+ "\n	I: 'j'"
-//			+ "\n}";
-//		assertEquals(e, YamlSerializer.DEFAULT.serialize(m));
-//	}
-//
-//	//====================================================================================================
-//	// Escaping double quotes
-//	//====================================================================================================
-//	@Test
-//	public void testEscapingDoubleQuotes() throws Exception {
-//		YamlSerializer s = YamlSerializer.DEFAULT;
-//		String r = s.serialize(new ObjectMap().append("f1", "x'x\"x"));
-//		assertEquals("{\"f1\":\"x'x\\\"x\"}", r);
-//		YamlParser p = YamlParser.DEFAULT;
-//		assertEquals("x'x\"x", p.parse(r, ObjectMap.class).getString("f1"));
-//	}
-//
-//	//====================================================================================================
-//	// Escaping single quotes
-//	//====================================================================================================
-//	@Test
-//	public void testEscapingSingleQuotes() throws Exception {
-//		YamlSerializer s = YamlSerializer.DEFAULT;
-//		String r = s.serialize(new ObjectMap().append("f1", "x'x\"x"));
-//		assertEquals("{f1:'x\\'x\"x'}", r);
-//		YamlParser p = YamlParser.DEFAULT;
-//		assertEquals("x'x\"x", p.parse(r, ObjectMap.class).getString("f1"));
-//	}
-//
-//	//====================================================================================================
-//	// testSubclassedList
-//	//====================================================================================================
-//	@Test
-//	public void testSubclassedList() throws Exception {
-//		YamlSerializer s = YamlSerializer.DEFAULT;
-//		Map<String,Object> o = new HashMap<String,Object>();
-//		o.put("c", new C());
-//		assertEquals("{\"c\":[]}", s.serialize(o));
-//	}
-//
-//	public static class C extends LinkedList<String> {
-//	}
-//
-//	//====================================================================================================
-//	// testEscapeSolidus
-//	//====================================================================================================
-//	@Test
-//	public void testEscapeSolidus() throws Exception {
-//		YamlSerializer s = YamlSerializer.create().escapeSolidus(false).build();
-//		String r = s.serialize("foo/bar");
-//		assertEquals("\"foo/bar\"", r);
-//		r = YamlParser.DEFAULT.parse(r, String.class);
-//		assertEquals("foo/bar", r);
-//
-//		s = YamlSerializer.create().escapeSolidus(true).build();
-//		r = s.serialize("foo/bar");
-//		assertEquals("\"foo\\/bar\"", r);
-//		r = YamlParser.DEFAULT.parse(r, String.class);
-//		assertEquals("foo/bar", r);
-//	}
-}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/N3.java
similarity index 55%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/N3.java
index 6398cfb..457059f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/N3.java
@@ -1,45 +1,66 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.jena.*;
+
+/**
+ * A pairing of a {@link N3Serializer} and {@link N3Parser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	N3 n3 = <jk>new</jk> N3();
+ * 	MyPojo myPojo = n3.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = n3.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = N3.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = N3.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ */
+public class N3 extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final N3 DEFAULT = new N3();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public N3(N3Serializer s, N3Parser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link N3Serializer#DEFAULT} and {@link N3Parser#DEFAULT}.
+	 */
+	public N3() {
+		this(N3Serializer.DEFAULT, N3Parser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/NTriple.java
similarity index 53%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/NTriple.java
index 6398cfb..39e8c95 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/NTriple.java
@@ -1,45 +1,66 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.jena.*;
+
+/**
+ * A pairing of a {@link NTripleSerializer} and {@link NTripleParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	NTriple nTriple = <jk>new</jk> NTriple();
+ * 	MyPojo myPojo = nTriple.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = nTriple.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = NTriple.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = NTriple.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ */
+public class NTriple extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final NTriple DEFAULT = new NTriple();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public NTriple(NTripleSerializer s, NTripleParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link NTripleSerializer#DEFAULT} and {@link NTripleParser#DEFAULT}.
+	 */
+	public NTriple() {
+		this(NTripleSerializer.DEFAULT, NTripleParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/RdfXml.java
similarity index 53%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/RdfXml.java
index 6398cfb..ac83f6a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/RdfXml.java
@@ -1,45 +1,66 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.jena.*;
+
+/**
+ * A pairing of a {@link RdfXmlSerializer} and {@link RdfXmlParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	RdfXml rdfXml = <jk>new</jk> RdfXml();
+ * 	MyPojo myPojo = rdfXml.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = rdfXml.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = RdfXml.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = RdfXml.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ */
+public class RdfXml extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final RdfXml DEFAULT = new RdfXml();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public RdfXml(RdfXmlSerializer s, RdfXmlParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link RdfXmlSerializer#DEFAULT} and {@link RdfXmlParser#DEFAULT}.
+	 */
+	public RdfXml() {
+		this(RdfXmlSerializer.DEFAULT, RdfXmlParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/RdfXmlAbbrev.java
similarity index 52%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/RdfXmlAbbrev.java
index 6398cfb..f8cf1a5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/RdfXmlAbbrev.java
@@ -1,45 +1,66 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.jena.*;
+
+/**
+ * A pairing of a {@link RdfXmlAbbrevSerializer} and {@link RdfXmlParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	RdfXmlAbbrev rdfXmlAbbrev = <jk>new</jk> RdfXmlAbbrev();
+ * 	MyPojo myPojo = rdfXmlAbbrev.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = rdfXmlAbbrev.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = RdfXmlAbbrev.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = RdfXmlAbbrev.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ */
+public class RdfXmlAbbrev extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final RdfXmlAbbrev DEFAULT = new RdfXmlAbbrev();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public RdfXmlAbbrev(RdfXmlAbbrevSerializer s, RdfXmlParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link RdfXmlAbbrevSerializer#DEFAULT} and {@link RdfXmlParser#DEFAULT}.
+	 */
+	public RdfXmlAbbrev() {
+		this(RdfXmlAbbrevSerializer.DEFAULT, RdfXmlParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/Turtle.java
similarity index 53%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/Turtle.java
index 6398cfb..56c60b7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/marshall/Turtle.java
@@ -1,45 +1,66 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.jena.*;
+
+/**
+ * A pairing of a {@link TurtleSerializer} and {@link TurtleParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	Turtle turtle = <jk>new</jk> Turtle();
+ * 	MyPojo myPojo = turtle.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = turtle.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = Turtle.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = Turtle.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ */
+public class Turtle extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final Turtle DEFAULT = new Turtle();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public Turtle(TurtleSerializer s, TurtleParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link TurtleSerializer#DEFAULT} and {@link TurtleParser#DEFAULT}.
+	 */
+	public Turtle() {
+		this(TurtleSerializer.DEFAULT, TurtleParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/CharMarshall.java
similarity index 58%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/CharMarshall.java
index 6398cfb..abfddba 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/CharMarshall.java
@@ -1,45 +1,57 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * A subclass of {@link Marshall} for character-based serializers and parsers.
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public abstract class CharMarshall extends Marshall {
+
+	private final WriterSerializer s;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	protected CharMarshall(WriterSerializer s, ReaderParser p) {
+		super(s, p);
+		this.s = s;
+	}
+
+	/**
+	 * Serializes a POJO directly to a <code>String</code>.
+	 *
+	 * @param o The object to serialize.
+	 * @return
+	 * 	The serialized object.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	@Override /* Serializer */
+	public final String write(Object o) throws SerializeException {
+		return s.createSession().serializeToString(o);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Html.java
similarity index 50%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Html.java
index 6398cfb..29f1441 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Html.java
@@ -1,45 +1,71 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.html.*;
+
+/**
+ * A pairing of a {@link HtmlSerializer} and {@link HtmlParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	Html html = <jk>new</jk> Html();
+ * 	MyPojo myPojo = html.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = html.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = Html.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = Html.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class Html extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final Html DEFAULT = new Html();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public Html(HtmlSerializer s, HtmlParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link HtmlSerializer#DEFAULT} and {@link HtmlParser#DEFAULT}.
+	 */
+	public Html() {
+		this(HtmlSerializer.DEFAULT, HtmlParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Jso.java
similarity index 50%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Jso.java
index 6398cfb..84e0490 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Jso.java
@@ -1,45 +1,71 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.jso.*;
+
+/**
+ * A pairing of a {@link JsoSerializer} and {@link JsoParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	Jso jso = <jk>new</jk> Jso();
+ * 	MyPojo myPojo = jso.read(bytes, MyPojo.<jk>class</jk>);
+ * 	<jk>byte</jk>[] bytes = jso.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = Jso.<jsf>DEFAULT</jsf>.read(bytes, MyPojo.<jk>class</jk>);
+ * 	<jk>byte</jk>[] bytes = Jso.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class Jso extends StreamMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final Jso DEFAULT = new Jso();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public Jso(JsoSerializer s, JsoParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link JsoSerializer#DEFAULT} and {@link JsoParser#DEFAULT}.
+	 */
+	public Jso() {
+		this(JsoSerializer.DEFAULT, JsoParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Json.java
similarity index 50%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Json.java
index 6398cfb..b40f478 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Json.java
@@ -1,45 +1,71 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.json.*;
+
+/**
+ * A pairing of a {@link JsonSerializer} and {@link JsonParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	Json json = <jk>new</jk> Json();
+ * 	MyPojo myPojo = json.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = json.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = Json.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = Json.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class Json extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final Json DEFAULT = new Json();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public Json(JsonSerializer s, JsonParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link JsonSerializer#DEFAULT} and {@link JsonParser#DEFAULT}.
+	 */
+	public Json() {
+		this(JsonSerializer.DEFAULT, JsonParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Marshall.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Marshall.java
new file mode 100644
index 0000000..91898ab
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Marshall.java
@@ -0,0 +1,257 @@
+package org.apache.juneau.marshall;
+// ***************************************************************************************************************************
+// * 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.                                              *
+// ***************************************************************************************************************************
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * Top-level class for a pairing of a {@link Serializer} and {@link Parser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	Marshall json = <jk>new</jk> Json();
+ * 	MyPojo myPojo = json.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = json.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = Json.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = Json.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public abstract class Marshall {
+
+	private final Serializer s;
+	private final Parser p;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	protected Marshall(Serializer s, Parser p) {
+		this.s = s;
+		this.p = p;
+	}
+
+	/**
+	 * Serializes a POJO directly to either a <code>String</code> or <code><jk>byte</jk>[]</code> depending on the serializer type.
+	 *
+	 * @param o The object to serialize.
+	 * @return
+	 * 	The serialized object.
+	 * 	<br>Character-based serializers will return a <code>String</code>
+	 * 	<br>Stream-based serializers will return a <code><jk>byte</jk>[]</code>
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public Object write(Object o) throws SerializeException {
+		return s.createSession().serialize(o);
+	}
+
+	/**
+	 * Serializes a POJO to the specified output stream or writer.
+	 *
+	 * <p>
+	 * Equivalent to calling <code>serializer.createSession().serialize(o, output);</code>
+	 *
+	 * @param o The object to serialize.
+	 * @param output
+	 * 	The output object.
+	 * 	<br>Character-based serializers can handle the following output class types:
+	 * 	<ul>
+	 * 		<li>{@link Writer}
+	 * 		<li>{@link OutputStream} - Output will be written as UTF-8 encoded stream.
+	 * 		<li>{@link File} - Output will be written as system-default encoded stream.
+	 * 		<li>{@link StringBuilder} - Output will be written to the specified string builder.
+	 * 	</ul>
+	 * 	<br>Stream-based serializers can handle the following output class types:
+	 * 	<ul>
+	 * 		<li>{@link OutputStream}
+	 * 		<li>{@link File}
+	 * 	</ul>
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public final void write(Object o, Object output) throws SerializeException {
+		s.createSession().serialize(o, output);
+	}
+
+	/**
+	 * Convenience method for serializing an object to a String.
+	 *
+	 * <p>
+	 * For writer-based serializers, this is identical to calling {@link Serializer#serialize(Object)}.
+	 * <br>For stream-based serializers, this converts the returned byte array to a string based on
+	 * the {@link OutputStreamSerializer#OSSERIALIZER_binaryFormat} setting.
+	 *
+	 * @param o The object to serialize.
+	 * @return The output serialized to a string.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public final String toString(Object o) throws SerializeException {
+		return s.createSession().serializeToString(o);
+	}
+
+
+	/**
+	 * Convenience method for calling <code>System.out.println(...)</code> on the specified object after calling {@link #toString(Object)}.
+	 *
+	 * @param o The object to serialize and then send to the console.
+	 * @return This object (for method chaining).
+	 */
+	public final Marshall println(Object o) {
+		try {
+			System.out.println(toString(o));
+		} catch (SerializeException e) {
+			e.printStackTrace();
+		}
+		return this;
+	}
+
+	/**
+	 * Parses input into the specified object type.
+	 *
+	 * <p>
+	 * The type can be a simple type (e.g. beans, strings, numbers) or parameterized type (collections/maps).
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	Marshall m = Json.<jsf>DEFAULT</jsf>;
+	 *
+	 * 	<jc>// Parse into a linked-list of strings.</jc>
+	 * 	List l = m.read(json, LinkedList.<jk>class</jk>, String.<jk>class</jk>);
+	 *
+	 * 	<jc>// Parse into a linked-list of beans.</jc>
+	 * 	List l = m.read(json, LinkedList.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 *
+	 * 	<jc>// Parse into a linked-list of linked-lists of strings.</jc>
+	 * 	List l = m.read(json, LinkedList.<jk>class</jk>, LinkedList.<jk>class</jk>, String.<jk>class</jk>);
+	 *
+	 * 	<jc>// Parse into a map of string keys/values.</jc>
+	 * 	Map m = m.read(json, TreeMap.<jk>class</jk>, String.<jk>class</jk>, String.<jk>class</jk>);
+	 *
+	 * 	<jc>// Parse into a map containing string keys and values of lists containing beans.</jc>
+	 * 	Map m = m.read(json, TreeMap.<jk>class</jk>, String.<jk>class</jk>, List.<jk>class</jk>, MyBean.<jk>class</jk>);
+	 * </p>
+	 *
+	 * <p>
+	 * <code>Collection</code> classes are assumed to be followed by zero or one objects indicating the element type.
+	 *
+	 * <p>
+	 * <code>Map</code> classes are assumed to be followed by zero or two meta objects indicating the key and value types.
+	 *
+	 * <p>
+	 * The array can be arbitrarily long to indicate arbitrarily complex data structures.
+	 *
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Use the {@link #read(Object, Class)} method instead if you don't need a parameterized map/collection.
+	 * </ul>
+	 *
+	 * @param <T> The class type of the object to create.
+	 * @param input
+	 * 	The input.
+	 * 	<br>Character-based parsers can handle the following input class types:
+	 * 	<ul>
+	 * 		<li><jk>null</jk>
+	 * 		<li>{@link Reader}
+	 * 		<li>{@link CharSequence}
+	 * 		<li>{@link InputStream} containing UTF-8 encoded text (or charset defined by
+	 * 			{@link ReaderParser#RPARSER_inputStreamCharset} property value).
+	 * 		<li><code><jk>byte</jk>[]</code> containing UTF-8 encoded text (or charset defined by
+	 * 			{@link ReaderParser#RPARSER_inputStreamCharset} property value).
+	 * 		<li>{@link File} containing system encoded text (or charset defined by
+	 * 			{@link ReaderParser#RPARSER_fileCharset} property value).
+	 * 	</ul>
+	 * 	<br>Stream-based parsers can handle the following input class types:
+	 * 	<ul>
+	 * 		<li><jk>null</jk>
+	 * 		<li>{@link InputStream}
+	 * 		<li><code><jk>byte</jk>[]</code>
+	 * 		<li>{@link File}
+	 * 		<li>{@link CharSequence} containing encoded bytes according to the {@link InputStreamParser#ISPARSER_binaryFormat} setting.
+	 * 	</ul>
+	 * @param type
+	 * 	The object type to create.
+	 * 	<br>Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}
+	 * @param args
+	 * 	The type arguments of the class if it's a collection or map.
+	 * 	<br>Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}
+	 * 	<br>Ignored if the main type is not a map or collection.
+	 * @return The parsed object.
+	 * @throws ParseException
+	 * 	If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 * @see BeanSession#getClassMeta(Type,Type...) for argument syntax for maps and collections.
+	 */
+	public final <T> T read(Object input, Type type, Type...args) throws ParseException {
+		return p.createSession().parse(input, type, args);
+	}
+
+	/**
+	 * Same as {@link #read(Object, Type, Type...)} except optimized for a non-parameterized class.
+	 *
+	 * <p>
+	 * This is the preferred parse method for simple types since you don't need to cast the results.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	Marshall m = Json.<jsf>DEFAULT</jsf>;
+	 *
+	 * 	<jc>// Parse into a string.</jc>
+	 * 	String s = m.read(json, String.<jk>class</jk>);
+	 *
+	 * 	<jc>// Parse into a bean.</jc>
+	 * 	MyBean b = m.read(json, MyBean.<jk>class</jk>);
+	 *
+	 * 	<jc>// Parse into a bean array.</jc>
+	 * 	MyBean[] ba = m.read(json, MyBean[].<jk>class</jk>);
+	 *
+	 * 	<jc>// Parse into a linked-list of objects.</jc>
+	 * 	List l = m.read(json, LinkedList.<jk>class</jk>);
+	 *
+	 * 	<jc>// Parse into a map of object keys/values.</jc>
+	 * 	Map m = m.read(json, TreeMap.<jk>class</jk>);
+	 * </p>
+	 *
+	 * @param <T> The class type of the object being created.
+	 * @param input
+	 * 	The input.
+	 * 	See {@link #read(Object, Type, Type...)} for details.
+	 * @param type The object type to create.
+	 * @return The parsed object.
+	 * @throws ParseException
+	 * 	If the input contains a syntax error or is malformed, or is not valid for the specified type.
+	 */
+	public final <T> T read(Object input, Class<T> type) throws ParseException {
+		return p.createSession().parse(input, type);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MsgPack.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MsgPack.java
new file mode 100644
index 0000000..5ce487f
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/MsgPack.java
@@ -0,0 +1,71 @@
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.msgpack.*;
+
+/**
+ * A pairing of a {@link MsgPackSerializer} and {@link MsgPackParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	MsgPack msgPack = <jk>new</jk> MsgPack();
+ * 	MyPojo myPojo = msgPack.read(bytes, MyPojo.<jk>class</jk>);
+ * 	<jk>byte</jk>[] bytes = msgPack.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = MsgPack.<jsf>DEFAULT</jsf>.read(bytes, MyPojo.<jk>class</jk>);
+ * 	<jk>byte</jk>[] bytes = MsgPack.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class MsgPack extends StreamMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final MsgPack DEFAULT = new MsgPack();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public MsgPack(MsgPackSerializer s, MsgPackParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link MsgPackSerializer#DEFAULT} and {@link MsgPackParser#DEFAULT}.
+	 */
+	public MsgPack() {
+		this(MsgPackSerializer.DEFAULT, MsgPackParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/PlainText.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/PlainText.java
new file mode 100644
index 0000000..106031d
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/PlainText.java
@@ -0,0 +1,76 @@
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.plaintext.*;
+
+/**
+ * A pairing of a {@link PlainTextSerializer} and {@link PlainTextParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	PlainText plainText = <jk>new</jk> PlainText();
+ * 	MyPojo myPojo = plainText.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = plainText.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = PlainText.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = PlainText.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class PlainText extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final PlainText DEFAULT = new PlainText();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public PlainText(PlainTextSerializer s, PlainTextParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link PlainTextSerializer#DEFAULT} and {@link PlainTextParser#DEFAULT}.
+	 */
+	public PlainText() {
+		this(PlainTextSerializer.DEFAULT, PlainTextParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/SimpleJson.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/SimpleJson.java
new file mode 100644
index 0000000..0247b0d
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/SimpleJson.java
@@ -0,0 +1,71 @@
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.json.*;
+
+/**
+ * A pairing of a {@link SimpleJsonSerializer} and {@link JsonParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	SimpleJson json = <jk>new</jk> SimpleJson();
+ * 	MyPojo myPojo = json.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = json.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = SimpleJson.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = SimpleJson.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class SimpleJson extends Json {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final SimpleJson DEFAULT = new SimpleJson();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public SimpleJson(JsonSerializer s, JsonParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link SimpleJsonSerializer#DEFAULT} and {@link JsonParser#DEFAULT}.
+	 */
+	public SimpleJson() {
+		this(SimpleJsonSerializer.DEFAULT, JsonParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/StreamMarshall.java
similarity index 57%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/StreamMarshall.java
index 6398cfb..ccfce40 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/StreamMarshall.java
@@ -1,45 +1,57 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * A subclass of {@link Marshall} for stream-based serializers and parsers.
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public abstract class StreamMarshall extends Marshall {
+
+	private final OutputStreamSerializer s;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	protected StreamMarshall(OutputStreamSerializer s, InputStreamParser p) {
+		super(s, p);
+		this.s = s;
+	}
+
+	/**
+	 * Serializes a POJO directly to a <code><jk>byte</jk>[]</code>.
+	 *
+	 * @param o The object to serialize.
+	 * @return
+	 * 	The serialized object.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	@Override /* Serializer */
+	public final byte[] write(Object o) throws SerializeException {
+		return s.createSession(null).serialize(o);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Uon.java
similarity index 51%
copy from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Uon.java
index 6398cfb..739580e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Uon.java
@@ -1,45 +1,71 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.uon.*;
+
+/**
+ * A pairing of a {@link UonSerializer} and {@link UonParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	Uon uon = <jk>new</jk> Uon();
+ * 	MyPojo myPojo = uon.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = uon.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = Uon.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = Uon.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class Uon extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final Uon DEFAULT = new Uon();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public Uon(UonSerializer s, UonParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link UonSerializer#DEFAULT} and {@link UonParser#DEFAULT}.
+	 */
+	public Uon() {
+		this(UonSerializer.DEFAULT, UonParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/UrlEncoding.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/UrlEncoding.java
new file mode 100644
index 0000000..27dff32
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/UrlEncoding.java
@@ -0,0 +1,71 @@
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.urlencoding.*;
+
+/**
+ * A pairing of a {@link UrlEncodingSerializer} and {@link UrlEncodingParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	UrlEncoding urlEncoding = <jk>new</jk> UrlEncoding();
+ * 	MyPojo myPojo = urlEncoding.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = urlEncoding.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = UrlEncoding.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = UrlEncoding.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class UrlEncoding extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final UrlEncoding DEFAULT = new UrlEncoding();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public UrlEncoding(UrlEncodingSerializer s, UrlEncodingParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link UrlEncodingSerializer#DEFAULT} and {@link UrlEncodingParser#DEFAULT}.
+	 */
+	public UrlEncoding() {
+		this(UrlEncodingSerializer.DEFAULT, UrlEncodingParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Xml.java
similarity index 51%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Xml.java
index 6398cfb..f8de1ec 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Xml.java
@@ -1,45 +1,71 @@
-// ***************************************************************************************************************************
-// * 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.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.json.annotation.*;
-
-/**
- * Metadata on classes specific to the JSON serializers and parsers pulled from the {@link Json @Json} annotation on
- * the class.
- */
-public class YamlClassMeta extends ClassMetaExtended {
-
-	private final Json json;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param cm The class that this annotation is defined on.
-	 */
-	public YamlClassMeta(ClassMeta<?> cm) {
-		super(cm);
-		this.json = ReflectionUtils.getAnnotation(Json.class, getInnerClass());
-	}
-
-	/**
-	 * Returns the {@link Json @Json} annotation defined on the class.
-	 *
-	 * @return The value of the annotation, or <jk>null</jk> if not specified.
-	 */
-	protected Json getAnnotation() {
-		return json;
-	}
-}
+// ***************************************************************************************************************************
+// * 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.marshall;
+
+import org.apache.juneau.xml.*;
+
+/**
+ * A pairing of a {@link XmlSerializer} and {@link XmlParser} into a single class with convenience read/write methods.
+ *
+ * <p>
+ * 	The general idea is to combine a single serializer and parser inside a simplified API for reading and writing POJOs.
+ *
+ * <h5 class='figure'>Examples:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Using instance.</jc>
+ * 	Xml xml = <jk>new</jk> Xml();
+ * 	MyPojo myPojo = xml.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = xml.write(myPojo);
+ * </p>
+ * <p class='bcode w800'>
+ *	<jc>// Using DEFAULT instance.</jc>
+ * 	MyPojo myPojo = Xml.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+ * 	String string = Xml.<jsf>DEFAULT</jsf>.write(myPojo);
+ * </p>
+ *
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-marshall.Marshalls">Overview &gt; juneau-marshall &gt;Marshalls</a>
+ * </ul>
+ */
+public class Xml extends CharMarshall {
+
+	/**
+	 * Default reusable instance.
+	 */
+	public static final Xml DEFAULT = new Xml();
+
+	/**
+	 * Constructor.
+	 *
+	 * @param s
+	 * 	The serializer to use for serializing output.
+	 * 	<br>Must not be <jk>null</jk>.
+	 * @param p
+	 * 	The parser to use for parsing input.
+	 * 	<br>Must not be <jk>null</jk>.
+	 */
+	public Xml(XmlSerializer s, XmlParser p) {
+		super(s, p);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * <p>
+	 * Uses {@link XmlSerializer#DEFAULT} and {@link XmlParser#DEFAULT}.
+	 */
+	public Xml() {
+		this(XmlSerializer.DEFAULT, XmlParser.DEFAULT);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlParser.java
deleted file mode 100644
index 959f34f..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlParser.java
+++ /dev/null
@@ -1,186 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.parser.*;
-
-/**
- * Parses any valid JSON text into a POJO model.
- *
- * <h5 class='topic'>Media types</h5>
- *
- * Handles <code>Content-Type</code> types:  <code><b>application/json, text/json</b></code>
- *
- * <h5 class='topic'>Description</h5>
- *
- * This parser uses a state machine, which makes it very fast and efficient.  It parses JSON in about 70% of the
- * time that it takes the built-in Java DOM parsers to parse equivalent XML.
- *
- * <p>
- * This parser handles all valid JSON syntax.
- * In addition, when strict mode is disable, the parser also handles the following:
- * <ul class='spaced-list'>
- * 	<li>
- * 		Javascript comments (both {@code /*} and {@code //}) are ignored.
- * 	<li>
- * 		Both single and double quoted strings.
- * 	<li>
- * 		Automatically joins concatenated strings (e.g. <code><js>"aaa"</js> + <js>'bbb'</js></code>).
- * 	<li>
- * 		Unquoted attributes.
- * </ul>
- *
- * <p>
- * Also handles negative, decimal, hexadecimal, octal, and double numbers, including exponential notation.
- *
- * <p>
- * This parser handles the following input, and automatically returns the corresponding Java class.
- * <ul class='spaced-list'>
- * 	<li>
- * 		JSON objects (<js>"{...}"</js>) are converted to {@link ObjectMap ObjectMaps}.
- * 		<b>Note:</b>  If a <code><xa>_type</xa>=<xs>'xxx'</xs></code> attribute is specified on the object, then an
- * 		attempt is made to convert the object to an instance of the specified Java bean class.
- * 		See the <code>beanTypeName</code> setting on the {@link PropertyStore} for more information about parsing
- * 		beans from JSON.
- * 	<li>
- * 		JSON arrays (<js>"[...]"</js>) are converted to {@link ObjectList ObjectLists}.
- * 	<li>
- * 		JSON string literals (<js>"'xyz'"</js>) are converted to {@link String Strings}.
- * 	<li>
- * 		JSON numbers (<js>"123"</js>, including octal/hexadecimal/exponential notation) are converted to
- * 		{@link Integer Integers}, {@link Long Longs}, {@link Float Floats}, or {@link Double Doubles} depending on
- * 		whether the number is decimal, and the size of the number.
- * 	<li>
- * 		JSON booleans (<js>"false"</js>) are converted to {@link Boolean Booleans}.
- * 	<li>
- * 		JSON nulls (<js>"null"</js>) are converted to <jk>null</jk>.
- * 	<li>
- * 		Input consisting of only whitespace or JSON comments are converted to <jk>null</jk>.
- * </ul>
- *
- * <p>
- * Input can be any of the following:
- * <ul class='spaced-list'>
- * 	<li>
- * 		<js>"{...}"</js> - Converted to a {@link ObjectMap} or an instance of a Java bean if a <xa>_type</xa>
- * 		attribute is present.
- * 	<li>
- * 		<js>"[...]"</js> - Converted to a {@link ObjectList}.
- * 	<li>
- * 		<js>"123..."</js> - Converted to a {@link Number} (either {@link Integer}, {@link Long}, {@link Float},
- * 		or {@link Double}).
- * 	<li>
- * 		<js>"true"</js>/<js>"false"</js> - Converted to a {@link Boolean}.
- * 	<li>
- * 		<js>"null"</js> - Returns <jk>null</jk>.
- * 	<li>
- * 		<js>"'xxx'"</js> - Converted to a {@link String}.
- * 	<li>
- * 		<js>"\"xxx\""</js> - Converted to a {@link String}.
- * 	<li>
- * 		<js>"'xxx' + \"yyy\""</js> - Converted to a concatenated {@link String}.
- * </ul>
- *
- * <p>
- * TIP:  If you know you're parsing a JSON object or array, it can be easier to parse it using the
- * {@link ObjectMap#ObjectMap(CharSequence) ObjectMap(CharSequence)} or {@link ObjectList#ObjectList(CharSequence)
- * ObjectList(CharSequence)} constructors instead of using this class.
- * The end result should be the same.
- */
-public class YamlParser extends ReaderParser {
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Predefined instances
-	//-------------------------------------------------------------------------------------------------------------------
-
-	/** Default parser, all default settings.*/
-	public static final YamlParser DEFAULT = new YamlParser(PropertyStore.DEFAULT);
-
-	/** Default parser, all default settings.*/
-	public static final YamlParser DEFAULT_STRICT = new YamlParser.Strict(PropertyStore.DEFAULT);
-
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Predefined subclasses
-	//-------------------------------------------------------------------------------------------------------------------
-
-	/** Default parser, strict mode. */
-	public static class Strict extends YamlParser {
-
-		/**
-		 * Constructor.
-		 *
-		 * @param ps The property store containing all the settings for this object.
-		 */
-		public Strict(PropertyStore ps) {
-			super(ps.builder().set(PARSER_strict, true).build());
-		}
-	}
-
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Instance
-	//-------------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Constructor.
-	 *
-	 * @param ps The property store containing all the settings for this object.
-	 */
-	public YamlParser(PropertyStore ps) {
-		this(ps, "application/json", "text/json");
-	}
-
-	/**
-	 * Constructor.
-	 *
-	 * @param ps The property store containing all the settings for this object.
-	 * @param consumes The list of media types that this parser consumes (e.g. <js>"application/json"</js>).
-	 */
-	public YamlParser(PropertyStore ps, String...consumes) {
-		super(ps, consumes);
-	}
-
-	@Override /* Context */
-	public YamlParserBuilder builder() {
-		return new YamlParserBuilder(getPropertyStore());
-	}
-
-	/**
-	 * Instantiates a new clean-slate {@link YamlParserBuilder} object.
-	 *
-	 * <p>
-	 * This is equivalent to simply calling <code><jk>new</jk> YamlParserBuilder()</code>.
-	 *
-	 * <p>
-	 * Note that this method creates a builder initialized to all default settings, whereas {@link #builder()} copies
-	 * the settings of the object called on.
-	 *
-	 * @return A new {@link YamlParserBuilder} object.
-	 */
-	public static YamlParserBuilder create() {
-		return new YamlParserBuilder();
-	}
-
-	@Override /* Parser */
-	public ReaderParserSession createSession(ParserSessionArgs args) {
-		return new YamlParserSession(this, args);
-	}
-
-	@Override /* Context */
-	public ObjectMap asMap() {
-		return super.asMap()
-			.append("YamlParser", new ObjectMap());
-	}
-}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlParserBuilder.java
deleted file mode 100644
index 3f31dc0..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlParserBuilder.java
+++ /dev/null
@@ -1,501 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.http.*;
-import org.apache.juneau.parser.*;
-
-/**
- * Builder class for building instances of JSON parsers.
- */
-public class YamlParserBuilder extends ReaderParserBuilder {
-
-	/**
-	 * Constructor, default settings.
-	 */
-	public YamlParserBuilder() {
-		super();
-	}
-
-	/**
-	 * Constructor.
-	 *
-	 * @param ps The initial configuration settings for this builder.
-	 */
-	public YamlParserBuilder(PropertyStore ps) {
-		super(ps);
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParser build() {
-		return build(YamlParser.class);
-	}
-
-
-	//--------------------------------------------------------------------------------
-	// Properties
-	//--------------------------------------------------------------------------------
-
-	@Override /* ReaderParserBuilder */
-	public YamlParserBuilder fileCharset(String value) {
-		super.fileCharset(value);
-		return this;
-	}
-
-	@Override /* ReaderParserBuilder */
-	public YamlParserBuilder inputStreamCharset(String value) {
-		super.inputStreamCharset(value);
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder autoCloseStreams(boolean value) {
-		super.autoCloseStreams(value);
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder autoCloseStreams() {
-		super.autoCloseStreams();
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder debugOutputLines(int value) {
-		super.debugOutputLines(value);
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder listener(Class<? extends ParserListener> value) {
-		super.listener(value);
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder strict(boolean value) {
-		super.strict(value);
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder strict() {
-		super.strict();
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder trimStrings(boolean value) {
-		super.trimStrings(value);
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder trimStrings() {
-		super.trimStrings();
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder unbuffered(boolean value) {
-		super.unbuffered(value);
-		return this;
-	}
-
-	@Override /* ParserBuilder */
-	public YamlParserBuilder unbuffered() {
-		super.unbuffered();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanClassVisibility(Visibility value) {
-		super.beanClassVisibility(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanConstructorVisibility(Visibility value) {
-		super.beanConstructorVisibility(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanDictionary(boolean append, Object...values) {
-		super.beanDictionary(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanDictionary(Class<?>...values) {
-		super.beanDictionary(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanDictionary(Object...values) {
-		super.beanDictionary(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanDictionaryRemove(Object...values) {
-		super.beanDictionaryRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanFieldVisibility(Visibility value) {
-		super.beanFieldVisibility(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanFilters(boolean append, Object...values) {
-		super.beanFilters(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanFilters(Class<?>...values) {
-		super.beanFilters(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanFilters(Object...values) {
-		super.beanFilters(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanFiltersRemove(Object...values) {
-		super.beanFiltersRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanMapPutReturnsOldValue(boolean value) {
-		super.beanMapPutReturnsOldValue(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanMapPutReturnsOldValue() {
-		super.beanMapPutReturnsOldValue();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanMethodVisibility(Visibility value) {
-		super.beanMethodVisibility(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beansRequireDefaultConstructor(boolean value) {
-		super.beansRequireDefaultConstructor(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beansRequireDefaultConstructor() {
-		super.beansRequireDefaultConstructor();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beansRequireSerializable(boolean value) {
-		super.beansRequireSerializable(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beansRequireSerializable() {
-		super.beansRequireSerializable();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beansRequireSettersForGetters(boolean value) {
-		super.beansRequireSettersForGetters(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beansRequireSettersForGetters() {
-		super.beansRequireSettersForGetters();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beansRequireSomeProperties(boolean value) {
-		super.beansRequireSomeProperties(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder beanTypePropertyName(String value) {
-		super.beanTypePropertyName(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder debug() {
-		super.debug();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public <T> YamlParserBuilder example(Class<T> c, T o) {
-		super.example(c, o);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
-		super.ignoreInvocationExceptionsOnGetters(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder ignoreInvocationExceptionsOnGetters() {
-		super.ignoreInvocationExceptionsOnGetters();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
-		super.ignoreInvocationExceptionsOnSetters(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder ignoreInvocationExceptionsOnSetters() {
-		super.ignoreInvocationExceptionsOnSetters();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder ignorePropertiesWithoutSetters(boolean value) {
-		super.ignorePropertiesWithoutSetters(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder ignoreUnknownBeanProperties(boolean value) {
-		super.ignoreUnknownBeanProperties(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder ignoreUnknownBeanProperties() {
-		super.ignoreUnknownBeanProperties();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder ignoreUnknownNullBeanProperties(boolean value) {
-		super.ignoreUnknownNullBeanProperties(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public <T> YamlParserBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
-		super.implClass(interfaceClass, implClass);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder implClasses(Map<String,Class<?>> values) {
-		super.implClasses(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder locale(Locale value) {
-		super.locale(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder mediaType(MediaType value) {
-		super.mediaType(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder notBeanClasses(boolean append, Object...values) {
-		super.notBeanClasses(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder notBeanClasses(Class<?>...values) {
-		super.notBeanClasses(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder notBeanClasses(Object...values) {
-		super.notBeanClasses(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder notBeanClassesRemove(Object...values) {
-		super.notBeanClassesRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder notBeanPackages(boolean append, Object...values) {
-		super.notBeanPackages(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder notBeanPackages(Object...values) {
-		super.notBeanPackages(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder notBeanPackages(String...values) {
-		super.notBeanPackages(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder notBeanPackagesRemove(Object...values) {
-		super.notBeanPackagesRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder pojoSwaps(boolean append, Object...values) {
-		super.pojoSwaps(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder pojoSwaps(Class<?>...values) {
-		super.pojoSwaps(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder pojoSwaps(Object...values) {
-		super.pojoSwaps(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder pojoSwapsRemove(Object...values) {
-		super.pojoSwapsRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder sortProperties(boolean value) {
-		super.sortProperties(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder sortProperties() {
-		super.sortProperties();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder timeZone(TimeZone value) {
-		super.timeZone(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder useEnumNames() {
-		super.useEnumNames();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder useInterfaceProxies(boolean value) {
-		super.useInterfaceProxies(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder useJavaBeanIntrospector(boolean value) {
-		super.useJavaBeanIntrospector(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlParserBuilder useJavaBeanIntrospector() {
-		super.useJavaBeanIntrospector();
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParserBuilder set(String name, Object value) {
-		super.set(name, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParserBuilder set(boolean append, String name, Object value) {
-		super.set(append, name, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParserBuilder set(Map<String,Object> properties) {
-		super.set(properties);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParserBuilder add(Map<String,Object> properties) {
-		super.add(properties);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParserBuilder addTo(String name, Object value) {
-		super.addTo(name, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParserBuilder addTo(String name, String key, Object value) {
-		super.addTo(name, key, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParserBuilder removeFrom(String name, Object value) {
-		super.removeFrom(name, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlParserBuilder 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/yaml/proto/YamlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlParserSession.java
deleted file mode 100644
index 2340931..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlParserSession.java
+++ /dev/null
@@ -1,675 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import static org.apache.juneau.internal.StringUtils.*;
-
-import java.io.*;
-import java.lang.reflect.*;
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.parser.*;
-import org.apache.juneau.transform.*;
-
-/**
- * Session object that lives for the duration of a single use of {@link YamlParser}.
- *
- * <p>
- * This class is NOT thread safe.
- * It is typically discarded after one-time use although it can be reused against multiple inputs.
- */
-@SuppressWarnings({ "unchecked", "rawtypes" })
-public final class YamlParserSession extends ReaderParserSession {
-
-	private static final AsciiSet decChars = AsciiSet.create().ranges("0-9").build();
-
-	/**
-	 * 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.
-	 * @param args
-	 * 	Runtime session arguments.
-	 */
-	protected YamlParserSession(YamlParser ctx, ParserSessionArgs args) {
-		super(ctx, args);
-	}
-
-	/**
-	 * Returns <jk>true</jk> if the specified character is whitespace.
-	 *
-	 * <p>
-	 * The definition of whitespace is different for strict vs lax mode.
-	 * Strict mode only interprets 0x20 (space), 0x09 (tab), 0x0A (line feed) and 0x0D (carriage return) as whitespace.
-	 * Lax mode uses {@link Character#isWhitespace(int)} to make the determination.
-	 *
-	 * @param cp The codepoint.
-	 * @return <jk>true</jk> if the specified character is whitespace.
-	 */
-	protected final boolean isWhitespace(int cp) {
-		if (isStrict())
-				return cp <= 0x20 && (cp == 0x09 || cp == 0x0A || cp == 0x0D || cp == 0x20);
-		return Character.isWhitespace(cp);
-	}
-
-	/**
-	 * Returns <jk>true</jk> if the specified character is whitespace or '/'.
-	 *
-	 * @param cp The codepoint.
-	 * @return <jk>true</jk> if the specified character is whitespace or '/'.
-	 */
-	protected final boolean isCommentOrWhitespace(int cp) {
-		if (cp == '/')
-			return true;
-		if (isStrict())
-			return cp <= 0x20 && (cp == 0x09 || cp == 0x0A || cp == 0x0D || cp == 0x20);
-		return Character.isWhitespace(cp);
-	}
-
-	@Override /* ParserSession */
-	protected <T> T doParse(ParserPipe pipe, ClassMeta<T> type) throws Exception {
-		try (ParserReader r = pipe.getParserReader()) {
-			if (r == null)
-				return null;
-			T o = parseAnything(type, r, getOuter(), null);
-			validateEnd(r);
-			return o;
-		}
-	}
-
-	@Override /* ReaderParserSession */
-	protected <K,V> Map<K,V> doParseIntoMap(ParserPipe pipe, Map<K,V> m, Type keyType, Type valueType) throws Exception {
-		try (ParserReader r = pipe.getParserReader()) {
-			m = parseIntoMap2(r, m, (ClassMeta<K>)getClassMeta(keyType), (ClassMeta<V>)getClassMeta(valueType), null);
-			validateEnd(r);
-			return m;
-		}
-	}
-
-	@Override /* ReaderParserSession */
-	protected <E> Collection<E> doParseIntoCollection(ParserPipe pipe, Collection<E> c, Type elementType) throws Exception {
-		try (ParserReader r = pipe.getParserReader()) {
-			c = parseIntoCollection2(r, c, getClassMeta(elementType), null);
-			validateEnd(r);
-			return c;
-		}
-	}
-
-	private <T> T parseAnything(ClassMeta<?> eType, ParserReader r, Object outer, BeanPropertyMeta pMeta) throws Exception {
-
-		if (eType == null)
-			eType = object();
-		PojoSwap<T,Object> swap = (PojoSwap<T,Object>)eType.getPojoSwap(this);
-		BuilderSwap<T,Object> builder = (BuilderSwap<T,Object>)eType.getBuilderSwap(this);
-		ClassMeta<?> sType = null;
-		if (builder != null)
-			sType = builder.getBuilderClassMeta(this);
-		else if (swap != null)
-			sType = swap.getSwapClassMeta(this);
-		else
-			sType = eType;
-		setCurrentClass(sType);
-
-		Object o = null;
-
-		skipCommentsAndSpace(r);
-		int c = r.peek();
-		if (c == -1) {
-			if (isStrict())
-				throw new ParseException(this, "Empty input.");
-			// Let o be null.
-		} else if ((c == ',' || c == '}' || c == ']')) {
-			if (isStrict())
-				throw new ParseException(this, "Missing value detected.");
-			// Handle bug in Cognos 10.2.1 that can product non-existent values.
-			// Let o be null;
-		} else if (c == 'n') {
-			parseKeyword("null", r);
-		} else if (sType.isObject()) {
-			if (c == '{') {
-				ObjectMap m2 = new ObjectMap(this);
-				parseIntoMap2(r, m2, string(), object(), pMeta);
-				o = cast(m2, pMeta, eType);
-			} else if (c == '[') {
-				o = parseIntoCollection2(r, new ObjectList(this), object(), pMeta);
-			} else if (c == '\'' || c == '"') {
-				o = parseString(r);
-				if (sType.isChar())
-					o = parseCharacter(o);
-			} else if (c >= '0' && c <= '9' || c == '-' || c == '.') {
-				o = parseNumber(r, null);
-			} else if (c == 't') {
-				parseKeyword("true", r);
-				o = Boolean.TRUE;
-			} else {
-				parseKeyword("false", r);
-				o = Boolean.FALSE;
-			}
-		} else if (sType.isBoolean()) {
-			o = parseBoolean(r);
-		} else if (sType.isCharSequence()) {
-			o = parseString(r);
-		} else if (sType.isChar()) {
-			o = parseCharacter(parseString(r));
-		} else if (sType.isNumber()) {
-			o = parseNumber(r, (Class<? extends Number>)sType.getInnerClass());
-		} else if (sType.isMap()) {
-			Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(this));
-			o = parseIntoMap2(r, m, sType.getKeyType(), sType.getValueType(), pMeta);
-		} else if (sType.isCollection()) {
-			if (c == '{') {
-				ObjectMap m = new ObjectMap(this);
-				parseIntoMap2(r, m, string(), object(), pMeta);
-				o = cast(m, pMeta, eType);
-			} else {
-				Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(this));
-				o = parseIntoCollection2(r, l, sType, pMeta);
-			}
-		} else if (builder != null) {
-			BeanMap m = toBeanMap(builder.create(this, eType));
-			o = builder.build(this, parseIntoBeanMap2(r, m).getBean(), eType);
-		} else if (sType.canCreateNewBean(outer)) {
-			BeanMap m = newBeanMap(outer, sType.getInnerClass());
-			o = parseIntoBeanMap2(r, m).getBean();
-		} else if (sType.canCreateNewInstanceFromString(outer) && (c == '\'' || c == '"')) {
-			o = sType.newInstanceFromString(outer, parseString(r));
-		} else if (sType.canCreateNewInstanceFromNumber(outer) && isFirstNumberChar((char)c)) {
-			o = sType.newInstanceFromNumber(this, outer, parseNumber(r, sType.getNewInstanceFromNumberClass()));
-		} else if (sType.isArray() || sType.isArgs()) {
-			if (c == '{') {
-				ObjectMap m = new ObjectMap(this);
-				parseIntoMap2(r, m, string(), object(), pMeta);
-				o = cast(m, pMeta, eType);
-			} else {
-				ArrayList l = (ArrayList)parseIntoCollection2(r, new ArrayList(), sType, pMeta);
-				o = toArray(sType, l);
-			}
-		} else if (c == '{') {
-			Map m = new ObjectMap(this);
-			parseIntoMap2(r, m, sType.getKeyType(), sType.getValueType(), pMeta);
-			if (m.containsKey(getBeanTypePropertyName(eType)))
-				o = cast((ObjectMap)m, pMeta, eType);
-			else
-				throw new ParseException(this, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''",
-						sType.getInnerClass().getName(), sType.getNotABeanReason());
-		} else if (sType.canCreateNewInstanceFromString(outer) && ! isStrict()) {
-			o = sType.newInstanceFromString(outer, parseString(r));
-		} else {
-			throw new ParseException(this, "Unrecognized syntax for class type ''{0}'', starting character ''{1}''",
-				sType, (char)c);
-		}
-
-		if (swap != null && o != null)
-			o = swap.unswap(this, o, eType);
-
-		if (outer != null)
-			setParent(eType, o, outer);
-
-		return (T)o;
-	}
-
-	private Number parseNumber(ParserReader r, Class<? extends Number> type) throws Exception {
-		int c = r.peek();
-		if (c == '\'' || c == '"')
-			return parseNumber(r, parseString(r), type);
-		return parseNumber(r, parseNumberString(r), type);
-	}
-
-	private Number parseNumber(ParserReader r, String s, Class<? extends Number> type) throws Exception {
-
-		// JSON has slightly different number rules from Java.
-		// Strict mode enforces these different rules, lax does not.
-		if (isStrict()) {
-
-			// Lax allows blank strings to represent 0.
-			// Strict does not allow blank strings.
-			if (s.length() == 0)
-				throw new ParseException(this, "Invalid JSON number: ''{0}''", s);
-
-			// Need to weed out octal and hexadecimal formats:  0123,-0123,0x123,-0x123.
-			// Don't weed out 0 or -0.
-			boolean isNegative = false;
-			char c = s.charAt(0);
-			if (c == '-') {
-				isNegative = true;
-				c = (s.length() == 1 ? 'x' : s.charAt(1));
-			}
-
-			// JSON doesn't allow '.123' and '-.123'.
-			if (c == '.')
-				throw new ParseException(this, "Invalid JSON number: ''{0}''", s);
-
-			// '01' is not a valid number, but '0.1', '0e1', '0e+1' are valid.
-			if (c == '0' && s.length() > (isNegative ? 2 : 1)) {
-				char c2 = s.charAt((isNegative ? 2 : 1));
-				if (c2 != '.' && c2 != 'e' && c2 != 'E')
-					throw new ParseException(this, "Invalid JSON number: ''{0}''", s);
-			}
-
-			// JSON doesn't allow '1.' or '0.e1'.
-			int i = s.indexOf('.');
-			if (i != -1 && (s.length() == (i+1) || ! decChars.contains(s.charAt(i+1))))
-				throw new ParseException(this, "Invalid JSON number: ''{0}''", s);
-
-		}
-		return StringUtils.parseNumber(s, type);
-	}
-
-	private Boolean parseBoolean(ParserReader r) throws Exception {
-		int c = r.peek();
-		if (c == '\'' || c == '"')
-			return Boolean.valueOf(parseString(r));
-		if (c == 't') {
-			parseKeyword("true", r);
-			return Boolean.TRUE;
-		}
-		parseKeyword("false", r);
-		return Boolean.FALSE;
-	}
-
-
-	private <K,V> Map<K,V> parseIntoMap2(ParserReader r, Map<K,V> m, ClassMeta<K> keyType,
-			ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception {
-
-		if (keyType == null)
-			keyType = (ClassMeta<K>)string();
-
-		int S0=0; // Looking for outer {
-		int S1=1; // Looking for attrName start.
-		int S3=3; // Found attrName end, looking for :.
-		int S4=4; // Found :, looking for valStart: { [ " ' LITERAL.
-		int S5=5; // Looking for , or }
-		int S6=6; // Found , looking for attr start.
-
-		int state = S0;
-		String currAttr = null;
-		int c = 0;
-		while (c != -1) {
-			c = r.read();
-			if (state == S0) {
-				if (c == '{')
-					state = S1;
-			} else if (state == S1) {
-				if (c == '}') {
-					return m;
-				} else if (isCommentOrWhitespace(c)) {
-					skipCommentsAndSpace(r.unread());
-				} else {
-					currAttr = parseFieldName(r.unread());
-					state = S3;
-				}
-			} else if (state == S3) {
-				if (c == ':')
-					state = S4;
-			} else if (state == S4) {
-				if (isCommentOrWhitespace(c)) {
-					skipCommentsAndSpace(r.unread());
-				} else {
-					K key = convertAttrToType(m, currAttr, keyType);
-					V value = parseAnything(valueType, r.unread(), m, pMeta);
-					setName(valueType, value, key);
-					m.put(key, value);
-					state = S5;
-				}
-			} else if (state == S5) {
-				if (c == ',')
-					state = S6;
-				else if (isCommentOrWhitespace(c))
-					skipCommentsAndSpace(r.unread());
-				else if (c == '}') {
-					return m;
-				} else {
-					break;
-				}
-			} else if (state == S6) {
-				if (c == '}') {
-					break;
-				} else if (isCommentOrWhitespace(c)) {
-					skipCommentsAndSpace(r.unread());
-				} else {
-					currAttr = parseFieldName(r.unread());
-					state = S3;
-				}
-			}
-		}
-		if (state == S0)
-			throw new ParseException(this, "Expected '{' at beginning of JSON object.");
-		if (state == S1)
-			throw new ParseException(this, "Could not find attribute name on JSON object.");
-		if (state == S3)
-			throw new ParseException(this, "Could not find ':' following attribute name on JSON object.");
-		if (state == S4)
-			throw new ParseException(this, "Expected one of the following characters: {,[,',\",LITERAL.");
-		if (state == S5)
-			throw new ParseException(this, "Could not find '}' marking end of JSON object.");
-		if (state == S6)
-			throw new ParseException(this, "Unexpected '}' found in JSON object.");
-
-		return null; // Unreachable.
-	}
-
-	/*
-	 * Parse a JSON attribute from the character array at the specified position, then
-	 * set the position marker to the last character in the field name.
-	 */
-	private String parseFieldName(ParserReader r) throws Exception {
-		int c = r.peek();
-		if (c == '\'' || c == '"')
-			return parseString(r);
-		if (isStrict())
-			throw new ParseException(this, "Unquoted attribute detected.");
-		r.mark();
-		// Look for whitespace.
-		while (c != -1) {
-			c = r.read();
-			if (c == ':' || isWhitespace(c) || c == '/') {
-				r.unread();
-				String s = r.getMarked().intern();
-				return s.equals("null") ? null : s;
-			}
-		}
-		throw new ParseException(this, "Could not find the end of the field name.");
-	}
-
-	private <E> Collection<E> parseIntoCollection2(ParserReader r, Collection<E> l,
-			ClassMeta<?> type, BeanPropertyMeta pMeta) throws Exception {
-
-		int S0=0; // Looking for outermost [
-		int S1=1; // Looking for starting [ or { or " or ' or LITERAL or ]
-		int S2=2; // Looking for , or ]
-		int S3=3; // Looking for starting [ or { or " or ' or LITERAL
-
-		int argIndex = 0;
-
-		int state = S0;
-		int c = 0;
-		while (c != -1) {
-			c = r.read();
-			if (state == S0) {
-				if (c == '[')
-					state = S1;
-			} else if (state == S1) {
-				if (c == ']') {
-					return l;
-				} else if (isCommentOrWhitespace(c)) {
-					skipCommentsAndSpace(r.unread());
-				} else if (c != -1) {
-					l.add((E)parseAnything(type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), r.unread(), l, pMeta));
-					state = S2;
-				}
-			} else if (state == S2) {
-				if (c == ',') {
-					state = S3;
-				} else if (isCommentOrWhitespace(c)) {
-					skipCommentsAndSpace(r.unread());
-				} else if (c == ']') {
-					return l;
-				} else {
-					break;  // Invalid character found.
-				}
-			} else if (state == S3) {
-				if (isCommentOrWhitespace(c)) {
-					skipCommentsAndSpace(r.unread());
-				} else if (c == ']') {
-					break;
-				} else if (c != -1) {
-					l.add((E)parseAnything(type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), r.unread(), l, pMeta));
-					state = S2;
-				}
-			}
-		}
-		if (state == S0)
-			throw new ParseException(this, "Expected '[' at beginning of JSON array.");
-		if (state == S1)
-			throw new ParseException(this, "Expected one of the following characters: {,[,',\",LITERAL.");
-		if (state == S2)
-			throw new ParseException(this, "Expected ',' or ']'.");
-		if (state == S3)
-			throw new ParseException(this, "Unexpected trailing comma in array.");
-
-		return null;  // Unreachable.
-	}
-
-	private <T> BeanMap<T> parseIntoBeanMap2(ParserReader r, BeanMap<T> m) throws Exception {
-
-		int S0=0; // Looking for outer {
-		int S1=1; // Looking for attrName start.
-		int S3=3; // Found attrName end, looking for :.
-		int S4=4; // Found :, looking for valStart: { [ " ' LITERAL.
-		int S5=5; // Looking for , or }
-
-		int state = S0;
-		String currAttr = "";
-		int c = 0;
-		while (c != -1) {
-			c = r.read();
-			if (state == S0) {
-				if (c == '{')
-					state = S1;
-			} else if (state == S1) {
-				if (c == '}') {
-					return m;
-				} else if (isCommentOrWhitespace(c)) {
-					skipCommentsAndSpace(r.unread());
-				} else {
-					r.unread();
-					currAttr = parseFieldName(r);
-					state = S3;
-				}
-			} else if (state == S3) {
-				if (c == ':')
-					state = S4;
-			} else if (state == S4) {
-				if (isCommentOrWhitespace(c)) {
-					skipCommentsAndSpace(r.unread());
-				} else {
-					if (! currAttr.equals(getBeanTypePropertyName(m.getClassMeta()))) {
-						BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
-						setCurrentProperty(pMeta);
-						if (pMeta == null) {
-							onUnknownProperty(currAttr, m);
-							parseAnything(object(), r.unread(), m.getBean(false), null); // Read content anyway to ignore it
-						} else {
-							ClassMeta<?> cm = pMeta.getClassMeta();
-							Object value = parseAnything(cm, r.unread(), m.getBean(false), pMeta);
-							setName(cm, value, currAttr);
-							pMeta.set(m, currAttr, value);
-						}
-						setCurrentProperty(null);
-					}
-					state = S5;
-				}
-			} else if (state == S5) {
-				if (c == ',')
-					state = S1;
-				else if (isCommentOrWhitespace(c))
-					skipCommentsAndSpace(r.unread());
-				else if (c == '}') {
-					return m;
-				}
-			}
-		}
-		if (state == S0)
-			throw new ParseException(this, "Expected '{' at beginning of JSON object.");
-		if (state == S1)
-			throw new ParseException(this, "Could not find attribute name on JSON object.");
-		if (state == S3)
-			throw new ParseException(this, "Could not find ':' following attribute name on JSON object.");
-		if (state == S4)
-			throw new ParseException(this, "Expected one of the following characters: {,[,',\",LITERAL.");
-		if (state == S5)
-			throw new ParseException(this, "Could not find '}' marking end of JSON object.");
-
-		return null; // Unreachable.
-	}
-
-	/*
-	 * Starting from the specified position in the character array, returns the
-	 * position of the character " or '.
-	 * If the string consists of a concatenation of strings (e.g. 'AAA' + "BBB"), this method
-	 * will automatically concatenate the strings and return the result.
-	 */
-	private String parseString(ParserReader r) throws Exception  {
-		r.mark();
-		int qc = r.read();		// The quote character being used (" or ')
-		if (qc != '"' && isStrict()) {
-			String msg = (
-				qc == '\''
-				? "Invalid quote character \"{0}\" being used."
-				: "Did not find quote character marking beginning of string.  Character=\"{0}\""
-			);
-			throw new ParseException(this, msg, (char)qc);
-		}
-		final boolean isQuoted = (qc == '\'' || qc == '"');
-		String s = null;
-		boolean isInEscape = false;
-		int c = 0;
-		while (c != -1) {
-			c = r.read();
-			// Strict syntax requires that all control characters be escaped.
-			if (isStrict() && c <= 0x1F)
-				throw new ParseException(this, "Unescaped control character encountered: ''0x{0}''", String.format("%04X", c));
-			if (isInEscape) {
-				switch (c) {
-					case 'n': r.replace('\n'); break;
-					case 'r': r.replace('\r'); break;
-					case 't': r.replace('\t'); break;
-					case 'f': r.replace('\f'); break;
-					case 'b': r.replace('\b'); break;
-					case '\\': r.replace('\\'); break;
-					case '/': r.replace('/'); break;
-					case '\'': r.replace('\''); break;
-					case '"': r.replace('"'); break;
-					case 'u': {
-						String n = r.read(4);
-						try {
-							r.replace(Integer.parseInt(n, 16), 6);
-						} catch (NumberFormatException e) {
-							throw new ParseException(this, "Invalid Unicode escape sequence in string.");
-						}
-						break;
-					}
-					default:
-						throw new ParseException(this, "Invalid escape sequence in string.");
-				}
-				isInEscape = false;
-			} else {
-				if (c == '\\') {
-					isInEscape = true;
-					r.delete();
-				} else if (isQuoted) {
-					if (c == qc) {
-						s = r.getMarked(1, -1);
-						break;
-					}
-				} else {
-					if (c == ',' || c == '}' || c == ']' || isWhitespace(c)) {
-						s = r.getMarked(0, -1);
-						r.unread();
-						break;
-					} else if (c == -1) {
-						s = r.getMarked(0, 0);
-						break;
-					}
-				}
-			}
-		}
-		if (s == null)
-			throw new ParseException(this, "Could not find expected end character ''{0}''.", (char)qc);
-
-		// Look for concatenated string (i.e. whitespace followed by +).
-		skipCommentsAndSpace(r);
-		if (r.peek() == '+') {
-			if (isStrict())
-				throw new ParseException(this, "String concatenation detected.");
-			r.read();	// Skip past '+'
-			skipCommentsAndSpace(r);
-			s += parseString(r);
-		}
-		return trim(s); // End of input reached.
-	}
-
-	/*
-	 * Looks for the keywords true, false, or null.
-	 * Throws an exception if any of these keywords are not found at the specified position.
-	 */
-	private void parseKeyword(String keyword, ParserReader r) throws Exception {
-		try {
-			String s = r.read(keyword.length());
-			if (s.equals(keyword))
-				return;
-			throw new ParseException(this, "Unrecognized syntax.");
-		} catch (IndexOutOfBoundsException e) {
-			throw new ParseException(this, "Unrecognized syntax.");
-		}
-	}
-
-	/*
-	 * Doesn't actually parse anything, but moves the position beyond any whitespace or comments.
-	 * If positionOnNext is 'true', then the cursor will be set to the point immediately after
-	 * the comments and whitespace.  Otherwise, the cursor will be set to the last position of
-	 * the comments and whitespace.
-	 */
-	private void skipCommentsAndSpace(ParserReader r) throws Exception {
-		int c = 0;
-		while ((c = r.read()) != -1) {
-			if (! isWhitespace(c)) {
-				if (c == '/') {
-					if (isStrict())
-						throw new ParseException(this, "Javascript comment detected.");
-					skipComments(r);
-				} else {
-					r.unread();
-					return;
-				}
-			}
-		}
-	}
-
-	/*
-	 * Doesn't actually parse anything, but when positioned at the beginning of comment,
-	 * it will move the pointer to the last character in the comment.
-	 */
-	private void skipComments(ParserReader r) throws ParseException, IOException {
-		int c = r.read();
-		//  "/* */" style comments
-		if (c == '*') {
-			while (c != -1)
-				if ((c = r.read()) == '*')
-					if ((c = r.read()) == '/')
-						return;
-		//  "//" style comments
-		} else if (c == '/') {
-			while (c != -1) {
-				c = r.read();
-				if (c == -1 || c == '\n')
-					return;
-			}
-		}
-		throw new ParseException(this, "Open ended comment.");
-	}
-
-	/*
-	 * Call this method after you've finished a parsing a string to make sure that if there's any
-	 * remainder in the input, that it consists only of whitespace and comments.
-	 */
-	private void validateEnd(ParserReader r) throws Exception {
-		skipCommentsAndSpace(r);
-		int c = r.read();
-		if (c != -1 && c != ';')  // var x = {...}; expressions can end with a semicolon.
-			throw new ParseException(this, "Remainder after parse: ''{0}''.", (char)c);
-	}
-}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlSerializer.java
deleted file mode 100644
index 02dabac..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlSerializer.java
+++ /dev/null
@@ -1,345 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.json.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Serializes POJO models to JSON.
- *
- * <h5 class='topic'>Media types</h5>
- *
- * Handles <code>Accept</code> types:  <code><b>application/json, text/json</b></code>
- * <p>
- * Produces <code>Content-Type</code> types:  <code><b>application/json</b></code>
- *
- * <h5 class='topic'>Description</h5>
- *
- * The conversion is as follows...
- * <ul class='spaced-list'>
- * 	<li>
- * 		Maps (e.g. {@link HashMap HashMaps}, {@link TreeMap TreeMaps}) are converted to JSON objects.
- * 	<li>
- * 		Collections (e.g. {@link HashSet HashSets}, {@link LinkedList LinkedLists}) and Java arrays are converted to
- * 		JSON arrays.
- * 	<li>
- * 		{@link String Strings} are converted to JSON strings.
- * 	<li>
- * 		{@link Number Numbers} (e.g. {@link Integer}, {@link Long}, {@link Double}) are converted to JSON numbers.
- * 	<li>
- * 		{@link Boolean Booleans} are converted to JSON booleans.
- * 	<li>
- * 		{@code nulls} are converted to JSON nulls.
- * 	<li>
- * 		{@code arrays} are converted to JSON arrays.
- * 	<li>
- * 		{@code beans} are converted to JSON objects.
- * </ul>
- *
- * <p>
- * The types above are considered "JSON-primitive" object types.
- * Any non-JSON-primitive object types are transformed into JSON-primitive object types through
- * {@link org.apache.juneau.transform.PojoSwap PojoSwaps} associated through the
- * {@link BeanContextBuilder#pojoSwaps(Class...)} method.
- * Several default transforms are provided for transforming Dates, Enums, Iterators, etc...
- *
- * <p>
- * This serializer provides several serialization options.
- * Typically, one of the predefined DEFAULT serializers will be sufficient.
- * However, custom serializers can be constructed to fine-tune behavior.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * 	<jc>// Use one of the default serializers to serialize a POJO</jc>
- * 	String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(someObject);
- *
- * 	<jc>// Create a custom serializer for lax syntax using single quote characters</jc>
- * 	JsonSerializer serializer = JsonSerializer.<jsm>create</jsm>().simple().sq().build();
- *
- * 	<jc>// Clone an existing serializer and modify it to use single-quotes</jc>
- * 	JsonSerializer serializer = JsonSerializer.<jsf>DEFAULT</jsf>.builder().sq().build();
- *
- * 	<jc>// Serialize a POJO to JSON</jc>
- * 	String json = serializer.serialize(someObject);
- * </p>
- */
-public class YamlSerializer extends WriterSerializer {
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Configurable properties
-	//-------------------------------------------------------------------------------------------------------------------
-
-	private static final String PREFIX = "YamlSerializer.";
-
-
-	/**
-	 * Configuration property:  Add <js>"_type"</js> properties when needed.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSerializer.addBeanTypes.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 JsonSerializerBuilder#addBeanTypes(boolean)}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * If <jk>true</jk>, then <js>"_type"</js> properties will be added to beans if their type cannot be inferred
-	 * through reflection.
-	 *
-	 * <p>
-	 * When present, this value overrides the {@link #SERIALIZER_addBeanTypes} setting and is
-	 * provided to customize the behavior of specific serializers in a {@link SerializerGroup}.
-	 */
-	public static final String YAML_addBeanTypes = PREFIX + "addBeanTypes.b";
-
-	/**
-	 * Configuration property:  Prefix solidus <js>'/'</js> characters with escapes.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSerializer.escapeSolidus.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 JsonSerializerBuilder#escapeSolidus(boolean)}
-	 * 			<li class='jm'>{@link JsonSerializerBuilder#escapeSolidus()}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * If <jk>true</jk>, solidus (e.g. slash) characters should be escaped.
-	 * The JSON specification allows for either format.
-	 * <br>However, if you're embedding JSON in an HTML script tag, this setting prevents confusion when trying to serialize
-	 * <xt>&lt;\/script&gt;</xt>.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Create a JSON serializer that escapes solidus characters.</jc>
-	 * 	WriterSerializer s = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.simple()
-	 * 		.escapeSolidus()
-	 * 		.build();
-	 *
-	 * 	<jc>// Same, but use property.</jc>
-	 * 	WriterSerializer s = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.simple()
-	 * 		.set(<jsf>JSON_escapeSolidus</jsf>, <jk>true</jk>)
-	 * 		.build();
-	 *
-	 * 	<jc>// Produces: "{foo:'&lt;\/bar&gt;'"</jc>
-	 * 	String json = s.serialize(<jk>new</jk> ObjectMap().append(<js>"foo"</js>, <js>"&lt;/bar&gt;"</js>);
-	 * </p>
-	 */
-	public static final String YAML_escapeSolidus = PREFIX + "escapeSolidus.b";
-
-	/**
-	 * Configuration property:  Simple JSON mode.
-	 *
-	 * <h5 class='section'>Property:</h5>
-	 * <ul>
-	 * 	<li><b>Name:</b>  <js>"JsonSerializer.simpleMode.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 JsonSerializerBuilder#simple(boolean)}
-	 * 			<li class='jm'>{@link JsonSerializerBuilder#simple()}
-	 * 			<li class='jm'>{@link JsonSerializerBuilder#ssq()}
-	 * 		</ul>
-	 * </ul>
-	 *
-	 * <h5 class='section'>Description:</h5>
-	 * <p>
-	 * If <jk>true</jk>, JSON attribute names will only be quoted when necessary.
-	 * <br>Otherwise, they are always quoted.
-	 *
-	 * <p>
-	 * Attributes do not need to be quoted when they conform to the following:
-	 * <ol class='spaced-list'>
-	 * 	<li>They start with an ASCII character or <js>'_'</js>.
-	 * 	<li>They contain only ASCII characters or numbers or <js>'_'</js>.
-	 * 	<li>They are not one of the following reserved words:
-	 * 		<p class='bcode w800'>
-	 * 	arguments, break, case, catch, class, const, continue, debugger, default,
-	 * 	delete, do, else, enum, eval, export, extends, false, finally, for, function,
-	 * 	if, implements, import, in, instanceof, interface, let, new, null, package,
-	 * 	private, protected, public, return, static, super, switch, this, throw,
-	 * 	true, try, typeof, var, void, while, with, undefined, yield
-	 * 		</p>
-	 * </ol>
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Create a JSON serializer in normal mode.</jc>
-	 * 	WriterSerializer s1 = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.build();
-	 *
-	 * 	<jc>// Create a JSON serializer in simple mode.</jc>
-	 * 	WriterSerializer s2 = JsonSerializer
-	 * 		.<jsm>create</jsm>()
-	 * 		.simple()
-	 * 		.build();
-	 *
-	 * 	ObjectMap m = <jk>new</jk> ObjectMap()
-	 * 		.append(<js>"foo"</js>, <js>"x1"</js>)
-	 * 		.append(<js>"_bar"</js>, <js>"x2"</js>)
-	 * 		.append(<js>" baz "</js>, <js>"x3"</js>)
-	 * 		.append(<js>"123"</js>, <js>"x4"</js>)
-	 * 		.append(<js>"return"</js>, <js>"x5"</js>);
-	 * 		.append(<js>""</js>, <js>"x6"</js>);
-	 *
-	 * 	<jc>// Produces:</jc>
-	 * 	<jc>// {</jc>
-	 * 	<jc>// 	"foo": "x1"</jc>
-	 * 	<jc>// 	"_bar": "x2"</jc>
-	 * 	<jc>// 	" baz ": "x3"</jc>
-	 * 	<jc>// 	"123": "x4"</jc>
-	 * 	<jc>// 	"return": "x5"</jc>
-	 * 	<jc>// 	"": "x6"</jc>
-	 * 	<jc>// }</jc>
-	 * 	String json1 = s1.serialize(m);
-	 *
-	 * 	<jc>// Produces:</jc>
-	 * 	<jc>// {</jc>
-	 * 	<jc>// 	foo: "x1"</jc>
-	 * 	<jc>// 	_bar: "x2"</jc>
-	 * 	<jc>// 	" baz ": "x3"</jc>
-	 * 	<jc>// 	"123": "x4"</jc>
-	 * 	<jc>// 	"return": "x5"</jc>
-	 * 	<jc>// 	"": "x6"</jc>
-	 * 	<jc>// }</jc>
-	 * 	String json2 = s2.serialize(m);
-	 * </p>
-	 */
-	public static final String YAML_simpleMode = PREFIX + "simpleMode.b";
-
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Predefined instances
-	//-------------------------------------------------------------------------------------------------------------------
-
-	/** Default serializer, all default settings.*/
-	public static final YamlSerializer DEFAULT = new YamlSerializer(PropertyStore.DEFAULT);
-
-
-	//-------------------------------------------------------------------------------------------------------------------
-	// Instance
-	//-------------------------------------------------------------------------------------------------------------------
-
-	final boolean
-		simpleMode,
-		escapeSolidus,
-		addBeanTypes;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param ps
-	 * 	The property store containing all the settings for this object.
-	 */
-	public YamlSerializer(PropertyStore ps) {
-		this(ps, "application/yaml", "application/yaml,text/yaml");
-	}
-
-	/**
-	 * 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 YamlSerializer(PropertyStore ps, String produces, String accept) {
-		super(ps, produces, accept);
-		simpleMode = getBooleanProperty(YAML_simpleMode, false);
-		escapeSolidus = getBooleanProperty(YAML_escapeSolidus, false);
-		addBeanTypes = getBooleanProperty(YAML_addBeanTypes, getBooleanProperty(SERIALIZER_addBeanTypes, false));
-	}
-
-	@Override /* Context */
-	public YamlSerializerBuilder builder() {
-		return new YamlSerializerBuilder(getPropertyStore());
-	}
-
-	/**
-	 * Instantiates a new clean-slate {@link YamlSerializerBuilder} object.
-	 *
-	 * <p>
-	 * This is equivalent to simply calling <code><jk>new</jk> YamlSerializerBuilder()</code>.
-	 *
-	 * <p>
-	 * Note that this method creates a builder initialized to all default settings, whereas {@link #builder()} copies
-	 * the settings of the object called on.
-	 *
-	 * @return A new {@link YamlSerializerBuilder} object.
-	 */
-	public static YamlSerializerBuilder create() {
-		return new YamlSerializerBuilder();
-	}
-
-
-	//--------------------------------------------------------------------------------
-	// Entry point methods
-	//--------------------------------------------------------------------------------
-
-	@Override /* Serializer */
-	public WriterSerializerSession createSession(SerializerSessionArgs args) {
-		return new YamlSerializerSession(this, args);
-	}
-
-	@Override /* Context */
-	public ObjectMap asMap() {
-		return super.asMap()
-			.append("YamlSerializer", new ObjectMap()
-				.append("simpleMode", simpleMode)
-				.append("escapeSolidus", escapeSolidus)
-				.append("addBeanTypes", addBeanTypes)
-			);
-	}
-}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlSerializerBuilder.java
deleted file mode 100644
index ad9160a..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlSerializerBuilder.java
+++ /dev/null
@@ -1,670 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import static org.apache.juneau.yaml.proto.YamlSerializer.*;
-
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.http.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Builder class for building instances of JSON serializers.
- */
-public class YamlSerializerBuilder extends WriterSerializerBuilder {
-
-	/**
-	 * Constructor, default settings.
-	 */
-	public YamlSerializerBuilder() {
-		super();
-	}
-
-	/**
-	 * Constructor.
-	 *
-	 * @param ps The initial configuration settings for this builder.
-	 */
-	public YamlSerializerBuilder(PropertyStore ps) {
-		super(ps);
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializer build() {
-		return build(YamlSerializer.class);
-	}
-
-
-	//--------------------------------------------------------------------------------
-	// Properties
-	//--------------------------------------------------------------------------------
-
-	/**
-	 * Configuration property:  Prefix solidus <js>'/'</js> characters with escapes.
-	 *
-	 * <p>
-	 * If <jk>true</jk>, solidus (e.g. slash) characters should be escaped.
-	 * The JSON specification allows for either format.
-	 * However, if you're embedding JSON in an HTML script tag, this setting prevents confusion when trying to
-	 * serialize <xt>&lt;\/script&gt;</xt>.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link YamlSerializer#YAML_escapeSolidus}
-	 * </ul>
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 */
-	public YamlSerializerBuilder escapeSolidus(boolean value) {
-		return set(YAML_escapeSolidus, value);
-	}
-
-	/**
-	 * Configuration property:  Simple JSON mode.
-	 *
-	 * <p>
-	 * If <jk>true</jk>, JSON attribute names will only be quoted when necessary.
-	 * Otherwise, they are always quoted.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link YamlSerializer#YAML_simpleMode}
-	 * </ul>
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 */
-	public YamlSerializerBuilder simple(boolean value) {
-		return set(YAML_simpleMode, value);
-	}
-
-	/**
-	 * Shortcut for calling <code>setSimpleMode(<jk>true</jk>).sq()</code>.
-	 *
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul>
-	 * 	<li class='jf'>{@link YamlSerializer#YAML_simpleMode}
-	 * </ul>
-	 *
-	 * @return This object (for method chaining).
-	 */
-	public YamlSerializerBuilder simple() {
-		return simple(true).sq();
-	}
-
-	@Override /* WriterSerializerBuilder */
-	public YamlSerializerBuilder maxIndent(int value) {
-		super.maxIndent(value);
-		return this;
-	}
-
-	@Override /* WriterSerializerBuilder */
-	public YamlSerializerBuilder quoteChar(char value) {
-		super.quoteChar(value);
-		return this;
-	}
-
-	@Override /* WriterSerializerBuilder */
-	public YamlSerializerBuilder sq() {
-		super.sq();
-		return this;
-	}
-
-	@Override /* WriterSerializerBuilder */
-	public YamlSerializerBuilder useWhitespace(boolean value) {
-		super.useWhitespace(value);
-		return this;
-	}
-
-	@Override /* WriterSerializerBuilder */
-	public YamlSerializerBuilder useWhitespace() {
-		super.useWhitespace();
-		return this;
-	}
-
-	@Override /* WriterSerializerBuilder */
-	public YamlSerializerBuilder ws() {
-		super.ws();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder addBeanTypes(boolean value) {
-		super.addBeanTypes(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder addBeanTypes() {
-		super.addBeanTypes();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder addRootType(boolean value) {
-		super.addRootType(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder addRootType() {
-		super.addRootType();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder detectRecursions(boolean value) {
-		super.detectRecursions(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder detectRecursions() {
-		super.detectRecursions();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder ignoreRecursions(boolean value) {
-		super.ignoreRecursions(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder ignoreRecursions() {
-		super.ignoreRecursions();
-		return this;
-	}
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder initialDepth(int value) {
-		super.initialDepth(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder listener(Class<? extends SerializerListener> value) {
-		super.listener(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder maxDepth(int value) {
-		super.maxDepth(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder sortCollections(boolean value) {
-		super.sortCollections(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder sortCollections() {
-		super.sortCollections();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder sortMaps(boolean value) {
-		super.sortMaps(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder sortMaps() {
-		super.sortMaps();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder trimEmptyCollections(boolean value) {
-		super.trimEmptyCollections(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder trimEmptyCollections() {
-		super.trimEmptyCollections();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder trimEmptyMaps(boolean value) {
-		super.trimEmptyMaps(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder trimEmptyMaps() {
-		super.trimEmptyMaps();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder trimNullProperties(boolean value) {
-		super.trimNullProperties(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder trimStrings(boolean value) {
-		super.trimStrings(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder trimStrings() {
-		super.trimStrings();
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder uriContext(UriContext value) {
-		super.uriContext(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder uriRelativity(UriRelativity value) {
-		super.uriRelativity(value);
-		return this;
-	}
-
-	@Override /* SerializerBuilder */
-	public YamlSerializerBuilder uriResolution(UriResolution value) {
-		super.uriResolution(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanClassVisibility(Visibility value) {
-		super.beanClassVisibility(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanConstructorVisibility(Visibility value) {
-		super.beanConstructorVisibility(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanDictionary(boolean append, Object...values) {
-		super.beanDictionary(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanDictionary(Class<?>...values) {
-		super.beanDictionary(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanDictionary(Object...values) {
-		super.beanDictionary(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanDictionaryRemove(Object...values) {
-		super.beanDictionaryRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanFieldVisibility(Visibility value) {
-		super.beanFieldVisibility(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanFilters(boolean append, Object...values) {
-		super.beanFilters(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanFilters(Class<?>...values) {
-		super.beanFilters(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanFilters(Object...values) {
-		super.beanFilters(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanFiltersRemove(Object...values) {
-		super.beanFiltersRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanMapPutReturnsOldValue(boolean value) {
-		super.beanMapPutReturnsOldValue(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanMapPutReturnsOldValue() {
-		super.beanMapPutReturnsOldValue();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanMethodVisibility(Visibility value) {
-		super.beanMethodVisibility(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beansRequireDefaultConstructor(boolean value) {
-		super.beansRequireDefaultConstructor(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beansRequireDefaultConstructor() {
-		super.beansRequireDefaultConstructor();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beansRequireSerializable(boolean value) {
-		super.beansRequireSerializable(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beansRequireSerializable() {
-		super.beansRequireSerializable();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beansRequireSettersForGetters(boolean value) {
-		super.beansRequireSettersForGetters(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beansRequireSettersForGetters() {
-		super.beansRequireSettersForGetters();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beansRequireSomeProperties(boolean value) {
-		super.beansRequireSomeProperties(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder beanTypePropertyName(String value) {
-		super.beanTypePropertyName(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder debug() {
-		super.debug();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public <T> YamlSerializerBuilder example(Class<T> c, T o) {
-		super.example(c, o);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
-		super.ignoreInvocationExceptionsOnGetters(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder ignoreInvocationExceptionsOnGetters() {
-		super.ignoreInvocationExceptionsOnGetters();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
-		super.ignoreInvocationExceptionsOnSetters(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder ignoreInvocationExceptionsOnSetters() {
-		super.ignoreInvocationExceptionsOnSetters();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder ignorePropertiesWithoutSetters(boolean value) {
-		super.ignorePropertiesWithoutSetters(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder ignoreUnknownBeanProperties(boolean value) {
-		super.ignoreUnknownBeanProperties(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder ignoreUnknownBeanProperties() {
-		super.ignoreUnknownBeanProperties();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder ignoreUnknownNullBeanProperties(boolean value) {
-		super.ignoreUnknownNullBeanProperties(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public <T> YamlSerializerBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
-		super.implClass(interfaceClass, implClass);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder implClasses(Map<String,Class<?>> values) {
-		super.implClasses(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder locale(Locale value) {
-		super.locale(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder mediaType(MediaType value) {
-		super.mediaType(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder notBeanClasses(boolean append, Object...values) {
-		super.notBeanClasses(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder notBeanClasses(Class<?>...values) {
-		super.notBeanClasses(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder notBeanClasses(Object...values) {
-		super.notBeanClasses(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder notBeanClassesRemove(Object...values) {
-		super.notBeanClassesRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder notBeanPackages(boolean append, Object...values) {
-		super.notBeanPackages(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder notBeanPackages(Object...values) {
-		super.notBeanPackages(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder notBeanPackages(String...values) {
-		super.notBeanPackages(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder notBeanPackagesRemove(Object...values) {
-		super.notBeanPackagesRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder pojoSwaps(boolean append, Object...values) {
-		super.pojoSwaps(append, values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder pojoSwaps(Class<?>...values) {
-		super.pojoSwaps(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder pojoSwaps(Object...values) {
-		super.pojoSwaps(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder pojoSwapsRemove(Object...values) {
-		super.pojoSwapsRemove(values);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder sortProperties(boolean value) {
-		super.sortProperties(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder sortProperties() {
-		super.sortProperties();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder timeZone(TimeZone value) {
-		super.timeZone(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder useEnumNames() {
-		super.useEnumNames();
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder useInterfaceProxies(boolean value) {
-		super.useInterfaceProxies(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder useJavaBeanIntrospector(boolean value) {
-		super.useJavaBeanIntrospector(value);
-		return this;
-	}
-
-	@Override /* BeanContextBuilder */
-	public YamlSerializerBuilder useJavaBeanIntrospector() {
-		super.useJavaBeanIntrospector();
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializerBuilder set(String name, Object value) {
-		super.set(name, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializerBuilder set(boolean append, String name, Object value) {
-		super.set(append, name, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializerBuilder set(Map<String,Object> properties) {
-		super.set(properties);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializerBuilder add(Map<String,Object> properties) {
-		super.add(properties);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializerBuilder addTo(String name, Object value) {
-		super.addTo(name, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializerBuilder addTo(String name, String key, Object value) {
-		super.addTo(name, key, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializerBuilder removeFrom(String name, Object value) {
-		super.removeFrom(name, value);
-		return this;
-	}
-
-	@Override /* ContextBuilder */
-	public YamlSerializerBuilder 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/yaml/proto/YamlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlSerializerSession.java
deleted file mode 100644
index ea29023..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlSerializerSession.java
+++ /dev/null
@@ -1,248 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import static org.apache.juneau.yaml.proto.YamlSerializer.*;
-
-import java.util.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.serializer.*;
-import org.apache.juneau.transform.*;
-
-/**
- * Session object that lives for the duration of a single use of {@link YamlSerializer}.
- *
- * <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 YamlSerializerSession extends WriterSerializerSession {
-
-	private final boolean
-		addBeanTypes;
-
-	/**
-	 * 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.
-	 * @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 YamlSerializerSession(YamlSerializer ctx, SerializerSessionArgs args) {
-		super(ctx, args);
-		addBeanTypes = getProperty(YAML_addBeanTypes, boolean.class, ctx.addBeanTypes);
-	}
-
-	@Override /* Session */
-	public ObjectMap asMap() {
-		return super.asMap()
-			.append("YamlSerializerSession", new ObjectMap()
-				.append("addBeanTypes", addBeanTypes)
-			);
-	}
-
-	@Override /* SerializerSesssion */
-	protected void doSerialize(SerializerPipe out, Object o) throws Exception {
-		serializeAnything(getYamlWriter(out), o, getExpectedRootType(o), "root", null);
-	}
-
-	/*
-	 * Workhorse method.
-	 * Determines the type of object, and then calls the appropriate type-specific serialization method.
-	 */
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	SerializerWriter serializeAnything(YamlWriter out, Object o, ClassMeta<?> eType,	String attrName, BeanPropertyMeta pMeta) throws Exception {
-
-		if (o == null) {
-			out.append("~");
-			return out;
-		}
-
-		if (eType == null)
-			eType = object();
-
-		ClassMeta<?> aType;			// The actual type
-		ClassMeta<?> sType;			// The serialized type
-
-		aType = push(attrName, o, eType);
-		boolean isRecursion = aType == null;
-
-		// Handle recursion
-		if (aType == null) {
-			o = null;
-			aType = object();
-		}
-
-		sType = aType;
-		String typeName = getBeanTypeName(eType, aType, pMeta);
-
-		// Swap if necessary
-		PojoSwap swap = aType.getPojoSwap(this);
-		if (swap != null) {
-			o = swap.swap(this, o);
-			sType = swap.getSwapClassMeta(this);
-
-			// If the getSwapClass() method returns Object, we need to figure out
-			// the actual type now.
-			if (sType.isObject())
-				sType = getClassMetaForObject(o);
-		}
-
-		// '\0' characters are considered null.
-		if (o == null || (sType.isChar() && ((Character)o).charValue() == 0))
-			out.append("~");
-		else if (sType.isNumber() || sType.isBoolean())
-			out.append(o);
-		else if (sType.isBean())
-			serializeBeanMap(out, toBeanMap(o), typeName);
-		else if (sType.isUri() || (pMeta != null && pMeta.isUri()))
-			out.uriValue(o);
-		else if (sType.isMap()) {
-			if (o instanceof BeanMap)
-				serializeBeanMap(out, (BeanMap)o, typeName);
-			else
-				serializeMap(out, (Map)o, eType);
-		}
-		else if (sType.isCollection()) {
-			serializeCollection(out, (Collection) o, eType);
-		}
-		else if (sType.isArray()) {
-			serializeCollection(out, toList(sType.getInnerClass(), o), eType);
-		}
-		else if (sType.isReader() || sType.isInputStream()) {
-			IOUtils.pipe(o, out);
-		}
-		else
-			out.stringValue(toString(o));
-
-		if (! isRecursion)
-			pop();
-		return out;
-	}
-
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	private SerializerWriter serializeMap(YamlWriter out, Map m, ClassMeta<?> type) throws Exception {
-
-		ClassMeta<?> keyType = type.getKeyType(), valueType = type.getValueType();
-
-		m = sort(m);
-
-		int i = indent;
-
-		Iterator mapEntries = m.entrySet().iterator();
-
-		while (mapEntries.hasNext()) {
-			Map.Entry e = (Map.Entry) mapEntries.next();
-			Object value = e.getValue();
-
-			Object key = generalize(e.getKey(), keyType);
-
-			out.attr(toString(key)).append(':').s();
-
-			serializeAnything(out, value, valueType, toString(key), null);
-
-			if (mapEntries.hasNext())
-				out.nl(i);
-		}
-
-		out.cre(i-1);
-
-		return out;
-	}
-
-	private SerializerWriter serializeBeanMap(YamlWriter out, BeanMap<?> m, String typeName) throws Exception {
-		int i = indent;
-		out.append('{');
-
-		boolean addComma = false;
-		for (BeanPropertyValue p : m.getValues(isTrimNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null)) {
-			BeanPropertyMeta pMeta = p.getMeta();
-			if (pMeta.canRead()) {
-				ClassMeta<?> cMeta = p.getClassMeta();
-				String key = p.getName();
-				Object value = p.getValue();
-				Throwable t = p.getThrown();
-				if (t != null)
-					onBeanGetterException(pMeta, t);
-
-				if (canIgnoreValue(cMeta, key, value))
-					continue;
-
-				if (addComma)
-					out.append(',').smi(i);
-
-				out.cr(i).attr(key).append(':').s(i);
-
-				serializeAnything(out, value, cMeta, key, pMeta);
-
-				addComma = true;
-			}
-		}
-		out.cre(i-1).append('}');
-		return out;
-	}
-
-	@SuppressWarnings({"rawtypes", "unchecked"})
-	private SerializerWriter serializeCollection(YamlWriter out, Collection c, ClassMeta<?> type) throws Exception {
-
-		ClassMeta<?> elementType = type.getElementType();
-
-		c = sort(c);
-
-		out.append('[');
-
-		for (Iterator i = c.iterator(); i.hasNext();) {
-			Object value = i.next();
-			out.cr(indent);
-			serializeAnything(out, value, elementType, "<iterator>", null);
-			if (i.hasNext())
-				out.append(',').smi(indent);
-		}
-		out.cre(indent-1).append(']');
-		return out;
-	}
-
-
-	/**
-	 * Returns the {@link #YAML_addBeanTypes} setting value for this session.
-	 *
-	 * @return The {@link #YAML_addBeanTypes} setting value for this session.
-	 */
-	@Override /* SerializerSession */
-	protected final boolean isAddBeanTypes() {
-		return addBeanTypes;
-	}
-
-	/**
-	 * Converts the specified output target object to an {@link YamlWriter}.
-	 *
-	 * @param out The output target object.
-	 * @return The output target object wrapped in an {@link YamlWriter}.
-	 * @throws Exception
-	 */
-	protected final YamlWriter getYamlWriter(SerializerPipe out) throws Exception {
-		Object output = out.getRawOutput();
-		if (output instanceof YamlWriter)
-			return (YamlWriter)output;
-		YamlWriter w = new YamlWriter(out.getWriter(), getQuoteChar(), isTrimStrings(), getUriResolver());
-		out.setWriter(w);
-		return w;
-	}
-}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlWriter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlWriter.java
deleted file mode 100644
index 3345308..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/YamlWriter.java
+++ /dev/null
@@ -1,289 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.yaml.proto;
-
-import java.io.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Specialized writer for serializing JSON.
- *
- * <h5 class='section'>Notes:</h5>
- * <ul class='spaced-list'>
- * 	<li>
- * 		This class is not intended for external use.
- * </ul>
- */
-public final class YamlWriter extends SerializerWriter {
-
-	// Characters that trigger special handling of serializing attribute values.
-	private static final AsciiSet
-		encodedChars = AsciiSet.create("\n\t\b\f\r'\"\\");
-
-	private static final KeywordSet reservedWords = new KeywordSet(
-		"y","Y","yes","Yes","YES","n","N","no","No","NO",
-		 "true","True","TRUE","false","False","FALSE",
-		 "on","On","ON","off","Off","OFF"
-	);
-
-
-
-	// Characters that represent attribute name characters that don't trigger quoting.
-	// These are actually more strict than the actual Javascript specification, but
-	// can be narrowed in the future if necessary.
-	// For example, we quote attributes that start with $ even though we don't need to.
-	private static final AsciiSet validAttrChars = AsciiSet.create().ranges("a-z","A-Z","0-9").chars("_").build();
-	private static final AsciiSet validFirstAttrChars = AsciiSet.create().ranges("a-z","A-Z").chars("_").build();
-
-	private final AsciiSet ec;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param out The writer being wrapped.
-	 * @param quoteChar The quote character to use (i.e. <js>'\''</js> or <js>'"'</js>)
-	 * @param trimStrings If <jk>true</jk>, strings will be trimmed before being serialized.
-	 * @param uriResolver The URI resolver for resolving URIs to absolute or root-relative form.
-	 */
-	protected YamlWriter(Writer out, char quoteChar, boolean trimStrings, UriResolver uriResolver) {
-		super(out, true, Integer.MAX_VALUE, trimStrings, quoteChar, uriResolver);
-		this.ec = encodedChars;
-	}
-
-	/**
-	 * Serializes the specified object as a JSON string value.
-	 *
-	 * @param s The object being serialized.
-	 * @return This object (for method chaining).
-	 * @throws IOException Should never happen.
-	 */
-	public YamlWriter stringValue(String s) throws IOException {
-		if (s == null)
-			return this;
-		boolean doConvert = false;
-		for (int i = 0; i < s.length() && ! doConvert; i++) {
-			char c = s.charAt(i);
-			doConvert |= ec.contains(c);
-		}
-		q();
-		if (! doConvert) {
-			out.append(s);
-		} else {
-			for (int i = 0; i < s.length(); i++) {
-				char c = s.charAt(i);
-				if (ec.contains(c)) {
-					if (c == '\n')
-						out.append('\\').append('n');
-					else if (c == '\t')
-						out.append('\\').append('t');
-					else if (c == '\b')
-						out.append('\\').append('b');
-					else if (c == '\f')
-						out.append('\\').append('f');
-					else if (c == quoteChar)
-						out.append('\\').append(quoteChar);
-					else if (c == '\\')
-						out.append('\\').append('\\');
-					else if (c != '\r')
-						out.append(c);
-				} else {
-					out.append(c);
-				}
-			}
-		}
-		q();
-		return this;
-	}
-
-	/**
-	 * Serializes the specified object as a JSON attribute name.
-	 *
-	 * @param s The object being serialized.
-	 * @return This object (for method chaining).
-	 * @throws IOException Should never happen.
-	 */
-	public YamlWriter attr(String s) throws IOException {
-		/*
-		 * Converts a Java string to an acceptable JSON attribute name. If
-		 * useStrictJson is false, then quotes will only be used if the attribute
-		 * name consists of only alphanumeric characters.
-		 */
-		boolean doConvert = false;		// Always convert when not in lax mode.
-
-		// If the attribute is null, it must always be printed as null without quotes.
-		// Technically, this isn't part of the JSON spec, but it does allow for null key values.
-		if (s == null) {
-			s = "~";
-			doConvert = false;
-
-		} else {
-
-			// Look for characters that would require the attribute to be quoted.
-			// All possible numbers should be caught here.
-			if (! doConvert) {
-				for (int i = 0; i < s.length() && ! doConvert; i++) {
-					char c = s.charAt(i);
-					doConvert |= ! (i == 0 ? validFirstAttrChars.contains(c) : validAttrChars.contains(c));
-				}
-			}
-
-			// Reserved words and blanks must be quoted.
-			if (! doConvert) {
-				if (s.isEmpty() || reservedWords.contains(s))
-					doConvert = true;
-			}
-		}
-
-		// If no conversion necessary, just print the attribute as-is.
-		if (doConvert)
-			stringValue(s);
-		else
-			out.append(s);
-
-		return this;
-	}
-
-	/**
-	 * Appends a URI to the output.
-	 *
-	 * @param uri The URI to append to the output.
-	 * @return This object (for method chaining).
-	 * @throws IOException
-	 */
-	public SerializerWriter uriValue(Object uri) throws IOException {
-		return stringValue(uriResolver.resolve(uri));
-	}
-
-	//--------------------------------------------------------------------------------
-	// Overridden methods
-	//--------------------------------------------------------------------------------
-
-	@Override /* SerializerWriter */
-	public YamlWriter cr(int depth) throws IOException {
-		super.cr(depth);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter cre(int depth) throws IOException {
-		super.cre(depth);
-		return this;
-	}
-
-	/**
-	 * Performs an indentation only if we're currently past max indentation.
-	 *
-	 * @param depth The current indentation depth.
-	 * @return This object (for method chaining).
-	 * @throws IOException
-	 */
-	public YamlWriter smi(int depth) throws IOException {
-		if (depth > maxIndent)
-			super.s();
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter appendln(int indent, String text) throws IOException {
-		super.appendln(indent, text);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter appendln(String text) throws IOException {
-		super.appendln(text);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter append(int indent, String text) throws IOException {
-		super.append(indent, text);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter append(int indent, char c) throws IOException {
-		super.append(indent, c);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter s() throws IOException {
-		super.s();
-		return this;
-	}
-
-	/**
-	 * Adds a space only if the current indentation level is below maxIndent.
-	 *
-	 * @param indent
-	 * @return This object (for method chaining).
-	 * @throws IOException
-	 */
-	public YamlWriter s(int indent) throws IOException {
-		if (indent <= maxIndent)
-			super.s();
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter q() throws IOException {
-		super.q();
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter i(int indent) throws IOException {
-		super.i(indent);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter nl(int indent) throws IOException {
-		super.nl(indent);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter append(Object text) throws IOException {
-		super.append(text);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter append(String text) throws IOException {
-		super.append(text);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter appendIf(boolean b, String text) throws IOException {
-		super.appendIf(b, text);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter appendIf(boolean b, char c) throws IOException {
-		super.appendIf(b, c);
-		return this;
-	}
-
-	@Override /* SerializerWriter */
-	public YamlWriter append(char c) throws IOException {
-		super.append(c);
-		return this;
-	}
-}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_HTML.png b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_HTML.png
deleted file mode 100644
index b4a3576..0000000
Binary files a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_HTML.png and /dev/null differ
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSON.png b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSON.png
deleted file mode 100644
index 13b5c22..0000000
Binary files a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSON.png and /dev/null differ
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSONSchema.png b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSONSchema.png
deleted file mode 100644
index bf1cdc6..0000000
Binary files a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSONSchema.png and /dev/null differ
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSONSimple.png b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSONSimple.png
deleted file mode 100644
index 935e8a9..0000000
Binary files a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/doc-files/Example_JSONSimple.png and /dev/null differ
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/package.html b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/package.html
deleted file mode 100644
index d3c6c4e..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/proto/package.html
+++ /dev/null
@@ -1,1005 +0,0 @@
-<!DOCTYPE HTML>
-<!--
-/***************************************************************************************************************************
- * 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>
-<head>
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-	<style type="text/css">
-		/* For viewing in Page Designer */
-		@IMPORT url("../../../../../../javadoc.css");
-
-		/* For viewing in REST interface */
-		@IMPORT url("../htdocs/javadoc.css");
-		body { 
-			margin: 20px; 
-		}	
-	</style>
-	<script>
-		/* Replace all @code and @link tags. */	
-		window.onload = function() {
-			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
-			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>');
-		}
-	</script>
-</head>
-<body>
-<p>YAML Marshalling Support</p>
-<script>
-	function toggle(x) {
-		var div = x.nextSibling;
-		while (div != null && div.nodeType != 1)
-			div = div.nextSibling;
-		if (div != null) {
-			var d = div.style.display;
-			if (d == 'block' || d == '') {
-				div.style.display = 'none';
-				x.className += " closed";
-			} else {
-				div.style.display = 'block';
-				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
-			}
-		}
-	}
-</script>
-
-<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
-<ol class='toc'>
-	<li><p><a class='doclink' href='#Overview'>JSON support overview</a></p> 
-	<ol>
-		<li><p><a class='doclink' href='#OverviewExample'>Example</a></p>
-	</ol>
-	<li><p><a class='doclink' href='#JsonSerializer'>JsonSerializer class</a></p> 
-	<ol>
-		<li><p><a class='doclink' href='#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
-		<li><p><a class='doclink' href='#Collections'>Collections</a></p>
-		<li><p><a class='doclink' href='#JsonSchemaSupport'>JSON-Schema support</a></p>
-		<li><p><a class='doclink' href='#Recursion'> Non-tree models and recursion detection</a></p>
-		<li><p><a class='doclink' href='#SerializerConfigurableProperties'>Configurable properties</a></p>
-		<li><p><a class='doclink' href='#SerializerOtherNotes'>Other notes</a></p>
-	</ol>
-	<li><p><a class='doclink' href='#JsonParser'>JsonParser class</a></p> 
-	<ol>
-		<li><p><a class='doclink' href='#GenericParsing'>Parsing into generic POJO models</a></p>
-		<li><p><a class='doclink' href='#ParserConfigurableProperties'>Configurable properties</a></p>
-		<li><p><a class='doclink' href='#ParserOtherNotes'>Other notes</a></p>
-	</ol>
-</ol>
-
-<!-- ======================================================================================================== -->
-<a id="Overview"></a>
-<h2 class='topic' onclick='toggle(this)'>1 -JSON support overview</h2>
-<div class='topic'>
-	<p>
-		Juneau supports converting arbitrary POJOs to and from JSON using ultra-efficient serializers and parsers.
-		<br>The JSON serializer converts POJOs directly to JSON without the need for intermediate DOM objects using a 
-		highly-efficient state machine.
-		<br>Likewise, the JSON parser creates POJOs directly from JSON without the need for intermediate DOM objects. 
-	</p>
-	<p>
-		Juneau can serialize and parse instances of any of the following POJO types:
-	</p>
-	<ul class='spaced-list'>
-		<li>
-			Java primitives and primitive objects (e.g. <code>String</code>, <code>Integer</code>, <code>Boolean</code>, 
-			<code>Float</code>).
-		<li>
-			Java Collections Framework objects (e.g. <code>HashSet</code>, <code>TreeMap</code>) containing anything on 
-			this list.
-		<li>
-			Multi-dimensional arrays of any type on this list.
-		<li>
-			Java Beans with properties of any type on this list.
-		<li>
-			Classes with standard transformations to and from <code>Strings</code> (e.g. classes containing 
-			<code>toString()</code>, <code>fromString()</code>, <code>valueOf()</code>, <code>constructor(String)</code>).
-		<li>
-			Non-serializable classes and properties with associated <code>PojoSwaps</code> that convert them to 
-			serializable forms.
-	</ul>
-	<p>
-		Refer to <a href='../../../../overview-summary.html#juneau-marshall.PojoCategories' class='doclink'>POJO Categories</a> 
-		for a complete definition of supported POJOs.
-	</p>
-	
-	<h5 class='topic'>Prerequisites</h5>
-	<p>
-		The Juneau JSON serialization and parsing support does not require any external prerequisites.  
-		It only requires Java 1.6 or above.
-	</p>
-
-	<!-- ======================================================================================================== -->
-	<a id="OverviewExample"></a>
-	<h3 class='topic' onclick='toggle(this)'>1.1 - JSON support overview - example</h3>
-	<div class='topic'>
-		<p>
-			The example shown here is from the Address Book resource located in the 
-			<code>org.apache.juneau.sample.war</code> application.
-			<br>The POJO model consists of a <code>List</code> of <code>Person</code> beans, with each <code>Person</code> 
-			containing zero or more <code>Address</code> beans.
-		</p>
-		<p>
-			When you point a browser at <code>/sample/addressBook</code>, the POJO is rendered as HTML:
-		</p>
-		<img class='bordered' src="doc-files/Example_HTML.png">
-		<p>
-			By appending <code>?Accept=<i>mediaType</i>&amp;plainText=true</code> to the URL, you can view the data in 
-			the various supported JSON formats:
-		</p>
-		
-		<h5 class='figure'>Normal JSON</h5>
-		<img class='bordered' src="doc-files/Example_JSON.png">
-		
-		<h5 class='figure'>Simple JSON</h5>
-		<img class='bordered' src="doc-files/Example_JSONSimple.png">
-
-		<p>
-			In addition to serializing POJOs to JSON, Juneau includes support for serializing POJO metamodels to 
-			JSON Schema.
-		</p>
-		
-		<h5 class='figure'>JSON Schema</h5>
-		<img class='bordered' src="doc-files/Example_JSONSchema.png">
-		
-		<p>
-			The JSON data type produced depends on the Java object type being serialized.
-		</p>
-		<ul class='spaced-list'>
-			<li>
-				Primitives and primitive objects are converted to JSON primitives.
-			<li>
-				Beans and Maps are converted to JSON objects.
-			<li>
-				Collections and arrays are converted to JSON arrays.
-			<li>
-				Anything else is converted to JSON strings.
-		</ul>
-			
-		<h5 class='topic'>Examples:</h5>
-		<table class='styled'>
-			<tr>
-				<th>POJO type</th>
-				<th>Example</th>
-				<th>Serialized form</th>
-			</tr>
-			<tr>
-				<td>String</td>
-				<td><code>serializer.serialize(<js>"foobar"</js>);</code></td>
-				<td><code><js>'foobar'</js></code>
-			</tr>
-			<tr>
-				<td>Number</td>
-				<td><code>serializer.serialize(123);</code></td>
-				<td><code><jk>123</jk></code>
-			</tr>
-			<tr>
-				<td>Boolean</td>
-				<td><code>serializer.serialize(<jk>true</jk>);</code></td>
-				<td><code><jk>true</jk></code>
-			</tr>
-			<tr>
-				<td>Null</td>
-				<td><code>serializer.serialize(<jk>null</jk>);</code></td>
-				<td><code><jk>null</jk></code>
-			</tr>
-			<tr>
-				<td>Beans with properties of any type on this list</td>
-				<td><code>serializer.serialize(<jk>new</jk> MyBean());</code></td>
-				<td><code>{p1:<js>'val1'</js>,p2:<jk>true</jk>}</code>
-			</tr>
-			<tr>
-				<td>Maps with values of any type on this list</td>
-				<td><code>serializer.serialize(<jk>new</jk> TreeMap());</code></td>
-				<td><code>{key1:<js>'val1'</js>,key2:<jk>true</jk>}</code>
-			</tr>
-			<tr>
-				<td>Collections and arrays of any type on this list</td>
-				<td><code>serializer.serialize(<jk>new</jk> Object[]{1,<js>"foo"</js>,<jk>true</jk>});</code></td>
-				<td><code>[1,'foo',true]</code>
-			</tr>
-		</table>
-		<p>
-			In addition, swaps can be used to convert non-serializable POJOs into serializable forms, such as converting 
-			<code>Calendar</code> object to ISO8601 strings, or <code><jk>byte</jk>[]</code> arrays to Base-64 
-			encoded strings.
-			<br>These swaps can be associated at various levels:
-		</p>
-		<ul class='spaced-list'>
-			<li>
-				On serializer and parser instances to handle all objects of the class type globally.
-			<li>
-				On classes through the <code><ja>@Bean</ja></code> annotation.
-			<li>
-				On bean properties through the <code><ja>@BeanProperty</ja></code> annotations.
-		</ul>
-		<p>
-			For more information about transforms, refer to <a class='doclink' 
-			href='../transform/package-summary.html#TOC'>org.apache.juneau.transform</a>.
-		</p>
-	</div>
-</div>
-
-<!-- ======================================================================================================== -->
-<a id="JsonSerializer"></a>
-<h2 class='topic' onclick='toggle(this)'>2 - JsonSerializer class</h2>
-<div class='topic'>
-	<p>
-		{@link org.apache.juneau.json.JsonSerializer} is the class used to convert POJOs to JSON.
-		<br>{@link org.apache.juneau.json.JsonSchemaSerializer} is the class used to generate JSON-Schema from POJOs.
-	</p>	
-	<p>
-		The JSON serializer includes several configurable settings.
-		<br>Static reusable instances of Json serializers are provided with commonly-used settings:
-	</p>
-	<ul class='spaced-list'>
-		<li>
-			{@link org.apache.juneau.json.JsonSerializer#DEFAULT} - All default settings
-		<li>
-			{@link org.apache.juneau.json.JsonSerializer#DEFAULT_LAX} - Single quotes, only quote attributes when 
-			necessary.
-		<li>
-			{@link org.apache.juneau.json.JsonSerializer#DEFAULT_LAX_READABLE} - Readable output.
-	</ul>
-	
-	<h5 class='topic'>Notes about examples</h5>
-	<p>
-		The examples shown in this document will use single-quote, readable settings.
-		<br>For brevity, the examples will use public fields instead of getters/setters to reduce the size of the examples.
-		<br>In the real world, you'll typically want to use standard bean getters and setters.
-	</p>
-	<p>
-		To start off simple, we'll begin with the following simplified bean and build upon it.
-	</p>
-	<p class='bcode w800'>
-	<jk>public class</jk> Person {
-		<jc>// Bean properties</jc>
-		<jk>public int</jk> <jf>id</jf>;
-		<jk>public</jk> String <jf>name</jf>;
-
-		<jc>// Bean constructor (needed by parser)</jc>
-		<jk>public</jk> Person() {}
-
-		<jc>// Normal constructor</jc>
-		<jk>public</jk> Person(<jk>int</jk> id, String name) {
-			<jk>this</jk>.<jf>id</jf> = id;
-			<jk>this</jk>.<jf>name</jf> = name;
-		}
-	}
-	</p>
-	<p>
-		The following code shows how to convert this to simple JSON:
-	</p>
-	<p class='bcode w800'>
-	<jc>// Use serializer with readable output, simple mode.</jc>
-	JsonSerializer s = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>;
-
-	<jc>// Create our bean.</jc>
-	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>);
-
-	<jc>// Serialize the bean to JSON.</jc>
-	String json = s.serialize(p);
-	</p>
-	<p>
-		We could have also created a new serializer with the same settings using the following code:
-	</p>
-	<p class='bcode w800'>
-	JsonSerializer s = JsonSerializer.<jsm>create</jsm>().simple().ws().sq().build();
-	</p>
-	
-	<p>
-		The code above produces the following output:
-	</p>
-	<p class='bcode w800'>
-	{
-		id: <jk>1</jk>, 
-		name: <js>'John Smith'</js>
-	}
-	</p>
-	
-
-	<!-- ======================================================================================================== -->
-	<a id="BeanAnnotations"></a>
-	<h3 class='topic' onclick='toggle(this)'>2.1 - @Bean and @BeanProperty annotations</h3>
-	<div class='topic'>
-		<p>
-			The {@link org.apache.juneau.annotation.Bean @Bean} and 
-			{@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotations are used to customize the 
-			behavior of beans across the entire framework.
-			<br>They have various uses:
-		</p>
-		<ul class='spaced-list'>
-			<li>
-				Hiding bean properties.
-			<li>
-				Specifying the ordering of bean properties.
-			<li>
-				Overriding the names of bean properties.
-			<li>
-				Associating swaps at both the class and property level (to convert non-serializable POJOs to 
-				serializable forms).
-		</ul>
-		<p>
-			For example, we now add a <code>birthDate</code> property, and associate a swap with it to transform it to 
-			an ISO8601 date-time string in GMT time.
-			<br>We'll also add a couple of <code>URI</code> properties.
-			<br>By default, <code>Calendars</code> are treated as beans by the framework, which is usually not how you 
-			want them serialized.
-			<br>Using swaps, we can convert them to standardized string forms.
-		</p>
-		<p class='bcode w800'>	
-	<jk>public class</jk> Person {
-		<jc>// Bean properties</jc>
-		<jk>public int</jk> <jf>id</jf>;
-		<jk>public</jk> String <jf>name</jf>;
-		<jk>public</jk> URI <jf>uri</jf>;
-		<jk>public</jk> URI <jf>addressBookUri</jf>;
-
-		<ja>@BeanProperty</ja>(swap=CalendarSwap.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
-
-
-		<jc>// Bean constructor (needed by parser)</jc>
-		<jk>public</jk> Person() {}
-
-		<jc>// Normal constructor</jc>
-		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri, String birthDate) <jk>throws</jk> Exception {
-			<jk>this</jk>.<jf>id</jf> = id;
-			<jk>this</jk>.<jf>name</jf> = name;
-			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
-			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
-			<jk>this</jk>.<jf>birthDate</jf> = <jk>new</jk> GregorianCalendar();
-			<jk>this</jk>.<jf>birthDate</jf>.setTime(DateFormat.<jsm>getDateInstance</jsm>(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
-		}
-	}
-		</p>
-		<p>
-			Next, we alter our code to pass in the birthdate:
-		</p>
-		<p class='bcode w800'>
-	<jc>// Create our bean.</jc>
-	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, 
-		<js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
-		</p>
-		<p>
-			Now when we rerun the sample code, we'll get the following:
-		</p>
-		<p class='bcode w800'>
-	{
-		id: <jk>1</jk>, 
-		name: <js>'John Smith'</js>, 
-		uri: <js>'http://sample/addressBook/person/1'</js>, 
-		addressBookUri: <js>'http://sample/addressBook'</js>, 
-		birthDate: <js>'1946-08-12T00:00:00Z'</js>
-	}
-		</p>
-		<p>
-			Another useful feature is the {@link org.apache.juneau.annotation.Bean#propertyNamer() @Bean.propertyNamer()} annotation that 
-			allows you to plug in your own logic for determining bean property names.
-			<br>The {@link org.apache.juneau.PropertyNamerDLC} is an example of an alternate property namer.
-			It converts bean property names to lowercase-dashed format.
-		</p>
-		
-		<h5 class='topic'>Example:</h5>
-		<p class='bcode w800'>	
-	<ja>@Bean</ja>(propertyNamer=PropertyNamerDLC.<jk>class</jk>)
-	<jk>public class</jk> Person {
-		...
-		</p>
-		
-		<h5 class='figure'>Results</h5>
-		<p class='bcode w800'>
-	{
-		id: <jk>1</jk>, 
-		name: <js>'John Smith'</js>, 
-		uri: <js>'http://sample/addressBook/person/1'</js>, 
-		<js>'address-book-uri'</js>: <js>'http://sample/addressBook'</js>, 
-		<js>'birth-date'</js>: <js>'1946-08-12T00:00:00Z'</js>
-	}
-		</p>
-	</div>
-	
-		
-	<!-- ======================================================================================================== -->
-	<a id="Collections"></a>
-	<h3 class='topic' onclick='toggle(this)'>2.2 - Collections</h3>
-	<div class='topic'>
-		<p>
-			In our example, let's add a list-of-beans property to our sample class:
-		</p>
-		<p class='bcode w800'>
-	<jk>public class</jk> Person {
-		
-		<jc>// Bean properties</jc>
-		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
-		...
-	}
-		</p>
-		<p>
-			The <code>Address</code> class has the following properties defined:
-		</p>
-		<p class='bcode w800'>
-	<jk>public class</jk> Address {
-
-		<jc>// Bean properties</jc>
-		<jk>public</jk> URI <jf>uri</jf>;
-		<jk>public</jk> URI <jf>personUri</jf>;
-		<jk>public int</jk> <jf>id</jf>;
-		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
-		<jk>public int</jk> <jf>zip</jf>;
-		<jk>public boolean</jk> <jf>isCurrent</jf>;
-	}
-		</p>
-		<p>
-			Next, add some quick-and-dirty code to add an address to our person bean:
-		</p>
-		<p class='bcode w800'>
-	<jc>// Use serializer with readable output, simple mode.</jc>
-	JsonSerializer s = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>;
-
-	<jc>// Create our bean.</jc>
-	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, 
-		<js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
-	Address a = <jk>new</jk> Address();
-	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
-	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
-	a.<jf>id</jf> = 1;
-	a.<jf>street</jf> = <js>"100 Main Street"</js>;
-	a.<jf>city</jf> = <js>"Anywhereville"</js>;
-	a.<jf>state</jf> = <js>"NY"</js>;
-	a.<jf>zip</jf> = 12345;
-	a.<jf>isCurrent</jf> = <jk>true</jk>;
-	p.<jf>addresses</jf>.add(a);	
-		</p>
-		<p>
-			Now when we run the sample code, we get the following:
-		</p>
-		<p class='bcode w800'>
-	{
-		id: <jk>1</jk>, 
-		name: <js>'John Smith'</js>, 
-		uri: <js>'http://sample/addressBook/person/1'</js>, 
-		addressBookUri: <js>'http://sample/addressBook'</js>, 
-		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
-		addresses: [
-			{
-				uri: <js>'http://sample/addressBook/address/1'</js>, 
-				personUri: <js>'http://sample/addressBook/person/1'</js>, 
-				id: <jk>1</jk>, 
-				street: <js>'100 Main Street'</js>, 
-				city: <js>'Anywhereville'</js>, 
-				state: <js>'NY'</js>, 
-				zip: <jk>12345</jk>, 
-				isCurrent: <jk>true</jk>
-			}
-		]
-	}
-		</p>
-	</div>
-	
-
-	<!-- ======================================================================================================== -->
-	<a id="JsonSchemaSupport"></a>
-	<h3 class='topic' onclick='toggle(this)'>2.3 - JSON-Schema support</h3>
-	<div class='topic'>
-		<p>
-			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 
-			added for creating instances of schema serializers from the regular serializer instance.
-		</p>
-		<p>
-			<i>Note:</i> As of this writing, JSON-Schema has not been standardized, so the output generated by the 
-			schema serializer may be subject to future modifications.
-		</p>
-		<p>
-			Lets start with the classes from the previous examples:
-		</p>
-		<p class='bcode w800'>
-	<jk>public class</jk> Person {
-		<jc>// Bean properties</jc>
-		<jk>public int</jk> <jf>id</jf>;
-		<jk>public</jk> String <jf>name</jf>;
-		<jk>public</jk> URI <jf>uri</jf>;
-		<jk>public</jk> URI <jf>addressBookUri</jf>;
-		<ja>@BeanProperty</ja>(swap=CalendarSwap.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
-		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = <jk>new</jk> LinkedList&lt;Address&gt;();
-
-		<jc>// Bean constructor (needed by parser)</jc>
-		<jk>public</jk> Person() {}
-
-		<jc>// Normal constructor</jc>
-		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri, String birthDate) <jk>throws</jk> Exception {
-			<jk>this</jk>.<jf>id</jf> = id;
-			<jk>this</jk>.<jf>name</jf> = name;
-			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
-			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
-			<jk>this</jk>.<jf>birthDate</jf> = <jk>new</jk> GregorianCalendar();
-			<jk>this</jk>.<jf>birthDate</jf>.setTime(DateFormat.getDateInstance(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate));
-		}
-	}
-
-	<jk>public class</jk> Address {
-		<jc>// Bean properties</jc>
-		<jk>public</jk> URI <jf>uri</jf>;
-		<jk>public</jk> URI <jf>personUri</jf>;
-		<jk>public int</jk> <jf>id</jf>;
-		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
-		<jk>public int</jk> <jf>zip</jf>;
-		<jk>public boolean</jk> <jf>isCurrent</jf>;
-	}
-		</p>
-		<p>
-			The code for creating our POJO model and generating JSON-Schema is shown below:
-		</p>
-		<p class='bcode w800'>
-	<jc>// Get the schema serializer for one of the default JSON serializers.</jc>
-	JsonSchemaSerializer s = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>.getSchemaSerializer();
-
-	<jc>// Create our bean.</jc>
-	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, 
-		<js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
-	Address a = <jk>new</jk> Address();
-	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
-	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
-	a.<jf>id</jf> = 1;
-	a.<jf>street</jf> = <js>"100 Main Street"</js>;
-	a.<jf>city</jf> = <js>"Anywhereville"</js>;
-	a.<jf>state</jf> = <js>"NY"</js>;
-	a.<jf>zip</jf> = 12345;
-	a.<jf>isCurrent</jf> = <jk>true</jk>;
-	p.<jf>addresses</jf>.add(a);
-
-	<jc>// Get the JSON Schema corresponding to the JSON generated above.</jc>
-	String jsonSchema = s.serialize(p);
-		</p>
-		
-		<h5 class='figure'>Results</h5>
-		<p class='bcode w800'>
-	{
-		type: <js>'object'</js>, 
-		description: <js>'org.apache.juneau.sample.Person'</js>, 
-		properties: {
-			id: {
-				type: <js>'number'</js>, 
-				description: <js>'int'</js>
-			}, 
-			name: {
-				type: <js>'string'</js>, 
-				description: <js>'java.lang.String'</js>
-			}, 
-			uri: {
-				type: <js>'any'</js>, 
-				description: <js>'java.net.URI'</js>
-			}, 
-			addressBookUri: {
-				type: <js>'any'</js>, 
-				description: <js>'java.net.URI'</js>
-			}, 
-			birthDate: {
-				type: <js>'any'</js>, 
-				description: <js>'java.util.Calendar'</js>
-			}, 
-			addresses: {
-				type: <js>'array'</js>, 
-				description: <js>'java.util.LinkedList&lt;org.apache.juneau.sample.Address&gt;'</js>, 
-				items: {
-					type: <js>'object'</js>, 
-					description: <js>'org.apache.juneau.sample.Address'</js>, 
-					properties: {
-						uri: {
-							type: <js>'any'</js>, 
-							description: <js>'java.net.URI'</js>
-						}, 
-						personUri: {
-							type: <js>'any'</js>, 
-							description: <js>'java.net.URI'</js>
-						}, 
-						id: {
-							type: <js>'number'</js>, 
-							description: <js>'int'</js>
-						}, 
-						street: {
-							type: <js>'string'</js>, 
-							description: <js>'java.lang.String'</js>
-						}, 
-						city: {
-							type: <js>'string'</js>, 
-							description: <js>'java.lang.String'</js>
-						}, 
-						state: {
-							type: <js>'string'</js>, 
-							description: <js>'java.lang.String'</js>
-						}, 
-						zip: {
-							type: <js>'number'</js>, 
-							description: <js>'int'</js>
-						}, 
-						isCurrent: {
-							type: <js>'boolean'</js>, 
-							description: <js>'boolean'</js>
-						}
-					}
-				}
-			}
-		}
-	}
-		</p>
-	</div>
-
-
-	<!-- ======================================================================================================== -->
-	<a id="Recursion"></a>
-	<h3 class='topic' onclick='toggle(this)'>2.4 - Non-tree models and recursion detection</h3>
-	<div class='topic'>
-		<p>
-			The JSON serializer 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 
-			first).
-		</p>
-		<p>
-			If you still want to use the JSON serializer on such models, Juneau provides the 
-			{@link org.apache.juneau.serializer.Serializer#SERIALIZER_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>
-		<p>
-			For example, let's make a POJO model out of the following classes:
-		</p>
-		<p class='bcode w800'>
-	<jk>public class</jk> A {
-		<jk>public</jk> B b;
-	}
-	
-	<jk>public class</jk> B {
-		<jk>public</jk> C c;
-	}
-	
-	<jk>public class</jk> C {
-		<jk>public</jk> A a;
-	}
-		</p>
-		<p>
-			Now we create a model with a loop and serialize the results.
-		</p>
-		<p class='bcode w800'>
-	<jc>// Clone an existing serializer and set property for detecting recursions.</jc>
-	JsonSerializer s = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>.builder().detectRecursions(<jk>true</jk>).build();
-
-	<jc>// Create a recursive loop.</jc>
-	A a = <jk>new</jk> A();
-	a.<jf>b</jf> = <jk>new</jk> B();
-	a.<jf>b</jf>.<jf>c</jf> = <jk>new</jk> C();
-	a.<jf>b</jf>.<jf>c</jf>.<jf>a</jf> = a;
-	
-	<jc>// Serialize to JSON.</jc>
-	String json = s.serialize(a);
-		</p>
-		<p>
-			What we end up with is the following, which does not serialize the contents of the <code>c</code> field:
-		</p>
-		<p class='bcode w800'>
-	{
-		b: {
-			c: {
-			}
-		}
-	}
-		</p>
-		<p>
-			Without recursion detection enabled, this would cause a stack-overflow error.
-		</p>
-		<p>
-			Recursion detection introduces a performance penalty of around 20%.
-			<br>For this reason the setting is disabled by default.
-		</p>
-	</div>
-
-
-	<!-- ======================================================================================================== -->
-	<a id="SerializerConfigurableProperties"></a>
-	<h3 class='topic' onclick='toggle(this)'>2.5 - Configurable properties</h3>
-	<div class='topic'>
-		<p>
-			See the following classes for all configurable properties that can be used on this serializer:
-		</p>
-		<ul class='spaced-list'>
-			<li>
-				{@link org.apache.juneau.BeanContext} - Bean context properties.
-			<li>
-				{@link org.apache.juneau.json.JsonSerializer} - Serializer context properties.
-		</ul>
-	</div>		
-
-
-	<!-- ======================================================================================================== -->
-	<a id="SerializerOtherNotes"></a>
-	<h3 class='topic' onclick='toggle(this)'>2.6 - Other notes</h3>
-	<div class='topic'>
-		<ul class='spaced-list'>
-			<li>
-				Like all other Juneau serializers, the JSON serializer is thread safe and maintains an internal cache 
-				of bean classes encountered.
-				<br>For performance reasons, it's recommended that serializers be reused whenever possible instead of 
-				always creating new instances.
-		</ul>
-	</div>
-</div>
-
-
-<!-- ======================================================================================================== -->
-<a id="JsonParser"></a>
-<h2 class='topic' onclick='toggle(this)'>3 - JsonParser class</h2>
-<div class='topic'>
-	<p>
-		The {@link org.apache.juneau.json.JsonParser} class is the class used to parse JSON back into POJOs.
-	</p>	
-	<p>
-		The JSON parser supports ALL valid JSON, including:
-	</p>
-	<ul class='spaced-list'>
-		<li>
-			Javascript comments.
-		<li>
-			Single or double quoted values.
-		<li>
-			Quoted (strict) or unquoted (non-strict) attributes.
-		<li>
-			JSON fragments (such as string, numeric, or boolean primitive values).
-		<li>
-			Concatenated strings. 
-	</ul>	
-	<p>
-		A static reusable instance of <code>JsonParser</code> is also provided for convenience:
-	</p>
-	<ul>
-		<li>{@link org.apache.juneau.json.JsonParser#DEFAULT}
-	</ul>
-	<p>
-		Let's build upon the previous example and parse the generated JSON back into the original bean.
-		<br>We start with the JSON that was generated.
-	</p>
-	<p class='bcode w800'>
-	<jc>// Use serializer with readable output, simple mode.</jc>
-	JsonSerializer s = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>;
-
-	<jc>// Create our bean.</jc>
-	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, 
-		<js>"http://sample/addressBook"</js>, <js>"Aug 12, 1946"</js>);
-	Address a = <jk>new</jk> Address();
-	a.<jf>uri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/address/1"</js>);
-	a.<jf>personUri</jf> = <jk>new</jk> URI(<js>"http://sample/addressBook/person/1"</js>);
-	a.<jf>id</jf> = 1;
-	a.<jf>street</jf> = <js>"100 Main Street"</js>;
-	a.<jf>city</jf> = <js>"Anywhereville"</js>;
-	a.<jf>state</jf> = <js>"NY"</js>;
-	a.<jf>zip</jf> = 12345;
-	a.<jf>isCurrent</jf> = <jk>true</jk>;
-	p.<jf>addresses</jf>.add(a);	
-
-	<jc>// Serialize the bean to JSON.</jc>
-	String json = s.serialize(p);
-	</p>
-	<p>
-		This code produced the following:
-	</p>
-	<p class='bcode w800'>
-	{
-		id: <jk>1</jk>, 
-		name: <js>'John Smith'</js>, 
-		uri: <js>'http://sample/addressBook/person/1'</js>, 
-		addressBookUri: <js>'http://sample/addressBook'</js>, 
-		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
-		addresses: [
-			{
-				uri: <js>'http://sample/addressBook/address/1'</js>, 
-				personUri: <js>'http://sample/addressBook/person/1'</js>, 
-				id: <jk>1</jk>, 
-				street: <js>'100 Main Street'</js>, 
-				city: <js>'Anywhereville'</js>, 
-				state: <js>'NY'</js>, 
-				zip: <jk>12345</jk>, 
-				isCurrent: <jk>true</jk>
-			}
-		]
-	}
-	</p>
-	<p>
-		The code to convert this back into a bean is:
-	</p>
-	<p class='bcode w800'>
-	<jc>// Parse it back into a bean using the reusable JSON parser.</jc>
-	Person p = JsonParser.<jsf>DEFAULT</jsf>.parse(json, Person.<jk>class</jk>);
-
-	<jc>// Render it back as JSON.</jc>
-	json = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>.serialize(p);
-	</p>
-	<p>
-		We print it back out to JSON to show that all the data has been preserved:
-	</p>
-	<p class='bcode w800'>
-	{
-		id: <jk>1</jk>, 
-		name: <js>'John Smith'</js>, 
-		uri: <js>'http://sample/addressBook/person/1'</js>, 
-		addressBookUri: <js>'http://sample/addressBook'</js>, 
-		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
-		addresses: [
-			{
-				uri: <js>'http://sample/addressBook/address/1'</js>, 
-				personUri: <js>'http://sample/addressBook/person/1'</js>, 
-				id: <jk>1</jk>, 
-				street: <js>'100 Main Street'</js>, 
-				city: <js>'Anywhereville'</js>, 
-				state: <js>'NY'</js>, 
-				zip: <jk>12345</jk>, 
-				isCurrent: <jk>true</jk>
-			}
-		]
-	}	
-	</p>
-	
-
-	<!-- ======================================================================================================== -->
-	<a id="GenericParsing"></a>
-	<h3 class='topic' onclick='toggle(this)'>3.1 - Parsing into generic POJO models</h3>
-	<div class='topic'>
-		<p>
-			The JSON parser is not limited to parsing back into the original bean classes.
-			<br>If the bean classes are not available on the parsing side, the parser can also be used to 
-			parse into a generic model consisting of <code>Maps</code>, <code>Collections</code>, and primitive
-			objects.
-		</p>
-		<p>
-			You can parse into any <code>Map</code> type (e.g. <code>HashMap</code>, <code>TreeMap</code>), but
-			using {@link org.apache.juneau.ObjectMap} is recommended since it has many convenience methods
-			for converting values to various types.
-			<br>The same is true when parsing collections.  You can use any Collection (e.g. <code>HashSet</code>, 
-			<code>LinkedList</code>) or array (e.g. <code>Object[]</code>, <code>String[]</code>, 
-			<code>String[][]</code>), but using {@link org.apache.juneau.ObjectList} is recommended.
-		</p>
-		<p>
-			When the map or list type is not specified, or is the abstract <code>Map</code>, <code>Collection</code>, 
-			or <code>List</code> types, the parser will use <code>ObjectMap</code> and <code>ObjectList</code> by 
-			default.
-		</p>
-		<p>
-			Starting back with our original JSON:
-		</p>
-		<p class='bcode w800'>
-	{
-		id: <jk>1</jk>, 
-		name: <js>'John Smith'</js>, 
-		uri: <js>'http://sample/addressBook/person/1'</js>, 
-		addressBookUri: <js>'http://sample/addressBook'</js>, 
-		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
-		addresses: [
-			{
-				uri: <js>'http://sample/addressBook/address/1'</js>, 
-				personUri: <js>'http://sample/addressBook/person/1'</js>, 
-				id: <jk>1</jk>, 
-				street: <js>'100 Main Street'</js>, 
-				city: <js>'Anywhereville'</js>, 
-				state: <js>'NY'</js>, 
-				zip: <jk>12345</jk>, 
-				isCurrent: <jk>true</jk>
-			}
-		]
-	}
-		</p>
-		<p>
-			We can parse this into a generic <code>ObjectMap</code>:
-		</p>
-		<p class='bcode w800'>	
-	<jc>// Parse JSON into a generic POJO model.</jc>
-	ObjectMap m = JsonParser.<jsf>DEFAULT</jsf>.parse(json, ObjectMap.<jk>class</jk>);
-
-	<jc>// Convert it back to JSON.</jc>
-	String json = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>.serialize(m);
-		</p>
-		<p>
-			What we end up with is the exact same output.
-			<br>Even the numbers and booleans are preserved because they are parsed into <code>Number</code> and 
-			<code>Boolean</code> objects when parsing into generic models.
-		</p>
-		<p class='bcode w800'>
-	{
-		id: <jk>1</jk>, 
-		name: <js>'John Smith'</js>, 
-		uri: <js>'http://sample/addressBook/person/1'</js>, 
-		addressBookUri: <js>'http://sample/addressBook'</js>, 
-		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
-		addresses: [
-			{
-				uri: <js>'http://sample/addressBook/address/1'</js>, 
-				personUri: <js>'http://sample/addressBook/person/1'</js>, 
-				id: <jk>1</jk>, 
-				street: <js>'100 Main Street'</js>, 
-				city: <js>'Anywhereville'</js>, 
-				state: <js>'NY'</js>, 
-				zip: <jk>12345</jk>, 
-				isCurrent: <jk>true</jk>
-			}
-		]
-	}
-		</p>
-		<p>
-			Once parsed into a generic model, various convenience methods are provided on the <code>ObjectMap</code>
-				and <code>ObjectList</code> classes to retrieve values:
-		</p>
-		<p class='bcode w800'>
-	<jc>// Parse JSON into a generic POJO model.</jc>
-	ObjectMap m = JsonParser.<jsf>DEFAULT</jsf>.parse(json, ObjectMap.<jk>class</jk>);
-
-	<jc>// Get some simple values.</jc>
-	String name = m.getString(<js>"name"</js>);
-	<jk>int</jk> id = m.getInt(<js>"id"</js>);
-
-	<jc>// Get a value convertable from a String.</jc>
-	URI uri = m.get(URI.<jk>class</jk>, <js>"uri"</js>);
-
-	<jc>// Get a value using a swap.</jc>
-	CalendarSwap swap = <jk>new</jk> CalendarSwap.ISO8601DTZ();
-	Calendar birthDate = m.get(swap, <js>"birthDate"</js>);
-
-	<jc>// Get the addresses.</jc>
-	ObjectList addresses = m.getObjectList(<js>"addresses"</js>);
-
-	<jc>// Get the first address and convert it to a bean.</jc>
-	Address address = addresses.get(Address.<jk>class</jk>, 0);
-		</p>
-
-		<p>
-			As a general rule, parsing into beans is often more efficient than parsing into generic models.
-			<br>And working with beans is often less error prone than working with generic models.
-		</p>		
-	</div>
-
-
-	<!-- ======================================================================================================== -->
-	<a id="ParserConfigurableProperties"></a>
-	<h3 class='topic' onclick='toggle(this)'>3.2 - Configurable properties</h3>
-	<div class='topic'>
-		<p>
-			See the following classes for all configurable properties that can be used on this parser:
-		</p>
-		<ul class='spaced-list'>
-			<li>
-				{@link org.apache.juneau.BeanContext} - Bean context properties.
-			<li>
-				{@link org.apache.juneau.json.JsonParser} - Serializer context properties.
-		</ul>
-	</div>		
-
-
-	<!-- ======================================================================================================== -->
-	<a id="ParserOtherNotes"></a>
-	<h3 class='topic' onclick='toggle(this)'>3.3 - Other notes</h3>
-	<div class='topic'>
-		<ul class='spaced-list'>
-			<li>
-				Like all other Juneau parsers, the JSON parser is thread safe and maintains an internal cache of bean 
-				classes encountered.
-				<br>For performance reasons, it's recommended that parser be reused whenever possible instead of always 
-				creating new instances.
-		</ul>
-	</div>
-	
-</div>
-<p align="center"><i><b>*** fín ***</b></i></p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/juneau-doc/juneau-doc.jar b/juneau-doc/juneau-doc.jar
index 546e201..2018967 100644
Binary files a/juneau-doc/juneau-doc.jar and b/juneau-doc/juneau-doc.jar differ
diff --git a/juneau-doc/src/main/java/org/apache/juneau/doc/internal/DocGenerator.java b/juneau-doc/src/main/java/org/apache/juneau/doc/internal/DocGenerator.java
index 75f5d12..bcd86e6 100644
--- a/juneau-doc/src/main/java/org/apache/juneau/doc/internal/DocGenerator.java
+++ b/juneau-doc/src/main/java/org/apache/juneau/doc/internal/DocGenerator.java
@@ -154,7 +154,7 @@ public class DocGenerator {
 	}
 
 	static class PageFile implements Comparable<PageFile> {
-		String idWithNum, id, fullId, title, contents;
+		String idWithNum, id, num, fullId, title, contents;
 		String number, fullNumber;
 		String tags = "";
 
@@ -164,6 +164,7 @@ public class DocGenerator {
 			try {
 				String n = f.getName();
 				idWithNum = n.substring(0, n.lastIndexOf('.'));
+				num = n.substring(0, n.indexOf('.'));
 				id = idWithNum.substring(n.indexOf('.') + 1);
 				fullId = (parent == null ? "" : parent.fullId + ".") + id;
 				number = n.substring(0, n.indexOf('.')).replaceAll("^[0]+", "");
@@ -182,14 +183,18 @@ public class DocGenerator {
 				throw new RuntimeException("Problem with file " + f.getAbsolutePath());
 			}
 
-			File d = new File(f.getParentFile(), idWithNum);
-			if (d.exists())
-				for (File f2 : d.listFiles()) {
-					if (f2.isFile())
-						pageFiles.add(new PageFile(this, f2, docFiles));
-					else if (f2.isDirectory() && f2.getName().contains("doc-files"))
-						docFiles.addAll(Arrays.asList(f2.listFiles()));
+			for (File d : f.getParentFile().listFiles()) {
+				if (d.isDirectory() && d.getName().startsWith(num + '.')) {
+					if (! d.getName().matches(idWithNum))
+						throw new RuntimeException("Unmatched file/directory: file=["+f.getName()+"], directory=["+d.getName()+"]");
+					for (File f2 : d.listFiles()) {
+						if (f2.isFile())
+							pageFiles.add(new PageFile(this, f2, docFiles));
+						else if (f2.isDirectory() && f2.getName().contains("doc-files"))
+							docFiles.addAll(Arrays.asList(f2.listFiles()));
+					}
 				}
+			}
 		}
 
 		@Override
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 415a7ac..ce0516d 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -90,15 +90,16 @@
 	<ol>
 		<li><p class=''><a class='doclink' href='#juneau-marshall.Serializers'>Serializers</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-marshall.Parsers'>Parsers</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-marshall.Marshalls'>Marshalls</a></p>
 		<li><p class='new'><a class='doclink' href='#juneau-marshall.HttpPartSerializers'>HTTP Part Serializers</a></p>
 		<li><p class='new'><a class='doclink' href='#juneau-marshall.HttpPartParsers'>HTTP Part Parsers</a></p>
-		<li><p class=''><a class='doclink' href='#juneau-marshall.ObjectMap'>ObjectMap and ObjectList</a></p>
 		<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=''><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>
 		<li><p class=''><a class='doclink' href='#juneau-marshall.Groups'>SerializerGroups and ParserGroups</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-marshall.ContextsBuildersSessionsPropertyStores'>Contexts, Builders, Sessions, and PropertyStores</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms'>Transforms</a></p>
@@ -1025,8 +1026,73 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HttpPartSerializers' id='juneau-marshall.HttpPartSerializers'>2.3 - HTTP Part Serializers</a></h3>
-<div class='topic'><!-- START: 2.3 - juneau-marshall.HttpPartSerializers -->
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.Marshalls' id='juneau-marshall.Marshalls'>2.3 - Marshalls</a></h3>
+<div class='topic'><!-- START: 2.3 - juneau-marshall.Marshalls -->
+<p>
+	{@link org.apache.juneau.marshall.Marshall Marshalls} are simple pairings of a {@link org.apache.juneau.serializer.Serializer}
+	and {@link org.apache.juneau.parser.Parser} with convenience methods for serializing and parsing POJOs.
+</p>
+<ul class='doctree'>
+	<li class='jac'>{@link org.apache.juneau.marshall.Marshall}
+	<ul>
+		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#read(Object,Class) read(Object,Class)}
+		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#read(Object,Type,Type...) read(Object,Type,Type...)}
+		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#write(Object) write(Object)} 
+		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#write(Object,Object) write(Object,Object)}
+		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#toString(Object) toString(Object)}
+		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#println(Object) println(Object)}
+	</ul>
+</ul>
+<p>
+	Marshalls are often cleaner to use on-the-fly since they have simplified names.
+	<br>The following shows the {@link org.apache.juneau.marshall.Json} marshall in action:
+</p>
+<h5 class='figure'>Examples:</h5>
+<p class='bpcode w800'>
+	<jc>// Using instance.</jc>
+	Json json = <jk>new</jk> Json();
+	MyPojo myPojo = json.read(string, MyPojo.<jk>class</jk>);
+	String string = json.write(myPojo);
+</p>
+<p class='bpcode w800'>
+	<jc>// Using DEFAULT instance.</jc>
+	MyPojo myPojo = Json.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
+	String string = Json.<jsf>DEFAULT</jsf>.write(myPojo);
+</p>
+<p>
+	Marshalls exist for all supported languages.
+</p>
+<ul class='doctree'>
+	<li class='jac'>{@link org.apache.juneau.marshall.Marshall}
+	<ul>
+		<li class='jac'>{@link org.apache.juneau.marshall.CharMarshall}
+		<ul>
+			<li class='jc'>{@link org.apache.juneau.marshall.Html}
+			<li class='jc'>{@link org.apache.juneau.marshall.Json}
+			<li class='jc'>{@link org.apache.juneau.marshall.PlainText}
+			<li class='jc'>{@link org.apache.juneau.marshall.SimpleJson}
+			<li class='jc'>{@link org.apache.juneau.marshall.Uon}
+			<li class='jc'>{@link org.apache.juneau.marshall.UrlEncoding}
+			<li class='jc'>{@link org.apache.juneau.marshall.Xml}
+			<li class='jc'>{@link org.apache.juneau.marshall.N3}
+			<li class='jc'>{@link org.apache.juneau.marshall.NTriple}
+			<li class='jc'>{@link org.apache.juneau.marshall.RdfXml}
+			<li class='jc'>{@link org.apache.juneau.marshall.RdfXmlAbbrev}
+			<li class='jc'>{@link org.apache.juneau.marshall.Turtle}	
+		</ul>
+		<li class='jac'>{@link org.apache.juneau.marshall.StreamMarshall}
+		<ul>
+			<li class='jc'>{@link org.apache.juneau.marshall.Jso}
+			<li class='jc'>{@link org.apache.juneau.marshall.MsgPack}
+		</ul>
+	</ul>
+</ul>
+</div><!-- END: 2.3 - juneau-marshall.Marshalls -->
+
+<!-- ==================================================================================================== -->
+
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HttpPartSerializers' id='juneau-marshall.HttpPartSerializers'>2.4 - HTTP Part Serializers</a></h3>
+<div class='topic'><!-- START: 2.4 - juneau-marshall.HttpPartSerializers -->
 <p>
 	There is a separate set of serializers for serializing HTTP parts (query, form-data, headers, path variables, and plain-text request bodies).
 	<br>The distinction is that these are designed to serialize directly to strings based on Open-API schema information.
@@ -1067,12 +1133,12 @@
 		</ul>
 	</ul>
 </ul>
-</div><!-- END: 2.3 - juneau-marshall.HttpPartSerializers -->
+</div><!-- END: 2.4 - juneau-marshall.HttpPartSerializers -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HttpPartParsers' id='juneau-marshall.HttpPartParsers'>2.4 - HTTP Part Parsers</a></h3>
-<div class='topic'><!-- START: 2.4 - juneau-marshall.HttpPartParsers -->
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HttpPartParsers' id='juneau-marshall.HttpPartParsers'>2.5 - HTTP Part Parsers</a></h3>
+<div class='topic'><!-- START: 2.5 - juneau-marshall.HttpPartParsers -->
 <p>
 	There is a separate set of parsers for parsing HTTP parts (query, form-data, headers, path variables, and plain-text request bodies).
 	<br>The distinction is that these are designed to parse directly from strings based on Open-API schema information.
@@ -1112,120 +1178,7 @@
 		</ul>
 	</ul>
 </ul>
-</div><!-- END: 2.4 - juneau-marshall.HttpPartParsers -->
-
-<!-- ==================================================================================================== -->
-
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ObjectMap' id='juneau-marshall.ObjectMap'>2.5 - ObjectMap and ObjectList</a></h3>
-<div class='topic'><!-- START: 2.5 - juneau-marshall.ObjectMap -->
-<p>
-	The {@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} classes are generic Java 
-	representations of JSON objects and arrays.  
-	These classes can be used to create "unstructured" models for serialization (as opposed to "structured" 
-	models consisting of beans).  
-	If you want to quickly generate JSON/XML/HTML from generic maps/collections, or parse JSON/XML/HTML into 
-	generic maps/collections, these classes work well.  
-</p>
-<p>
-	These classes extend directly from the following JCF classes:
-</p>
-<ul class='doctree'>
-	<li class='jc'> 
-		{@link java.util.LinkedHashMap java.util.LinkedHashMap}
-		<ul>
-			<li class='jc'> 
-			{@link org.apache.juneau.ObjectMap org.apache.juneau.ObjectMap}
-		</ul>
-	</li>
-	<li class='jc'> 
-		{@link java.util.LinkedList java.util.LinkedList}
-		<ul>
-			<li class='jc'> 
-				{@link org.apache.juneau.ObjectMap org.apache.juneau.ObjectList}
-		</ul>
-	</li>
-</ul>
-<p>
-	The <l>ObjectMap</l> and <l>ObjectList</l> classes are very similar to the <l>JSONObject</l> and 
-	<l>JSONArray</l> classes found in other libraries.  
-	However, the names were chosen because the concepts of <l>Maps</l> and <l>Lists</l> are already familiar to 
-	Java programmers, and these classes can be used with any of the serializers or parsers.
-</p>
-<p>
-	These object can be serialized in one of two ways:
-</p>
-<ol class='spaced-list'>
-	<li>
-		Using the provided {@link org.apache.juneau.ObjectMap#serializeTo(java.io.Writer)} or 
-		{@link org.apache.juneau.ObjectList#serializeTo(java.io.Writer)} methods.
-	<li>
-		Passing them to one of the {@link org.apache.juneau.serializer.Serializer} serialize methods.
-	<li>
-		Simply calling the {@link org.apache.juneau.ObjectMap#toString()} or {@link org.apache.juneau.ObjectList#toString()}
-		methods which will serialize it as Simplified JSON.
-</ol>
-<p>
-	Any valid JSON can be parsed into an unstructured model consisting of generic 
-	{@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} objects. 
-	<br>
-	(In theory, any valid XML can also be parsed into an unstructured model, although this has not been 
-	officially 'tested')
-</p>
-<p class='bpcode w800'>
-	<jc>// Parse an arbitrary JSON document into an unstructered data model
-	// consisting of ObjectMaps, ObjectLists, and java primitive objects.</jc>
-	Parser parser = JsonParser.<jsf>DEFAULT</jsf>;
-	String json = <js>"{a:{name:'John Smith',age:21},b:{name:'Joe Smith',age:42}}"</js>;
-	ObjectMap m = parser.parse(json, ObjectMap.<jk>class</jk>);
-
-	<jc>// Use ObjectMap API to extract data from the unstructured model.</jc>
-	<jk>int</jk> johnSmithAge = m.getObjectMap(<js>"a"</js>).getInt(<js>"age"</js>);
-	
-	<jc>// Convert it back into JSON.</jc>
-	json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(m);
-	
-	<jc>// Or convert it to XML.</jc>
-	String xml = XmlSerializer.<jsf>DEFAULT</jsf>.serialize(m);
-
-	<jc>// Or just use toString().</jc>
-	json = m.toString();
-</p>
-<p>
-	The <code>ObjectMap</code> and <code>ObjectList</code> classes have many convenience features:
-</p>
-<p class='bpcode w800'>	
-	<jc>// Convert the map to a bean.</jc>		
-	MyBean m = objectMap.cast(MyBean.<jk>class</jk>);
-			
-	<jc>// Find entries by multiple keys.</jc>
-	MyBean m = objectMap.find(MyBean.<jk>class</jk>, <js>"key1"</js>, <js>"key2"</js>);
-	
-	<jc>// Fluent-style appenders.</jc>
-	objectMap.append(<js>"key1"</js>, <js>"val1"</js>).append(<js>"key2"</js>, <js>"val2"</js>);
-			
-	<jc>// REST-like functions for manipulating nodes in the data structure using URL-like notation.</jc>
-	objectMap.getAt(<js>"foo/bar/myBean"</js>, MyBean.<jk>class</jk>);		
-	objectMap.putAt(<js>"foo/bar/myBean"</js>, MyBean.<jk>class</jk>);		
-	objectMap.postAt(<js>"foo/bar/myListOfBeans"</js>, MyBean.<jk>class</jk>);		
-	objectMap.deleteAt(<js>"foo/bar/myBean"</js>);		
-	
-	<jc>// Copy with inclusion or exclusion.</jc>
-	ObjectMap m2 = objectMap.include(<js>"key1"</js>, <js>"key2"</js>, <js>"key3"</js>);
-	ObjectMap m3 = objectMap.exclude(<js>"key1"</js>, <js>"key2"</js>, <js>"key3"</js>);
-	
-	<jc>// Serialize using another serializer.</jc>
-	String xml = objectMap.serializeTo(XmlSerializer.<jsf>DEFAULT</jsf>);
-	
-	<jc>// Nested maps.</jc>
-	objectMap.setInner(objectMapInner);
-</p>
-
-<ul class='doctree'>
-	<li class='info'>
-		As a general rule, if you do not specify a target type during parsing, or if the target type cannot be 
-		determined through reflection, the parsers automatically generate <l>ObjectMaps</l> and <l>ObjectLists</l>.
-</ul>
-</div><!-- END: 2.5 - juneau-marshall.ObjectMap -->
+</div><!-- END: 2.5 - juneau-marshall.HttpPartParsers -->
 
 <!-- ==================================================================================================== -->
 
@@ -1422,8 +1375,121 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Groups' id='juneau-marshall.Groups'>2.7 - SerializerGroups and ParserGroups</a></h3>
-<div class='topic'><!-- START: 2.7 - juneau-marshall.Groups -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ObjectMap' id='juneau-marshall.ObjectMap'>2.7 - ObjectMap and ObjectList</a></h3>
+<div class='topic'><!-- START: 2.7 - juneau-marshall.ObjectMap -->
+<p>
+	The {@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} classes are generic Java 
+	representations of JSON objects and arrays.  
+	These classes can be used to create "unstructured" models for serialization (as opposed to "structured" 
+	models consisting of beans).  
+	If you want to quickly generate JSON/XML/HTML from generic maps/collections, or parse JSON/XML/HTML into 
+	generic maps/collections, these classes work well.  
+</p>
+<p>
+	These classes extend directly from the following JCF classes:
+</p>
+<ul class='doctree'>
+	<li class='jc'> 
+		{@link java.util.LinkedHashMap java.util.LinkedHashMap}
+		<ul>
+			<li class='jc'> 
+			{@link org.apache.juneau.ObjectMap org.apache.juneau.ObjectMap}
+		</ul>
+	</li>
+	<li class='jc'> 
+		{@link java.util.LinkedList java.util.LinkedList}
+		<ul>
+			<li class='jc'> 
+				{@link org.apache.juneau.ObjectMap org.apache.juneau.ObjectList}
+		</ul>
+	</li>
+</ul>
+<p>
+	The <l>ObjectMap</l> and <l>ObjectList</l> classes are very similar to the <l>JSONObject</l> and 
+	<l>JSONArray</l> classes found in other libraries.  
+	However, the names were chosen because the concepts of <l>Maps</l> and <l>Lists</l> are already familiar to 
+	Java programmers, and these classes can be used with any of the serializers or parsers.
+</p>
+<p>
+	These object can be serialized in one of two ways:
+</p>
+<ol class='spaced-list'>
+	<li>
+		Using the provided {@link org.apache.juneau.ObjectMap#serializeTo(java.io.Writer)} or 
+		{@link org.apache.juneau.ObjectList#serializeTo(java.io.Writer)} methods.
+	<li>
+		Passing them to one of the {@link org.apache.juneau.serializer.Serializer} serialize methods.
+	<li>
+		Simply calling the {@link org.apache.juneau.ObjectMap#toString()} or {@link org.apache.juneau.ObjectList#toString()}
+		methods which will serialize it as Simplified JSON.
+</ol>
+<p>
+	Any valid JSON can be parsed into an unstructured model consisting of generic 
+	{@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} objects. 
+	<br>
+	(In theory, any valid XML can also be parsed into an unstructured model, although this has not been 
+	officially 'tested')
+</p>
+<p class='bpcode w800'>
+	<jc>// Parse an arbitrary JSON document into an unstructered data model
+	// consisting of ObjectMaps, ObjectLists, and java primitive objects.</jc>
+	Parser parser = JsonParser.<jsf>DEFAULT</jsf>;
+	String json = <js>"{a:{name:'John Smith',age:21},b:{name:'Joe Smith',age:42}}"</js>;
+	ObjectMap m = parser.parse(json, ObjectMap.<jk>class</jk>);
+
+	<jc>// Use ObjectMap API to extract data from the unstructured model.</jc>
+	<jk>int</jk> johnSmithAge = m.getObjectMap(<js>"a"</js>).getInt(<js>"age"</js>);
+	
+	<jc>// Convert it back into JSON.</jc>
+	json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(m);
+	
+	<jc>// Or convert it to XML.</jc>
+	String xml = XmlSerializer.<jsf>DEFAULT</jsf>.serialize(m);
+
+	<jc>// Or just use toString().</jc>
+	json = m.toString();
+</p>
+<p>
+	The <code>ObjectMap</code> and <code>ObjectList</code> classes have many convenience features:
+</p>
+<p class='bpcode w800'>	
+	<jc>// Convert the map to a bean.</jc>		
+	MyBean m = objectMap.cast(MyBean.<jk>class</jk>);
+			
+	<jc>// Find entries by multiple keys.</jc>
+	MyBean m = objectMap.find(MyBean.<jk>class</jk>, <js>"key1"</js>, <js>"key2"</js>);
+	
+	<jc>// Fluent-style appenders.</jc>
+	objectMap.append(<js>"key1"</js>, <js>"val1"</js>).append(<js>"key2"</js>, <js>"val2"</js>);
+			
+	<jc>// REST-like functions for manipulating nodes in the data structure using URL-like notation.</jc>
+	objectMap.getAt(<js>"foo/bar/myBean"</js>, MyBean.<jk>class</jk>);		
+	objectMap.putAt(<js>"foo/bar/myBean"</js>, MyBean.<jk>class</jk>);		
+	objectMap.postAt(<js>"foo/bar/myListOfBeans"</js>, MyBean.<jk>class</jk>);		
+	objectMap.deleteAt(<js>"foo/bar/myBean"</js>);		
+	
+	<jc>// Copy with inclusion or exclusion.</jc>
+	ObjectMap m2 = objectMap.include(<js>"key1"</js>, <js>"key2"</js>, <js>"key3"</js>);
+	ObjectMap m3 = objectMap.exclude(<js>"key1"</js>, <js>"key2"</js>, <js>"key3"</js>);
+	
+	<jc>// Serialize using another serializer.</jc>
+	String xml = objectMap.serializeTo(XmlSerializer.<jsf>DEFAULT</jsf>);
+	
+	<jc>// Nested maps.</jc>
+	objectMap.setInner(objectMapInner);
+</p>
+
+<ul class='doctree'>
+	<li class='info'>
+		As a general rule, if you do not specify a target type during parsing, or if the target type cannot be 
+		determined through reflection, the parsers automatically generate <l>ObjectMaps</l> and <l>ObjectLists</l>.
+</ul>
+</div><!-- END: 2.7 - juneau-marshall.ObjectMap -->
+
+<!-- ==================================================================================================== -->
+
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Groups' id='juneau-marshall.Groups'>2.8 - SerializerGroups and ParserGroups</a></h3>
+<div class='topic'><!-- START: 2.8 - juneau-marshall.Groups -->
 <p>
 	Above the serializers and parsers are the {@link org.apache.juneau.serializer.SerializerGroup} and 
 	{@link org.apache.juneau.parser.ParserGroup} classes.
@@ -1455,12 +1521,12 @@
 	to provide annotated REST servlets that automatically negotiate the HTTP media types and allow the developer
 	to work with requests and responses as POJOs.
 </p>
-</div><!-- END: 2.7 - juneau-marshall.Groups -->
+</div><!-- END: 2.8 - juneau-marshall.Groups -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ContextsBuildersSessionsPropertyStores' id='juneau-marshall.ContextsBuildersSessionsPropertyStores'>2.8 - Contexts, Builders, Sessions, and PropertyStores</a></h3>
-<div class='topic'><!-- START: 2.8 - juneau-marshall.ContextsBuildersSessionsPropertyStores -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ContextsBuildersSessionsPropertyStores' id='juneau-marshall.ContextsBuildersSessionsPropertyStores'>2.9 - Contexts, Builders, Sessions, and PropertyStores</a></h3>
+<div class='topic'><!-- START: 2.9 - juneau-marshall.ContextsBuildersSessionsPropertyStores -->
 <p>
 	All the serializers, parsers, and REST server/client classes use the following design pattern:
 </p>
@@ -1595,12 +1661,12 @@
 	Refer to the {@link org.apache.juneau.PropertyStore} javadoc for a detailed explaination on how
 	property stores work.
 </p>
-</div><!-- END: 2.8 - juneau-marshall.ContextsBuildersSessionsPropertyStores -->
+</div><!-- END: 2.9 - juneau-marshall.ContextsBuildersSessionsPropertyStores -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms' id='juneau-marshall.Transforms'>2.9 - Transforms</a></h3>
-<div class='topic'><!-- START: 2.9 - juneau-marshall.Transforms -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms' id='juneau-marshall.Transforms'>2.10 - Transforms</a></h3>
+<div class='topic'><!-- START: 2.10 - juneau-marshall.Transforms -->
 <p>
 	By default, the Juneau framework can serialize and parse a wide variety of POJOs out-of-the-box.  
 	<br>However, two special classes are provided tailor how certain Java objects are handled by the framework.
@@ -1660,8 +1726,8 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PojoSwaps' id='juneau-marshall.Transforms.PojoSwaps'>2.9.1 - PojoSwaps</a></h4>
-<div class='topic'><!-- START: 2.9.1 - juneau-marshall.Transforms.PojoSwaps -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PojoSwaps' id='juneau-marshall.Transforms.PojoSwaps'>2.10.1 - PojoSwaps</a></h4>
+<div class='topic'><!-- START: 2.10.1 - juneau-marshall.Transforms.PojoSwaps -->
 <p>
 	{@link org.apache.juneau.transform.PojoSwap PojoSwaps} are a critical component of Juneau.
 	They allow the serializers and parsers to handle Java objects that wouldn't normally be serializable.
@@ -1828,12 +1894,12 @@
 		The 'swapped' class type must be a serializable type.
 		<br>See the definition for Category 4 objects in <a class='doclink' href='#juneau-marshall.PojoCategories'>POJO Categories</a>.  
 </ul>
-</div><!-- END: 2.9.1 - juneau-marshall.Transforms.PojoSwaps -->
+</div><!-- END: 2.10.1 - juneau-marshall.Transforms.PojoSwaps -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PerMediaTypePojoSwaps' id='juneau-marshall.Transforms.PerMediaTypePojoSwaps'>2.9.2 - Per-media-type PojoSwaps</a></h4>
-<div class='topic'><!-- START: 2.9.2 - juneau-marshall.Transforms.PerMediaTypePojoSwaps -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PerMediaTypePojoSwaps' id='juneau-marshall.Transforms.PerMediaTypePojoSwaps'>2.10.2 - Per-media-type PojoSwaps</a></h4>
+<div class='topic'><!-- START: 2.10.2 - juneau-marshall.Transforms.PerMediaTypePojoSwaps -->
 <p>
 	Swaps can also be defined per-media-type.		
 </p>
@@ -1908,12 +1974,12 @@
 		}
 	}
 </p>
-</div><!-- END: 2.9.2 - juneau-marshall.Transforms.PerMediaTypePojoSwaps -->
+</div><!-- END: 2.10.2 - juneau-marshall.Transforms.PerMediaTypePojoSwaps -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.OneWayPojoSwaps' id='juneau-marshall.Transforms.OneWayPojoSwaps'>2.9.3 - One-way PojoSwaps</a></h4>
-<div class='topic'><!-- START: 2.9.3 - juneau-marshall.Transforms.OneWayPojoSwaps -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.OneWayPojoSwaps' id='juneau-marshall.Transforms.OneWayPojoSwaps'>2.10.3 - One-way PojoSwaps</a></h4>
+<div class='topic'><!-- START: 2.10.3 - juneau-marshall.Transforms.OneWayPojoSwaps -->
 <p>
 	In the previous sections, we defined two-way swaps, meaning swaps where the original objects could be 
 	reconstructing during parsing. 
@@ -1960,12 +2026,12 @@
 	ReaderParser p = JsonParser.<jsm>create</jsm>().pojoSwaps(IteratorSwap.<jk>class</jk>).build();
 	i = p.parse(s, Iterator.<jk>class</jk>);		<jc>// Throws ParseException!!!</jc>
 </p>
-</div><!-- END: 2.9.3 - juneau-marshall.Transforms.OneWayPojoSwaps -->
+</div><!-- END: 2.10.3 - juneau-marshall.Transforms.OneWayPojoSwaps -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.SwapAnnotation' id='juneau-marshall.Transforms.SwapAnnotation'>2.9.4 - @Swap Annotation</a></h4>
-<div class='topic'><!-- START: 2.9.4 - juneau-marshall.Transforms.SwapAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.SwapAnnotation' id='juneau-marshall.Transforms.SwapAnnotation'>2.10.4 - @Swap Annotation</a></h4>
+<div class='topic'><!-- START: 2.10.4 - juneau-marshall.Transforms.SwapAnnotation -->
 <p>
 	{@link org.apache.juneau.annotation.Swap @Swap} can be used to associate a swap class using an 
 	annotation.
@@ -2024,12 +2090,12 @@
 	<ja>@BeanProperty</ja>(swap=MyPojoSwap.<jk>class</jk>)
 	<jk>public</jk> MyPojo getMyPojo();
 </p>
-</div><!-- END: 2.9.4 - juneau-marshall.Transforms.SwapAnnotation -->
+</div><!-- END: 2.10.4 - juneau-marshall.Transforms.SwapAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.TemplatedSwaps' id='juneau-marshall.Transforms.TemplatedSwaps'>2.9.5 - Templated Swaps</a></h4>
-<div class='topic'><!-- START: 2.9.5 - juneau-marshall.Transforms.TemplatedSwaps -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.TemplatedSwaps' id='juneau-marshall.Transforms.TemplatedSwaps'>2.10.5 - Templated Swaps</a></h4>
+<div class='topic'><!-- START: 2.10.5 - juneau-marshall.Transforms.TemplatedSwaps -->
 <p>
 	The {@link org.apache.juneau.annotation.Swap#template() @Swap.template()} annotation allows you to associate
 	arbitrary contextual strings with swaps.
@@ -2063,12 +2129,12 @@
 		}
 	}
 </p>
-</div><!-- END: 2.9.5 - juneau-marshall.Transforms.TemplatedSwaps -->
+</div><!-- END: 2.10.5 - juneau-marshall.Transforms.TemplatedSwaps -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.SwapMethods' id='juneau-marshall.Transforms.SwapMethods'>2.9.6 - Swap Methods</a></h4>
-<div class='topic'><!-- START: 2.9.6 - juneau-marshall.Transforms.SwapMethods -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.SwapMethods' id='juneau-marshall.Transforms.SwapMethods'>2.10.6 - Swap Methods</a></h4>
+<div class='topic'><!-- START: 2.10.6 - juneau-marshall.Transforms.SwapMethods -->
 <p>
 	Various methods can be defined on a class directly to affect how it gets serialized.
 	<br>This can often be simpler than using <code>PojoSwaps</code>.
@@ -2207,12 +2273,12 @@
 		}
 	}
 </p>
-</div><!-- END: 2.9.6 - juneau-marshall.Transforms.SwapMethods -->
+</div><!-- END: 2.10.6 - juneau-marshall.Transforms.SwapMethods -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.SurrogateClasses' id='juneau-marshall.Transforms.SurrogateClasses'>2.9.7 - Surrogate Classes</a></h4>
-<div class='topic'><!-- START: 2.9.7 - juneau-marshall.Transforms.SurrogateClasses -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.SurrogateClasses' id='juneau-marshall.Transforms.SurrogateClasses'>2.10.7 - Surrogate Classes</a></h4>
+<div class='topic'><!-- START: 2.10.7 - juneau-marshall.Transforms.SurrogateClasses -->
 <p>
 <p>
 	Surrogate classes are very similar in concept to <code>PojoSwaps</code> except they're simpler to define.
@@ -2277,12 +2343,12 @@
 <ul>
 	<li class='jic'>{@link org.apache.juneau.transform.Surrogate}
 </ul>
-</div><!-- END: 2.9.7 - juneau-marshall.Transforms.SurrogateClasses -->
+</div><!-- END: 2.10.7 - juneau-marshall.Transforms.SurrogateClasses -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanAnnotation' id='juneau-marshall.Transforms.BeanAnnotation'>2.9.8 - @BeanProperty Annotation</a></h4>
-<div class='topic'><!-- START: 2.9.8 - juneau-marshall.Transforms.BeanAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanAnnotation' id='juneau-marshall.Transforms.BeanAnnotation'>2.10.8 - @BeanProperty Annotation</a></h4>
+<div class='topic'><!-- START: 2.10.8 - juneau-marshall.Transforms.BeanAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.Bean @Bean} annotation is used to tailor how beans are 
 	interpreted by the framework.
@@ -2415,12 +2481,12 @@
 		}
 	}	
 </p>
-</div><!-- END: 2.9.8 - juneau-marshall.Transforms.BeanAnnotation -->
+</div><!-- END: 2.10.8 - juneau-marshall.Transforms.BeanAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanPropertyAnnotation' id='juneau-marshall.Transforms.BeanPropertyAnnotation'>2.9.9 - @BeanProperty Annotation</a></h4>
-<div class='topic'><!-- START: 2.9.9 - juneau-marshall.Transforms.BeanPropertyAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanPropertyAnnotation' id='juneau-marshall.Transforms.BeanPropertyAnnotation'>2.10.9 - @BeanProperty Annotation</a></h4>
+<div class='topic'><!-- START: 2.10.9 - juneau-marshall.Transforms.BeanPropertyAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotation is used to tailor how 
 	individual bean properties are interpreted by the framework.
@@ -2603,12 +2669,12 @@
 	<ja>@BeanProperty</ja>(format=<js>"$%.2f"</js>)
 	<jk>public float</jk> <jf>price</jf>;
 </p>
-</div><!-- END: 2.9.9 - juneau-marshall.Transforms.BeanPropertyAnnotation -->
+</div><!-- END: 2.10.9 - juneau-marshall.Transforms.BeanPropertyAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanConstructorAnnotation' id='juneau-marshall.Transforms.BeanConstructorAnnotation'>2.9.10 - @BeanConstructor Annotation</a></h4>
-<div class='topic'><!-- START: 2.9.10 - juneau-marshall.Transforms.BeanConstructorAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanConstructorAnnotation' id='juneau-marshall.Transforms.BeanConstructorAnnotation'>2.10.10 - @BeanConstructor Annotation</a></h4>
+<div class='topic'><!-- START: 2.10.10 - juneau-marshall.Transforms.BeanConstructorAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor} annotation is used to 
 	map constructor arguments to property names on bean with read-only properties.
@@ -2652,12 +2718,12 @@
 <p>
 	Beans can also be defined with a combination of read-only and read-write properties.
 </p>
-</div><!-- END: 2.9.10 - juneau-marshall.Transforms.BeanConstructorAnnotation -->
+</div><!-- END: 2.10.10 - juneau-marshall.Transforms.BeanConstructorAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanIgnoreAnnotation' id='juneau-marshall.Transforms.BeanIgnoreAnnotation'>2.9.11 - @BeanIgnore Annotation</a></h4>
-<div class='topic'><!-- START: 2.9.11 - juneau-marshall.Transforms.BeanIgnoreAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanIgnoreAnnotation' id='juneau-marshall.Transforms.BeanIgnoreAnnotation'>2.10.11 - @BeanIgnore Annotation</a></h4>
+<div class='topic'><!-- START: 2.10.11 - juneau-marshall.Transforms.BeanIgnoreAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.BeanIgnore @BeanIgnore} annotation is used to
 	ignore classes, fields, and methods from being interpreted as beans or bean components.
@@ -2685,12 +2751,12 @@
 		<jk>public</jk> String getBar() {...}
 	}
 </p>
-</div><!-- END: 2.9.11 - juneau-marshall.Transforms.BeanIgnoreAnnotation -->
+</div><!-- END: 2.10.11 - juneau-marshall.Transforms.BeanIgnoreAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.NamePropertyAnnotation' id='juneau-marshall.Transforms.NamePropertyAnnotation'>2.9.12 - @NameProperty Annotation</a></h4>
-<div class='topic'><!-- START: 2.9.12 - juneau-marshall.Transforms.NamePropertyAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.NamePropertyAnnotation' id='juneau-marshall.Transforms.NamePropertyAnnotation'>2.10.12 - @NameProperty Annotation</a></h4>
+<div class='topic'><!-- START: 2.10.12 - juneau-marshall.Transforms.NamePropertyAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.NameProperty @NameProperty} annotation is used to
 	identify a setter as a method for setting the name of a POJO as it's known by its parent object.
@@ -2717,12 +2783,12 @@
 		<jk>public char</jk> <jf>sex</jf>;
 	}
 </p>
-</div><!-- END: 2.9.12 - juneau-marshall.Transforms.NamePropertyAnnotation -->
+</div><!-- END: 2.10.12 - juneau-marshall.Transforms.NamePropertyAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.ParentPropertyAnnotation' id='juneau-marshall.Transforms.ParentPropertyAnnotation'>2.9.13 - @ParentProperty Annotation</a></h4>
-<div class='topic'><!-- START: 2.9.13 - juneau-marshall.Transforms.ParentPropertyAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.ParentPropertyAnnotation' id='juneau-marshall.Transforms.ParentPropertyAnnotation'>2.10.13 - @ParentProperty Annotation</a></h4>
+<div class='topic'><!-- START: 2.10.13 - juneau-marshall.Transforms.ParentPropertyAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.ParentProperty @ParentProperty} annotation is used to
 	identify a setter as a method for adding a parent reference to a child object.
@@ -2748,12 +2814,12 @@
 <p>
 	Parsers will automatically set this field for you in the child beans.
 </p>
-</div><!-- END: 2.9.13 - juneau-marshall.Transforms.ParentPropertyAnnotation -->
+</div><!-- END: 2.10.13 - juneau-marshall.Transforms.ParentPropertyAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PojoBuilders' id='juneau-marshall.Transforms.PojoBuilders'>2.9.14 - POJO Builders</a></h4>
-<div class='topic'><!-- START: 2.9.14 - juneau-marshall.Transforms.PojoBuilders -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PojoBuilders' id='juneau-marshall.Transforms.PojoBuilders'>2.10.14 - POJO Builders</a></h4>
+<div class='topic'><!-- START: 2.10.14 - juneau-marshall.Transforms.PojoBuilders -->
 <p>
 	Juneau parsers can use builders to instantiate POJOs.
 	<br>This is useful in cases where you want to create beans with read-only properties.
@@ -2863,12 +2929,12 @@
 	<li class='ja'>{@link org.apache.juneau.annotation.Builder}
 	<li class='jic'>{@link org.apache.juneau.transform.Builder}
 </ul>
-</div><!-- END: 2.9.14 - juneau-marshall.Transforms.PojoBuilders -->
+</div><!-- END: 2.10.14 - juneau-marshall.Transforms.PojoBuilders -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.URIs' id='juneau-marshall.Transforms.URIs'>2.9.15 - URIs</a></h4>
-<div class='topic'><!-- START: 2.9.15 - juneau-marshall.Transforms.URIs -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.URIs' id='juneau-marshall.Transforms.URIs'>2.10.15 - URIs</a></h4>
+<div class='topic'><!-- START: 2.10.15 - juneau-marshall.Transforms.URIs -->
 <p>
 	Juneau serializers have sophisticated support for transforming relative URIs to absolute form.
 </p>
@@ -2992,12 +3058,12 @@
 		}
 	}
 </p>
-</div><!-- END: 2.9.15 - juneau-marshall.Transforms.URIs -->
+</div><!-- END: 2.10.15 - juneau-marshall.Transforms.URIs -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanFilters' id='juneau-marshall.Transforms.BeanFilters'>2.9.16 - BeanFilter Class</a></h4>
-<div class='topic'><!-- START: 2.9.16 - juneau-marshall.Transforms.BeanFilters -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanFilters' id='juneau-marshall.Transforms.BeanFilters'>2.10.16 - BeanFilter Class</a></h4>
+<div class='topic'><!-- START: 2.10.16 - juneau-marshall.Transforms.BeanFilters -->
 <p>
 	The {@link org.apache.juneau.transform.BeanFilter} class is the programmatic equivalent to the
 	{@link org.apache.juneau.annotation.Bean @Bean} annotation.
@@ -3081,12 +3147,12 @@
 		.beanFilters(AddressInterface.<jk>class</jk>)
 		.build();
 </p>
-</div><!-- END: 2.9.16 - juneau-marshall.Transforms.BeanFilters -->
+</div><!-- END: 2.10.16 - juneau-marshall.Transforms.BeanFilters -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.InterfaceFilters' id='juneau-marshall.Transforms.InterfaceFilters'>2.9.17 - Interface Filters</a></h4>
-<div class='topic'><!-- START: 2.9.17 - juneau-marshall.Transforms.InterfaceFilters -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.InterfaceFilters' id='juneau-marshall.Transforms.InterfaceFilters'>2.10.17 - Interface Filters</a></h4>
+<div class='topic'><!-- START: 2.10.17 - juneau-marshall.Transforms.InterfaceFilters -->
 <p>
 	Occasionally, you may want to limit bean properties to only those defined on a parent class or interface.  
 	<br>This is accomplished through interface filters.
@@ -3185,12 +3251,12 @@
 		<jk>public</jk> String getFoo() {...};
 	}
 </p>
-</div><!-- END: 2.9.17 - juneau-marshall.Transforms.InterfaceFilters -->
+</div><!-- END: 2.10.17 - juneau-marshall.Transforms.InterfaceFilters -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.StopClasses' id='juneau-marshall.Transforms.StopClasses'>2.9.18 - Stop Classes</a></h4>
-<div class='topic'><!-- START: 2.9.18 - juneau-marshall.Transforms.StopClasses -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.StopClasses' id='juneau-marshall.Transforms.StopClasses'>2.10.18 - Stop Classes</a></h4>
+<div class='topic'><!-- START: 2.10.18 - juneau-marshall.Transforms.StopClasses -->
 <p>
 	Whereas interface filters limit properties defined on child classes, stop filters 
 	do the opposite and limit properties defined on parent classes.
@@ -3227,12 +3293,12 @@
 	<jc>// Serializes property 'p3', but NOT 'p1' or 'p2'.</jc>
 	String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(<jk>new</jk> C3());
 </p>
-</div><!-- END: 2.9.18 - juneau-marshall.Transforms.StopClasses -->
+</div><!-- END: 2.10.18 - juneau-marshall.Transforms.StopClasses -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BypassSerialization' id='juneau-marshall.Transforms.BypassSerialization'>2.9.19 - Bypass Serialization using Readers and InputStreams</a></h4>
-<div class='topic'><!-- START: 2.9.19 - juneau-marshall.Transforms.BypassSerialization -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BypassSerialization' id='juneau-marshall.Transforms.BypassSerialization'>2.10.19 - Bypass Serialization using Readers and InputStreams</a></h4>
+<div class='topic'><!-- START: 2.10.19 - juneau-marshall.Transforms.BypassSerialization -->
 <p>
 	Juneau serializers treat instances of <code>Readers</code> and <code>InputStreams</code> special by 
 	simply serializing their contents directly to the output stream or writer.
@@ -3280,13 +3346,13 @@
 		This is due to the fact that the RDF serializers use a DOM for serialization, so we don't have
 		access to the underlying stream.
 </ul>
-</div><!-- END: 2.9.19 - juneau-marshall.Transforms.BypassSerialization -->
-</div><!-- END: 2.9 - juneau-marshall.Transforms -->
+</div><!-- END: 2.10.19 - juneau-marshall.Transforms.BypassSerialization -->
+</div><!-- END: 2.10 - juneau-marshall.Transforms -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.BeanDictionaries' id='juneau-marshall.BeanDictionaries'>2.10 - Bean Names and Dictionaries</a></h3>
-<div class='topic'><!-- START: 2.10 - juneau-marshall.BeanDictionaries -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.BeanDictionaries' id='juneau-marshall.BeanDictionaries'>2.11 - Bean Names and Dictionaries</a></h3>
+<div class='topic'><!-- START: 2.11 - juneau-marshall.BeanDictionaries -->
 <p>
 	While parsing into beans, Juneau attempts to determine the class types of bean properties through 
 	reflection on the bean property getter or setter.
@@ -3442,8 +3508,8 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.BeanDictionaries.BeanSubTypes' id='juneau-marshall.BeanDictionaries.BeanSubTypes'>2.10.1 - Bean Subtypes</a></h4>
-<div class='topic'><!-- START: 2.10.1 - juneau-marshall.BeanDictionaries.BeanSubTypes -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.BeanDictionaries.BeanSubTypes' id='juneau-marshall.BeanDictionaries.BeanSubTypes'>2.11.1 - Bean Subtypes</a></h4>
+<div class='topic'><!-- START: 2.11.1 - juneau-marshall.BeanDictionaries.BeanSubTypes -->
 <p>
 	In addition to the bean type name support described above, simplified support is provided
 	for bean subtypes.
@@ -3498,13 +3564,13 @@
 	A a = p.parse(r, A.<jk>class</jk>);
 	<jsm>assertTrue</jsm>(a <jk>instanceof</jk> A1);
 </p>
-</div><!-- END: 2.10.1 - juneau-marshall.BeanDictionaries.BeanSubTypes -->
-</div><!-- END: 2.10 - juneau-marshall.BeanDictionaries -->
+</div><!-- END: 2.11.1 - juneau-marshall.BeanDictionaries.BeanSubTypes -->
+</div><!-- END: 2.11 - juneau-marshall.BeanDictionaries -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.VirtualBeans' id='juneau-marshall.VirtualBeans'>2.11 - Virtual Beans</a></h3>
-<div class='topic'><!-- START: 2.11 - juneau-marshall.VirtualBeans -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.VirtualBeans' id='juneau-marshall.VirtualBeans'>2.12 - Virtual Beans</a></h3>
+<div class='topic'><!-- START: 2.12 - juneau-marshall.VirtualBeans -->
 <p>
 	The {@link org.apache.juneau.BeanContext#BEAN_useInterfaceProxies} setting (enabled by default) allows
 	the Juneau parsers to parse content into virtual beans (bean interfaces without implementation classes).
@@ -3552,12 +3618,12 @@
 <p class='bpcode w800'>
 	Address address = BeanContext.<jsf>DEFAULT</jsf>.createSession().newBean(Address.<jk>class</jk>);
 </p>
-</div><!-- END: 2.11 - juneau-marshall.VirtualBeans -->
+</div><!-- END: 2.12 - juneau-marshall.VirtualBeans -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Recursion' id='juneau-marshall.Recursion'>2.12 - Non-Tree Models and Recursion Detection</a></h3>
-<div class='topic'><!-- START: 2.12 - juneau-marshall.Recursion -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Recursion' id='juneau-marshall.Recursion'>2.13 - Non-Tree Models and Recursion Detection</a></h3>
+<div class='topic'><!-- START: 2.13 - juneau-marshall.Recursion -->
 <p>
 	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...).
@@ -3621,12 +3687,12 @@
 	Recursion detection introduces a performance penalty of around 20%.
 	<br>For this reason the setting is disabled by default.
 </p>
-</div><!-- END: 2.12 - juneau-marshall.Recursion -->
+</div><!-- END: 2.13 - juneau-marshall.Recursion -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ParsingIntoGenericModels' id='juneau-marshall.ParsingIntoGenericModels'>2.13 - Parsing into Generic Models</a></h3>
-<div class='topic'><!-- START: 2.13 - juneau-marshall.ParsingIntoGenericModels -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ParsingIntoGenericModels' id='juneau-marshall.ParsingIntoGenericModels'>2.14 - Parsing into Generic Models</a></h3>
+<div class='topic'><!-- START: 2.14 - juneau-marshall.ParsingIntoGenericModels -->
 <p>
 	The Juneau parsers are not limited to parsing back into the original bean classes.
 	<br>If the bean classes are not available on the parsing side, the parser can also be used to 
@@ -3736,12 +3802,12 @@
 	As a general rule, parsing into beans is often more efficient than parsing into generic models.
 	<br>And working with beans is often less error prone than working with generic models.
 </p>
-</div><!-- END: 2.13 - juneau-marshall.ParsingIntoGenericModels -->
+</div><!-- END: 2.14 - juneau-marshall.ParsingIntoGenericModels -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ReadingContinuousStreams' id='juneau-marshall.ReadingContinuousStreams'>2.14 - Reading Continuous Streams</a></h3>
-<div class='topic'><!-- START: 2.14 - juneau-marshall.ReadingContinuousStreams -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ReadingContinuousStreams' id='juneau-marshall.ReadingContinuousStreams'>2.15 - Reading Continuous Streams</a></h3>
+<div class='topic'><!-- START: 2.15 - juneau-marshall.ReadingContinuousStreams -->
 <p>
 	The following parsers can be configured to read continuous streams of objects from the same input stream:
 </p>
@@ -3788,19 +3854,19 @@
 	The {@link org.apache.juneau.msgpack.MsgPackParser} class doesn't use any internal buffering to begin with, so it can be used with
 	continuous streams without any special properties.
 </p>
-</div><!-- END: 2.14 - juneau-marshall.ReadingContinuousStreams -->
+</div><!-- END: 2.15 - juneau-marshall.ReadingContinuousStreams -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-marshall.URIs' id='juneau-marshall.URIs'>2.15 - URIs</a></h3>
-<div class='topic'><!-- START: 2.15 - juneau-marshall.URIs -->
+<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-marshall.URIs' id='juneau-marshall.URIs'>2.16 - URIs</a></h3>
+<div class='topic'><!-- START: 2.16 - juneau-marshall.URIs -->
 TODO(7.2.0)
-</div><!-- END: 2.15 - juneau-marshall.URIs -->
+</div><!-- END: 2.16 - juneau-marshall.URIs -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JacksonComparison' id='juneau-marshall.JacksonComparison'>2.16 - Comparison with Jackson</a></h3>
-<div class='topic'><!-- START: 2.16 - juneau-marshall.JacksonComparison -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JacksonComparison' id='juneau-marshall.JacksonComparison'>2.17 - Comparison with Jackson</a></h3>
+<div class='topic'><!-- START: 2.17 - juneau-marshall.JacksonComparison -->
 <p>
 	Juneau was developed independently from Jackson, but shares many of the same features and capabilities.
 	Whereas Jackson was created to work primarily with JSON, Juneau was created to work for multiple languages.
@@ -3908,12 +3974,12 @@ TODO(7.2.0)
 		</td>
 	</tr>
 </table>
-</div><!-- END: 2.16 - juneau-marshall.JacksonComparison -->
+</div><!-- END: 2.17 - juneau-marshall.JacksonComparison -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.PojoCategories' id='juneau-marshall.PojoCategories'>2.17 - POJO Categories</a></h3>
-<div class='topic'><!-- START: 2.17 - juneau-marshall.PojoCategories -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.PojoCategories' id='juneau-marshall.PojoCategories'>2.18 - POJO Categories</a></h3>
+<div class='topic'><!-- START: 2.18 - juneau-marshall.PojoCategories -->
 <p>
 	The following chart shows POJOs categorized into groups and whether they can be serialized or parsed:
 </p>
@@ -4174,12 +4240,12 @@ TODO(7.2.0)
 		(by setting these references to <jk>null</jk>), but it is not enabled by default since it introduces 
 		a moderate performance penalty. 
 </ul>
-</div><!-- END: 2.17 - juneau-marshall.PojoCategories -->
+</div><!-- END: 2.18 - juneau-marshall.PojoCategories -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails' id='juneau-marshall.JsonDetails'>2.18 - JSON Details</a></h3>
-<div class='topic'><!-- START: 2.18 - juneau-marshall.JsonDetails -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails' id='juneau-marshall.JsonDetails'>2.19 - JSON Details</a></h3>
+<div class='topic'><!-- START: 2.19 - juneau-marshall.JsonDetails -->
 <p>
 	Juneau supports converting arbitrary POJOs to and from JSON using ultra-efficient serializers and parsers.
 	<br>The JSON serializer converts POJOs directly to JSON without the need for intermediate DOM objects using a 
@@ -4261,8 +4327,8 @@ TODO(7.2.0)
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Methodology' id='juneau-marshall.JsonDetails.Methodology'>2.18.1 - JSON Methodology</a></h4>
-<div class='topic'><!-- START: 2.18.1 - juneau-marshall.JsonDetails.Methodology -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Methodology' id='juneau-marshall.JsonDetails.Methodology'>2.19.1 - JSON Methodology</a></h4>
+<div class='topic'><!-- START: 2.19.1 - juneau-marshall.JsonDetails.Methodology -->
 <p>
 	The JSON data type produced depends on the Java object type being serialized.
 </p>
@@ -4333,12 +4399,12 @@ TODO(7.2.0)
 	<code>Calendar</code> object to ISO8601 strings, or <code><jk>byte</jk>[]</code> arrays to Base-64 
 	encoded strings.
 </p>
-</div><!-- END: 2.18.1 - juneau-marshall.JsonDetails.Methodology -->
+</div><!-- END: 2.19.1 - juneau-marshall.JsonDetails.Methodology -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Serializers' id='juneau-marshall.JsonDetails.Serializers'>2.18.2 - JSON Serializers</a></h4>
-<div class='topic'><!-- START: 2.18.2 - juneau-marshall.JsonDetails.Serializers -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Serializers' id='juneau-marshall.JsonDetails.Serializers'>2.19.2 - JSON Serializers</a></h4>
+<div class='topic'><!-- START: 2.19.2 - juneau-marshall.JsonDetails.Serializers -->
 <p>
 	The {@link org.apache.juneau.json.JsonSerializer} class is used to serialize POJOs into JSON.
 </p>	
@@ -4370,12 +4436,12 @@ TODO(7.2.0)
 		<li class='jf'>{@link org.apache.juneau.json.SimpleJsonSerializer#DEFAULT_READABLE DEFAULT_READABLE}
 	</ul>
 </ul>
-</div><!-- END: 2.18.2 - juneau-marshall.JsonDetails.Serializers -->
+</div><!-- END: 2.19.2 - juneau-marshall.JsonDetails.Serializers -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.SimplifiedJson' id='juneau-marshall.JsonDetails.SimplifiedJson'>2.18.3 - Simplified JSON</a></h4>
-<div class='topic'><!-- START: 2.18.3 - juneau-marshall.JsonDetails.SimplifiedJson -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.SimplifiedJson' id='juneau-marshall.JsonDetails.SimplifiedJson'>2.19.3 - Simplified JSON</a></h4>
+<div class='topic'><!-- START: 2.19.3 - juneau-marshall.JsonDetails.SimplifiedJson -->
 <p>
 	The {@link org.apache.juneau.json.SimpleJsonSerializer} class can be used to serialized POJOs into Simplified JSON notation.
 </p>
@@ -4432,12 +4498,12 @@ TODO(7.2.0)
 <ul>
 	<li class='jf'>{@link org.apache.juneau.json.JsonSerializer#JSON_simpleMode}
 </ul>
-</div><!-- END: 2.18.3 - juneau-marshall.JsonDetails.SimplifiedJson -->
+</div><!-- END: 2.19.3 - juneau-marshall.JsonDetails.SimplifiedJson -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Parsers' id='juneau-marshall.JsonDetails.Parsers'>2.18.4 - JSON Parsers</a></h4>
-<div class='topic'><!-- START: 2.18.4 - juneau-marshall.JsonDetails.Parsers -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Parsers' id='juneau-marshall.JsonDetails.Parsers'>2.19.4 - JSON Parsers</a></h4>
+<div class='topic'><!-- START: 2.19.4 - juneau-marshall.JsonDetails.Parsers -->
 <p>
 	The {@link org.apache.juneau.json.JsonParser} class is used to parse JSON into POJOs.
 </p>	
@@ -4477,12 +4543,12 @@ TODO(7.2.0)
 	<li>
 		Concatenated strings. 
 </ul>
-</div><!-- END: 2.18.4 - juneau-marshall.JsonDetails.Parsers -->
+</div><!-- END: 2.19.4 - juneau-marshall.JsonDetails.Parsers -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.JsonAnnotation' id='juneau-marshall.JsonDetails.JsonAnnotation'>2.18.5 - @Json Annotation</a></h4>
-<div class='topic'><!-- START: 2.18.5 - juneau-marshall.JsonDetails.JsonAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.JsonAnnotation' id='juneau-marshall.JsonDetails.JsonAnnotation'>2.19.5 - @Json Annotation</a></h4>
+<div class='topic'><!-- START: 2.19.5 - juneau-marshall.JsonDetails.JsonAnnotation -->
 <p>
 	The {@link org.apache.juneau.json.annotation.Json#wrapperAttr() @Json(wrapperAttr)} annotation
 	can be used to wrap beans inside a JSON object with a specified attribute name.
@@ -4520,12 +4586,12 @@ TODO(7.2.0)
 		</td>
 	</tr>
 </table>
-</div><!-- END: 2.18.5 - juneau-marshall.JsonDetails.JsonAnnotation -->
+</div><!-- END: 2.19.5 - juneau-marshall.JsonDetails.JsonAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.JsonSchema' id='juneau-marshall.JsonDetails.JsonSchema'>2.18.6 - JSON-Schema Support</a></h4>
-<div class='topic'><!-- START: 2.18.6 - juneau-marshall.JsonDetails.JsonSchema -->
+<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 
 	documents that describe the output generated by the {@link org.apache.juneau.json.JsonSerializer} class.
@@ -4618,13 +4684,13 @@ TODO(7.2.0)
 		}
 	}
 </p>
-</div><!-- END: 2.18.6 - juneau-marshall.JsonDetails.JsonSchema -->
-</div><!-- END: 2.18 - juneau-marshall.JsonDetails -->
+</div><!-- END: 2.19.6 - juneau-marshall.JsonDetails.JsonSchema -->
+</div><!-- END: 2.19 - juneau-marshall.JsonDetails -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails' id='juneau-marshall.XmlDetails'>2.19 - XML Details</a></h3>
-<div class='topic'><!-- START: 2.19 - juneau-marshall.XmlDetails -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails' id='juneau-marshall.XmlDetails'>2.20 - XML Details</a></h3>
+<div class='topic'><!-- START: 2.20 - juneau-marshall.XmlDetails -->
 <p>
 	Juneau supports converting arbitrary POJOs to and from XML using ultra-efficient serializers and parsers.
 	<br>The XML serializer converts POJOs directly to XML without the need for intermediate DOM objects.
@@ -4701,8 +4767,8 @@ TODO(7.2.0)
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Methodology' id='juneau-marshall.XmlDetails.Methodology'>2.19.1 - XML Methodology</a></h4>
-<div class='topic'><!-- START: 2.19.1 - juneau-marshall.XmlDetails.Methodology -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Methodology' id='juneau-marshall.XmlDetails.Methodology'>2.20.1 - XML Methodology</a></h4>
+<div class='topic'><!-- START: 2.20.1 - juneau-marshall.XmlDetails.Methodology -->
 <p>
 	The following examples show how different data types are represented in XML.
 	They mirror how the data structures are represented in JSON.
@@ -5104,12 +5170,12 @@ TODO(7.2.0)
 		</xt></td>
 	</tr>
 </table>
-</div><!-- END: 2.19.1 - juneau-marshall.XmlDetails.Methodology -->
+</div><!-- END: 2.20.1 - juneau-marshall.XmlDetails.Methodology -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Serializers' id='juneau-marshall.XmlDetails.Serializers'>2.19.2 - XML Serializers</a></h4>
-<div class='topic'><!-- START: 2.19.2 - juneau-marshall.XmlDetails.Serializers -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Serializers' id='juneau-marshall.XmlDetails.Serializers'>2.20.2 - XML Serializers</a></h4>
+<div class='topic'><!-- START: 2.20.2 - juneau-marshall.XmlDetails.Serializers -->
 <p>
 	The {@link org.apache.juneau.xml.XmlSerializer} class is used to serialize POJOs into XML.
 </p>	
@@ -5150,12 +5216,12 @@ TODO(7.2.0)
 		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT_XS_NAMESPACE DEFAULT_XS_NAMESPACE}				
 	</ul>
 </ul>
-</div><!-- END: 2.19.2 - juneau-marshall.XmlDetails.Serializers -->
+</div><!-- END: 2.20.2 - juneau-marshall.XmlDetails.Serializers -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Parsers' id='juneau-marshall.XmlDetails.Parsers'>2.19.3 - XML Parsers</a></h4>
-<div class='topic'><!-- START: 2.19.3 - juneau-marshall.XmlDetails.Parsers -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Parsers' id='juneau-marshall.XmlDetails.Parsers'>2.20.3 - XML Parsers</a></h4>
+<div class='topic'><!-- START: 2.20.3 - juneau-marshall.XmlDetails.Parsers -->
 <p>
 	The {@link org.apache.juneau.xml.XmlParser} class is used to parse XML into POJOs.
 </p>	
@@ -5183,12 +5249,12 @@ TODO(7.2.0)
 		<li class='jf'>{@link org.apache.juneau.xml.XmlParser#DEFAULT DEFAULT}
 	</ul>
 </ul>
-</div><!-- END: 2.19.3 - juneau-marshall.XmlDetails.Parsers -->
+</div><!-- END: 2.20.3 - juneau-marshall.XmlDetails.Parsers -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.BeanTypeNameAnnotation' id='juneau-marshall.XmlDetails.BeanTypeNameAnnotation'>2.19.4 - @Bean(typeName) Annotation</a></h4>
-<div class='topic'><!-- START: 2.19.4 - juneau-marshall.XmlDetails.BeanTypeNameAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.BeanTypeNameAnnotation' id='juneau-marshall.XmlDetails.BeanTypeNameAnnotation'>2.20.4 - @Bean(typeName) Annotation</a></h4>
+<div class='topic'><!-- START: 2.20.4 - juneau-marshall.XmlDetails.BeanTypeNameAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.Bean#typeName() @Bean.typeName()} annotation can be used to 
 	override the Juneau default name on bean elements. 
@@ -5668,12 +5734,12 @@ TODO(7.2.0)
 	{@link javax.xml.stream.XMLInputFactory#IS_REPLACING_ENTITY_REFERENCES} setting in Java
 	forced us to make some hard design decisions that may not be the most elegant.
 </p>
-</div><!-- END: 2.19.4 - juneau-marshall.XmlDetails.BeanTypeNameAnnotation -->
+</div><!-- END: 2.20.4 - juneau-marshall.XmlDetails.BeanTypeNameAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlChildNameAnnotation' id='juneau-marshall.XmlDetails.XmlChildNameAnnotation'>2.19.5 - @Xml(childName) Annotation</a></h4>
-<div class='topic'><!-- START: 2.19.5 - juneau-marshall.XmlDetails.XmlChildNameAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlChildNameAnnotation' id='juneau-marshall.XmlDetails.XmlChildNameAnnotation'>2.20.5 - @Xml(childName) Annotation</a></h4>
+<div class='topic'><!-- START: 2.20.5 - juneau-marshall.XmlDetails.XmlChildNameAnnotation -->
 <p>
 	The {@link org.apache.juneau.xml.annotation.Xml#childName() @Xml.childName()} annotation can be used to 
 	specify the name of XML child elements for bean properties of type collection or array.
@@ -5757,12 +5823,12 @@ TODO(7.2.0)
 		</xt></td>
 	</tr>
 </table>
-</div><!-- END: 2.19.5 - juneau-marshall.XmlDetails.XmlChildNameAnnotation -->
+</div><!-- END: 2.20.5 - juneau-marshall.XmlDetails.XmlChildNameAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlFormatAnnotation' id='juneau-marshall.XmlDetails.XmlFormatAnnotation'>2.19.6 - @Xml(format) Annotation</a></h4>
-<div class='topic'><!-- START: 2.19.6 - juneau-marshall.XmlDetails.XmlFormatAnnotation -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlFormatAnnotation' id='juneau-marshall.XmlDetails.XmlFormatAnnotation'>2.20.6 - @Xml(format) Annotation</a></h4>
+<div class='topic'><!-- START: 2.20.6 - juneau-marshall.XmlDetails.XmlFormatAnnotation -->
 <p>
 	The {@link org.apache.juneau.xml.annotation.Xml#format() @Xml.format()} annotation can be used to tweak 
 	the XML format of a POJO.
@@ -6470,12 +6536,12 @@ TODO(7.2.0)
 		</xt></td>
 	</tr>
 </table>
-</div><!-- END: 2.19.6 - juneau-marshall.XmlDetails.XmlFormatAnnotation -->
+</div><!-- END: 2.20.6 - juneau-marshall.XmlDetails.XmlFormatAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Namespaces' id='juneau-marshall.XmlDetails.Namespaces'>2.19.7 - Namespaces</a></h4>
-<div class='topic'><!-- START: 2.19.7 - juneau-marshall.XmlDetails.Namespaces -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Namespaces' id='juneau-marshall.XmlDetails.Namespaces'>2.20.7 - Namespaces</a></h4>
+<div class='topic'><!-- START: 2.20.7 - juneau-marshall.XmlDetails.Namespaces -->
 <p>
 	Let's go back to the example of our original <code>Person</code> bean class, but add some namespace annotations:
 </p>
@@ -6641,12 +6707,12 @@ TODO(7.2.0)
 		.namespaces(<js>"{per:'http://www.apache.org/person/'}"</js>)
 		.build();
 </p>
-</div><!-- END: 2.19.7 - juneau-marshall.XmlDetails.Namespaces -->
+</div><!-- END: 2.20.7 - juneau-marshall.XmlDetails.Namespaces -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlSchema' id='juneau-marshall.XmlDetails.XmlSchema'>2.19.8 - XML-Schema Support</a></h4>
-<div class='topic'><!-- START: 2.19.8 - juneau-marshall.XmlDetails.XmlSchema -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlSchema' id='juneau-marshall.XmlDetails.XmlSchema'>2.20.8 - XML-Schema Support</a></h4>
+<div class='topic'><!-- START: 2.20.8 - juneau-marshall.XmlDetails.XmlSchema -->
 <p>
 	Juneau provides the {@link org.apache.juneau.xmlschema.XmlSchemaSerializer} class for generating XML-Schema 
 	documents that describe the output generated by the {@link org.apache.juneau.xml.XmlSerializer} class.
@@ -6899,13 +6965,13 @@ TODO(7.2.0)
 	#getValidator(SerializerSession,Object)} method is provided to create a 
 	{@link javax.xml.validation.Validator} using the input from the serialize method.
 </p>
-</div><!-- END: 2.19.8 - juneau-marshall.XmlDetails.XmlSchema -->
-</div><!-- END: 2.19 - juneau-marshall.XmlDetails -->
+</div><!-- END: 2.20.8 - juneau-marshall.XmlDetails.XmlSchema -->
+</div><!-- END: 2.20 - juneau-marshall.XmlDetails -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails' id='juneau-marshall.HtmlDetails'>2.20 - HTML Details</a></h3>
-<div class='topic'><!-- START: 2.20 - juneau-marshall.HtmlDetails -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails' id='juneau-marshall.HtmlDetails'>2.21 - HTML Details</a></h3>
+<div class='topic'><!-- START: 2.21 - juneau-marshall.HtmlDetails -->
 <p>
 	Juneau supports converting arbitrary POJOs to and from HTML.
 	Built on top of the existing XML parser, it also uses a STaX parser and creates POJOs directly without intermediate DOM objects.
@@ -6916,8 +6982,8 @@ TODO(7.2.0)
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Methodology' id='juneau-marshall.HtmlDetails.Methodology'>2.20.1 - HTML Methodology</a></h4>
-<div class='topic'><!-- START: 2.20.1 - juneau-marshall.HtmlDetails.Methodology -->
+<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Methodology' id='juneau-marshall.HtmlDetails.Methodology'>2.21.1 - HTML Methodology</a></h4>
+<div class='topic'><!-- START: 2.21.1 - juneau-marshall.HtmlDetails.Methodology -->
 <p>
 	The following examples show how different data types are represented in HTML.
 	They mirror how the data structures are represented in JSON.
@@ -7425,12 +7491,12 @@ TODO(7.2.0)
 		</xt></td>
 	</tr>
 </table>
-</div><!-- END: 2.20.1 - juneau-marshall.HtmlDetails.Methodology -->
+</div><!-- END: 2.21.1 - juneau-marshall.HtmlDetails.Methodology -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Serializers' id='juneau-marshall.HtmlDetails.Serializers'>2.20.2 - HTML Serializers</a></h4>
-<div class='topic'><!-- START: 2.20.2 - juneau-marshall.HtmlDetails.Serializers -->
+<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Serializers' id='juneau-marshall.HtmlDetails.Serializers'>2.21.2 - HTML Serializers</a></h4>
+<div class='topic'><!-- START: 2.21.2 - juneau-marshall.HtmlDetails.Serializers -->
 <p>
 	The {@link org.apache.juneau.html.HtmlSerializer} class is used to serialize POJOs into HTML.
 </p>	
@@ -7484,12 +7550,12 @@ TODO(7.2.0)
 		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#DEFAULT }
 	</ul>
 </ul>
-</div><!-- END: 2.20.2 - juneau-marshall.HtmlDetails.Serializers -->
+</div><!-- END: 2.21.2 - juneau-marshall.HtmlDetails.Serializers -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Parsers' id='juneau-marshall.HtmlDetails.Parsers'>2.20.3 - HTML Parsers</a></h4>
-<div class='topic'><!-- START: 2.20.3 - juneau-marshall.HtmlDetails.Parsers -->
+<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Parsers' id='juneau-marshall.HtmlDetails.Parsers'>2.21.3 - HTML Parsers</a></h4>
+<div class='topic'><!-- START: 2.21.3 - juneau-marshall.HtmlDetails.Parsers -->
 <p>
 	The {@link org.apache.juneau.html.HtmlParser} class is used to parse HTML into POJOs.
 	<br>They can also parse the contents produced by {@link org.apache.juneau.html.HtmlDocSerializer}.
@@ -7510,12 +7576,12 @@ TODO(7.2.0)
 		<li class='jf'>{@link org.apache.juneau.html.HtmlParser#DEFAULT DEFAULT}
 	</ul>
 </ul>
-</div><!-- END: 2.20.3 - juneau-marshall.HtmlDetails.Parsers -->
+</div><!-- END: 2.21.3 - juneau-marshall.HtmlDetails.Parsers -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlAnnotation' id='juneau-marshall.HtmlDetails.HtmlAnnotation'>2.20.4 - @Html Annotation</a></h4>
-<div class='topic'><!-- START: 2.20.4 - juneau-marshall.HtmlDetails.HtmlAnnotation -->
+<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlAnnotation' id='juneau-marshall.HtmlDetails.HtmlAnnotation'>2.21.4 - @Html Annotation</a></h4>
+<div class='topic'><!-- START: 2.21.4 - juneau-marshall.HtmlDetails.HtmlAnnotation -->
 <p>
 	The {@link org.apache.juneau.html.annotation.Html @Html} annotation can be used to customize how POJOs are serialized to HTML on a per-class/field/method basis.
 </p>
@@ -7559,12 +7625,12 @@ TODO(7.2.0)
 <p>
 	The {@link org.apache.juneau.html.annotation.Html#noTables @Html(noTables)} annotation is used to force beans to be serialized as trees instead of tables
 </p>
-</div><!-- END: 2.20.4 - juneau-marshall.HtmlDetails.HtmlAnnotation -->
+</div><!-- END: 2.21.4 - juneau-marshall.HtmlDetails.HtmlAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlRenderAnnotation' id='juneau-marshall.HtmlDetails.HtmlRenderAnnotation'>2.20.5 - @Html(render) Annotation</a></h4>
-<div class='topic'><!-- START: 2.20.5 - juneau-marshall.HtmlDetails.HtmlRenderAnnotation -->
+<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlRenderAnnotation' id='juneau-marshall.HtmlDetails.HtmlRenderAnnotation'>2.21.5 - @Html(render) Annotation</a></h4>
+<div class='topic'><!-- START: 2.21.5 - juneau-marshall.HtmlDetails.HtmlRenderAnnotation -->
 <p>
 	The {@link org.apache.juneau.html.annotation.Html#render @Html(render)} annotation allows for custom rendering of bean property values when serialized as HTML. 
 	Using this class, you can alter the CSS style and HTML content of the bean property.
@@ -7663,34 +7729,34 @@ TODO(7.2.0)
 		}
 	}
 </p>
-</div><!-- END: 2.20.5 - juneau-marshall.HtmlDetails.HtmlRenderAnnotation -->
+</div><!-- END: 2.21.5 - juneau-marshall.HtmlDetails.HtmlRenderAnnotation -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic todo' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlDocSerializer' id='juneau-marshall.HtmlDetails.HtmlDocSerializer'>2.20.6 - HtmlDocSerializer</a></h4>
-<div class='topic'><!-- START: 2.20.6 - juneau-marshall.HtmlDetails.HtmlDocSerializer -->
+<h4 class='topic todo' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlDocSerializer' id='juneau-marshall.HtmlDetails.HtmlDocSerializer'>2.21.6 - HtmlDocSerializer</a></h4>
+<div class='topic'><!-- START: 2.21.6 - juneau-marshall.HtmlDetails.HtmlDocSerializer -->
 TODO(7.2.0)
-</div><!-- END: 2.20.6 - juneau-marshall.HtmlDetails.HtmlDocSerializer -->
+</div><!-- END: 2.21.6 - juneau-marshall.HtmlDetails.HtmlDocSerializer -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic todo' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.CustomTemplates' id='juneau-marshall.HtmlDetails.CustomTemplates'>2.20.7 - Custom Templates</a></h4>
-<div class='topic'><!-- START: 2.20.7 - juneau-marshall.HtmlDetails.CustomTemplates -->
+<h4 class='topic todo' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.CustomTemplates' id='juneau-marshall.HtmlDetails.CustomTemplates'>2.21.7 - Custom Templates</a></h4>
+<div class='topic'><!-- START: 2.21.7 - juneau-marshall.HtmlDetails.CustomTemplates -->
 TODO(7.2.0)
-</div><!-- END: 2.20.7 - juneau-marshall.HtmlDetails.CustomTemplates -->
+</div><!-- END: 2.21.7 - juneau-marshall.HtmlDetails.CustomTemplates -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic todo' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlSchema' id='juneau-marshall.HtmlDetails.HtmlSchema'>2.20.8 - HTML-Schema Support</a></h4>
-<div class='topic'><!-- START: 2.20.8 - juneau-marshall.HtmlDetails.HtmlSchema -->
+<h4 class='topic todo' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlSchema' id='juneau-marshall.HtmlDetails.HtmlSchema'>2.21.8 - HTML-Schema Support</a></h4>
+<div class='topic'><!-- START: 2.21.8 - juneau-marshall.HtmlDetails.HtmlSchema -->
 TODO(7.2.0)
-</div><!-- END: 2.20.8 - juneau-marshall.HtmlDetails.HtmlSchema -->
-</div><!-- END: 2.20 - juneau-marshall.HtmlDetails -->
+</div><!-- END: 2.21.8 - juneau-marshall.HtmlDetails.HtmlSchema -->
+</div><!-- END: 2.21 - juneau-marshall.HtmlDetails -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails' id='juneau-marshall.UonDetails'>2.21 - UON Details</a></h3>
-<div class='topic'><!-- START: 2.21 - juneau-marshall.UonDetails -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails' id='juneau-marshall.UonDetails'>2.22 - UON Details</a></h3>
+<div class='topic'><!-- START: 2.22 - juneau-marshall.UonDetails -->
 <p>
 	Juneau supports converting arbitrary POJOs to and from UON strings using ultra-efficient serializers 
 	and parsers.
@@ -7762,8 +7828,8 @@ TODO(7.2.0)
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Methodology' id='juneau-marshall.UonDetails.Methodology'>2.21.1 - UON Methodology</a></h4>
-<div class='topic'><!-- START: 2.21.1 - juneau-marshall.UonDetails.Methodology -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Methodology' id='juneau-marshall.UonDetails.Methodology'>2.22.1 - UON Methodology</a></h4>
+<div class='topic'><!-- START: 2.22.1 - juneau-marshall.UonDetails.Methodology -->
 <h5 class='figure'>General methodology:</h5>
 <table class='styled w800' style='border-collapse:collapse'>
 	<tr><th>Java type</th><th>JSON equivalent</th><th>UON</th></tr>
@@ -7821,12 +7887,12 @@ TODO(7.2.0)
 <p>
 	Refer to the <a href='doc-files/rfc_uon.txt'>UON specification</a> for a complete set of syntax rules.		
 </p>
-</div><!-- END: 2.21.1 - juneau-marshall.UonDetails.Methodology -->
+</div><!-- END: 2.22.1 - juneau-marshall.UonDetails.Methodology -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Serializers' id='juneau-marshall.UonDetails.Serializers'>2.21.2 - UON Serializers</a></h4>
-<div class='topic'><!-- START: 2.21.2 - juneau-marshall.UonDetails.Serializers -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Serializers' id='juneau-marshall.UonDetails.Serializers'>2.22.2 - UON Serializers</a></h4>
+<div class='topic'><!-- START: 2.22.2 - juneau-marshall.UonDetails.Serializers -->
 <p>
 	The {@link org.apache.juneau.uon.UonSerializer} class is used to serialize POJOs into UON.
 </p>	
@@ -7854,12 +7920,12 @@ TODO(7.2.0)
 		<li class='jf'>{@link org.apache.juneau.uon.UonSerializer#DEFAULT_READABLE DEFAULT_READABLE}
 	</ul>
 </ul>
-</div><!-- END: 2.21.2 - juneau-marshall.UonDetails.Serializers -->
+</div><!-- END: 2.22.2 - juneau-marshall.UonDetails.Serializers -->
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Parsers' id='juneau-marshall.UonDetails.Parsers'>2.21.3 - UON Parsers</a></h4>
-<div class='topic'><!-- START: 2.21.3 - juneau-marshall.UonDetails.Parsers -->
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Parsers' id='juneau-marshall.UonDetails.Parsers'>2.22.3 - UON Parsers</a></h4>
+<div class='topic'><!-- START: 2.22.3 - juneau-marshall.UonDetails.Parsers -->
 <p>
 	The {@link org.apache.juneau.uon.UonParser} class is used to parse UON into POJOs.
 </p>	
@@ -7885,13 +7951,13 @@ TODO(7.2.0)
 		<li class='jf'>{@link org.apache.juneau.uon.UonParser#DEFAULT_DECODING DEFAULT_DECODING}			
 	</ul>
 </ul>
-</div><!-- END: 2.21.3 - juneau-marshall.UonDetails.Parsers -->
-</div><!-- END: 2.21 - juneau-marshall.UonDetails -->
+</div><!-- END: 2.22.3 - juneau-marshall.UonDetails.Parsers -->
+</div><!-- END: 2.22 - juneau-marshall.UonDetails -->
 
 <!-- ==================================================================================================== -->
 
... 715 lines suppressed ...