Merge pull request #50 from raphidlee/JUNEAU-156

JUNEAU-156
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 227101e..ee3f205 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -11,6 +11,30 @@
 * specific language governing permissions and limitations under the License.                                              *
 ***************************************************************************************************************************
 
+Release Notes - Juneau - Version 8.1.1
+
+** Bug
+    * [JUNEAU-143] - Static files mapping doesn't properly handle override scenarios.
+    * [JUNEAU-147] - Error in Swagger generator when @Example used on bean class.
+
+** Improvement
+    * [JUNEAU-144] - Add support for absolute paths on @RestResource(staticFiles)
+    * [JUNEAU-145] - @RestResource(staticFiles) should handle multiple mappings.
+    * [JUNEAU-146] - Add ranks to @Config annotations.
+
+** Task
+    * [JUNEAU-132] - Various HTTP parameter annotations should support Optional.
+    * [JUNEAU-133] - Serializers/parsers should support Optional objects and properties.
+    * [JUNEAU-134] - Parsers not correctly finding generic types on complex types involving arrays.
+    * [JUNEAU-135] - @RestMethod(debug=true) is not causing requests to be logged.
+    * [JUNEAU-136] - Juneau cannot reflect parameterized types on Spring bean methods.
+    * [JUNEAU-137] - Juneau cannot reflect parameterized types on Spring bean methods.
+    * [JUNEAU-138] - Move REST response/exception beans into juneau-marshall.
+    * [JUNEAU-139] - juneau-rest-client should not have dependency on juneau-rest-server.
+    * [JUNEAU-140] - Provide initial contents of PetStore modules.
+    * [JUNEAU-141] - Move @RemoteResource/@RemoteMethod annotations into juneau-marshall.
+    * [JUNEAU-142] - BasicRest subclasses need programmatic access to RestRequest/RestResponse
+
 
 Release Notes - Juneau - Version 8.1.0
 
diff --git a/juneau-core/juneau-config/pom.xml b/juneau-core/juneau-config/pom.xml
index 16d67f2..1886d46 100644
--- a/juneau-core/juneau-config/pom.xml
+++ b/juneau-core/juneau-config/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-core</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-config</artifactId>
diff --git a/juneau-core/juneau-core-utest/pom.xml b/juneau-core/juneau-core-utest/pom.xml
index 436b4b4..f6d3cab 100644
--- a/juneau-core/juneau-core-utest/pom.xml
+++ b/juneau-core/juneau-core-utest/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-core</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-core-utest</artifactId>
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/ValueTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/ValueTest.java
index 988742b..7c21027 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/ValueTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/ValueTest.java
@@ -13,11 +13,10 @@
 package org.apache.juneau;
 
 import static org.junit.Assert.*;
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.lang.reflect.*;
 import java.util.*;
 
+import org.apache.juneau.reflect.*;
 import org.junit.*;
 
 /**
@@ -60,6 +59,6 @@
 	@Test
 	public void testOnParameterType() throws Exception {
 		Type t = Value.getParameterType(C.class.getMethod("m1", Value.class), 0);
-		assertEquals("List<Integer>", getClassInfo(t).getShortName());
+		assertEquals("List<Integer>", ClassInfo.of(t).getShortName());
 	}
 }
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanPropertiesTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanPropertiesTest.java
new file mode 100644
index 0000000..3864a92
--- /dev/null
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanPropertiesTest.java
@@ -0,0 +1,94 @@
+// ***************************************************************************************************************************

+// * 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.a.rttests;

+

+import static org.junit.Assert.*;

+

+import java.util.*;

+

+import org.apache.juneau.parser.*;

+import org.apache.juneau.serializer.*;

+import org.apache.juneau.utils.*;

+import org.junit.*;

+import org.junit.runners.*;

+

+/**

+ * Tests designed to serialize and parse objects to make sure we end up

+ * with the same objects for all serializers and parsers.

+ */

+@SuppressWarnings({"unchecked"})

+@FixMethodOrder(MethodSorters.NAME_ASCENDING)

+public class RoundTripBeanPropertiesTest extends RoundTripTest {

+

+	public RoundTripBeanPropertiesTest(String label, SerializerBuilder s, ParserBuilder p, int flags) throws Exception {

+		super(label, s, p, flags);

+	}

+

+	//------------------------------------------------------------------------------------------------------------------

+	// Combo arrays/lists

+	//------------------------------------------------------------------------------------------------------------------

+

+	public static class A01 {

+		public List<Long>[] f1;

+	}

+

+	@Test

+	public void a01_arrayOfListOfLongs() throws Exception {

+		A01 o = new A01();

+		o.f1 = new List[1];

+		o.f1[0] = AList.create(123l);

+		o = roundTrip(o);

+		assertEquals(123, o.f1[0].get(0).intValue());

+		assertTrue(o.f1[0].get(0) instanceof Long);

+	}

+

+	public static class A02 {

+		public List<Long[]> f1;

+	}

+

+	@Test

+	public void a02_ListOfArrayOfLongs() throws Exception {

+		A02 o = new A02();

+		o.f1 = AList.<Long[]>create(new Long[]{123l});

+		o = roundTrip(o);

+		assertEquals(123, o.f1.get(0)[0].intValue());

+		assertTrue(o.f1.get(0)[0] instanceof Long);

+	}

+

+	public static class A03 {

+		public List<Long>[][] f1;

+	}

+

+	@Test

+	public void a03_2dArrayOfListOfLongs() throws Exception {

+		A03 o = new A03();

+		o.f1 = new List[1][1];

+		o.f1[0] = new List[]{AList.create(123l)};

+		o = roundTrip(o);

+		assertEquals(123, o.f1[0][0].get(0).intValue());

+		assertTrue(o.f1[0][0].get(0) instanceof Long);

+	}

+

+	public static class A04 {

+		public List<Long[][]> f1;

+	}

+

+	@Test

+	public void a04_ListOf2dArrayOfLongs() throws Exception {

+		A04 o = new A04();

+		o.f1 = AList.<Long[][]>create(new Long[][]{new Long[]{123l}});

+		o = roundTrip(o);

+		assertEquals(123, o.f1.get(0)[0][0].intValue());

+		assertTrue(o.f1.get(0)[0][0] instanceof Long);

+	}

+}

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripOptionalObjectsTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripOptionalObjectsTest.java
new file mode 100644
index 0000000..47057b0
--- /dev/null
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripOptionalObjectsTest.java
@@ -0,0 +1,379 @@
+// ***************************************************************************************************************************

+// * 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.a.rttests;

+

+import static org.junit.Assert.*;

+

+import java.util.*;

+

+import org.apache.juneau.parser.*;

+import org.apache.juneau.serializer.*;

+import org.apache.juneau.utils.*;

+import org.junit.*;

+import org.junit.runners.*;

+

+/**

+ * Tests designed to serialize and parse objects to make sure we end up

+ * with the same objects for all serializers and parsers.

+ */

+@FixMethodOrder(MethodSorters.NAME_ASCENDING)

+public class RoundTripOptionalObjectsTest extends RoundTripTest {

+

+	public RoundTripOptionalObjectsTest(String label, SerializerBuilder s, ParserBuilder p, int flags) throws Exception {

+		super(label, s, p, flags);

+	}

+

+	//------------------------------------------------------------------------------------------------------------------

+	// Standalone Optional objects

+	//------------------------------------------------------------------------------------------------------------------

+

+	// Empty Optional

+	@Test

+	public void a01_emptyOptional() throws Exception {

+		Optional<String> o = Optional.empty();

+		o = roundTrip(o);

+		assertFalse(o.isPresent());

+	}

+

+	// Optional containing String.

+	@Test

+	public void a02_optionalContainingString() throws Exception {

+		Optional<String> o = Optional.of("foobar");

+		o = roundTrip(o);

+		assertEquals("foobar", o.get());

+		o = Optional.of("");

+		o = roundTrip(o);

+		assertEquals("", o.get());

+	}

+

+	//------------------------------------------------------------------------------------------------------------------

+	// Bean properties of Optional types.

+	//------------------------------------------------------------------------------------------------------------------

+

+	//-----------------------------------------------------

+	// Optional<String>

+	//-----------------------------------------------------

+

+	public static class B01 {

+		public Optional<String> f1;

+	}

+

+	@Test

+	public void b01a_stringField() throws Exception {

+		B01 x = new B01();

+		x.f1 = Optional.of("foo");

+		x = roundTrip(x);

+		assertEquals("foo", x.f1.get());

+	}

+

+	@Test

+	public void b01b_stringField_emptyValue() throws Exception {

+		B01 x = new B01();

+		x.f1 = Optional.empty();

+		x = roundTrip(x);

+		assertFalse(x.f1.isPresent());

+	}

+

+	@Test

+	public void b01c_stringField_nullField() throws Exception {

+		B01 x = new B01();

+		x.f1 = null;

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertFalse(x.f1.isPresent());

+	}

+

+	//-----------------------------------------------------

+	// Optional<Integer>

+	//-----------------------------------------------------

+

+	public static class B02 {

+		public Optional<Integer> f1;

+	}

+

+	@Test

+	public void b02a_integerField() throws Exception {

+		B02 x = new B02();

+		x.f1 = Optional.of(123);

+		x = roundTrip(x);

+		assertEquals(123, x.f1.get().intValue());

+	}

+

+	@Test

+	public void b02b_integerField_emptyValue() throws Exception {

+		B02 x = new B02();

+		x.f1 = Optional.empty();

+		x = roundTrip(x);

+		assertFalse(x.f1.isPresent());

+	}

+

+	@Test

+	public void b02c_integerField_nullField() throws Exception {

+		B02 x = new B02();

+		x.f1 = null;

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertFalse(x.f1.isPresent());

+	}

+

+	//-----------------------------------------------------

+	// Optional<List<Integer>>

+	//-----------------------------------------------------

+

+	public static class B03 {

+		public Optional<List<Integer>> f1;

+	}

+

+	@Test

+	public void b03a_integerListField() throws Exception {

+		B03 x = new B03();

+		x.f1 = Optional.of(AList.of(123));

+		x = roundTrip(x);

+		assertEquals(123, x.f1.get().get(0).intValue());

+	}

+

+	@Test

+	public void b03b_integerListField_listWithNull() throws Exception {

+		B03 x = new B03();

+		x.f1 = Optional.of(AList.of((Integer)null));

+		x = roundTrip(x);

+		assertTrue(x.f1.isPresent());

+		assertEquals(1, x.f1.get().size());

+		assertNull(x.f1.get().get(0));

+	}

+

+	@Test

+	public void b03c_integerListField_emptyList() throws Exception {

+		B03 x = new B03();

+		x.f1 = Optional.of(AList.of());

+		x = roundTrip(x);

+		assertTrue(x.f1.isPresent());

+		assertEquals(0, x.f1.get().size());

+	}

+

+	@Test

+	public void b03d_integerListField_emptyValue() throws Exception {

+		B03 x = new B03();

+		x.f1 = Optional.empty();

+		x = roundTrip(x);

+		assertFalse(x.f1.isPresent());

+	}

+

+	@Test

+	public void b03e_integerListField_nullField() throws Exception {

+		B03 x = new B03();

+		x.f1 = null;

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertFalse(x.f1.isPresent());

+	}

+

+	//-----------------------------------------------------

+	// Optional<Optional<Integer>>

+	//-----------------------------------------------------

+

+	public static class B04 {

+		public Optional<Optional<Integer>> f1;

+	}

+

+	@Test

+	public void b04a_optionalOptionalInteger() throws Exception {

+		B04 x = new B04();

+		x.f1 = Optional.of(Optional.of(123));

+		x = roundTrip(x);

+		assertEquals(123, x.f1.get().get().intValue());

+	}

+

+	@Test

+	public void b04b_optionalOptionalInteger_emptyInnerValue() throws Exception {

+		B04 x = new B04();

+		x.f1 = Optional.of(Optional.empty());

+		x = roundTrip(x);

+		assertTrue(x.f1.isPresent());

+		assertFalse(x.f1.get().isPresent());

+	}

+

+	@Test

+	public void b04c_optionalOptionalInteger_emptyOuterValue() throws Exception {

+		B04 x = new B04();

+		x.f1 = Optional.empty();

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertTrue(x.f1.isPresent());

+		assertFalse(x.f1.get().isPresent());

+	}

+

+	@Test

+	public void b04d_optionalOptionalInteger_nullField() throws Exception {

+		B04 x = new B04();

+		x.f1 = null;

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertTrue(x.f1.isPresent());

+		assertFalse(x.f1.get().isPresent());

+	}

+

+	//-----------------------------------------------------

+	// Optional<Optional<Bean>>

+	//-----------------------------------------------------

+

+	public static class B05 {

+		public Optional<Optional<B05B>> f1;

+	}

+

+	public static class B05B {

+		public int f2;

+		public static B05B create() {

+			B05B b = new B05B();

+			b.f2 = 123;

+			return b;

+		}

+	}

+

+	@Test

+	public void b05a_optionalOptionalBean() throws Exception {

+		B05 x = new B05();

+		x.f1 = Optional.of(Optional.of(B05B.create()));

+		x = roundTrip(x);

+		assertEquals(123, x.f1.get().get().f2);

+	}

+

+	@Test

+	public void b05b_optionalOptionalBean_emptyInnerValue() throws Exception {

+		B05 x = new B05();

+		x.f1 = Optional.of(Optional.empty());

+		x = roundTrip(x);

+		assertTrue(x.f1.isPresent());

+		assertFalse(x.f1.get().isPresent());

+	}

+

+	@Test

+	public void b05c_optionalOptionalBean_emptyOuterValue() throws Exception {

+		B05 x = new B05();

+		x.f1 = Optional.empty();

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertTrue(x.f1.isPresent());

+		assertFalse(x.f1.get().isPresent());

+	}

+

+	@Test

+	public void b05d_optionalOptionalBean_nullField() throws Exception {

+		B05 x = new B05();

+		x.f1 = null;

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertTrue(x.f1.isPresent());

+		assertFalse(x.f1.get().isPresent());

+	}

+

+	//-----------------------------------------------------

+	// List<Optional<Integer>>

+	//-----------------------------------------------------

+

+	public static class B06 {

+		public List<Optional<Integer>> f1;

+	}

+

+	@Test

+	public void b06a_listOfOptionalIntegers() throws Exception {

+		B06 x = new B06();

+		x.f1 = AList.of(Optional.of(123));

+		x = roundTrip(x);

+		assertEquals(123, x.f1.get(0).get().intValue());

+	}

+

+	@Test

+	public void b06b_listOfOptionalIntegers_listWithEmpty() throws Exception {

+		B06 x = new B06();

+		x.f1 = AList.of(Optional.empty());

+		x = roundTrip(x);

+		assertEquals(1, x.f1.size());

+		assertFalse(x.f1.get(0).isPresent());

+	}

+

+	@Test

+	public void b06c_listOfOptionalIntegers_listWithNull() throws Exception {

+		B06 x = new B06();

+		x.f1 = AList.of((Optional<Integer>)null);

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertEquals(1, x.f1.size());

+		assertFalse(x.f1.get(0).isPresent());

+	}

+

+	@Test

+	public void b06d_listOfOptionalIntegers_nullField() throws Exception {

+		B06 x = new B06();

+		x.f1 = null;

+		x = roundTrip(x);

+		assertNull(x.f1);

+	}

+

+	//-----------------------------------------------------

+	// Optional<Integer>[]

+	//-----------------------------------------------------

+

+	public static class B07 {

+		public Optional<Integer>[] f1;

+		public List<Integer>[] f2;

+	}

+

+	@Test

+	@SuppressWarnings("unchecked")

+	public void b07a_arrayOfOptionalIntegers() throws Exception {

+		B07 x = new B07();

+		x.f1 = new Optional[]{Optional.of(123)};

+		x.f2 = new List[]{AList.create(123)};

+		x = roundTrip(x);

+		assertEquals(123, x.f1[0].get().intValue());

+	}

+

+	@Test

+	@SuppressWarnings("unchecked")

+	public void b07b_arrayOfOptionalIntegers_listWithEmpty() throws Exception {

+		B07 x = new B07();

+		x.f1 = new Optional[]{Optional.empty()};

+		x = roundTrip(x);

+		assertEquals(1, x.f1.length);

+		assertFalse(x.f1[0].isPresent());

+	}

+

+	@Test

+	@SuppressWarnings("unchecked")

+	public void b07c_arrayOfOptionalIntegers_listWithNull() throws Exception {

+		B07 x = new B07();

+		x.f1 = new Optional[]{null};

+		x = roundTrip(x);

+		if (isValidationOnly())

+			return;

+		assertEquals(1, x.f1.length);

+		assertFalse(x.f1[0].isPresent());

+	}

+

+	@Test

+	public void b07d_arrayOfOptionalIntegers_nullField() throws Exception {

+		B07 x = new B07();

+		x.f1 = null;

+		x = roundTrip(x);

+		assertNull(x.f1);

+	}

+}

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripSimpleObjectsTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripSimpleObjectsTest.java
index 7c472b2..0257626 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripSimpleObjectsTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripSimpleObjectsTest.java
@@ -43,6 +43,16 @@
 	}

 

 	//====================================================================================================

+	// testOptional

+	//====================================================================================================

+	@Test

+	public void testOptional() throws Exception {

+		Optional<String> o = Optional.empty();

+		o = roundTrip(o);

+		assertFalse(o.isPresent());

+	}

+

+	//====================================================================================================

 	// testString

 	//====================================================================================================

 	@Test

@@ -56,6 +66,19 @@
 	}

 

 	//====================================================================================================

+	// testOptional

+	//====================================================================================================

+	@Test

+	public void testOptionalContainingString() throws Exception {

+		Optional<String> o = Optional.of("foobar");

+		o = roundTrip(o);

+		assertEquals("foobar", o.get());

+		o = Optional.of("");

+		o = roundTrip(o);

+		assertEquals("", o.get());

+	}

+

+	//====================================================================================================

 	// testStringArray

 	//====================================================================================================

 	@Test

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlDocConfigAnnotationTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlDocConfigAnnotationTest.java
index 126e322..8fd217b 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlDocConfigAnnotationTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlDocConfigAnnotationTest.java
@@ -335,4 +335,78 @@
 			"<script>xxx| yyy|</script>"
 		);
 	}
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Rank sorting
+	//-----------------------------------------------------------------------------------------------------------------
+
+	@HtmlDocConfig(
+		rank=1,
+		aside="f1"
+	)
+	static class F1 {}
+
+	@HtmlDocConfig(
+		aside="f2"
+	)
+	static class F2 extends F1 {}
+
+	@HtmlDocConfig(
+		rank=3,
+		aside="f3"
+	)
+	static class F3 extends F2 {}
+
+	@HtmlDocConfig(
+		rank=2,
+		aside="f4"
+	)
+	static class F4 extends F3 {}
+
+	@HtmlDocConfig(
+		rank=3,
+		aside="f5"
+	)
+	static class F5 extends F4 {}
+
+	static ClassInfo f1 = ClassInfo.of(F1.class);
+	static ClassInfo f2 = ClassInfo.of(F2.class);
+	static ClassInfo f3 = ClassInfo.of(F3.class);
+	static ClassInfo f4 = ClassInfo.of(F4.class);
+	static ClassInfo f5 = ClassInfo.of(F5.class);
+
+	@Test
+	public void e01_rankedAnnotations_f1() throws Exception {
+		AnnotationList al = f1.getAnnotationListParentFirst(null).sort();
+		HtmlDocSerializerSession x = HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+		check("f1", x.getAside());
+	}
+
+	@Test
+	public void e02_rankedAnnotations_f2() throws Exception {
+		AnnotationList al = f2.getAnnotationListParentFirst(null).sort();
+		HtmlDocSerializerSession x = HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+		check("f1", x.getAside());
+	}
+
+	@Test
+	public void e03_rankedAnnotations_f3() throws Exception {
+		AnnotationList al = f3.getAnnotationListParentFirst(null).sort();
+		HtmlDocSerializerSession x = HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+		check("f3", x.getAside());
+	}
+
+	@Test
+	public void e04_rankedAnnotations_f4() throws Exception {
+		AnnotationList al = f4.getAnnotationListParentFirst(null).sort();
+		HtmlDocSerializerSession x = HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+		check("f3", x.getAside());
+	}
+
+	@Test
+	public void e05_rankedAnnotations_f5() throws Exception {
+		AnnotationList al = f5.getAnnotationListParentFirst(null).sort();
+		HtmlDocSerializerSession x = HtmlDocSerializer.create().applyAnnotations(al, sr).build().createSession();
+		check("f5", x.getAside());
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Body.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Body.java
index 223daed..9aa6d4a 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Body.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Body.java
@@ -16,8 +16,6 @@
 
 import static org.apache.juneau.testutils.TestUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.jsonschema.annotation.Items;
@@ -74,7 +72,7 @@
 
 	@Test
 	public void a03_basic_onParameter() throws Exception {
-		ParamInfo mpi = getMethodInfo(A03.class.getMethod("a", String.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A03.class.getMethod("a", String.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(Body.class, mpi).noValidate().build();
 		assertTrue(s.isRequired());
 	}
@@ -95,7 +93,7 @@
 
 	@Test
 	public void a04_basic_onParameterAndClass() throws Exception {
-		ParamInfo mpi = getMethodInfo(A04.class.getMethod("a", A02.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A04.class.getMethod("a", A02.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(Body.class, mpi).noValidate().build();
 		assertTrue(s.isRequired());
 	}
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_FormData.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_FormData.java
index 6c0c14a..853864c 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_FormData.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_FormData.java
@@ -16,8 +16,6 @@
 
 import static org.apache.juneau.testutils.TestUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.jsonschema.annotation.Items;
@@ -136,7 +134,7 @@
 
 	@Test
 	public void a03_basic_onParameter() throws Exception {
-		ParamInfo mpi = getMethodInfo(A03.class.getMethod("a", String.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A03.class.getMethod("a", String.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(FormData.class, mpi).noValidate().build();
 		assertEquals("x", s.getName());
 		assertEquals(HttpPartSchema.Type.NUMBER, s.getType());
@@ -193,7 +191,7 @@
 
 	@Test
 	public void a04_basic_onParameterAndClass() throws Exception {
-		ParamInfo mpi = getMethodInfo(A04.class.getMethod("a", A01.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A04.class.getMethod("a", A01.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(FormData.class, mpi).noValidate().build();
 		assertEquals("y", s.getName());
 		assertEquals(HttpPartSchema.Type.INTEGER, s.getType());
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Header.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Header.java
index a8a40d9..0a04701 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Header.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Header.java
@@ -15,7 +15,6 @@
 import static org.junit.Assert.*;
 import static org.junit.Assert.assertEquals;
 import static org.apache.juneau.testutils.TestUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 
 import org.apache.juneau.*;
@@ -136,7 +135,7 @@
 
 	@Test
 	public void a03_basic_onParameter() throws Exception {
-		ParamInfo mpi = getMethodInfo(A03.class.getMethod("a", String.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A03.class.getMethod("a", String.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(Header.class, mpi).noValidate().build();
 		assertEquals("x", s.getName());
 		assertEquals(HttpPartSchema.Type.NUMBER, s.getType());
@@ -193,7 +192,7 @@
 
 	@Test
 	public void a04_basic_onParameterAndClass() throws Exception {
-		ParamInfo mpi = getMethodInfo(A04.class.getMethod("a", A01.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A04.class.getMethod("a", A01.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(Header.class, mpi).noValidate().build();
 		assertEquals("y", s.getName());
 		assertEquals(HttpPartSchema.Type.INTEGER, s.getType());
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Path.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Path.java
index 67fc14a..04baf09 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Path.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Path.java
@@ -15,7 +15,6 @@
 import static org.junit.Assert.*;
 import static org.junit.Assert.assertEquals;
 import static org.apache.juneau.testutils.TestUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 
 import org.apache.juneau.*;
@@ -118,7 +117,7 @@
 
 	@Test
 	public void a03_basic_onParameter() throws Exception {
-		ParamInfo mpi = getMethodInfo(A03.class.getMethod("a", String.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A03.class.getMethod("a", String.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, mpi).noValidate().build();
 		assertEquals("x", s.getName());
 		assertEquals(HttpPartSchema.Type.NUMBER, s.getType());
@@ -163,7 +162,7 @@
 
 	@Test
 	public void a04_basic_onParameterAndClass() throws Exception {
-		ParamInfo mpi = getMethodInfo(A04.class.getMethod("a", A01.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A04.class.getMethod("a", A01.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, mpi).noValidate().build();
 		assertEquals("y", s.getName());
 		assertEquals(HttpPartSchema.Type.INTEGER, s.getType());
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Query.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Query.java
index 8c5e750..a7a0d75 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Query.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Query.java
@@ -15,7 +15,6 @@
 import static org.junit.Assert.*;
 import static org.junit.Assert.assertEquals;
 import static org.apache.juneau.testutils.TestUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 
 import org.apache.juneau.*;
@@ -136,7 +135,7 @@
 
 	@Test
 	public void a03_basic_onParameter() throws Exception {
-		ParamInfo mpi = getMethodInfo(A03.class.getMethod("a", String.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A03.class.getMethod("a", String.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(Query.class, mpi).noValidate().build();
 		assertEquals("x", s.getName());
 		assertEquals(HttpPartSchema.Type.NUMBER, s.getType());
@@ -193,7 +192,7 @@
 
 	@Test
 	public void a04_basic_onParameterAndClass() throws Exception {
-		ParamInfo mpi = getMethodInfo(A04.class.getMethod("a", A01.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A04.class.getMethod("a", A01.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(Query.class, mpi).noValidate().build();
 		assertEquals("y", s.getName());
 		assertEquals(HttpPartSchema.Type.INTEGER, s.getType());
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_ResponseHeader.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_ResponseHeader.java
index 4c6c1bc..6095cc4 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_ResponseHeader.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_ResponseHeader.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.httppart;
 
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.testutils.TestUtils.*;
 import static org.junit.Assert.*;
@@ -130,7 +129,7 @@
 
 	@Test
 	public void a03_basic_onParameter() throws Exception {
-		ParamInfo mpi = getMethodInfo(A03.class.getMethod("a", String.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A03.class.getMethod("a", String.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(ResponseHeader.class, mpi).noValidate().build();
 		assertEquals("x", s.getName());
 		assertEquals(HttpPartSchema.Type.NUMBER, s.getType());
@@ -183,7 +182,7 @@
 
 	@Test
 	public void a04_basic_onParameterAndClass() throws Exception {
-		ParamInfo mpi = getMethodInfo(A04.class.getMethod("a", A01.class)).getParam(0);
+		ParamInfo mpi = MethodInfo.of(A04.class.getMethod("a", A01.class)).getParam(0);
 		HttpPartSchema s = HttpPartSchema.create().apply(ResponseHeader.class, mpi).noValidate().build();
 		assertEquals("y", s.getName());
 		assertEquals(HttpPartSchema.Type.INTEGER, s.getType());
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
index 9712a30..d552ff8 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
@@ -67,7 +67,7 @@
 
 	@Test
 	public void of_withDeclaringClass() throws Exception {
-		check("A()", ConstructorInfo.of(ClassInfo.of(A.class), a.inner()));
+		check("A()", ConstructorInfo.of(ClassInfo.of(A.class), a.inner(), null));
 	}
 
 	@Test
@@ -83,7 +83,7 @@
 	@Test
 	public void of_null() throws Exception {
 		check(null, ConstructorInfo.of(null));
-		check(null, ConstructorInfo.of(null, null));
+		check(null, ConstructorInfo.of(null, null, null));
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/reflection/MethodInfoTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/reflection/MethodInfoTest.java
index 3e752fd..7341438 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/reflection/MethodInfoTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/reflection/MethodInfoTest.java
@@ -120,7 +120,7 @@
 	@Test
 	public void of_withDeclaringClass() {
 		check("A1.m()", a_m);
-		check("A1.m()", MethodInfo.of(ClassInfo.of(A1.class), a_m.inner()));
+		check("A1.m()", MethodInfo.of(ClassInfo.of(A1.class), a_m.inner(), null));
 	}
 
 	@Test
@@ -132,7 +132,7 @@
 	@Test
 	public void of_null() {
 		check(null, MethodInfo.of(null));
-		check(null, MethodInfo.of(null, null));
+		check(null, MethodInfo.of((ClassInfo)null, null, null));
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java
new file mode 100644
index 0000000..8955e9b
--- /dev/null
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java
@@ -0,0 +1,39 @@
+// ***************************************************************************************************************************

+// * 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.svl.vars;

+

+import static org.junit.Assert.*;

+

+import org.apache.juneau.svl.*;

+import org.junit.*;

+

+public class SystemPropertiesVarTest {

+

+	//====================================================================================================

+	// test - Basic tests

+	//====================================================================================================

+	@Test

+	public void test() throws Exception {

+		VarResolver vr = new VarResolverBuilder().vars(SystemPropertiesVar.class).build();

+

+		System.setProperty("SystemPropertiesVar.x", "foo");

+		assertEquals("foo", vr.resolve("$S{SystemPropertiesVar.x}"));

+		assertEquals("foo", vr.resolve("$S{SystemPropertiesVar.x,bar}"));

+		assertEquals("", vr.resolve("$S{SystemPropertiesVar.y}"));

+		assertEquals("bar", vr.resolve("$S{SystemPropertiesVar.y,bar}"));

+		assertEquals("bar,bar", vr.resolve("$S{SystemPropertiesVar.y,bar,bar}"));

+		assertEquals(" bar ", vr.resolve("$S{ SystemPropertiesVar.y , bar }"));

+		assertEquals(" bar,bar ", vr.resolve("$S{ SystemPropertiesVar.y , bar,bar }"));

+		assertEquals("", vr.resolve("$S{SystemPropertiesVar.y,}"));

+	}

+}

diff --git a/juneau-core/juneau-dto/pom.xml b/juneau-core/juneau-dto/pom.xml
index c5509b0..375af69 100644
--- a/juneau-core/juneau-dto/pom.xml
+++ b/juneau-core/juneau-dto/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-core</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-dto</artifactId>
diff --git a/juneau-core/juneau-marshall-rdf/pom.xml b/juneau-core/juneau-marshall-rdf/pom.xml
index 8d175b1..7aeec4d 100644
--- a/juneau-core/juneau-marshall-rdf/pom.xml
+++ b/juneau-core/juneau-marshall-rdf/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-core</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-marshall-rdf</artifactId>
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
index ead6465..31b3eed 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
@@ -100,7 +100,8 @@
 		}

 

 		if (roots.isEmpty())

-			return null;

+			return type.isOptional() ? (T)Optional.empty() : null;

+

 		if (roots.size() > 1)

 			throw new ParseException(this, "Too many root nodes found in model:  {0}", roots.size());

 		Resource resource = roots.get(0);

@@ -219,6 +220,10 @@
 			sType = swap.getSwapClassMeta(this);

 		else

 			sType = eType;

+

+		if (sType.isOptional())

+			return (T)Optional.ofNullable(parseAnything(eType.getElementType(), n, outer, pMeta));

+

 		setCurrentClass(sType);

 

 		if (! sType.canCreateNewInstance(outer)) {

diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index c9fd337..2036305 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -158,6 +158,13 @@
 			aType = object();

 		}

 

+		// Handle Optional<X>

+		if (isOptional(aType)) {

+			o = getOptionalValue(o);

+			eType = getOptionalType(eType);

+			aType = getClassMetaForObject(o, object());

+		}

+

 		if (o != null) {

 

 			if (aType.isDelegate()) {

diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/annotation/RdfConfig.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/annotation/RdfConfig.java
index 68725b4..153a075 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/annotation/RdfConfig.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/annotation/RdfConfig.java
@@ -36,6 +36,14 @@
 @PropertyStoreApply(RdfConfigApply.class)
 public @interface RdfConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// RdfCommon
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/pom.xml b/juneau-core/juneau-marshall/pom.xml
index bedef67..738e723 100644
--- a/juneau-core/juneau-marshall/pom.xml
+++ b/juneau-core/juneau-marshall/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-core</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-marshall</artifactId>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index 999f783..641d820 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -2010,7 +2010,7 @@
 
 		LinkedList<BeanFilter> lbf = new LinkedList<>();
 		for (Class<?> c : getClassListProperty(BEAN_beanFilters)) {
-			ClassInfo ci = getClassInfo(c);
+			ClassInfo ci = ClassInfo.of(c);
 			if (ci.isChildOf(BeanFilter.class))
 				lbf.add(castOrCreate(BeanFilter.class, c));
 			else if (ci.isChildOf(BeanFilterBuilder.class))
@@ -2023,7 +2023,7 @@
 		LinkedList<PojoSwap<?,?>> lpf = new LinkedList<>();
 		for (Object o : getListProperty(BEAN_pojoSwaps, Object.class)) {
 			if (o instanceof Class) {
-				ClassInfo ci = getClassInfo((Class<?>)o);
+				ClassInfo ci = ClassInfo.of((Class<?>)o);
 				if (ci.isChildOf(PojoSwap.class))
 					lpf.add(castOrCreate(PojoSwap.class, ci.inner()));
 				else if (ci.isChildOf(Surrogate.class))
@@ -2040,7 +2040,7 @@
 
 		Map<String,ClassInfo> icm = new LinkedHashMap<>();
 		for (Map.Entry<String,Class<?>> e : getClassMapProperty(BEAN_implClasses).entrySet())
-			icm.put(e.getKey(), getClassInfo(e.getValue()));
+			icm.put(e.getKey(), ClassInfo.of(e.getValue()));
 		implClasses = unmodifiableMap(icm);
 
 		Map<String,String[]> m2 = new HashMap<>();
@@ -2192,7 +2192,7 @@
 				if (p.getName().startsWith(p2))
 					return true;
 		}
-		ClassInfo ci = getClassInfo(c);
+		ClassInfo ci = ClassInfo.of(c);
 		for (Class exclude : notBeanClasses)
 			if (ci.isChildOf(exclude))
 				return true;
@@ -2349,7 +2349,7 @@
 	 */
 	private ClassMeta<?> getTypedClassMeta(ClassMeta<?>[] c, int pos) {
 		ClassMeta<?> cm = c[pos++];
-		if (cm.isCollection()) {
+		if (cm.isCollection() || cm.isOptional()) {
 			ClassMeta<?> ce = c.length == pos ? object() : getTypedClassMeta(c, pos);
 			return (ce.isObject() ? cm : new ClassMeta(cm, null, null, ce));
 		} else if (cm.isMap()) {
@@ -2373,7 +2373,7 @@
 				return cm;
 			if (cm.isMap())
 				return getClassMeta(cm.innerClass, cm.getKeyType(), cm.getValueType());
-			if (cm.isCollection())
+			if (cm.isCollection() || cm.isOptional())
 				return getClassMeta(cm.innerClass, cm.getElementType());
 			return getClassMeta(cm.innerClass);
 		}
@@ -2390,7 +2390,7 @@
 		// If this is a Map or Collection, and the parameter types aren't part
 		// of the class definition itself (e.g. class AddressBook extends List<Person>),
 		// then we need to figure out the parameters.
-		if (rawType.isMap() || rawType.isCollection()) {
+		if (rawType.isMap() || rawType.isCollection() || rawType.isOptional()) {
 			ClassMeta[] params = findParameters(o, c);
 			if (params == null)
 				return rawType;
@@ -2401,7 +2401,7 @@
 					return rawType;
 				return new ClassMeta(rawType, params[0], params[1], null);
 			}
-			if (rawType.isCollection()) {
+			if (rawType.isCollection() || rawType.isOptional()) {
 				if (params.length != 1)
 					return rawType;
 				if (params[0].isObject())
@@ -2410,6 +2410,14 @@
 			}
 		}
 
+		if (rawType.isArray()) {
+			if (o instanceof GenericArrayType) {
+				GenericArrayType gat = (GenericArrayType)o;
+				ClassMeta elementType = resolveClassMeta(gat.getGenericComponentType(), typeVarImpls);
+				return new ClassMeta(rawType, null, null, elementType);
+			}
+		}
+
 		return rawType;
 	}
 
@@ -2551,10 +2559,10 @@
 				return new ClassMeta<>(cm2, keyType, valueType, null);
 			}
 
-			if (cm2.isCollection()) {
+			if (cm2.isCollection() || cm2.isOptional()) {
 				Class<?>[] pParams = (p.params().length == 0 ? new Class[]{Object.class} : p.params());
 				if (pParams.length != 1)
-					throw new FormattedRuntimeException("Invalid number of parameters specified for Collection (must be 1): {0}", pParams.length);
+					throw new FormattedRuntimeException("Invalid number of parameters specified for "+(cm2.isCollection() ? "Collection" : cm2.isOptional() ? "Optional" : "Array")+" (must be 1): {0}", pParams.length);
 				ClassMeta<?> elementType = resolveType(pParams[0], cm2.getElementType(), cm.getElementType());
 				if (elementType.isObject())
 					return cm2;
@@ -2649,7 +2657,7 @@
 	private final <T> BeanFilter findBeanFilter(Class<T> c) {
 		if (c != null)
 			for (BeanFilter f : beanFilters)
-				if (getClassInfo(f.getBeanClass()).isParentOf(c))
+				if (ClassInfo.of(f.getBeanClass()).isParentOf(c))
 					return f;
 		return null;
 	}
@@ -2708,7 +2716,7 @@
 		if (includeProperties.isEmpty())
 			return null;
 		String[] s = null;
-		ClassInfo ci = getClassInfo(c);
+		ClassInfo ci = ClassInfo.of(c);
 		for (ClassInfo c2 : ci.getAllParents()) {
 			s = includeProperties.get(c2.getFullName());
 			if (s != null)
@@ -2730,7 +2738,7 @@
 		if (excludeProperties.isEmpty())
 			return null;
 		String[] s = null;
-		ClassInfo ci = getClassInfo(c);
+		ClassInfo ci = ClassInfo.of(c);
 		for (ClassInfo c2 : ci.getAllParents()) {
 			s = excludeProperties.get(c2.getFullName());
 			if (s != null)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
index e6d273f..c975510 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
@@ -148,6 +148,14 @@
 			}

 			arrayPropertyCache = null;

 		}

+

+		// Initialize any null Optional<X> fields.

+		for (BeanPropertyMeta pMeta : this.meta.properties.values()) {

+			ClassMeta<?> cm = pMeta.getClassMeta();

+			if (cm.isOptional() && pMeta.get(this, pMeta.getName()) == null)

+				pMeta.set(this, pMeta.getName(), cm.getOptionalDefault());

+		}

+

 		return b;

 	}

 

@@ -266,7 +274,6 @@
 		p.add(this, property, value);

 	}

 

-

 	/**

 	 * Gets a property on the bean.

 	 *

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index 341328c..12b42b8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************

 package org.apache.juneau;

 

-import static org.apache.juneau.internal.ClassUtils.*;

 import static org.apache.juneau.internal.CollectionUtils.*;

 import static org.apache.juneau.internal.StringUtils.*;

 import static org.apache.juneau.reflect.ReflectFlags.*;

@@ -554,9 +553,9 @@
 			this.methodType = type;

 			this.method = method;

 			if (type == MethodType.SETTER)

-				this.type = getClassInfo(method.getParameterTypes()[0]);

+				this.type = ClassInfo.of(method.getParameterTypes()[0]);

 			else

-				this.type = getClassInfo(method.getReturnType());

+				this.type = ClassInfo.of(method.getReturnType());

 		}

 

 		/*

@@ -767,7 +766,7 @@
 

 	private static void findClasses(Class<?> c, LinkedList<ClassInfo> l, Class<?> stopClass) {

 		while (c != null && stopClass != c) {

-			l.addFirst(getClassInfo(c));

+			l.addFirst(ClassInfo.of(c));

 			for (Class<?> ci : c.getInterfaces())

 				findClasses(ci, l, stopClass);

 			c = c.getSuperclass();

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index e8b366b..99cfd3d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -196,7 +196,7 @@
 			}

 

 			if (getter != null) {

-				BeanProperty p = getMethodInfo(getter).getAnnotation(BeanProperty.class);

+				BeanProperty p = MethodInfo.of(getter).getAnnotation(BeanProperty.class);

 				if (rawTypeMeta == null)

 					rawTypeMeta = f.resolveClassMeta(p, getter.getGenericReturnType(), typeVarImpls);

 				isUri |= (rawTypeMeta.isUri() || getter.isAnnotationPresent(org.apache.juneau.annotation.URI.class));

@@ -212,7 +212,7 @@
 			}

 

 			if (setter != null) {

-				BeanProperty p = getMethodInfo(setter).getAnnotation(BeanProperty.class);

+				BeanProperty p = MethodInfo.of(setter).getAnnotation(BeanProperty.class);

 				if (rawTypeMeta == null)

 					rawTypeMeta = f.resolveClassMeta(p, setter.getGenericParameterTypes()[0], typeVarImpls);

 				isUri |= (rawTypeMeta.isUri() || setter.isAnnotationPresent(org.apache.juneau.annotation.URI.class));

@@ -270,7 +270,7 @@
 			}

 			if (field != null) {

 				if (isDyna) {

-					if (! getClassInfo(field.getType()).isChildOf(Map.class))

+					if (! ClassInfo.of(field.getType()).isChildOf(Map.class))

 						return false;

 				} else {

 					if (! ci.isChildOf(field.getType()))

@@ -313,7 +313,7 @@
 				c = s.impl();

 			if (c == Null.class)

 				return null;

-			ClassInfo ci = getClassInfo(c);

+			ClassInfo ci = ClassInfo.of(c);

 			if (ci.isChildOf(PojoSwap.class)) {

 				PojoSwap ps = castOrCreate(PojoSwap.class, c);

 				if (ps.forMediaTypes() != null)

@@ -373,11 +373,11 @@
 		this.field = b.field;

 		this.innerField = b.innerField;

 		this.getter = b.getter;

-		this.getterInfo = getMethodInfo(b.getter);

+		this.getterInfo = MethodInfo.of(b.getter);

 		this.setter = b.setter;

-		this.setterInfo = getMethodInfo(b.setter);

+		this.setterInfo = MethodInfo.of(b.setter);

 		this.extraKeys = b.extraKeys;

-		this.extraKeysInfo = getMethodInfo(b.extraKeys);

+		this.extraKeysInfo = MethodInfo.of(b.extraKeys);

 		this.isUri = b.isUri;

 		this.beanMeta = b.beanMeta;

 		this.beanContext = b.beanContext;

@@ -1067,19 +1067,19 @@
 		List<A> l = new LinkedList<>();

 		if (field != null) {

 			addIfNotNull(l, field.getAnnotation(a));

-			getClassInfo(field.getType()).appendAnnotations(l, a);

+			ClassInfo.of(field.getType()).appendAnnotations(l, a);

 		}

 		if (getter != null) {

-			addIfNotNull(l, getMethodInfo(getter).getAnnotation(a));

-			getClassInfo(getter.getReturnType()).appendAnnotations(l, a);

+			addIfNotNull(l, MethodInfo.of(getter).getAnnotation(a));

+			ClassInfo.of(getter.getReturnType()).appendAnnotations(l, a);

 		}

 		if (setter != null) {

-			addIfNotNull(l, getMethodInfo(setter).getAnnotation(a));

-			getClassInfo(setter.getReturnType()).appendAnnotations(l, a);

+			addIfNotNull(l, MethodInfo.of(setter).getAnnotation(a));

+			ClassInfo.of(setter.getReturnType()).appendAnnotations(l, a);

 		}

 		if (extraKeys != null) {

-			addIfNotNull(l, getMethodInfo(extraKeys).getAnnotation(a));

-			getClassInfo(extraKeys.getReturnType()).appendAnnotations(l, a);

+			addIfNotNull(l, MethodInfo.of(extraKeys).getAnnotation(a));

+			ClassInfo.of(extraKeys.getReturnType()).appendAnnotations(l, a);

 		}

 

 		getBeanMeta().getClassMeta().getInfo().appendAnnotations(l, a);

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
index bd161af..37cb982 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
@@ -64,7 +64,7 @@
 	private void addClass(Class<?> c) {
 		try {
 			if (c != null) {
-				ClassInfo ci = getClassInfo(c);
+				ClassInfo ci = ClassInfo.of(c);
 				if (ci.isChildOf(Collection.class)) {
 					@SuppressWarnings("rawtypes")
 					Collection cc = castOrCreate(Collection.class, c);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
index 8ada5d3..b78fba9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
@@ -283,15 +283,18 @@
 					return to.getPrimitiveDefault();

 

 				// Otherwise, just return null.

-				return null;

+				return to.isOptional() ? (T)to.getOptionalDefault() : null;

 			}

 

+			if (to.isOptional() && (! (value instanceof Optional)))

+				return (T) Optional.ofNullable(convertToMemberType(outer, value, to.getElementType()));

+

 			Class<T> tc = to.getInnerClass();

 

 			// If no conversion needed, then just return the value.

 			// Don't include maps or collections, because child elements may need conversion.

 			if (tc.isInstance(value))

-				if (! ((to.isMap() && to.getValueType().isNotObject()) || (to.isCollection() && to.getElementType().isNotObject())))

+				if (! ((to.isMap() && to.getValueType().isNotObject()) || ((to.isCollection() || to.isOptional()) && to.getElementType().isNotObject())))

 					return (T)value;

 

 			PojoSwap swap = to.getPojoSwap(this);

@@ -573,7 +576,7 @@
 			if (to.isString()) {

 				if (from.isByteArray()) {

 					return (T) new String((byte[])value);

-				} else if (from.isMapOrBean() || from.isCollectionOrArray()) {

+				} else if (from.isMapOrBean() || from.isCollectionOrArrayOrOptional()) {

 					if (SimpleJsonSerializer.DEFAULT != null)

 						return (T)SimpleJsonSerializer.DEFAULT.serialize(value);

 				} else if (from.isClass()) {

@@ -1016,9 +1019,20 @@
 	 * @return The ClassMeta object, or <jk>null</jk> if {@code o} is <jk>null</jk>.

 	 */

 	public final <T> ClassMeta<T> getClassMetaForObject(T o) {

+		return (ClassMeta<T>)getClassMetaForObject(o, null);

+	}

+

+	/**

+	 * Shortcut for calling {@code getClassMeta(o.getClass())} but returns a default value if object is <jk>null</jk>.

+	 *

+	 * @param o The class to find the class type for.

+	 * @param def The default {@link ClassMeta} if the object is null.

+	 * @return The ClassMeta object, or the default value if {@code o} is <jk>null</jk>.

+	 */

+	protected final ClassMeta<?> getClassMetaForObject(Object o, ClassMeta<?> def) {

 		if (o == null)

-			return null;

-		return (ClassMeta<T>)getClassMeta(o.getClass());

+			return def;

+		return getClassMeta(o.getClass());

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
index ab1c48d..8301fb4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseSession.java
@@ -165,6 +165,42 @@
 	}
 
 	/**
+	 * Same as {@link ClassMeta#isOptional()} but gracefully handles a null {@link ClassMeta}.
+	 *
+	 * @param cm The meta to check.
+	 * @return <jk>true</jk> if the specified meta is an {@link Optional}.
+	 */
+	protected final boolean isOptional(ClassMeta<?> cm) {
+		return (cm != null && cm.isOptional());
+	}
+
+	/**
+	 * Returns the inner type of an {@link Optional}.
+	 *
+	 * @param cm The meta to check.
+	 * @return The inner type of an {@link Optional}.
+	 */
+	protected final ClassMeta<?> getOptionalType(ClassMeta<?> cm) {
+		if (cm.isOptional())
+			return getOptionalType(cm.getElementType());
+		return cm;
+	}
+
+	/**
+	 * If the specified object is an {@link Optional}, returns the inner object.
+	 *
+	 * @param o The object to check.
+	 * @return The inner object if it's an {@link Optional}, <jk>null</jk> if it's <jk>null</jk>, or else the same object.
+	 */
+	protected final Object getOptionalValue(Object o) {
+		if (o == null)
+			return null;
+		if (o instanceof Optional)
+			return getOptionalValue(((Optional<?>)o).orElse(null));
+		return o;
+	}
+
+	/**
 	 * Logs a warning message.
 	 *
 	 * @param t The throwable that was thrown (if there was one).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 2a0dc9e..b3e1de1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -60,7 +60,7 @@
 

 	/** Class categories. */

 	enum ClassCategory {

-		MAP, COLLECTION, CLASS, METHOD, NUMBER, DECIMAL, BOOLEAN, CHAR, DATE, ARRAY, ENUM, OTHER, CHARSEQ, STR, OBJ, URI, BEANMAP, READER, INPUTSTREAM, VOID, ARGS

+		MAP, COLLECTION, CLASS, METHOD, NUMBER, DECIMAL, BOOLEAN, CHAR, DATE, ARRAY, ENUM, OTHER, CHARSEQ, STR, OBJ, URI, BEANMAP, READER, INPUTSTREAM, VOID, ARGS, OPTIONAL

 	}

 

 	final Class<T> innerClass;                              // The class being wrapped.

@@ -141,7 +141,7 @@
 	@SuppressWarnings({ "rawtypes", "unchecked" })

 	ClassMeta(Class<T> innerClass, BeanContext beanContext, Class<? extends T> implClass, BeanFilter beanFilter, PojoSwap<T,?>[] pojoSwaps, PojoSwap<?,?>[] childPojoSwaps, Object example) {

 		this.innerClass = innerClass;

-		this.info = getClassInfo(innerClass);

+		this.info = ClassInfo.of(innerClass);

 		this.beanContext = beanContext;

 		this.extMeta = new MetadataMap();

 		String notABeanReason = null;

@@ -256,7 +256,7 @@
 	@SuppressWarnings("unchecked")

 	ClassMeta(ClassMeta<?>[] args) {

 		this.innerClass = (Class<T>) Object[].class;

-		this.info = getClassInfo(innerClass);

+		this.info = ClassInfo.of(innerClass);

 		this.extMeta = new MetadataMap();

 		this.args = args;

 		this.implClass = null;

@@ -344,7 +344,7 @@
 			this.beanContext = beanContext;

 

 			this.implClass = implClass;

-			ClassInfo ici = getClassInfo(implClass);

+			ClassInfo ici = ClassInfo.of(implClass);

 			this.childPojoSwaps = childPojoSwaps;

 			if (childPojoSwaps == null) {

 				this.childSwapMap = null;

@@ -355,7 +355,7 @@
 			}

 

 			Class<T> c = innerClass;

-			ci = getClassInfo(c);

+			ci = ClassInfo.of(c);

 

 			if (c.isPrimitive()) {

 				if (c == Boolean.TYPE)

@@ -416,6 +416,8 @@
 					cc = READER;

 				else if (ci.isChildOf(InputStream.class))

 					cc = INPUTSTREAM;

+				else if (ci.is(Optional.class))

+					cc = OPTIONAL;

 			}

 

 			isMemberClass = ci.isMemberClass() && ci.isNotStatic();

@@ -448,13 +450,13 @@
 			for (FieldInfo f : ci.getAllFieldsParentFirst()) {

 				if (f.hasAnnotation(ParentProperty.class)) {

 					if (f.isStatic())

-						throw new ClassMetaRuntimeException("@ParentProperty used on invalid field ''{0}''.  Must be static.", f);

+						throw new ClassMetaRuntimeException(c, "@ParentProperty used on invalid field ''{0}''.  Must be static.", f);

 					f.setAccessible();

 					parentPropertyMethod = new Setter.FieldSetter(f.inner());

 				}

 				if (f.hasAnnotation(NameProperty.class)) {

 					if (f.isStatic())

-						throw new ClassMetaRuntimeException("@NameProperty used on invalid field ''{0}''.  Must be static.", f);

+						throw new ClassMetaRuntimeException(c, "@NameProperty used on invalid field ''{0}''.  Must be static.", f);

 					f.setAccessible();

 					namePropertyMethod = new Setter.FieldSetter(f.inner());

 				}

@@ -463,7 +465,7 @@
 			for (FieldInfo f : ci.getDeclaredFields()) {

 				if (f.hasAnnotation(Example.class)) {

 					if (! (f.isStatic() && ci.isParentOf(f.getType().inner())))

-						throw new ClassMetaRuntimeException("@Example used on invalid field ''{0}''.  Must be static and an instance of the type.", f);

+						throw new ClassMetaRuntimeException(c, "@Example used on invalid field ''{0}''.  Must be static and an instance of the type.", f);

 					f.setAccessible();

 					exampleField = f.inner();

 				}

@@ -473,13 +475,13 @@
 			for (MethodInfo m : ci.getAllMethodsParentFirst()) {

 				if (m.hasAnnotation(ParentProperty.class)) {

 					if (m.isStatic() || ! m.hasNumParams(1))

-						throw new ClassMetaRuntimeException("@ParentProperty used on invalid method ''{0}''.  Must not be static and have one argument.", m);

+						throw new ClassMetaRuntimeException(c, "@ParentProperty used on invalid method ''{0}''.  Must not be static and have one argument.", m);

 					m.setAccessible();

 					parentPropertyMethod = new Setter.MethodSetter(m.inner());

 				}

 				if (m.hasAnnotation(NameProperty.class)) {

 					if (m.isStatic() || ! m.hasNumParams(1))

-						throw new ClassMetaRuntimeException("@NameProperty used on invalid method ''{0}''.  Must not be static and have one argument.", m);

+						throw new ClassMetaRuntimeException(c, "@NameProperty used on invalid method ''{0}''.  Must not be static and have one argument.", m);

 					m.setAccessible();

 					namePropertyMethod = new Setter.MethodSetter(m.inner());

 				}

@@ -488,7 +490,7 @@
 			for (MethodInfo m : ci.getDeclaredMethods()) {

 				if (m.hasAnnotation(Example.class)) {

 					if (! (m.isStatic() && m.hasFuzzyParamTypes(BeanSession.class) && ci.isParentOf(m.getReturnType().inner())))

-						throw new ClassMetaRuntimeException("@Example used on invalid method ''{0}''.  Must be static and return an instance of the declaring class.", m);

+						throw new ClassMetaRuntimeException(c, "@Example used on invalid method ''{0}''.  Must be static and return an instance of the declaring class.", m);

 					m.setAccessible();

 					exampleMethod = m.inner();

 				}

@@ -552,7 +554,7 @@
 				}

 

 				// If this is a COLLECTION, see if it's parameterized (e.g. AddressBook extends LinkedList<Person>)

-				else if (cc == COLLECTION) {

+				else if (cc == COLLECTION || cc == OPTIONAL) {

 					ClassMeta[] parameters = findParameters();

 					if (parameters != null && parameters.length == 1) {

 						elementType = parameters[0];

@@ -654,6 +656,7 @@
 					case OBJ:

 					case OTHER:

 					case READER:

+					case OPTIONAL:

 					case VOID:

 						break;

 				}

@@ -701,7 +704,7 @@
 			Class<?> c = s.value();

 			if (c == Null.class)

 				c = s.impl();

-			ClassInfo ci = getClassInfo(c);

+			ClassInfo ci = ClassInfo.of(c);

 

 			if (ci.isChildOf(PojoSwap.class)) {

 				PojoSwap ps = castOrCreate(PojoSwap.class, c);

@@ -718,7 +721,7 @@
 					return (PojoSwap<T,?>)l.iterator().next();

 			}

 

-			throw new ClassMetaRuntimeException("Invalid swap class ''{0}'' specified.  Must extend from PojoSwap or Surrogate.", c);

+			throw new ClassMetaRuntimeException(c, "Invalid swap class ''{0}'' specified.  Must extend from PojoSwap or Surrogate.", c);

 		}

 

 		private ClassMeta<?> findClassMeta(Class<?> c) {

@@ -891,7 +894,7 @@
 	 */

 	@SuppressWarnings({"unchecked"})

 	protected static <T> Constructor<? extends T> findNoArgConstructor(Class<?> c, Visibility v) {

-		ClassInfo ci = getClassInfo(c);

+		ClassInfo ci = ClassInfo.of(c);

 		if (ci.isAbstract())

 			return null;

 		boolean isMemberClass = ci.isMemberClass() && ci.isNotStatic();

@@ -957,7 +960,7 @@
 				}

 			}

 			if (exampleMethod != null)

-				return (T)getMethodInfo(exampleMethod).invokeFuzzy(null, session);

+				return (T)MethodInfo.of(exampleMethod).invokeFuzzy(null, session);

 			if (exampleField != null)

 				return (T)exampleField.get(null);

 

@@ -1072,6 +1075,15 @@
 	}

 

 	/**

+	 * Returns <jk>true</jk> if this class is a subclass of {@link Optional}.

+	 *

+	 * @return <jk>true</jk> if this class is a subclass of {@link Optional}.

+	 */

+	public boolean isOptional() {

+		return cc == OPTIONAL;

+	}

+

+	/**

 	 * Returns <jk>true</jk> if this class is a subclass of {@link Collection} or is an array.

 	 *

 	 * @return <jk>true</jk> if this class is a subclass of {@link Collection} or is an array.

@@ -1080,6 +1092,14 @@
 		return cc == COLLECTION || cc == ARRAY;

 	}

 

+	/**

+	 * Returns <jk>true</jk> if this class is a subclass of {@link Collection} or is an array or {@link Optional}.

+	 *

+	 * @return <jk>true</jk> if this class is a subclass of {@link Collection} or is an array or {@link Optional}.

+	 */

+	public boolean isCollectionOrArrayOrOptional() {

+		return cc == COLLECTION || cc == ARRAY || cc == OPTIONAL;

+	}

 

 	/**

 	 * Returns <jk>true</jk> if this class extends from {@link Set}.

@@ -1638,6 +1658,20 @@
 	}

 

 	/**

+	 * If this is an {@link Optional}, returns an empty optional.

+	 *

+	 * <p>

+	 * Note that if this is a nested optional, will recursively create empty optionals.

+	 *

+	 * @return An empty optional, or <jk>null</jk> if this isn't an optional.

+	 */

+	public Optional<?> getOptionalDefault() {

+		if (isOptional())

+			return Optional.ofNullable(getElementType().getOptionalDefault());

+		return null;

+	}

+

+	/**

 	 * Converts the specified object to a string.

 	 *

 	 * @param t The object to convert.

@@ -1788,7 +1822,7 @@
 			return sb.append(n).append(keyType.isObject() && valueType.isObject() ? "" : "<"+keyType.toString(simple)+","+valueType.toString(simple)+">");

 		if (cc == BEANMAP)

 			return sb.append(BeanMap.class.getName()).append('<').append(n).append('>');

-		if (cc == COLLECTION)

+		if (cc == COLLECTION || cc == OPTIONAL)

 			return sb.append(n).append(elementType.isObject() ? "" : "<"+elementType.toString(simple)+">");

 		return sb.append(n);

 	}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextCache.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextCache.java
index 31ab308..e7455cb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextCache.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextCache.java
@@ -146,7 +146,7 @@
 		String[] prefixes = prefixCache.get(c);
 		if (prefixes == null) {
 			Set<String> ps = new HashSet<>();
-			for (ClassInfo c2 : getClassInfo(c).getAllParents()) {
+			for (ClassInfo c2 : ClassInfo.of(c).getAllParents()) {
 				ConfigurableContext cc = c2.getAnnotation(ConfigurableContext.class);
 				if (cc != null) {
 					if (cc.nocache()) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStore.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStore.java
index e3c745b..d0f31c4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStore.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStore.java
@@ -22,6 +22,7 @@
 import org.apache.juneau.PropertyStoreBuilder.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
+import org.apache.juneau.reflect.*;
 
 
 /**
@@ -778,7 +779,7 @@
 		 * @throws ConfigException If value could not be converted.
 		 */
 		public <T> T as(Class<T> c) {
-			Class<?> c2 = getClassInfo(c).getPrimitiveWrapper();
+			Class<?> c2 = ClassInfo.of(c).getPrimitiveWrapper();
 			if (c2 != null)
 				c = (Class<T>)c2;
 			if (c.isInstance(value))
@@ -987,9 +988,9 @@
 	//-------------------------------------------------------------------------------------------------------------------
 
 	static <T> T instantiate(ResourceResolver resolver, Object outer, Class<T> c, Object value, Object...args) {
-		if (getClassInfo(c).isParentOf(value.getClass()))
+		if (ClassInfo.of(c).isParentOf(value.getClass()))
 			return (T)value;
-		if (getClassInfo(value.getClass()).isChildOf(Class.class))
+		if (ClassInfo.of(value.getClass()).isChildOf(Class.class))
 			return resolver.resolve(outer, (Class<T>)value, args);
 		return null;
 	}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStoreBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStoreBuilder.java
index 55d9f02..e3d4b30 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStoreBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStoreBuilder.java
@@ -124,7 +124,7 @@
 	 */
 	@SuppressWarnings("unchecked")
 	public PropertyStoreBuilder applyAnnotations(AnnotationList al, VarResolverSession r) {
-		for (AnnotationInfo<?> ai : al) {
+		for (AnnotationInfo<?> ai : al.sort()) {
 			try {
 				ai.getConfigApply(r).apply((AnnotationInfo<Annotation>)ai, this);
 			} catch (ConfigException ex) {
@@ -341,6 +341,7 @@
 	 * 		Out-of-range indexes are simply 'adjusted' to the beginning or the end of the list.
 	 * 		So, for example, a value of <js>"-100"</js> will always just cause the entry to be added to the beginning
 	 * 		of the list.
+	 * 		<br>NOTE:  If <jk>null</jk>, value will be inserted at position 0.
 	 * 	<br>For MAPs, this can be <jk>null</jk> if we're adding a map, or a string key if we're adding an entry.
 	 * @param value
 	 * 	The new value to add to the property.
@@ -370,11 +371,14 @@
 	}
 
 	/**
-	 * Adds a value to a SET, LIST, or MAP property.
+	 * Adds/prepends a value to a SET, LIST, or MAP property.
 	 *
 	 * <p>
 	 * Shortcut for calling <code>addTo(key, <jk>null</jk>, value);</code>.
 	 *
+	 * <p>
+	 * NOTE:  When adding to a list, the value is inserted at the beginning of the list.
+	 *
 	 * @param key The property key.
 	 * @param value
 	 * 	The new value to add to the property.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
index a63bb53..9dc18ac 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Session.java
@@ -21,6 +21,7 @@
 
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
+import org.apache.juneau.reflect.*;
 
 /**
  * A one-time-use non-thread-safe object that's meant to be used once and then thrown away.
@@ -88,7 +89,7 @@
 		Object o = properties.get(key);
 		if (o == null)
 			return def;
-		type = (Class<T>)getClassInfo(type).getWrapperIfPrimitive();
+		type = (Class<T>)ClassInfo.of(type).getWrapperIfPrimitive();
 		T t = properties.get(key, type);
 		return t == null ? def : t;
 	}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
index 2e8b43b..37f3b2a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
@@ -12,10 +12,10 @@
 // ***************************************************************************************************************************
 package org.apache.juneau;
 
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.lang.reflect.*;
 
+import org.apache.juneau.reflect.*;
+
 /**
  * Represents a simple settable value.
  *
@@ -65,7 +65,7 @@
 		} else if (t instanceof Class) {
 			Class<?> c = (Class<?>)t;
 			if (Value.class.isAssignableFrom(c)) {
-				return getClassInfo(c).getParameterType(0, Value.class);
+				return ClassInfo.of(c).getParameterType(0, Value.class);
 			}
 		}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
index c686719..82f3c1e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
@@ -37,6 +37,14 @@
 @PropertyStoreApply(BeanConfigApply.class)
 public @interface BeanConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// BeanContext
 	//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/annotation/CsvConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/annotation/CsvConfig.java
index 4b78b63..1d731ef 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/annotation/CsvConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/annotation/CsvConfig.java
@@ -31,4 +31,13 @@
 @Retention(RUNTIME)
 @Inherited
 @PropertyStoreApply(CsvConfigApply.class)
-public @interface CsvConfig {}
+public @interface CsvConfig {
+
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index b9d7b6a..151fbeb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -98,6 +98,10 @@
 			sType = swap.getSwapClassMeta(this);

 		else

 			sType = eType;

+

+		if (sType.isOptional()) 

+			return (T)Optional.ofNullable(parseAnything(eType.getElementType(), r, outer, isRoot, pMeta));

+

 		setCurrentClass(sType);

 

 		int event = r.getEventType();

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index f17bf73..e926d69 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -239,6 +239,13 @@
 			o = null;

 			aType = object();

 		}

+		

+		// Handle Optional<X>

+		if (isOptional(aType)) {

+			o = getOptionalValue(o);

+			eType = getOptionalType(eType);

+			aType = getClassMetaForObject(o, object());

+		}

 

 		indent += xIndent;

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
index 3abd195..2f53268 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
@@ -34,6 +34,14 @@
 @PropertyStoreApply(HtmlConfigApply.class)
 public @interface HtmlConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// HtmlSerializer
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
index 657742f..b3ae95f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
@@ -35,6 +35,14 @@
 @PropertyStoreApply(HtmlDocConfigApply.class)
 public @interface HtmlDocConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// HtmlDocSerializer
 	//-------------------------------------------------------------------------------------------------------------------
@@ -384,6 +392,7 @@
 	 * Adds the specified Javascript code to the HTML page.
 	 *
 	 * <h5 class='section'>Example:</h5>
+	 * <p class='bpcode w800'>
 	 * 	htmldoc=<ja>@HtmlDocConfig</ja>(
 	 * 		script={
 	 * 			<js>"alert('hello!');"</js>
@@ -425,6 +434,7 @@
 	 * Adds the specified CSS instructions to the HTML page.
 	 *
 	 * <h5 class='section'>Example:</h5>
+	 * <p class='bpcode w800'>
 	 * 	<ja>@HtmlDocConfig</ja>(
 	 * 		style={
 	 * 			<js>"h3 { color: red; }"</js>,
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
index 092ce9e..040502d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
@@ -117,6 +117,17 @@
  * 	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.Request}

  * 	<li class='link'>{@doc juneau-rest-client.RestProxies.Request}

  * </ul>

+ *

+ * <div class='warn'>

+ * 	If using this annotation on a Spring bean, note that you are likely to encounter issues when using on parameterized

+ * 	types such as <code>List&lt;MyBean&gt;</code>.  This is due to the fact that Spring uses CGLIB to recompile classes

+ * 	at runtime, and CGLIB was written before generics were introduced into Java and is a virtually-unsupported library.

+ * 	Therefore, parameterized types will often be stripped from class definitions and replaced with unparameterized types

+ *	(e.g. <code>List</code>).  Under these circumstances, you are likely to get <code>ClassCastExceptions</code>

+ *	when trying to access generalized <code>ObjectMaps</code> as beans.  The best solution to this issue is to either

+ *	specify the parameter as a bean array (e.g. <code>MyBean[]</code>) or declare the method as final so that CGLIB

+ *	will not try to recompile it.

+ * </div>

  */

 @Documented

 @Target({PARAMETER,FIELD,METHOD,TYPE})

@@ -254,7 +265,7 @@
 	 * A serialized example of the body of a request.

 	 *

 	 * <p>

-	 * This is the {@doc juneau-marshall.JsonDetails.SimplifiedJson} of an example of the body.

+	 * This is the {@doc SimpleJson} of an example of the body.

 	 *

 	 * <p>

 	 * This value is converted to a POJO and then serialized to all the registered serializers on the REST method to produce examples for all

@@ -359,7 +370,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is any {@doc juneau-marshall.JsonDetails.SimplifiedJson} if the object can be converted to a POJO using {@link JsonParser#DEFAULT} or a simple String if the object

+	 * 		The format is any {@doc SimpleJson} if the object can be converted to a POJO using {@link JsonParser#DEFAULT} or a simple String if the object

 	 * 		has a schema associated with it meancan be converted from a String.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

@@ -375,7 +386,7 @@
 	 * Serialized examples of the body of a request.

 	 *

 	 * <p>

-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object whose keys are media types and values are string representations of that value.

+	 * This is a {@doc SimpleJson} object whose keys are media types and values are string representations of that value.

 	 *

 	 * <p>

 	 * In general you won't need to populate this value directly since it will automatically be calculated based on the value provided in the {@link #example()} field.

@@ -399,7 +410,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object with string keys (media type) and string values (example for that media type) .

+	 * 		The format is a {@doc SimpleJson} object with string keys (media type) and string values (example for that media type) .

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 	<li>

@@ -418,7 +429,7 @@
 	 * Free-form value for the {@doc SwaggerParameterObject}.

 	 *

 	 * <p>

-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this parameter-info.

+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this parameter-info.

 	 *

 	 * <p>

 	 * The following are completely equivalent ways of defining the swagger description of the body:

@@ -471,7 +482,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		Schema-based serialization is NOT affected by values defined in this annotation.

 	 * 		<br>It only affects the generated Swagger documentation.

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Contact.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Contact.java
index 85041b9..8835243 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Contact.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Contact.java
@@ -162,7 +162,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 		<br>The following two example are considered equivalent:

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
index e4a4601..955d191 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormData.java
@@ -98,6 +98,17 @@
  * 	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.Request}

  * 	<li class='link'>{@doc juneau-rest-client.RestProxies.Request}

  * </ul>

+ *

+ * <div class='warn'>

+ * 	If using this annotation on a Spring bean, note that you are likely to encounter issues when using on parameterized

+ * 	types such as <code>List&lt;MyBean&gt;</code>.  This is due to the fact that Spring uses CGLIB to recompile classes

+ * 	at runtime, and CGLIB was written before generics were introduced into Java and is a virtually-unsupported library.

+ * 	Therefore, parameterized types will often be stripped from class definitions and replaced with unparameterized types

+ *	(e.g. <code>List</code>).  Under these circumstances, you are likely to get <code>ClassCastExceptions</code>

+ *	when trying to access generalized <code>ObjectMaps</code> as beans.  The best solution to this issue is to either

+ *	specify the parameter as a bean array (e.g. <code>MyBean[]</code>) or declare the method as final so that CGLIB

+ *	will not try to recompile it.

+ * </div>

 */

 @Documented

 @Target({PARAMETER,FIELD,METHOD,TYPE})

@@ -797,7 +808,7 @@
 	 * <br>On the server-side, this gets converted to a <c>BadRequest</c> (400).

 	 *

 	 * <p>

-	 * The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array or comma-delimited list.

+	 * The format is a {@doc SimpleJson} array or comma-delimited list.

 	 * <br>Multiple lines are concatenated with newlines.

 	 *

 	 * <h5 class='section'>Examples:</h5>

@@ -906,7 +917,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object or plain text string.

+	 * 		The format is a {@doc SimpleJson} object or plain text string.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -972,7 +983,7 @@
 	 * 	<li>

 	 * 		Automatic validation is NOT performed on input based on attributes in this value.

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 		<br>The following two example are considered equivalent:

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
index 0cf5155..5523b3b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Header.java
@@ -773,7 +773,7 @@
 	 * <br>On the server-side, this gets converted to a <c>BadRequest</c> (400).

 	 *

 	 * <p>

-	 * The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array or comma-delimited list.

+	 * The format is a {@doc SimpleJson} array or comma-delimited list.

 	 * <br>Multiple lines are concatenated with newlines.

 	 *

 	 * <h5 class='section'>Examples:</h5>

@@ -883,7 +883,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object or plain text string.

+	 * 		The format is a {@doc SimpleJson} object or plain text string.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -949,7 +949,7 @@
 	 * 	<li>

 	 * 		Note that the only swagger field you can't specify using this value is <js>"name"</js> whose value needs to be known during servlet initialization.

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		Automatic validation is NOT performed on input based on attributes in this value.

 	 * 	<li>

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/License.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/License.java
index 7e92544..fb9650e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/License.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/License.java
@@ -134,7 +134,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 		<br>The following two example are considered equivalent:

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
index c0b75ee..2dc8a50 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Path.java
@@ -711,7 +711,7 @@
 	 * <br>On the server-side, this gets converted to a <c>BadRequest</c> (400).

 	 *

 	 * <p>

-	 * The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array or comma-delimited list.

+	 * The format is a {@doc SimpleJson} array or comma-delimited list.

 	 * <br>Multiple lines are concatenated with newlines.

 	 *

 	 * <h5 class='section'>Examples:</h5>

@@ -823,7 +823,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object or plain text string.

+	 * 		The format is a {@doc SimpleJson} object or plain text string.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -836,7 +836,7 @@
 	 * Free-form value for the {@doc SwaggerParameterObject}.

 	 *

 	 * <p>

-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this field.

+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this field.

 	 *

 	 * <p>

 	 * The following are completely equivalent ways of defining the swagger description of the Path object:

@@ -891,7 +891,7 @@
 	 * 	<li>

 	 * 		Note that the only swagger field you can't specify using this value is <js>"name"</js> whose value needs to be known during servlet initialization.

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		Automatic validation is NOT performed on input based on attributes in this value.

 	 * 	<li>

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
index 591fb07..45b8921 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Query.java
@@ -786,7 +786,7 @@
 	 * <br>On the server-side, this gets converted to a <c>BadRequest</c> (400).

 	 *

 	 * <p>

-	 * The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array or comma-delimited list.

+	 * The format is a {@doc SimpleJson} array or comma-delimited list.

 	 * <br>Multiple lines are concatenated with newlines.

 	 *

 	 * <h5 class='section'>Examples:</h5>

@@ -896,7 +896,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object or plain text string.

+	 * 		The format is a {@doc SimpleJson} object or plain text string.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -909,7 +909,7 @@
 	 * Free-form value for the {@doc SwaggerParameterObject}.

 	 *

 	 * <p>

-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this field.

+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this field.

 	 *

 	 * <p>

 	 * The following are completely equivalent ways of defining the swagger description of the Query object:

@@ -976,7 +976,7 @@
 	 * 	<li>

 	 * 		Automatic validation is NOT performed on input based on attributes in this value.

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 		<br>The following two example are considered equivalent:

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
index 6d176d5..41f9550 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
@@ -145,7 +145,7 @@
 	 * A serialized example of the body of a response.
 	 *
 	 * <p>
-	 * This is the {@doc juneau-marshall.JsonDetails.SimplifiedJson} of an example of the body.
+	 * This is the {@doc SimpleJson} of an example of the body.
 	 *
 	 * <p>
 	 * This value is converted to a POJO and then serialized to all the registered serializers on the REST method to produce examples for all
@@ -248,7 +248,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is any {@doc juneau-marshall.JsonDetails.SimplifiedJson} if the object can be converted to a POJO using {@link JsonParser#DEFAULT} or a simple String if the object
+	 * 		The format is any {@doc SimpleJson} if the object can be converted to a POJO using {@link JsonParser#DEFAULT} or a simple String if the object
 	 * 		has a schema associated with it meancan be converted from a String.
 	 * 		<br>Multiple lines are concatenated with newlines.
 	 * 	<li>
@@ -264,7 +264,7 @@
 	 * Serialized examples of the body of a response.
 	 *
 	 * <p>
-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object whose keys are media types and values are string representations of that value.
+	 * This is a {@doc SimpleJson} object whose keys are media types and values are string representations of that value.
 	 *
 	 * <p>
 	 * In general you won't need to populate this value directly since it will automatically be calculated based on the value provided in the {@link #example()} field.
@@ -288,7 +288,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object with string keys (media type) and string values (example for that media type) .
+	 * 		The format is a {@doc SimpleJson} object with string keys (media type) and string values (example for that media type) .
 	 * 	<li>
 	 * 		The leading/trailing <c>{ }</c> characters are optional.
 	 * 	<li>
@@ -307,7 +307,7 @@
 	 * Free-form value for the {@doc SwaggerResponseObject}.
 	 *
 	 * <p>
-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this field.
+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this field.
 	 *
 	 * <p>
 	 * The following are completely equivalent ways of defining the swagger description of the Response object:
@@ -369,7 +369,7 @@
 	 * 	<li>
 	 * 		Note that the only swagger field you can't specify using this value is <js>"code"</js> whose value needs to be known during servlet initialization.
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.
+	 * 		The format is a {@doc SimpleJson} object.
 	 * 	<li>
 	 * 		The leading/trailing <c>{ }</c> characters are optional.
 	 * 		<br>The following two example are considered equivalent:
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/ResponseHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/ResponseHeader.java
index 0803bbd..73d0c12 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/ResponseHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/ResponseHeader.java
@@ -533,7 +533,7 @@
 	 * Free-form value for the {@doc SwaggerHeaderObject}.
 	 *
 	 * <p>
-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this field.
+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this field.
 	 *
 	 * <p>
 	 * The following are completely equivalent ways of defining the swagger description of the Header object:
@@ -586,7 +586,7 @@
 	 * 	<li>
 	 * 		Note that the only swagger field you can't specify using this value is <js>"name"</js> whose value needs to be known during servlet initialization.
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.
+	 * 		The format is a {@doc SimpleJson} object.
 	 * 	<li>
 	 * 		The leading/trailing <c>{ }</c> characters are optional.
 	 * 		<br>The following two example are considered equivalent:
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Tag.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Tag.java
index 93805c7..8a3207a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Tag.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Tag.java
@@ -80,7 +80,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -94,7 +94,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -107,7 +107,7 @@
 	 * Free-form value for the {@doc SwaggerTagObject}.

 	 *

 	 * <p>

-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this Tag object.

+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this Tag object.

 	 *

 	 * <p>

 	 * The following are completely equivalent ways of defining the swagger description of the resource tags:

@@ -169,7 +169,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 		<br>The following two example are considered equivalent:

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/BadRequest.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/BadRequest.java
new file mode 100644
index 0000000..96ddfca
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/BadRequest.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.BadRequest.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 400 (Bad Request).
+ *
+ * <p>
+ * The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing).
+ */
+@Response(code=CODE, description=MESSAGE)
+public class BadRequest extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 400;
+
+	/** Default message */
+	public static final String MESSAGE = "Bad Request";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public BadRequest(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public BadRequest(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public BadRequest() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public BadRequest(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public BadRequest(Throwable cause) {
+		this(cause, null);
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Conflict.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Conflict.java
new file mode 100644
index 0000000..ce2fab8
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Conflict.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.Conflict.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 409 (Conflict).
+ *
+ * <p>
+ * Indicates that the request could not be processed because of conflict in the request, such as an edit conflict between multiple simultaneous updates.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class Conflict extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 409;
+
+	/** Default message */
+	public static final String MESSAGE = "Conflict";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Conflict(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public Conflict(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public Conflict() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Conflict(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public Conflict(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ExpectationFailed.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ExpectationFailed.java
new file mode 100644
index 0000000..c98e66b
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ExpectationFailed.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.ExpectationFailed.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 417 (Expectation Failed).
+ *
+ * <p>
+ * The server cannot meet the requirements of the Expect request-header field.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class ExpectationFailed extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 417;
+
+	/** Default message */
+	public static final String MESSAGE = "Expectation Failed";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public ExpectationFailed(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public ExpectationFailed(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public ExpectationFailed() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public ExpectationFailed(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public ExpectationFailed(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/FailedDependency.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/FailedDependency.java
new file mode 100644
index 0000000..0d022a9
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/FailedDependency.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.FailedDependency.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 424 (Failed Dependency).
+ *
+ * <p>
+ * The request failed because it depended on another request and that request failed (e.g., a PROPPATCH).
+ */
+@Response(code=CODE, description=MESSAGE)
+public class FailedDependency extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 424;
+
+	/** Default message */
+	public static final String MESSAGE = "Failed Dependency";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public FailedDependency(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public FailedDependency(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public FailedDependency() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public FailedDependency(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public FailedDependency(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Forbidden.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Forbidden.java
new file mode 100644
index 0000000..b189335
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Forbidden.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.Forbidden.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 403 (Forbidden).
+ *
+ * <p>
+ * The request was valid, but the server is refusing action.
+ * <br>The user might not have the necessary permissions for a resource, or may need an account of some sort.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class Forbidden extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 403;
+
+	/** Default message */
+	public static final String MESSAGE = "Forbidden";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Forbidden(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public Forbidden(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public Forbidden() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Forbidden(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public Forbidden(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Gone.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Gone.java
new file mode 100644
index 0000000..1b008a4
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Gone.java
@@ -0,0 +1,87 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.Gone.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 410 ().
+ *
+ * <p>
+ * Indicates that the resource requested is no longer available and will not be available again.
+ * <br>This should be used when a resource has been intentionally removed and the resource should be purged.
+ * <br>Upon receiving a 410 status code, the client should not request the resource in the future.
+ * <br>Clients such as search engines should remove the resource from their indices.
+ * <br>Most use cases do not require clients and search engines to purge the resource, and a <js>"404 Not Found"</js> may be used instead.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class Gone extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 410;
+
+	/** Default message */
+	public static final String MESSAGE = "Gone";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Gone(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public Gone(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public Gone() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Gone(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public Gone(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpException.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpException.java
new file mode 100644
index 0000000..7652b52
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpException.java
@@ -0,0 +1,174 @@
+// ***************************************************************************************************************************

+// * 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.http.exception;

+

+import static org.apache.juneau.internal.StringUtils.*;

+

+import java.lang.reflect.*;

+import java.text.*;

+

+/**

+ * Exception thrown to trigger an error HTTP status.

+ *

+ * <p>

+ * REST methods on subclasses of <c>RestServlet</c> can throw this exception to trigger an HTTP status other than the

+ * automatically-generated <c>404</c>, <c>405</c>, and <c>500</c> statuses.

+ */

+public class HttpException extends RuntimeException {

+

+	private static final long serialVersionUID = 1L;

+

+	private int status;

+

+	/**

+	 * Constructor.

+	 *

+	 * @param cause The cause of this exception.

+	 * @param status The HTTP status code.

+	 * @param msg The status message.

+	 * @param args Optional {@link MessageFormat}-style arguments.

+	 */

+	public HttpException(Throwable cause, int status, String msg, Object...args) {

+		super(message(cause, msg, args), cause);

+		this.status = status;

+	}

+

+	/**

+	 * Constructor.

+	 *

+	 * @param msg The status message.

+	 */

+	public HttpException(String msg) {

+		super(msg, null);

+	}

+

+	private static String message(Throwable cause, String msg, Object...args) {

+		if (msg == null && cause != null)

+			return firstNonEmpty(cause.getLocalizedMessage(), cause.getClass().getName());

+		return format(msg, args);

+	}

+

+	/**

+	 * Constructor.

+	 * @param cause The root exception.

+	 * @param status The HTTP status code.

+	 */

+	public HttpException(Throwable cause, int status) {

+		this(cause, status, null);

+	}

+

+	/**

+	 * Constructor.

+	 *

+	 * @param status The HTTP status code.

+	 * @param msg The status message.

+	 * @param args Optional {@link MessageFormat}-style arguments.

+	 */

+	public HttpException(int status, String msg, Object...args) {

+		this(null, status, msg, args);

+	}

+

+	/**

+	 * Returns the root cause of this exception.

+	 *

+	 * <p>

+	 * The root cause is the first exception in the init-cause parent chain that's not one of the following:

+	 * <ul>

+	 * 	<li>{@link HttpException}

+	 * 	<li>{@link InvocationTargetException}

+	 * </ul>

+	 *

+	 * @return The root cause of this exception, or <jk>null</jk> if no root cause was found.

+	 */

+	public Throwable getRootCause() {

+		Throwable t = this;

+		while(t != null) {

+			t = t.getCause();

+			if (! (t instanceof HttpException || t instanceof InvocationTargetException))

+				return t;

+		}

+		return null;

+	}

+

+	/**

+	 * Returns all error messages from all errors in this stack.

+	 *

+	 * <p>

+	 * Typically useful if you want to render all the error messages in the stack, but don't want to render all the

+	 * stack traces too.

+	 *

+	 * @param scrubForXssVulnerabilities

+	 * 	If <jk>true</jk>, replaces <js>'&lt;'</js>, <js>'&gt;'</js>, and <js>'&amp;'</js> characters with spaces.

+	 * @return All error messages from all errors in this stack.

+	 */

+	public String getFullStackMessage(boolean scrubForXssVulnerabilities) {

+		String msg = getMessage();

+		StringBuilder sb = new StringBuilder();

+		if (msg != null) {

+			if (scrubForXssVulnerabilities)

+				msg = msg.replace('<', ' ').replace('>', ' ').replace('&', ' ');

+			sb.append(msg);

+		}

+		Throwable e = getCause();

+		while (e != null) {

+			msg = e.getMessage();

+			if (msg != null && scrubForXssVulnerabilities)

+				msg = msg.replace('<', ' ').replace('>', ' ').replace('&', ' ');

+			String cls = e.getClass().getSimpleName();

+			if (msg == null)

+				sb.append(format("\nCaused by ({0})", cls));

+			else

+				sb.append(format("\nCaused by ({0}): {1}", cls, msg));

+			e = e.getCause();

+		}

+		return sb.toString();

+	}

+

+	@Override /* Object */

+	public int hashCode() {

+		int i = 0;

+		Throwable t = this;

+		while (t != null) {

+			for (StackTraceElement e : t.getStackTrace())

+			i ^= e.hashCode();

+			t = t.getCause();

+		}

+		return i;

+	}

+

+	/**

+	 * Set the status code on this exception.

+	 *

+	 * @param status The status code.

+	 * @return This object (for method chaining).

+	 */

+	protected HttpException setStatus(int status) {

+		this.status = status;

+		return this;

+	}

+

+	/**

+	 * Returns the HTTP status code.

+	 *

+	 * @return The HTTP status code.

+	 */

+	public int getStatus() {

+		return status;

+	}

+

+	// When serialized, just serialize the message itself.

+	@Override /* Object */

+	public String toString() {

+		return emptyIfNull(getLocalizedMessage());

+	}

+}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpVersionNotSupported.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpVersionNotSupported.java
new file mode 100644
index 0000000..a7287ae
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpVersionNotSupported.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.HttpVersionNotSupported.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 505 ().
+ *
+ * <p>
+ * The server does not support the HTTP protocol version used in the request.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class HttpVersionNotSupported extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 505;
+
+	/** Default message */
+	public static final String MESSAGE = "HTTP Version Not Supported";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public HttpVersionNotSupported(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public HttpVersionNotSupported(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public HttpVersionNotSupported() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public HttpVersionNotSupported(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public HttpVersionNotSupported(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InsufficientStorage.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InsufficientStorage.java
new file mode 100644
index 0000000..af9ea0f
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InsufficientStorage.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.InsufficientStorage.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 507 ().
+ *
+ * <p>
+ * The server is unable to store the representation needed to complete the request.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class InsufficientStorage extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 507;
+
+	/** Default message */
+	public static final String MESSAGE = "Insufficient Storage";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public InsufficientStorage(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public InsufficientStorage(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public InsufficientStorage() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public InsufficientStorage(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public InsufficientStorage(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InternalServerError.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InternalServerError.java
new file mode 100644
index 0000000..6684460
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InternalServerError.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.InternalServerError.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 500 (Internal Server Error).
+ *
+ * <p>
+ * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class InternalServerError extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 500;
+
+	/** Default message */
+	public static final String MESSAGE = "Internal Server Error";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public InternalServerError(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public InternalServerError(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public InternalServerError() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public InternalServerError(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public InternalServerError(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LengthRequired.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LengthRequired.java
new file mode 100644
index 0000000..a4b182a
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LengthRequired.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.LengthRequired.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 411 ().
+ *
+ * <p>
+ * The request did not specify the length of its content, which is required by the requested resource.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class LengthRequired extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 411;
+
+	/** Default message */
+	public static final String MESSAGE = "Length Required";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public LengthRequired(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public LengthRequired(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public LengthRequired() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public LengthRequired(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public LengthRequired(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Locked.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Locked.java
new file mode 100644
index 0000000..91ed9dc
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Locked.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.Locked.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 423 (Locked).
+ *
+ * <p>
+ * The resource that is being accessed is locked.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class Locked extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 423;
+
+	/** Default message */
+	public static final String MESSAGE = "Locked";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Locked(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public Locked(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public Locked() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Locked(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public Locked(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LoopDetected.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LoopDetected.java
new file mode 100644
index 0000000..426d6c3
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LoopDetected.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.LoopDetected.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 508 (Loop Detected).
+ *
+ * <p>
+ * The server detected an infinite loop while processing the request (sent in lieu of 208 Already Reported).
+ */
+@Response(code=CODE, description=MESSAGE)
+public class LoopDetected extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 508;
+
+	/** Default message */
+	public static final String MESSAGE = "Loop Detected";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public LoopDetected(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public LoopDetected(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public LoopDetected() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public LoopDetected(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public LoopDetected(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MethodNotAllowed.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MethodNotAllowed.java
new file mode 100644
index 0000000..6a97f98
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MethodNotAllowed.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.MethodNotAllowed.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 405 (Method Not Allowed).
+ *
+ * <p>
+ * A request method is not supported for the requested resource; for example, a GET request on a form that requires data to be presented via POST, or a PUT request on a read-only resource.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class MethodNotAllowed extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 405;
+
+	/** Default message */
+	public static final String MESSAGE = "Method Not Allowed";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public MethodNotAllowed(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public MethodNotAllowed(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public MethodNotAllowed() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public MethodNotAllowed(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public MethodNotAllowed(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MisdirectedRequest.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MisdirectedRequest.java
new file mode 100644
index 0000000..f0d24a1
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MisdirectedRequest.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.MisdirectedRequest.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 421 (Misdirected Request).
+ *
+ * <p>
+ * The request was directed at a server that is not able to produce a response (for example because of connection reuse).
+ */
+@Response(code=CODE, description=MESSAGE)
+public class MisdirectedRequest extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 421;
+
+	/** Default message */
+	public static final String MESSAGE = "Misdirected Request";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public MisdirectedRequest(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public MisdirectedRequest(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public MisdirectedRequest() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public MisdirectedRequest(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public MisdirectedRequest(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired.java
new file mode 100644
index 0000000..ad23748
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.NetworkAuthenticationRequired.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 511 (Network Authentication Required).
+ *
+ * <p>
+ * The client needs to authenticate to gain network access.
+ * <br>Intended for use by intercepting proxies used to control access to the network (e.g., "captive portals" used to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot).
+ */
+@Response(code=CODE, description=MESSAGE)
+public class NetworkAuthenticationRequired extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 511;
+
+	/** Default message */
+	public static final String MESSAGE = "Network Authentication Required";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NetworkAuthenticationRequired(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public NetworkAuthenticationRequired(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public NetworkAuthenticationRequired() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NetworkAuthenticationRequired(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public NetworkAuthenticationRequired(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotAcceptable.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotAcceptable.java
new file mode 100644
index 0000000..1f2658c
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotAcceptable.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.NotAcceptable.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 406 (Not Acceptable).
+ *
+ * <br>
+ * The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class NotAcceptable extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 406;
+
+	/** Default message */
+	public static final String MESSAGE = "Not Acceptable";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NotAcceptable(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public NotAcceptable(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public NotAcceptable() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NotAcceptable(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public NotAcceptable(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotExtended.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotExtended.java
new file mode 100644
index 0000000..292e383
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotExtended.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.NotExtended.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 510 (Not Extended).
+ *
+ * <p>
+ * Further extensions to the request are required for the server to fulfill it.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class NotExtended extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 510;
+
+	/** Default message */
+	public static final String MESSAGE = "Not Extended";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NotExtended(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public NotExtended(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public NotExtended() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NotExtended(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public NotExtended(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotFound.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotFound.java
new file mode 100644
index 0000000..25ce070
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotFound.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.NotFound.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 404 (Not Found).
+ *
+ * <p>
+ * The requested resource could not be found but may be available in the future.
+ * <br>Subsequent requests by the client are permissible.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class NotFound extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 404;
+
+	/** Default message */
+	public static final String MESSAGE = "Not Found";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NotFound(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public NotFound(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public NotFound() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NotFound(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public NotFound(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotImplemented.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotImplemented.java
new file mode 100644
index 0000000..34b5f2d
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotImplemented.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.NotImplemented.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 501 (Not Implemented).
+ *
+ * <p>
+ * The server either does not recognize the request method, or it lacks the ability to fulfill the request.
+ * <br>Usually this implies future availability (e.g., a new feature of a web-service API).
+ */
+@Response(code=CODE, description=MESSAGE)
+public class NotImplemented extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 501;
+
+	/** Default message */
+	public static final String MESSAGE = "Not Implemented";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NotImplemented(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public NotImplemented(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public NotImplemented() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public NotImplemented(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public NotImplemented(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PayloadTooLarge.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PayloadTooLarge.java
new file mode 100644
index 0000000..eca7287
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PayloadTooLarge.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.PayloadTooLarge.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 413 (Payload Too Large).
+ *
+ * <p>
+ * The request is larger than the server is willing or able to process.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class PayloadTooLarge extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 413;
+
+	/** Default message */
+	public static final String MESSAGE = "Payload Too Large";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public PayloadTooLarge(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public PayloadTooLarge(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public PayloadTooLarge() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public PayloadTooLarge(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public PayloadTooLarge(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionFailed.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionFailed.java
new file mode 100644
index 0000000..a605423
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionFailed.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.PreconditionFailed.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 412 (Precondition Failed).
+ *
+ * <p>
+ * The server does not meet one of the preconditions that the requester put on the request.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class PreconditionFailed extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 412;
+
+	/** Default message */
+	public static final String MESSAGE = "Precondition Failed";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public PreconditionFailed(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public PreconditionFailed() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public PreconditionFailed(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public PreconditionFailed(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public PreconditionFailed(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionRequired.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionRequired.java
new file mode 100644
index 0000000..72b8152
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionRequired.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.PreconditionRequired.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 428 (Precondition Required).
+ *
+ * <p>
+ * The origin server requires the request to be conditional.
+ * <br>Intended to prevent the 'lost update' problem, where a client GETs a resource's state, modifies it, and PUTs it back to the server, when meanwhile a third party has modified the state on the server, leading to a conflict.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class PreconditionRequired extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 428;
+
+	/** Default message */
+	public static final String MESSAGE = "Precondition Required";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public PreconditionRequired(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public PreconditionRequired(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public PreconditionRequired() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public PreconditionRequired(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public PreconditionRequired(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RangeNotSatisfiable.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RangeNotSatisfiable.java
new file mode 100644
index 0000000..41d6936
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RangeNotSatisfiable.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.RangeNotSatisfiable.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 416 (Range Not Satisfiable).
+ *
+ * <p>
+ * The client has asked for a portion of the file (byte serving), but the server cannot supply that portion.
+ * <br>For example, if the client asked for a part of the file that lies beyond the end of the file.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class RangeNotSatisfiable extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 416;
+
+	/** Default message */
+	public static final String MESSAGE = "Range Not Satisfiable";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public RangeNotSatisfiable(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public RangeNotSatisfiable(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public RangeNotSatisfiable() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public RangeNotSatisfiable(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public RangeNotSatisfiable(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge.java
new file mode 100644
index 0000000..da8de2a
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.RequestHeaderFieldsTooLarge.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 431 (Request Header Fields Too Large).
+ *
+ * <p>
+ * The server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class RequestHeaderFieldsTooLarge extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 431;
+
+	/** Default message */
+	public static final String MESSAGE = "Request Header Fields Too Large";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public RequestHeaderFieldsTooLarge(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public RequestHeaderFieldsTooLarge(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public RequestHeaderFieldsTooLarge() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public RequestHeaderFieldsTooLarge(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public RequestHeaderFieldsTooLarge(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ServiceUnavailable.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ServiceUnavailable.java
new file mode 100644
index 0000000..3d3e76e
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ServiceUnavailable.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.ServiceUnavailable.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 503 (Service Unavailable).
+ *
+ * <p>
+ * The server is currently unavailable (because it is overloaded or down for maintenance).
+ * <br>Generally, this is a temporary state.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class ServiceUnavailable extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 503;
+
+	/** Default message */
+	public static final String MESSAGE = "Service Unavailable";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public ServiceUnavailable(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public ServiceUnavailable(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public ServiceUnavailable() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public ServiceUnavailable(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public ServiceUnavailable(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/TooManyRequests.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/TooManyRequests.java
new file mode 100644
index 0000000..f71026a
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/TooManyRequests.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.TooManyRequests.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 429 (Too Many Requests).
+ *
+ * <p>
+ * The user has sent too many requests in a given amount of time.
+ * <br>Intended for use with rate-limiting schemes.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class TooManyRequests extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 429;
+
+	/** Default message */
+	public static final String MESSAGE = "Too Many Requests";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public TooManyRequests(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public TooManyRequests(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public TooManyRequests() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public TooManyRequests(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public TooManyRequests(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Unauthorized.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Unauthorized.java
new file mode 100644
index 0000000..1113195
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Unauthorized.java
@@ -0,0 +1,86 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.Unauthorized.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 401 (Unauthorized).
+ *
+ * <p>
+ * Similar to <c>403 Forbidden</c>, but specifically for use when authentication is required and has failed or has not yet been provided.
+ * <br>The response must include a WWW-Authenticate header field containing a challenge applicable to the requested resource.
+ * <br>401 semantically means "unauthenticated",i.e. the user does not have the necessary credentials.
+ * <br>Note: Some sites issue HTTP 401 when an IP address is banned from the website (usually the website domain) and that specific address is refused permission to access a website.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class Unauthorized extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 401;
+
+	/** Default message */
+	public static final String MESSAGE = "Unauthorized";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Unauthorized(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public Unauthorized(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public Unauthorized() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public Unauthorized(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public Unauthorized(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnavailableForLegalReasons.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnavailableForLegalReasons.java
new file mode 100644
index 0000000..cd091af
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnavailableForLegalReasons.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.UnavailableForLegalReasons.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 451 (Unavailable For Legal Reasons).
+ *
+ * <p>
+ * A server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class UnavailableForLegalReasons extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 451;
+
+	/** Default message */
+	public static final String MESSAGE = "Unavailable For Legal Reasons";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UnavailableForLegalReasons(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public UnavailableForLegalReasons(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public UnavailableForLegalReasons() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UnavailableForLegalReasons(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public UnavailableForLegalReasons(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnprocessableEntity.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnprocessableEntity.java
new file mode 100644
index 0000000..0e0e950
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnprocessableEntity.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.UnprocessableEntity.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 422 (Unprocessable Entity).
+ *
+ * <p>
+ * The request was well-formed but was unable to be followed due to semantic errors.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class UnprocessableEntity extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 422;
+
+	/** Default message */
+	public static final String MESSAGE = "Unprocessable Entity";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UnprocessableEntity(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public UnprocessableEntity(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public UnprocessableEntity() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UnprocessableEntity(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public UnprocessableEntity(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnsupportedMediaType.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnsupportedMediaType.java
new file mode 100644
index 0000000..d95d1d4
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnsupportedMediaType.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.UnsupportedMediaType.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 415 (Unsupported Media Type).
+ *
+ * <p>
+ * The request entity has a media type which the server or resource does not support.
+ * <br>For example, the client uploads an image as image/svg+xml, but the server requires that images use a different format.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class UnsupportedMediaType extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 415;
+
+	/** Default message */
+	public static final String MESSAGE = "Unsupported Media Type";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UnsupportedMediaType(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public UnsupportedMediaType(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public UnsupportedMediaType() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UnsupportedMediaType(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public UnsupportedMediaType(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UpgradeRequired.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UpgradeRequired.java
new file mode 100644
index 0000000..abf0023
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UpgradeRequired.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.UpgradeRequired.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 426 (Upgrade Required).
+ *
+ * <p>
+ * The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class UpgradeRequired extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 426;
+
+	/** Default message */
+	public static final String MESSAGE = "Upgrade Required";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UpgradeRequired(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public UpgradeRequired(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public UpgradeRequired() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UpgradeRequired(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public UpgradeRequired(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UriTooLong.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UriTooLong.java
new file mode 100644
index 0000000..6938713
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UriTooLong.java
@@ -0,0 +1,84 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.UriTooLong.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 414 (URI Too Long).
+ *
+ * <p>
+ * The URI provided was too long for the server to process.
+ * <br>Often the result of too much data being encoded as a query-string of a GET request, in which case it should be converted to a POST request.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class UriTooLong extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 414;
+
+	/** Default message */
+	public static final String MESSAGE = "URI Too Long";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UriTooLong(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public UriTooLong(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public UriTooLong() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public UriTooLong(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public UriTooLong(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/VariantAlsoNegotiates.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/VariantAlsoNegotiates.java
new file mode 100644
index 0000000..30fd61a
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/VariantAlsoNegotiates.java
@@ -0,0 +1,83 @@
+// ***************************************************************************************************************************
+// * 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.http.exception;
+
+import static org.apache.juneau.http.exception.VariantAlsoNegotiates.*;
+
+import java.text.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Exception representing an HTTP 506 (Variant Also Negotiate).
+ *
+ * <p>
+ * Transparent content negotiation for the request results in a circular reference.
+ */
+@Response(code=CODE, description=MESSAGE)
+public class VariantAlsoNegotiates extends HttpException {
+	private static final long serialVersionUID = 1L;
+
+	/** HTTP status code */
+	public static final int CODE = 506;
+
+	/** Default message */
+	public static final String MESSAGE = "Variant Also Negotiates";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public VariantAlsoNegotiates(Throwable cause, String msg, Object...args) {
+		super(cause, CODE, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 */
+	public VariantAlsoNegotiates(String msg) {
+		super(msg);
+		setStatus(CODE);
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public VariantAlsoNegotiates() {
+		this((Throwable)null, MESSAGE);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param msg The message.  Can be <jk>null</jk>.
+	 * @param args Optional {@link MessageFormat}-style arguments in the message.
+	 */
+	public VariantAlsoNegotiates(String msg, Object...args) {
+		this(null, msg, args);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param cause The cause.  Can be <jk>null</jk>.
+	 */
+	public VariantAlsoNegotiates(Throwable cause) {
+		this(cause, null);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/package-info.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/package-info.java
new file mode 100644
index 0000000..f20c490
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/package-info.java
@@ -0,0 +1,18 @@
+/***************************************************************************************************************************
+ * 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.
+ *
+ ***************************************************************************************************************************/
+
+/**
+ * HTTP Response Exception Beans
+ */
+package org.apache.juneau.http.exception;
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteMethod.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteMethod.java
new file mode 100644
index 0000000..adc90a9
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteMethod.java
@@ -0,0 +1,113 @@
+// ***************************************************************************************************************************

+// * 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.http.remote;

+

+import static java.lang.annotation.ElementType.*;

+import static java.lang.annotation.RetentionPolicy.*;

+

+import java.io.*;

+import java.lang.annotation.*;

+

+import org.apache.juneau.http.annotation.*;

+

+/**

+ * Annotation applied to Java methods on REST proxy.

+ *

+ * <ul class='seealso'>

+ * 	<li class='link'>{@doc juneau-rest-client.RestProxies}

+ * </ul>

+ */

+@Documented

+@Target(METHOD)

+@Retention(RUNTIME)

+@Inherited

+public @interface RemoteMethod {

+

+	/**

+	 * REST service path.

+	 *

+	 * <p>

+	 * The possible values are:

+	 * <ul class='spaced-list'>

+	 * 	<li>An absolute URL.

+	 * 	<li>A relative URL interpreted as relative to the root URL defined on the <c>RestClient</c> and/or {@link RemoteResource#path()}.

+	 * 	<li>No path.

+	 * </ul>

+	 *

+	 * <p>

+	 * If you do not specify a path, then the path is inferred from the Java method name.

+	 *

+	 * <h5 class='figure'>Example:</h5>

+	 * <p class='bcode'>

+	 * 	<jc>// POST /pet</jc>

+	 * 	<ja>@RestMethod</ja>

+	 * 	<jk>public void</jk> postPet(...) {...}

+	 * </p>

+	 */

+	String path() default "";

+

+	/**

+	 * Defines the HTTP method to use for REST calls.

+	 *

+	 * <p>

+	 * If not specified, then the method is inferred from the Java method name.

+	 *

+	 * <h5 class='figure'>Example:</h5>

+	 * <p class='bcode'>

+	 * 	<jc>// POST /pet</jc>

+	 * 	<ja>@RestMethod</ja>

+	 * 	<jk>public void</jk> postPet(...) {...}

+	 * </p>

+	 *

+	 * <br>If the method cannot be inferred, then the default is <js>"GET"</js>.

+	 */

+	String method() default "";

+

+	/**

+	 * The value the remote method returns.

+	 *

+	 * <p>

+	 * Possible values:

+	 * <ul class='spaced-list'>

+	 * 	<li>

+	 * 		{@link RemoteReturn#BODY} (default) - The body of the HTTP response converted to a POJO.

+	 * 		<br>The return type on the Java method can be any of the following:

+	 * 		<ul class='spaced-list'>

+	 * 			<li>

+	 * 				<jk>void</jk> - Don't parse any response.  Note that the method will still throw an exception if an

+	 * 				error HTTP status is returned.

+	 * 			<li>

+	 * 				Any parsable POJO - The body of the response will be converted to the POJO using the parser defined

+	 * 				on the <c>RestClient</c>.

+	 * 			<li>

+	 * 				Any POJO annotated with the {@link Response @Response} annotation.

+	 * 				This allows for response beans to be used which also allows for OpenAPI-based parsing and validation.

+	 * 			<li>

+	 * 				<c>HttpResponse</c> - Returns the raw <c>HttpResponse</c> returned by the inner

+	 * 				<c>HttpClient</c>.

+	 * 			<li>

+	 * 				{@link Reader} - Returns access to the raw reader of the response.

+	 * 			<li>

+	 * 				{@link InputStream} - Returns access to the raw input stream of the response.

+	 * 		</ul>

+	 * 	<li>

+	 * 		{@link RemoteReturn#STATUS} - The HTTP status code on the response.

+	 * 		<br>The return type on the Java method can be any of the following:

+	 * 		<ul>

+	 * 			<li><jk>int</jk>/<c>Integer</c> - The HTTP response code.

+	 * 			<li><jk>boolean</jk>/<c>Boolean</c> - <jk>true</jk> if the response code is <c>&lt;400</c>

+	 * 		</ul>

+	 * </ul>

+	 */

+	RemoteReturn returns() default RemoteReturn.BODY;

+}

diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteResource.java
similarity index 67%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteResource.java
index 46b56da..b7a1475 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteResource.java
@@ -1,35 +1,45 @@
-// ***************************************************************************************************************************
-// * 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.examples.rest.petstore;
-
-import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
-
-/**
- * Exception thrown when an invalid username or password is provided.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@SuppressWarnings("serial")
-@Response(description="Invalid username or password provided")
-public class InvalidLogin extends Unauthorized {
-
-	/**
-	 * Constructor.
-	 */
-	public InvalidLogin() {
-		super("Invalid username or password.");
-	}
-}
+// ***************************************************************************************************************************

+// * 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.http.remote;

+

+import static java.lang.annotation.ElementType.*;

+import static java.lang.annotation.RetentionPolicy.*;

+

+import java.lang.annotation.*;

+

+/**

+ * Identifies a proxy against a REST interface.

+ *

+ * <ul class='seealso'>

+ * 	<li class='link'>{@doc juneau-rest-client.RestProxies}

+ * </ul>

+ */

+@Documented

+@Target({TYPE})

+@Retention(RUNTIME)

+@Inherited

+public @interface RemoteResource {

+

+	/**

+	 * REST service path.

+	 *

+	 * <p>

+	 * The possible values are:

+	 * <ul class='spaced-list'>

+	 * 	<li>An absolute URL.

+	 * 	<li>A relative URL interpreted as relative to the root URL defined on the <c>RestClient</c>

+	 * 	<li>No path interpreted as the class name (e.g. <js>"http://localhost/root-url/org.foo.MyInterface"</js>)

+	 * </ul>

+	 */

+	String path() default "";

+}

diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/package-info.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteReturn.java
old mode 100755
new mode 100644
similarity index 82%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/package-info.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteReturn.java
index 7122ab8..48105d4
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/package-info.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RemoteReturn.java
@@ -1,18 +1,31 @@
-// ***************************************************************************************************************************

-// * 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.                                              *

-// ***************************************************************************************************************************

-

-/**

- * Examples

- */

-package org.apache.juneau.examples.rest.petstore;

-

+// ***************************************************************************************************************************
+// * 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.http.remote;
+
+/**
+ * Possible values for the {@link RemoteMethod#returns() @RemoteMethod(returns)} annotation.
+ */
+public enum RemoteReturn {
+
+	/** HTTP response body */
+	BODY,
+
+	/** HTTP status code */
+	STATUS,
+
+	/** Response bean */
+	BEAN,
+
+	/** Ignore (used for void methods) */
+	NONE;
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/package-info.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/package-info.java
new file mode 100644
index 0000000..e99cedd
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/package-info.java
@@ -0,0 +1,18 @@
+/***************************************************************************************************************************
+ * 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.
+ *
+ ***************************************************************************************************************************/
+
+/**
+ * Remote REST API
+ */
+package org.apache.juneau.http.remote;
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Accepted.java
similarity index 63%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Accepted.java
index 46b56da..9ef78e8 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Accepted.java
@@ -10,26 +10,43 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
+
+import static org.apache.juneau.http.response.Accepted.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when an invalid username or password is provided.
+ * Represents an <c>HTTP 202 Accepted</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The request has been accepted for processing, but the processing has not been completed.
+ * The request might or might not be eventually acted upon, and may be disallowed when processing occurs.
  */
-@SuppressWarnings("serial")
-@Response(description="Invalid username or password provided")
-public class InvalidLogin extends Unauthorized {
+@Response(code=CODE, description=MESSAGE)
+public class Accepted extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 202;
+
+	/** Default message */
+	public static final String MESSAGE = "Accepted";
+
+	/** Reusable instance. */
+	public static final Accepted INSTANCE = new Accepted();
 
 	/**
-	 * Constructor.
+	 * Constructor using HTTP-standard message.
 	 */
-	public InvalidLogin() {
-		super("Invalid username or password.");
+	public Accepted() {
+		this(MESSAGE);
 	}
-}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public Accepted(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/AlreadyReported.java
similarity index 63%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/AlreadyReported.java
index 46b56da..9fe2fd7 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/AlreadyReported.java
@@ -10,26 +10,42 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
+
+import static org.apache.juneau.http.response.AlreadyReported.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when an invalid username or password is provided.
+ * Represents an <c>HTTP 208 Already Reported</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, and are not being included again.
  */
-@SuppressWarnings("serial")
-@Response(description="Invalid username or password provided")
-public class InvalidLogin extends Unauthorized {
+@Response(code=CODE, description=MESSAGE)
+public class AlreadyReported extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 208;
+
+	/** Default message */
+	public static final String MESSAGE = "Already Reported";
+
+	/** Reusable instance. */
+	public static final AlreadyReported INSTANCE = new AlreadyReported();
 
 	/**
-	 * Constructor.
+	 * Constructor using HTTP-standard message.
 	 */
-	public InvalidLogin() {
-		super("Invalid username or password.");
+	public AlreadyReported() {
+		this(MESSAGE);
 	}
-}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public AlreadyReported(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Continue.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Continue.java
new file mode 100644
index 0000000..5e0b917
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Continue.java
@@ -0,0 +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.http.response;
+
+import static org.apache.juneau.http.response.Continue.*;
+
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Represents an <c>HTTP 100 Continue</c> response.
+ *
+ * <p>
+ * The server has received the request headers and the client should proceed to send the request body (in the case of a request for which a body needs to be sent; for example, a POST request).
+ * Sending a large request body to a server after a request has been rejected for inappropriate headers would be inefficient.
+ * To have a server check the request's headers, a client must send Expect: 100-continue as a header in its initial request and receive a 100 Continue status code in response before sending the body.
+ * If the client receives an error code such as 403 (Forbidden) or 405 (Method Not Allowed) then it shouldn't send the request's body.
+ * The response 417 Expectation Failed indicates that the request should be repeated without the Expect header as it indicates that the server doesn't support expectations (this is the case, for example, of HTTP/1.0 servers).
+ */
+@Response(code=CODE, description=MESSAGE)
+public class Continue extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 100;
+
+	/** Default message */
+	public static final String MESSAGE = "Continue";
+
+	/** Reusable instance.*/
+	public static final Continue INSTANCE = new Continue();
+
+	/**
+	 * Constructor using HTTP-standard message.
+	 */
+	public Continue() {
+		this(MESSAGE);
+	}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public Continue(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Created.java
similarity index 67%
rename from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Created.java
index 06869e3..6e44a20 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Created.java
@@ -10,44 +10,42 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
-import java.util.*;
+import static org.apache.juneau.http.response.Created.*;
 
 import org.apache.juneau.http.annotation.*;
 
 /**
- * X-Expires-After custom HTTP header.
+ * Represents an <c>HTTP 201 Created</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The request has been fulfilled, resulting in the creation of a new resource.
  */
-@ResponseHeader(
-	name="X-Expires-After",
-	type="string",
-	format="date-time",
-	description="Date in UTC when token expires",
-	example="2012-10-21"
-)
-public class ExpiresAfter {
-	private final Calendar c;
+@Response(code=CODE, description=MESSAGE)
+public class Created extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 201;
+
+	/** Default message */
+	public static final String MESSAGE = "Created";
+
+	/** Reusable instance. */
+	public static final Created INSTANCE = new Created();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param d The header value.
+	 * Constructor using HTTP-standard message.
 	 */
-	public ExpiresAfter(Date d) {
-		this.c = new GregorianCalendar();
-		c.setTime(d);
+	public Created() {
+		this(MESSAGE);
 	}
 
 	/**
-	 * The header value.
-	 * @return The header value.
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
 	 */
-	public Calendar toCalendar() {
-		return c;
+	public Created(String message) {
+		super(message);
 	}
 }
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/EarlyHints.java
similarity index 66%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/EarlyHints.java
index 46b56da..312a254 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/EarlyHints.java
@@ -10,26 +10,42 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
+
+import static org.apache.juneau.http.response.EarlyHints.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when an invalid username or password is provided.
+ * Represents an <c>HTTP 103 Early Hints</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * Used to return some response headers before final HTTP message.
  */
-@SuppressWarnings("serial")
-@Response(description="Invalid username or password provided")
-public class InvalidLogin extends Unauthorized {
+@Response(code=CODE, description=MESSAGE)
+public class EarlyHints extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 103;
+
+	/** Default message */
+	public static final String MESSAGE = "Early Hints";
+
+	/** Reusable instance. */
+	public static final EarlyHints INSTANCE = new EarlyHints();
 
 	/**
-	 * Constructor.
+	 * Constructor using HTTP-standard message.
 	 */
-	public InvalidLogin() {
-		super("Invalid username or password.");
+	public EarlyHints() {
+		this(MESSAGE);
 	}
-}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public EarlyHints(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Found.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Found.java
new file mode 100644
index 0000000..60d614d
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Found.java
@@ -0,0 +1,91 @@
+// ***************************************************************************************************************************
+// * 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.http.response;
+
+import java.net.*;
+
+import static org.apache.juneau.http.response.Found.*;
+
+import org.apache.juneau.annotation.BeanIgnore;
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Represents an <c>HTTP 302 Found</c> response.
+ *
+ * <p>
+ * Tells the client to look at (browse to) another url. 302 has been superseded by 303 and 307.
+ * This is an example of industry practice contradicting the standard.
+ * The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect (the original describing phrase was "Moved Temporarily"), but popular browsers implemented 302 with the functionality of a 303 See Other.
+ * Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviours.
+ * However, some Web applications and frameworks use the 302 status code as if it were the 303.
+ */
+@Response(code=CODE, description=MESSAGE)
+@BeanIgnore
+public class Found extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 302;
+
+	/** Default message */
+	public static final String MESSAGE = "Found";
+
+	/** Reusable instance. */
+	public static final Found INSTANCE = new Found();
+
+	private final URI location;
+
+	/**
+	 * Constructor using HTTP-standard message.
+	 */
+	public Found() {
+		this(MESSAGE, null);
+	}
+
+	/**
+	 * Constructor with no redirect.
+	 * <p>
+	 * Used for end-to-end interfaces.
+	 *
+	 * @param message Message to send as the response.
+	 */
+	public Found(String message) {
+		super(message);
+		this.location = null;
+	}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 * @param location <c>Location</c> header value.
+	 */
+	public Found(String message, URI location) {
+		super(message);
+		this.location = location;
+	}
+
+	/**
+	 * Constructor.
+	 * @param location <c>Location</c> header value.
+	 */
+	public Found(URI location) {
+		this(MESSAGE, location);
+	}
+
+	/**
+	 * @return <c>Location</c> header value.
+	 */
+	@ResponseHeader(name="Location", description="Location of resource.")
+	public URI getLocation() {
+		return location;
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponse.java
similarity index 77%
rename from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponse.java
index 46b56da..b0ae346 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponse.java
@@ -10,26 +10,33 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when an invalid username or password is provided.
+ * Superclass of all predefined responses in this package.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * Consists simply of a simple string message.
  */
-@SuppressWarnings("serial")
-@Response(description="Invalid username or password provided")
-public class InvalidLogin extends Unauthorized {
+@Response
+public abstract class HttpResponse {
+
+	private final String message;
 
 	/**
 	 * Constructor.
+	 *
+	 * @param message Message to send as the response.
 	 */
-	public InvalidLogin() {
-		super("Invalid username or password.");
+	protected HttpResponse(String message) {
+		this.message = message;
+	}
+
+	@ResponseBody
+	@Override /* Object */
+	public String toString() {
+		return message;
 	}
 }
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/IMUsed.java
similarity index 64%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/IMUsed.java
index 46b56da..46bea59 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/IMUsed.java
@@ -10,26 +10,42 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
+
+import static org.apache.juneau.http.response.IMUsed.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when an invalid username or password is provided.
+ * Represents an <c>HTTP 226 IM Used</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The server has fulfilled a request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance.
  */
-@SuppressWarnings("serial")
-@Response(description="Invalid username or password provided")
-public class InvalidLogin extends Unauthorized {
+@Response(code=CODE, description=MESSAGE)
+public class IMUsed extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 226;
+
+	/** Default message */
+	public static final String MESSAGE = "IM Used";
+
+	/** Reusable instance. */
+	public static final IMUsed INSTANCE = new IMUsed();
 
 	/**
-	 * Constructor.
+	 * Constructor using HTTP-standard message.
 	 */
-	public InvalidLogin() {
-		super("Invalid username or password.");
+	public IMUsed() {
+		this(MESSAGE);
 	}
-}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public IMUsed(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MovedPermanently.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MovedPermanently.java
new file mode 100644
index 0000000..828147f
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MovedPermanently.java
@@ -0,0 +1,87 @@
+// ***************************************************************************************************************************
+// * 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.http.response;
+
+import static org.apache.juneau.http.response.MovedPermanently.*;
+
+import java.net.*;
+
+import org.apache.juneau.annotation.BeanIgnore;
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Represents an <c>HTTP 301 Moved Permanently</c> response.
+ *
+ * <p>
+ * This and all future requests should be directed to the given URI.
+ */
+@Response(code=CODE, description=MESSAGE)
+@BeanIgnore
+public class MovedPermanently extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 301;
+
+	/** Default message */
+	public static final String MESSAGE = "Moved Permanently";
+
+	/** Reusable instance. */
+	public static final MovedPermanently INSTANCE = new MovedPermanently();
+
+	private final URI location;
+
+	/**
+	 * Constructor using HTTP-standard message.
+	 */
+	public MovedPermanently() {
+		this(MESSAGE, null);
+	}
+
+	/**
+	 * Constructor with no redirect.
+	 * <p>
+	 * Used for end-to-end interfaces.
+	 *
+	 * @param message Message to send as the response.
+	 */
+	public MovedPermanently(String message) {
+		super(message);
+		this.location = null;
+	}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 * @param location <c>Location</c> header value.
+	 */
+	public MovedPermanently(String message, URI location) {
+		super(message);
+		this.location = location;
+	}
+
+	/**
+	 * Constructor.
+	 * @param location <c>Location</c> header value.
+	 */
+	public MovedPermanently(URI location) {
+		this(MESSAGE, location);
+	}
+
+	/**
+	 * @return <c>Location</c> header value.
+	 */
+	@ResponseHeader(name="Location", description="New location of resource.")
+	public URI getLocation() {
+		return location;
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultiStatus.java
similarity index 64%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultiStatus.java
index 06869e3..89bf7bb 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultiStatus.java
@@ -10,44 +10,42 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
-import java.util.*;
+import static org.apache.juneau.http.response.MultiStatus.*;
 
 import org.apache.juneau.http.annotation.*;
 
 /**
- * X-Expires-After custom HTTP header.
+ * Represents an <c>HTTP 207 Multi-Status</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The message body that follows is by default an XML message and can contain a number of separate response codes, depending on how many sub-requests were made.
  */
-@ResponseHeader(
-	name="X-Expires-After",
-	type="string",
-	format="date-time",
-	description="Date in UTC when token expires",
-	example="2012-10-21"
-)
-public class ExpiresAfter {
-	private final Calendar c;
+@Response(code=CODE, description=MESSAGE)
+public class MultiStatus extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 207;
+
+	/** Default message */
+	public static final String MESSAGE = "Multi-Status";
+
+	/** Reusable instance. */
+	public static final MultiStatus INSTANCE = new MultiStatus();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param d The header value.
+	 * Constructor using HTTP-standard message.
 	 */
-	public ExpiresAfter(Date d) {
-		this.c = new GregorianCalendar();
-		c.setTime(d);
+	public MultiStatus() {
+		this(MESSAGE);
 	}
 
 	/**
-	 * The header value.
-	 * @return The header value.
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
 	 */
-	public Calendar toCalendar() {
-		return c;
+	public MultiStatus(String message) {
+		super(message);
 	}
 }
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultipleChoices.java
similarity index 60%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultipleChoices.java
index 06869e3..c21c7d0 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultipleChoices.java
@@ -10,44 +10,43 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
-import java.util.*;
+import static org.apache.juneau.http.response.MultipleChoices.*;
 
 import org.apache.juneau.http.annotation.*;
 
 /**
- * X-Expires-After custom HTTP header.
+ * Represents an <c>HTTP 300 Multiple Choices</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * Indicates multiple options for the resource from which the client may choose (via agent-driven content negotiation).
+ * For example, this code could be used to present multiple video format options, to list files with different filename extensions, or to suggest word-sense disambiguation.
  */
-@ResponseHeader(
-	name="X-Expires-After",
-	type="string",
-	format="date-time",
-	description="Date in UTC when token expires",
-	example="2012-10-21"
-)
-public class ExpiresAfter {
-	private final Calendar c;
+@Response(code=CODE, description=MESSAGE)
+public class MultipleChoices extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 300;
+
+	/** Default message */
+	public static final String MESSAGE = "Multiple Choices";
+
+	/** Reusable instance. */
+	public static final MultipleChoices INSTANCE = new MultipleChoices();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param d The header value.
+	 * Constructor using HTTP-standard message.
 	 */
-	public ExpiresAfter(Date d) {
-		this.c = new GregorianCalendar();
-		c.setTime(d);
+	public MultipleChoices() {
+		this(MESSAGE);
 	}
 
 	/**
-	 * The header value.
-	 * @return The header value.
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
 	 */
-	public Calendar toCalendar() {
-		return c;
+	public MultipleChoices(String message) {
+		super(message);
 	}
 }
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NoContent.java
similarity index 66%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NoContent.java
index 46b56da..fed311f 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NoContent.java
@@ -10,26 +10,42 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
+
+import static org.apache.juneau.http.response.NoContent.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when an invalid username or password is provided.
+ * Represents an <c>HTTP 204 No Content</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The server successfully processed the request and is not returning any content.
  */
-@SuppressWarnings("serial")
-@Response(description="Invalid username or password provided")
-public class InvalidLogin extends Unauthorized {
+@Response(code=CODE, description=MESSAGE)
+public class NoContent extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 204;
+
+	/** Default message */
+	public static final String MESSAGE = "No Content";
+
+	/** Reusable instance. */
+	public static final NoContent INSTANCE = new NoContent();
 
 	/**
-	 * Constructor.
+	 * Constructor using HTTP-standard message.
 	 */
-	public InvalidLogin() {
-		super("Invalid username or password.");
+	public NoContent() {
+		this(MESSAGE);
 	}
-}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public NoContent(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NonAuthoritiveInformation.java
similarity index 61%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NonAuthoritiveInformation.java
index 06869e3..d5125d6 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NonAuthoritiveInformation.java
@@ -10,44 +10,42 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
-import java.util.*;
+import static org.apache.juneau.http.response.NonAuthoritiveInformation.*;
 
 import org.apache.juneau.http.annotation.*;
 
 /**
- * X-Expires-After custom HTTP header.
+ * Represents an <c>HTTP 203 Non-Authoritative Information</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The server is a transforming proxy (e.g. a Web accelerator) that received a 200 OK from its origin, but is returning a modified version of the origin's response.
  */
-@ResponseHeader(
-	name="X-Expires-After",
-	type="string",
-	format="date-time",
-	description="Date in UTC when token expires",
-	example="2012-10-21"
-)
-public class ExpiresAfter {
-	private final Calendar c;
+@Response(code=CODE, description=MESSAGE)
+public class NonAuthoritiveInformation extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 203;
+
+	/** Default message */
+	public static final String MESSAGE = "Non-Authoritative Information";
+
+	/** Reusable instance. */
+	public static final NonAuthoritiveInformation INSTANCE = new NonAuthoritiveInformation();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param d The header value.
+	 * Constructor using HTTP-standard message.
 	 */
-	public ExpiresAfter(Date d) {
-		this.c = new GregorianCalendar();
-		c.setTime(d);
+	public NonAuthoritiveInformation() {
+		this(MESSAGE);
 	}
 
 	/**
-	 * The header value.
-	 * @return The header value.
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
 	 */
-	public Calendar toCalendar() {
-		return c;
+	public NonAuthoritiveInformation(String message) {
+		super(message);
 	}
 }
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NotModified.java
similarity index 61%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NotModified.java
index 46b56da..91a35f6 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NotModified.java
@@ -10,26 +10,43 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
+
+import static org.apache.juneau.http.response.NotModified.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when an invalid username or password is provided.
+ * Represents an <c>HTTP 304 Not Modified</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match.
+ * In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy.
  */
-@SuppressWarnings("serial")
-@Response(description="Invalid username or password provided")
-public class InvalidLogin extends Unauthorized {
+@Response(code=CODE, description=MESSAGE)
+public class NotModified extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 304;
+
+	/** Default message */
+	public static final String MESSAGE = "Not Modified";
+
+	/** Reusable instance. */
+	public static final NotModified INSTANCE = new NotModified();
 
 	/**
-	 * Constructor.
+	 * Constructor using HTTP-standard message.
 	 */
-	public InvalidLogin() {
-		super("Invalid username or password.");
+	public NotModified() {
+		this(MESSAGE);
 	}
-}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public NotModified(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdNotFound.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Ok.java
similarity index 60%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdNotFound.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Ok.java
index 01edc34..a26a1cd 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdNotFound.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Ok.java
@@ -10,29 +10,46 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
+
+import static org.apache.juneau.http.response.Ok.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when trying to add an entry where the ID is already in use.
+ * Represents an <c>HTTP 200 OK</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * Standard response for successful HTTP requests. The actual response will depend on the request method used.
+ * In a GET request, the response will contain an entity corresponding to the requested resource.
+ * In a POST request, the response will contain an entity describing or containing the result of the action.
  */
-@SuppressWarnings("serial")
-@Response(description="ID not found")
-public class IdNotFound extends NotFound {
+@Response(code=CODE, description=MESSAGE)
+public class Ok extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 200;
+
+	/** Default message */
+	public static final String MESSAGE = "OK";
+
+	/** Reusable instance. */
+	public static final Ok INSTANCE = new Ok();
+	/** Reusable instance. */
+	public static final Ok OK = new Ok();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param id The duplicate ID.
-	 * @param c The object type..
+	 * Constructor using HTTP-standard message.
 	 */
-	public IdNotFound(Object id, Class<?> c) {
-		super("ID ''{0}'' not found for type ''{1}''", id, c.getSimpleName());
+	public Ok() {
+		this(MESSAGE);
 	}
-}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public Ok(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PartialContent.java
similarity index 61%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PartialContent.java
index 06869e3..a911800 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PartialContent.java
@@ -10,44 +10,43 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
-import java.util.*;
+import static org.apache.juneau.http.response.PartialContent.*;
 
 import org.apache.juneau.http.annotation.*;
 
 /**
- * X-Expires-After custom HTTP header.
+ * Represents an <c>HTTP 206 Partial Content</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The server is delivering only part of the resource (byte serving) due to a range header sent by the client.
+ * The range header is used by HTTP clients to enable resuming of interrupted downloads, or split a download into multiple simultaneous streams.
  */
-@ResponseHeader(
-	name="X-Expires-After",
-	type="string",
-	format="date-time",
-	description="Date in UTC when token expires",
-	example="2012-10-21"
-)
-public class ExpiresAfter {
-	private final Calendar c;
+@Response(code=CODE, description=MESSAGE)
+public class PartialContent extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 206;
+
+	/** Default message */
+	public static final String MESSAGE = "Partial Content";
+
+	/** Reusable instance. */
+	public static final PartialContent INSTANCE = new PartialContent();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param d The header value.
+	 * Constructor using HTTP-standard message.
 	 */
-	public ExpiresAfter(Date d) {
-		this.c = new GregorianCalendar();
-		c.setTime(d);
+	public PartialContent() {
+		this(MESSAGE);
 	}
 
 	/**
-	 * The header value.
-	 * @return The header value.
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
 	 */
-	public Calendar toCalendar() {
-		return c;
+	public PartialContent(String message) {
+		super(message);
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PermanentRedirect.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PermanentRedirect.java
new file mode 100644
index 0000000..7cb998e
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PermanentRedirect.java
@@ -0,0 +1,88 @@
+// ***************************************************************************************************************************
+// * 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.http.response;
+
+import static org.apache.juneau.http.response.PermanentRedirect.*;
+
+import java.net.*;
+
+import org.apache.juneau.annotation.BeanIgnore;
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Represents an <c>HTTP 308 Permanent Redirect</c> response.
+ *
+ * <p>
+ * The request and all future requests should be repeated using another URI. 307 and 308 parallel the behaviors of 302 and 301, but do not allow the HTTP method to change.
+ * So, for example, submitting a form to a permanently redirected resource may continue smoothly.
+ */
+@Response(code=CODE, description=MESSAGE)
+@BeanIgnore
+public class PermanentRedirect extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 308;
+
+	/** Default message */
+	public static final String MESSAGE = "Permanent Redirect";
+
+	/** Reusable instance. */
+	public static final PermanentRedirect INSTANCE = new PermanentRedirect();
+
+	private final URI location;
+
+	/**
+	 * Constructor using HTTP-standard message.
+	 */
+	public PermanentRedirect() {
+		this(MESSAGE, null);
+	}
+
+	/**
+	 * Constructor with no redirect.
+	 * <p>
+	 * Used for end-to-end interfaces.
+	 *
+	 * @param message Message to send as the response.
+	 */
+	public PermanentRedirect(String message) {
+		super(message);
+		this.location = null;
+	}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 * @param location <c>Location</c> header value.
+	 */
+	public PermanentRedirect(String message, URI location) {
+		super(message);
+		this.location = location;
+	}
+
+	/**
+	 * Constructor.
+	 * @param location <c>Location</c> header value.
+	 */
+	public PermanentRedirect(URI location) {
+		this(MESSAGE, location);
+	}
+
+	/**
+	 * @return <c>Location</c> header value.
+	 */
+	@ResponseHeader(name="Location", description="New location of resource.")
+	public URI getLocation() {
+		return location;
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdNotFound.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Processing.java
similarity index 60%
rename from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdNotFound.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Processing.java
index 01edc34..ccffbeb 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdNotFound.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Processing.java
@@ -10,29 +10,44 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
+
+import static org.apache.juneau.http.response.Processing.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
 
 /**
- * Exception thrown when trying to add an entry where the ID is already in use.
+ * Represents an <c>HTTP 102 Processing</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request.
+ * This code indicates that the server has received and is processing the request, but no response is available yet.
+ * This prevents the client from timing out and assuming the request was lost.
  */
-@SuppressWarnings("serial")
-@Response(description="ID not found")
-public class IdNotFound extends NotFound {
+@Response(code=CODE, description=MESSAGE)
+public class Processing extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 102;
+
+	/** Default message */
+	public static final String MESSAGE = "Processing";
+
+	/** Reusable instance. */
+	public static final Processing INSTANCE = new Processing();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param id The duplicate ID.
-	 * @param c The object type..
+	 * Constructor using HTTP-standard message.
 	 */
-	public IdNotFound(Object id, Class<?> c) {
-		super("ID ''{0}'' not found for type ''{1}''", id, c.getSimpleName());
+	public Processing() {
+		this(MESSAGE);
 	}
-}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 */
+	public Processing(String message) {
+		super(message);
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/ResetContent.java
similarity index 63%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/ResetContent.java
index 06869e3..0fffa8d 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/ResetContent.java
@@ -10,44 +10,43 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
-import java.util.*;
+import static org.apache.juneau.http.response.ResetContent.*;
 
 import org.apache.juneau.http.annotation.*;
 
 /**
- * X-Expires-After custom HTTP header.
+ * Represents an <c>HTTP 205 Reset Content</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The server successfully processed the request, but is not returning any content.
+ * Unlike a 204 response, this response requires that the requester reset the document view.
  */
-@ResponseHeader(
-	name="X-Expires-After",
-	type="string",
-	format="date-time",
-	description="Date in UTC when token expires",
-	example="2012-10-21"
-)
-public class ExpiresAfter {
-	private final Calendar c;
+@Response(code=CODE, description=MESSAGE)
+public class ResetContent extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 205;
+
+	/** Default message */
+	public static final String MESSAGE = "Reset Content";
+
+	/** Reusable instance. */
+	public static final ResetContent INSTANCE = new ResetContent();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param d The header value.
+	 * Constructor using HTTP-standard message.
 	 */
-	public ExpiresAfter(Date d) {
-		this.c = new GregorianCalendar();
-		c.setTime(d);
+	public ResetContent() {
+		this(MESSAGE);
 	}
 
 	/**
-	 * The header value.
-	 * @return The header value.
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
 	 */
-	public Calendar toCalendar() {
-		return c;
+	public ResetContent(String message) {
+		super(message);
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SeeOther.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SeeOther.java
new file mode 100644
index 0000000..88b456a
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SeeOther.java
@@ -0,0 +1,113 @@
+// ***************************************************************************************************************************
+// * 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.http.response;
+
+import static org.apache.juneau.http.response.SeeOther.*;
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.net.*;
+import java.text.*;
+
+import org.apache.juneau.annotation.BeanIgnore;
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Represents an <c>HTTP 303 See Other</c> response.
+ *
+ * <p>
+ * The response to the request can be found under another URI using the GET method.
+ * When received in response to a POST (or PUT/DELETE), the client should presume that the server has received the data and should issue a new GET request to the given URI.
+ */
+@Response(code=CODE, description=MESSAGE)
+@BeanIgnore
+public class SeeOther extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 303;
+
+	/** Default message */
+	public static final String MESSAGE = "See Other";
+
+	/** Reusable instance. */
+	public static final SeeOther INSTANCE = new SeeOther();
+
+	private final URI location;
+
+	/**
+	 * Constructor using HTTP-standard message.
+	 */
+	public SeeOther() {
+		this(MESSAGE, null);
+	}
+
+	/**
+	 * Constructor with no redirect.
+	 * <p>
+	 * Used for end-to-end interfaces.
+	 *
+	 * @param message Message to send as the response.
+	 */
+	public SeeOther(String message) {
+		super(message);
+		this.location = null;
+	}
+
+	/**
+	 * Constructor using custom message.
+	 *
+	 * @param message Message to send as the response.
+	 * @param location <c>Location</c> header value.
+	 */
+	public SeeOther(String message, URI location) {
+		super(message);
+		this.location = location;
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param message Message to send as the response.
+	 * @param uri URI containing {@link MessageFormat}-style arguments.
+	 * @param uriArgs {@link MessageFormat}-style arguments.
+	 */
+	public SeeOther(String message, String uri, Object uriArgs) {
+		this(message, toURI(format(uri.toString(), uriArgs)));
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param location <c>Location</c> header value.
+	 */
+	public SeeOther(URI location) {
+		this(MESSAGE, location);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param uri URI containing {@link MessageFormat}-style arguments.
+	 * @param uriArgs {@link MessageFormat}-style arguments.
+	 */
+	public SeeOther(String uri, Object uriArgs) {
+		this(toURI(format(uri.toString(), uriArgs)));
+	}
+
+	/**
+	 * @return <c>Location</c> header value.
+	 */
+	@ResponseHeader(name="Location", description="Other location.")
+	public URI getLocation() {
+		return location;
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SwitchingProtocols.java
similarity index 64%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SwitchingProtocols.java
index 06869e3..cc34d0b 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SwitchingProtocols.java
@@ -10,44 +10,42 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
-import java.util.*;
+import static org.apache.juneau.http.response.SwitchingProtocols.*;
 
 import org.apache.juneau.http.annotation.*;
 
 /**
- * X-Expires-After custom HTTP header.
+ * Represents an <c>HTTP 101 Switching Protocols</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The requester has asked the server to switch protocols and the server has agreed to do so.
  */
-@ResponseHeader(
-	name="X-Expires-After",
-	type="string",
-	format="date-time",
-	description="Date in UTC when token expires",
-	example="2012-10-21"
-)
-public class ExpiresAfter {
-	private final Calendar c;
+@Response(code=CODE, description=MESSAGE)
+public class SwitchingProtocols extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 101;
+
+	/** Default message */
+	public static final String MESSAGE = "Switching Protocols";
+
+	/** Reusable instance. */
+	public static final SwitchingProtocols INSTANCE = new SwitchingProtocols();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param d The header value.
+	 * Constructor using HTTP-standard message.
 	 */
-	public ExpiresAfter(Date d) {
-		this.c = new GregorianCalendar();
-		c.setTime(d);
+	public SwitchingProtocols() {
+		this(MESSAGE);
 	}
 
 	/**
-	 * The header value.
-	 * @return The header value.
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
 	 */
-	public Calendar toCalendar() {
-		return c;
+	public SwitchingProtocols(String message) {
+		super(message);
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/TemporaryRedirect.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/TemporaryRedirect.java
new file mode 100644
index 0000000..bc9f363
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/TemporaryRedirect.java
@@ -0,0 +1,89 @@
+// ***************************************************************************************************************************
+// * 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.http.response;
+
+import static org.apache.juneau.http.response.TemporaryRedirect.*;
+
+import java.net.*;
+
+import org.apache.juneau.annotation.BeanIgnore;
+import org.apache.juneau.http.annotation.*;
+
+/**
+ * Represents an <c>HTTP 307 Temporary Redirect</c> response.
+ *
+ * <p>
+ * In this case, the request should be repeated with another URI; however, future requests should still use the original URI.
+ * In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request.
+ * For example, a POST request should be repeated using another POST request.
+ */
+@Response(code=CODE, description=MESSAGE)
+@BeanIgnore
+public class TemporaryRedirect extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 307;
+
+	/** Default message */
+	public static final String MESSAGE = "Temporary Redirect";
+
+	/** Reusable instance. */
+	public static final TemporaryRedirect INSTANCE = new TemporaryRedirect();
+
+	private final URI location;
+
+	/**
+	 * Constructor using HTTP-standard message.
+	 */
+	public TemporaryRedirect() {
+		this(MESSAGE, null);
+	}
+
+	/**
+	 * Constructor with no redirect.
+	 * <p>
+	 * Used for end-to-end interfaces.
+	 *
+	 * @param message Message to send as the response.
+	 */
+	public TemporaryRedirect(String message) {
+		super(message);
+		this.location = null;
+	}
+
+	/**
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
+	 * @param location <c>Location</c> header value.
+	 */
+	public TemporaryRedirect(String message, URI location) {
+		super(message);
+		this.location = location;
+	}
+
+	/**
+	 * Constructor.
+	 * @param location <c>Location</c> header value.
+	 */
+	public TemporaryRedirect(URI location) {
+		this(MESSAGE, location);
+	}
+
+	/**
+	 * @return <c>Location</c> header value.
+	 */
+	@ResponseHeader(name="Location", description="Temporary location of resource.")
+	public URI getLocation() {
+		return location;
+	}
+}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/UseProxy.java
similarity index 62%
copy from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
copy to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/UseProxy.java
index 06869e3..9f567a2 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/UseProxy.java
@@ -10,44 +10,43 @@
 // * "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.examples.rest.petstore;
+package org.apache.juneau.http.response;
 
-import java.util.*;
+import static org.apache.juneau.http.response.UseProxy.*;
 
 import org.apache.juneau.http.annotation.*;
 
 /**
- * X-Expires-After custom HTTP header.
+ * Represents an <c>HTTP 305 Use Proxy</c> response.
  *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
+ * <p>
+ * The requested resource is available only through a proxy, the address for which is provided in the response.
+ * Many HTTP clients (such as Mozilla and Internet Explorer) do not correctly handle responses with this status code, primarily for security reasons.
  */
-@ResponseHeader(
-	name="X-Expires-After",
-	type="string",
-	format="date-time",
-	description="Date in UTC when token expires",
-	example="2012-10-21"
-)
-public class ExpiresAfter {
-	private final Calendar c;
+@Response(code=CODE, description=MESSAGE)
+public class UseProxy extends HttpResponse {
+
+	/** HTTP status code */
+	public static final int CODE = 305;
+
+	/** Default message */
+	public static final String MESSAGE = "Use Proxy";
+
+	/** Reusable instance. */
+	public static final UseProxy INSTANCE = new UseProxy();
 
 	/**
-	 * Constructor.
-	 *
-	 * @param d The header value.
+	 * Constructor using HTTP-standard message.
 	 */
-	public ExpiresAfter(Date d) {
-		this.c = new GregorianCalendar();
-		c.setTime(d);
+	public UseProxy() {
+		this(MESSAGE);
 	}
 
 	/**
-	 * The header value.
-	 * @return The header value.
+	 * Constructor using custom message.
+	 * @param message Message to send as the response.
 	 */
-	public Calendar toCalendar() {
-		return c;
+	public UseProxy(String message) {
+		super(message);
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/package-info.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/package-info.java
new file mode 100644
index 0000000..d3cddf5
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/package-info.java
@@ -0,0 +1,18 @@
+/***************************************************************************************************************************
+ * 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.
+ *
+ ***************************************************************************************************************************/
+
+/**
+ * HTTP Response beans.
+ */
+package org.apache.juneau.http.response;
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
index 013b4a5..dac8c66 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
@@ -13,8 +13,6 @@
 package org.apache.juneau.httppart;
 
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
@@ -83,8 +81,7 @@
 
 	HttpPartSchemaBuilder apply(Class<? extends Annotation> c, java.lang.reflect.Type t) {
 		if (t instanceof Class<?>) {
-			Class<?> tc = (Class<?>)t;
-			ClassInfo ci = getClassInfo(tc);
+			ClassInfo ci = ClassInfo.of((Class<?>)t);
 			for (Annotation a : ci.getAnnotationsParentFirst(c))
 				apply(a);
 		} else if (Value.isType(t)) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
index 2318c7f..c4426ee 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
@@ -54,7 +54,7 @@
 	 * @return Metadata about the class, or <jk>null</jk> if class not annotated with {@link Request}.
 	 */
 	public static RequestBeanMeta create(Class<?> c, PropertyStore ps) {
-		ClassInfo ci = getClassInfo(c);
+		ClassInfo ci = ClassInfo.of(c);
 		if (! ci.hasAnnotation(Request.class))
 			return null;
 		return new RequestBeanMeta.Builder(ps).apply(c).build();
@@ -95,7 +95,7 @@
 		}
 
 		Builder apply(Class<?> c) {
-			ClassInfo ci = getClassInfo(c);
+			ClassInfo ci = ClassInfo.of(c);
 			apply(ci.getAnnotation(Request.class));
 			this.cm = BeanContext.DEFAULT.getClassMeta(c);
 			for (MethodInfo m : cm.getInfo().getAllMethods()) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
index 2f23850..3f0ba6e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
@@ -47,7 +47,7 @@
 	 * @return Metadata about the class, or <jk>null</jk> if class not annotated with {@link Response}.
 	 */
 	public static ResponseBeanMeta create(Type t, PropertyStore ps) {
-		ClassInfo ci = getClassInfo(t).resolved();
+		ClassInfo ci = ClassInfo.of(t).resolved();
 		if (! ci.hasAnnotation(Response.class))
 			return null;
 		Builder b = new Builder(ps);
@@ -67,7 +67,7 @@
 	 * @return Metadata about the class, or <jk>null</jk> if class not annotated with {@link Response}.
 	 */
 	public static ResponseBeanMeta create(MethodInfo m, PropertyStore ps) {
-		if (! m.hasAnnotation(Response.class))
+		if (! (m.hasAnnotation(Response.class) || m.getResolvedReturnType().hasAnnotation(Response.class)))
 			return null;
 		Builder b = new Builder(ps);
 		b.apply(m.getReturnType().resolved().innerType());
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ArrayUtils.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ArrayUtils.java
index a36bfb6..7ce707b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ArrayUtils.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ArrayUtils.java
@@ -13,12 +13,13 @@
 package org.apache.juneau.internal;

 

 import static org.apache.juneau.internal.StringUtils.*;

-import static org.apache.juneau.internal.ClassUtils.*;

 import static org.apache.juneau.internal.ThrowableUtils.*;

 

 import java.lang.reflect.*;

 import java.util.*;

 

+import org.apache.juneau.reflect.*;

+

 /**

  * Quick and dirty utilities for working with arrays.

  */

@@ -392,7 +393,7 @@
 		if (! c.isArray())

 			throw new IllegalArgumentException("Cannot pass non-array objects to toPrimitiveArray()");

 		int l = Array.getLength(o);

-		Class<?> tc = getClassInfo(c.getComponentType()).getPrimitiveForWrapper();

+		Class<?> tc = ClassInfo.of(c.getComponentType()).getPrimitiveForWrapper();

 		if (tc == null)

 			throw new IllegalArgumentException("Array type is not a primitive wrapper array.");

 		Object a = Array.newInstance(tc, l);

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
index b2d72e1..2a9f123 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils.java
@@ -25,70 +25,6 @@
 public final class ClassUtils {

 

 	/**

-	 * Shortcut for calling {@link ClassInfo#of(Type)}.

-	 *

-	 * @param t The class being wrapped.

-	 * @return The wrapped class.

-	 */

-	public static ClassInfo getClassInfo(Type t) {

-		return ClassInfo.of(t);

-	}

-

-	/**

-	 * Shortcut for calling {@link ClassInfo#of(Object)}.

-	 *

-	 * @param o The object whose class being wrapped.

-	 * @return The wrapped class.

-	 */

-	public static ClassInfo getClassInfo(Object o) {

-		return ClassInfo.of(o);

-	}

-

-	/**

-	 * Shortcut for calling {@link MethodInfo#of(Method)}.

-	 *

-	 * @param m The method being wrapped.

-	 * @return The wrapped method.

-	 */

-	public static MethodInfo getMethodInfo(Method m) {

-		return MethodInfo.of(m);

-	}

-

-	/**

-	 * Shortcut for calling {@link MethodInfo#of(ClassInfo, Method)}.

-	 *

-	 * @param c

-	 * 	The class containing the method.

-	 * 	<br>Note that this isn't necessarily the declaring class, but could be a subclass

-	 * 	of the declaring class.

-	 * @param m The method being wrapped.

-	 * @return The wrapped method.

-	 */

-	public static MethodInfo getMethodInfo(Class<?> c, Method m) {

-		return MethodInfo.of(ClassInfo.of(c), m);

-	}

-

-	/**

-	 * Shortcut for calling {@link FieldInfo#of(Field)}.

-	 *

-	 * @param f The field being wrapped.

-	 * @return The wrapped field.

-	 */

-	public static FieldInfo getFieldInfo(Field f) {

-		return FieldInfo.of(f);

-	}

-

-	/**

-	 * Shortcut for calling {@link ConstructorInfo#of(Constructor)}.

-	 *

-	 * @param c The constructor being wrapped.

-	 * @return The wrapped constructor.

-	 */

-	public static ConstructorInfo getConstructorInfo(Constructor<?> c) {

-		return ConstructorInfo.of(c);

-	}

-

-	/**

 	 * Given the specified list of objects, return readable names for the class types of the objects.

 	 *

 	 * @param o The objects.

@@ -111,7 +47,7 @@
 	public static boolean argsMatch(Class<?>[] paramTypes, Class<?>[] argTypes) {

 		if (paramTypes.length == argTypes.length) {

 			for (int i = 0; i < paramTypes.length; i++)

-				if (! getClassInfo(paramTypes[i]).isParentOf(argTypes[i]))

+				if (! ClassInfo.of(paramTypes[i]).isParentOf(argTypes[i]))

 					return false;

 			return true;

 		}

@@ -145,9 +81,9 @@
 	public static int fuzzyArgsMatch(Class<?>[] paramTypes, Class<?>... argTypes) {

 		int matches = 0;

 		outer: for (Class<?> p : paramTypes) {

-			ClassInfo pi = getClassInfo(p).getWrapperInfoIfPrimitive();

+			ClassInfo pi = ClassInfo.of(p).getWrapperInfoIfPrimitive();

 			for (Class<?> a : argTypes) {

-				ClassInfo ai = getClassInfo(a).getWrapperInfoIfPrimitive();

+				ClassInfo ai = ClassInfo.of(a).getWrapperInfoIfPrimitive();

 				if (pi.isParentOf(ai.inner())) {

 					matches++;

 					continue outer;

@@ -168,7 +104,7 @@
 	public static int fuzzyArgsMatch(Class<?>[] paramTypes, ClassInfo... argTypes) {

 		int matches = 0;

 		outer: for (Class<?> p : paramTypes) {

-			ClassInfo pi = getClassInfo(p).getWrapperInfoIfPrimitive();

+			ClassInfo pi = ClassInfo.of(p).getWrapperInfoIfPrimitive();

 			for (ClassInfo a : argTypes) {

 				ClassInfo ai = a.getWrapperInfoIfPrimitive();

 				if (pi.isParentOf(ai.inner())) {

@@ -284,7 +220,7 @@
 			return null;

 		if (c2 instanceof Class) {

 			try {

-				ClassInfo c3 = getClassInfo((Class<?>)c2);

+				ClassInfo c3 = ClassInfo.of((Class<?>)c2);

 				if (c3.isInterface() || c3.isAbstract())

 					return null;

 

@@ -312,7 +248,7 @@
 			} catch (Exception e) {

 				throw new FormattedRuntimeException(e, "Could not instantiate class {0}", c.getName());

 			}

-		} else if (getClassInfo(c).isParentOf(c2.getClass())) {

+		} else if (ClassInfo.of(c).isParentOf(c2.getClass())) {

 			return (T)c2;

 		} else {

 			throw new FormattedRuntimeException("Object of type {0} found but was expecting {1}.", c2.getClass(), c.getClass());

@@ -334,7 +270,7 @@
 	public static Object[] getMatchingArgs(Class<?>[] paramTypes, Object... args) {

 		Object[] params = new Object[paramTypes.length];

 		for (int i = 0; i < paramTypes.length; i++) {

-			ClassInfo pt = getClassInfo(paramTypes[i]).getWrapperInfoIfPrimitive();

+			ClassInfo pt = ClassInfo.of(paramTypes[i]).getWrapperInfoIfPrimitive();

 			for (int j = 0; j < args.length; j++) {

 				if (args[j] != null && pt.isParentOf(args[j].getClass())) {

 					params[i] = args[j];

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/CollectionUtils.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/CollectionUtils.java
index 9e102ae..6feba07 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/CollectionUtils.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/CollectionUtils.java
@@ -100,6 +100,16 @@
 	}

 

 	/**

+	 * Returns a reverse iterable over the specified list.

+	 *

+	 * @param c The collection to iterate over.

+	 * @return An iterable over the collection.

+	 */

+	public static <T> Iterable<T> reverseIterable(final List<T> c) {

+		return iterable(c, true);

+	}

+

+	/**

 	 * Returns an iterable over the specified array.

 	 *

 	 * @param c The collection to iterate over.

@@ -113,6 +123,16 @@
 	}

 

 	/**

+	 * Returns a reverse iterable over the specified array.

+	 *

+	 * @param c The collection to iterate over.

+	 * @return An iterable over the collection.

+	 */

+	public static <T> Iterable<T> reverseIterable(T[] c) {

+		return iterable(c, true);

+	}

+

+	/**

 	 * Returns an iterable over the specified enumeration.

 	 *

 	 * @param e The collection to iterate over.

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/HttpUtils.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/HttpUtils.java
index babbdae..81333db 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/HttpUtils.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/HttpUtils.java
@@ -13,8 +13,6 @@
 package org.apache.juneau.internal;
 
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.lang.reflect.*;
 
 import org.apache.juneau.reflect.*;
@@ -85,7 +83,7 @@
 			return "";
 		sb.append('(');
 		for (int i = 0; i < pt.length; i++) {
-			ClassInfo pti = getClassInfo(pt[i]);
+			ClassInfo pti = ClassInfo.of(pt[i]);
 			if (i > 0)
 				sb.append(',');
 			if (full)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/annotation/JsoConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/annotation/JsoConfig.java
index e011d35..50c350b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/annotation/JsoConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/annotation/JsoConfig.java
@@ -31,4 +31,13 @@
 @Retention(RUNTIME)
 @Inherited
 @PropertyStoreApply(JsoConfigApply.class)
-public @interface JsoConfig {}
+public @interface JsoConfig {
+
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
index 571baae..27faae0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
@@ -124,6 +124,10 @@
 			sType = swap.getSwapClassMeta(this);

 		else

 			sType = eType;

+

+		if (sType.isOptional()) 

+			return (T)Optional.ofNullable(parseAnything(eType.getElementType(), r, outer, pMeta));

+

 		setCurrentClass(sType);

 		String wrapperAttr = sType.getExtendedMeta(JsonClassMeta.class).getWrapperAttr();

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index 915fb84..3ed2bc2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -105,6 +105,13 @@
 			aType = object();

 		}

 

+		// Handle Optional<X>

+		if (isOptional(aType)) {

+			o = getOptionalValue(o);

+			eType = getOptionalType(eType);

+			aType = getClassMetaForObject(o, object());

+		}

+

 		sType = aType;

 		String typeName = getBeanTypeName(eType, aType, pMeta);

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonSerializer.java
index 7fae549..6caa968 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonSerializer.java
@@ -32,7 +32,7 @@
  * </ul>
  *
  * <ul class='seealso'>
- * 	<li class='link'>{@doc juneau-marshall.JsonDetails.SimplifiedJson}
+ * 	<li class='link'>{@doc SimpleJson}
  * </ul>
  */
 public class SimpleJsonSerializer extends JsonSerializer {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
index 5fa3188..4528785 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
@@ -34,6 +34,14 @@
 @PropertyStoreApply(JsonConfigApply.class)
 public @interface JsonConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// JsonParser
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/ExternalDocs.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/ExternalDocs.java
index 5430fd3..f43fb7e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/ExternalDocs.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/ExternalDocs.java
@@ -97,7 +97,7 @@
 	 * Free-form value for the {@doc SwaggerExternalDocumentationObject}.
 	 *
 	 * <p>
-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this field.
+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this field.
 	 *
 	 * <p>
 	 * The following are completely equivalent ways of defining the swagger description of documentation:
@@ -145,7 +145,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.
+	 * 		The format is a {@doc SimpleJson} object.
 	 * 	<li>
 	 * 		The leading/trailing <c>{ }</c> characters are optional.
 	 * 		<br>The following two example are considered equivalent:
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Items.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Items.java
index 03c453d..dab267e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Items.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Items.java
@@ -314,7 +314,7 @@
 	 * Free-form value for the {@doc SwaggerItemsObject}.

 	 *

 	 * <p>

-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this field.

+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this field.

 	 *

 	 * <p>

 	 * The following are completely equivalent ways of defining the swagger description of an Items object:

@@ -380,7 +380,7 @@
 	 * 	<li>

 	 * 		Note that the only swagger field you can't specify using this value is <js>"name"</js> whose value needs to be known during servlet initialization.

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 		<br>The following two example are considered equivalent:

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
index dbf6987..b289d54 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
@@ -34,6 +34,14 @@
 @PropertyStoreApply(JsonSchemaConfigApply.class)
 public @interface JsonSchemaConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// JsonSchemaGenerator
 	//-------------------------------------------------------------------------------------------------------------------
@@ -212,6 +220,7 @@
 	 * Swagger documentation.
 	 *
 	 * <ul class='notes'>
+	 * 	<li>
 	 * 		Format: Comma-delimited list of patterns
 	 * 	<li>
 	 * 		Supports {@doc DefaultSvlVariables} (e.g. <js>"$C{myConfigVar}"</js>).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
index b91fd42..b219d4f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
@@ -171,7 +171,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is any {@doc juneau-marshall.JsonDetails.SimplifiedJson}.

+	 * 		The format is any {@doc SimpleJson}.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -337,7 +337,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -352,7 +352,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -400,7 +400,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array or comma-delimited list.

+	 * 		The format is a {@doc SimpleJson} array or comma-delimited list.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -460,7 +460,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -519,7 +519,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -533,7 +533,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -547,7 +547,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -561,7 +561,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -575,7 +575,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -589,7 +589,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -603,7 +603,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -624,7 +624,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object or plain text string.

+	 * 		The format is a {@doc SimpleJson} object or plain text string.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -641,7 +641,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -699,7 +699,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 		<br>The following two example are considered equivalent:

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/SubItems.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/SubItems.java
index aa4fef4..f2c91f8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/SubItems.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/SubItems.java
@@ -263,7 +263,7 @@
 	 * Describes the type of items in the array.

 	 *

 	 * <p>

-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * This is a {@doc SimpleJson} object.

 	 * <br>It must be declared free-form because it's not possible to nest annotations in Java.

 	 */

 	String[] items() default {};

@@ -272,7 +272,7 @@
 	 * Free-form value for the {@doc SwaggerItemsObject}.

 	 *

 	 * <p>

-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this field.

+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this field.

 	 *

 	 * <p>

 	 * The following are completely equivalent ways of defining the swagger description of an Items object:

@@ -338,7 +338,7 @@
 	 * 	<li>

 	 * 		Note that the only swagger field you can't specify using this value is <js>"name"</js> whose value needs to be known during servlet initialization.

 	 * 	<li>

-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.

+	 * 		The format is a {@doc SimpleJson} object.

 	 * 	<li>

 	 * 		The leading/trailing <c>{ }</c> characters are optional.

 	 * 		<br>The following two example are considered equivalent:

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
index a33d250..89088c3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
@@ -67,6 +67,10 @@
 			sType = swap.getSwapClassMeta(this);

 		else

 			sType = eType;

+

+		if (sType.isOptional()) 

+			return (T)Optional.ofNullable(parseAnything(eType.getElementType(), is, outer, pMeta));

+

 		setCurrentClass(sType);

 

 		Object o = null;

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
index d8b3ddc..b3f7aec 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
@@ -89,6 +89,13 @@
 			o = null;

 			aType = object();

 		}

+		

+		// Handle Optional<X>

+		if (isOptional(aType)) {

+			o = getOptionalValue(o);

+			eType = getOptionalType(eType);

+			aType = getClassMetaForObject(o, object());

+		}

 

 		sType = aType;

 		String typeName = getBeanTypeName(eType, aType, pMeta);

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
index 9c4ef6b..46293fc 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
@@ -34,6 +34,14 @@
 @PropertyStoreApply(MsgPackConfigApply.class)
 public @interface MsgPackConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// MsgPackSerializer
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
index 035bcb7..3fc4797 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
@@ -67,13 +67,27 @@
 	}

 

 

+	@SuppressWarnings("unchecked")

 	@Override /* HttpPartParser */

 	public <T> T parse(HttpPartType partType, HttpPartSchema schema, String in, ClassMeta<T> type) throws ParseException, SchemaValidationException {

+		boolean isOptional = type.isOptional();

+

+		while (type != null && type.isOptional())

+			type = (ClassMeta<T>)type.getElementType();

+

+		if (type == null)

+			type = (ClassMeta<T>)object();

+

 		schema = ObjectUtils.firstNonNull(schema, getSchema(), DEFAULT_SCHEMA);

+

 		T t = parseInner(partType, schema, in, type);

 		if (t == null && type.isPrimitive())

 			t = type.getPrimitiveDefault();

 		schema.validateOutput(t, ctx);

+

+		if (isOptional)

+			t = (T)Optional.ofNullable(t);

+

 		return t;

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/annotation/OpenApiConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/annotation/OpenApiConfig.java
index 1540a16..7dbeb9b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/annotation/OpenApiConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/annotation/OpenApiConfig.java
@@ -31,4 +31,13 @@
 @Retention(RUNTIME)
 @Inherited
 @PropertyStoreApply(OpenApiConfigApply.class)
-public @interface OpenApiConfig {}
+public @interface OpenApiConfig {
+
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/annotation/ParserConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/annotation/ParserConfig.java
index ea51ae0..47d553c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/annotation/ParserConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/annotation/ParserConfig.java
@@ -38,6 +38,14 @@
 @PropertyStoreApply(ParserConfigApply.class)
 public @interface ParserConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// InputStreamParser
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/annotation/PlainTextConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/annotation/PlainTextConfig.java
index 6c99ddf..ee433fa 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/annotation/PlainTextConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/annotation/PlainTextConfig.java
@@ -31,4 +31,13 @@
 @Retention(RUNTIME)
 @Inherited
 @PropertyStoreApply(PlainTextConfigApply.class)
-public @interface PlainTextConfig {}
+public @interface PlainTextConfig {
+
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/package-info.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/pojotools/PageArgs.java
old mode 100755
new mode 100644
similarity index 86%
rename from juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/package-info.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/pojotools/PageArgs.java
index 7122ab8..2487098
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/package-info.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/pojotools/PageArgs.java
@@ -1,18 +1,37 @@
-// ***************************************************************************************************************************

-// * 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.                                              *

-// ***************************************************************************************************************************

-

-/**

- * Examples

- */

-package org.apache.juneau.examples.rest.petstore;

-

+// ***************************************************************************************************************************
+// * 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.pojotools;
+
+/**
+ * TODO
+ */
+public class PageArgs {
+
+	/**
+	 * TODO
+	 *
+	 * @return TODO
+	 */
+	public int getLimit() {
+		return 0;
+	}
+
+	/**
+	 * TODO
+	 *
+	 * @return TODO
+	 */
+	public int getPosition() {
+		return 0;
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
index eab269f..4227828 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
@@ -29,10 +29,11 @@
  */
 public class AnnotationInfo<T extends Annotation> {
 
-	private ClassInfo c;
-	private MethodInfo m;
-	private Package p;
-	private T a;
+	private final ClassInfo c;
+	private final MethodInfo m;
+	private final Package p;
+	private final T a;
+	final int rank;
 
 	/**
 	 * Constructor.
@@ -47,6 +48,20 @@
 		this.m = m;
 		this.p = p;
 		this.a = a;
+		this.rank = getRank(a);
+	}
+
+	private static int getRank(Object a) {
+		ClassInfo ci = ClassInfo.ofc(a);
+		MethodInfo mi = ci.getPublicMethod("rank");
+		if (mi != null && mi.hasReturnType(int.class)) {
+			try {
+				return (int)mi.invoke(a);
+			} catch (ExecutableException e) {
+				e.printStackTrace();
+			}
+		}
+		return 0;
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
index 86240fa..17332a9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationList.java
@@ -12,7 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.reflect;
 
-import java.util.ArrayList;
+import java.util.*;
 import java.util.function.*;
 
 /**
@@ -49,4 +49,21 @@
 		}
 		return false;
 	}
+
+	private static final Comparator<AnnotationInfo<?>> RANK_COMPARATOR = new Comparator<AnnotationInfo<?>>() {
+		@Override
+		public int compare(AnnotationInfo<?> o1, AnnotationInfo<?> o2) {
+			return o1.rank - o2.rank;
+		}
+	};
+
+	/**
+	 * Sort the annotations in this list based on rank.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public AnnotationList sort() {
+		Collections.sort(this, RANK_COMPARATOR);
+		return this;
+	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
index f226c67..06014db 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
@@ -37,7 +37,7 @@
  * <p>
  * Objects are designed to be lightweight to create and threadsafe.
  *
- * <h5 class='figure'>
+ * <h5 class='figure'>Example:</h5>
  * <p class='bpcode w800'>
  * 	<jc>// Wrap our class inside a ClassInfo.</jc>
  * 	ClassInfo ci = ClassInfo.<jsm>of</jsm>(MyClass.<jk>class</jk>);
@@ -58,6 +58,7 @@
 
 	private final Type t;
 	final Class<?> c;
+	private ClassInfo proxyFor;
 	private final boolean isParameterizedType;
 	private List<ClassInfo> interfaces, declaredInterfaces, parents, allParents;
 	private List<MethodInfo> publicMethods, declaredMethods, allMethods, allMethodsParentFirst;
@@ -67,6 +68,8 @@
 	private int dim = -1;
 	private ClassInfo componentType;
 
+	private static final Map<Class<?>,ClassInfo> CACHE = new ConcurrentHashMap<>();
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Instantiation.
 	//-----------------------------------------------------------------------------------------------------------------
@@ -76,10 +79,12 @@
 	 *
 	 * @param c The class type.
 	 * @param t The generic type (if parameterized type).
+	 * @param proxyFor If the class is a CGLIB proxy, this is the underlying wrapped class.
 	 */
-	protected ClassInfo(Class<?> c, Type t) {
+	protected ClassInfo(Class<?> c, Type t, Class<?> proxyFor) {
 		this.t = t;
 		this.c = c;
+		this.proxyFor = proxyFor == null ? null : ClassInfo.of(proxyFor);
 		this.isParameterizedType = t == null ? false : (t instanceof ParameterizedType);
 	}
 
@@ -92,7 +97,7 @@
 	public static ClassInfo of(Type t) {
 		if (t == null)
 			return null;
-		return new ClassInfo(ClassUtils.toClass(t), t);
+		return new ClassInfo(ClassUtils.toClass(t), t, null);
 	}
 
 	/**
@@ -104,7 +109,24 @@
 	public static ClassInfo of(Class<?> c) {
 		if (c == null)
 			return null;
-		return new ClassInfo(c, c);
+		return new ClassInfo(c, c, null);
+	}
+
+	/**
+	 * Same as {@link #of(Class)}} but caches the result for faster future lookup.
+	 *
+	 * @param c The class type.
+	 * @return The constructed class info, or <jk>null</jk> if the type was <jk>null</jk>.
+	 */
+	public static ClassInfo ofc(Class<?> c) {
+		if (c == null)
+			return null;
+		ClassInfo ci = CACHE.get(c);
+		if (ci == null) {
+			ci = ClassInfo.of(c);
+			CACHE.put(c, ci);
+		}
+		return ci;
 	}
 
 	/**
@@ -115,19 +137,58 @@
 	 * @return The constructed class info, or <jk>null</jk> if the type was <jk>null</jk>.
 	 */
 	public static ClassInfo of(Class<?> c, Type t) {
-		return new ClassInfo(c, t);
+		return new ClassInfo(c, t, null);
 	}
 
 	/**
 	 * Same as using the constructor, but operates on an object instance.
 	 *
 	 * @param o The class instance.
-	 * @return The constructed class info.
+	 * @return The constructed class info, or <jk>null</jk> if the object was <jk>null</jk>.
 	 */
 	public static ClassInfo of(Object o) {
 		if (o == null)
 			return null;
-		return new ClassInfo(o.getClass(), o.getClass());
+		return new ClassInfo(o.getClass(), o.getClass(), getProxyFor(o));
+	}
+
+	/**
+	 * Same as {@link #of(Object)}} but caches the result for faster future lookup.
+	 *
+	 * @param o The class instance.
+	 * @return The constructed class info, or <jk>null</jk> if the type was <jk>null</jk>.
+	 */
+	public static ClassInfo ofc(Object o) {
+		if (o == null)
+			return null;
+		Class<?> c = o.getClass();
+		ClassInfo ci = CACHE.get(c);
+		if (ci == null) {
+			ci = ClassInfo.of(o);
+			CACHE.put(c, ci);
+		}
+		return ci;
+	}
+
+	/**
+	 * When this metadata is against a CGLIB proxy, this method finds the underlying "real" class.
+	 *
+	 * @param o The class instance.
+	 * @return The non-proxy class, or <jk>null</jk> if it's not a CGLIB proxy.
+	 */
+	private static Class<?> getProxyFor(Object o) {
+		Class<?> c = o.getClass();
+		String s = c.getName();
+		if (s.indexOf('$') == -1 || ! s.contains("$$EnhancerBySpringCGLIB$$"))
+			return null;
+		for (Method m : c.getMethods()) {
+			if (m.getName().equals("getTargetClass") && m.getParameterCount() == 0 && m.getReturnType().equals(Class.class)) {
+				try {
+					return (Class<?>) m.invoke(o);
+				} catch (Exception e) {}
+			}
+		}
+		return null;
 	}
 
 	/**
@@ -160,6 +221,26 @@
 		return this;
 	}
 
+	/**
+	 * Identifies the inner target class when this class info represents a CGLIB proxy class.
+	 *
+	 * @param proxyFor The inner non-proxied class.
+	 * @return This object (for method chaining).
+	 */
+	public ClassInfo proxyFor(Class<?> proxyFor) {
+		this.proxyFor = ClassInfo.of(proxyFor);
+		return this;
+	}
+
+	/**
+	 * Returns the non-proxied inner class of a CGLIB proxy class.
+	 *
+	 * @return The non-proxied inner class of a CGLIB proxy class, or the inner class if it's not a proxy.
+	 */
+	public Class<?> getProxiedClass() {
+		return proxyFor == null ? c : proxyFor.inner();
+	}
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Parent classes and interfaces.
 	//-----------------------------------------------------------------------------------------------------------------
@@ -308,13 +389,31 @@
 			List<MethodInfo> l = new ArrayList<>(mm.length);
 			for (Method m : mm)
 				if (m.getDeclaringClass() != Object.class)
-					l.add(MethodInfo.of(this, m));
+					l.add(MethodInfo.of(this, m, getProxyTarget(m)));
 			l.sort(null);
 			publicMethods = Collections.unmodifiableList(l);
 		}
 		return publicMethods;
 	}
 
+	private Method getProxyTarget(Method m) {
+		if (proxyFor != null) {
+			MethodInfo m2 = proxyFor.getMethod(m.getName(), m.getParameterTypes());
+			if (m2 != null)
+				return m2.inner();
+		}
+		return m;
+	}
+
+	private Constructor<?> getProxyTarget(Constructor<?> c) {
+		if (proxyFor != null) {
+			ConstructorInfo c2 = proxyFor.getConstructor(Visibility.PRIVATE, c.getParameterTypes());
+			if (c2 != null)
+				return c2.inner();
+		}
+		return c;
+	}
+
 	/**
 	 * Returns the public method with the specified method name and argument types.
 	 *
@@ -358,7 +457,7 @@
 			List<MethodInfo> l = new ArrayList<>(mm.length);
 			for (Method m : mm)
 				if (! "$jacocoInit".equals(m.getName())) // Jacoco adds its own simulated methods.
-					l.add(MethodInfo.of(this, m));
+					l.add(MethodInfo.of(this, m, getProxyTarget(m)));
 			l.sort(null);
 			declaredMethods = Collections.unmodifiableList(l);
 		}
@@ -516,7 +615,7 @@
 			Constructor<?>[] cc = c == null ? new Constructor[0] : c.getConstructors();
 			List<ConstructorInfo> l = new ArrayList<>(cc.length);
 			for (Constructor<?> ccc : cc)
-				l.add(ConstructorInfo.of(this, ccc));
+				l.add(ConstructorInfo.of(this, ccc, getProxyTarget(ccc)));
 			l.sort(null);
 			publicConstructors = Collections.unmodifiableList(l);
 		}
@@ -575,7 +674,7 @@
 			Constructor<?>[] cc = c == null ? new Constructor[0] : c.getDeclaredConstructors();
 			List<ConstructorInfo> l = new ArrayList<>(cc.length);
 			for (Constructor<?> ccc : cc)
-				l.add(ConstructorInfo.of(this, ccc));
+				l.add(ConstructorInfo.of(this, ccc, getProxyTarget(ccc)));
 			l.sort(null);
 			declaredConstructors = Collections.unmodifiableList(l);
 		}
@@ -1142,7 +1241,7 @@
 		return m;
 	}
 
-	private <T extends Annotation> T findAnnotation(Class<T> a) {
+	<T extends Annotation> T findAnnotation(Class<T> a) {
 		T t2 = getDeclaredAnnotation(a);
 		if (t2 != null)
 			return t2;
@@ -1500,6 +1599,15 @@
 		return c != null && ! c.isInterface();
 	}
 
+	/**
+	 * Returns <jk>true</jk> if this class is a {@link RuntimeException}.
+	 *
+	 * @return <jk>true</jk> if this class is a {@link RuntimeException}.
+	 */
+	public boolean isRuntimeException() {
+		return isChildOf(RuntimeException.class);
+	}
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Primitive wrappers
 	//-----------------------------------------------------------------------------------------------------------------
@@ -1745,7 +1853,7 @@
 	}
 
 	/**
-	 * Same as {@link #getSimpleName()} but uses <js>"Array"</j> instead of <js>"[]"</js>.
+	 * Same as {@link #getSimpleName()} but uses <js>"Array"</js> instead of <js>"[]"</js>.
 	 *
 	 * @return The readable name for this class.
 	 */
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ConstructorInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ConstructorInfo.java
index cb66dd5..36c01b9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ConstructorInfo.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ConstructorInfo.java
@@ -34,9 +34,10 @@
 	 *
 	 * @param declaringClass The class that declares this method.
 	 * @param c The constructor being wrapped.
+	 * @param rc The "real" constructor if the constructor above is defined against a CGLIB proxy.
 	 */
-	protected ConstructorInfo(ClassInfo declaringClass, Constructor<?> c) {
-		super(declaringClass, c);
+	protected ConstructorInfo(ClassInfo declaringClass, Constructor<?> c, Constructor<?> rc) {
+		super(declaringClass, c, rc);
 		this.c = c;
 	}
 
@@ -45,12 +46,13 @@
 	 *
 	 * @param declaringClass The class that declares this method.
 	 * @param c The constructor being wrapped.
+	 * @param rc The "real" constructor if the constructor above is defined against a CGLIB proxy.
 	 * @return A new {@link ConstructorInfo} object, or <jk>null</jk> if the method was null;
 	 */
-	public static ConstructorInfo of(ClassInfo declaringClass, Constructor<?> c) {
+	public static ConstructorInfo of(ClassInfo declaringClass, Constructor<?> c, Constructor<?> rc) {
 		if (c == null)
 			return null;
-		return new ConstructorInfo(declaringClass, c);
+		return new ConstructorInfo(declaringClass, c, rc);
 	}
 
 	/**
@@ -62,7 +64,7 @@
 	public static ConstructorInfo of(Constructor<?> c) {
 		if (c == null)
 			return null;
-		return new ConstructorInfo(ClassInfo.of(c.getDeclaringClass()), c);
+		return new ConstructorInfo(ClassInfo.of(c.getDeclaringClass()), c, c);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java
index df1d89c..08313e4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ExecutableInfo.java
@@ -28,7 +28,7 @@
 public abstract class ExecutableInfo {
 
 	final ClassInfo declaringClass;
-	final Executable e;
+	final Executable e, re;
 	final boolean isConstructor;
 
 	private List<ParamInfo> params;
@@ -43,10 +43,12 @@
 	 *
 	 * @param declaringClass The class that declares this method or constructor.
 	 * @param e The constructor or method that this info represents.
+	 * @param re The "real" constructor if the constructor above is defined against a CGLIB proxy.
 	 */
-	protected ExecutableInfo(ClassInfo declaringClass, Executable e) {
+	protected ExecutableInfo(ClassInfo declaringClass, Executable e, Executable re) {
 		this.declaringClass = declaringClass;
 		this.e = e;
+		this.re = re == null ? e : re;
 		this.isConstructor = e instanceof Constructor;
 	}
 
@@ -259,13 +261,13 @@
 
 	Type[] rawGenericParamTypes() {
 		if (rawGenericParamTypes == null)
-			rawGenericParamTypes = e.getGenericParameterTypes();
+			rawGenericParamTypes = re.getGenericParameterTypes();
 		return rawGenericParamTypes;
 	}
 
 	Parameter[] rawParameters() {
 		if (rawParameters == null)
-			rawParameters = e.getParameters();
+			rawParameters = re.getParameters();
 		return rawParameters;
 	}
 
@@ -302,10 +304,10 @@
 	}
 
 	/**
-	 * Returns <jk>true</jk> if the specified annotation is present on this constructor.
+	 * Returns <jk>true</jk> if the specified annotation is present on this method.
 	 *
 	 * @param a The annotation to check for.
-	 * @return <jk>true</jk> if the specified annotation is present on this constructor.
+	 * @return <jk>true</jk> if the specified annotation is present on this method.
 	 */
 	public final boolean hasAnnotation(Class<? extends Annotation> a) {
 		return getAnnotation(a) != null;
@@ -319,9 +321,6 @@
 	 * signature on the parent classes or interfaces.
 	 * <br>The search is performed in child-to-parent order.
 	 *
-	 * <p>
-	 * If still not found, searches for the annotation on the return type of the method.
-	 *
 	 * @param a
 	 * 	The annotation to search for.
 	 * @return
@@ -340,9 +339,9 @@
 	}
 
 	/**
-	 * Searched for the specified annotation.
+	 * Searched for the specified annotation on the method.
 	 *
-	 * @param a The annotation to search for.
+	 * @param a The annotation to search for on the method.
 	 * @return The annotation if found.
 	 */
 	protected <T extends Annotation> T findAnnotation(Class<T> a) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
index 861d99d..0cac994 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
@@ -43,9 +43,10 @@
 	 *
 	 * @param declaringClass The class that declares this method.
 	 * @param m The method being wrapped.
+	 * @param rm The "real" method if the method above is defined against a CGLIB proxy.
 	 */
-	protected MethodInfo(ClassInfo declaringClass, Method m) {
-		super(declaringClass, m);
+	protected MethodInfo(ClassInfo declaringClass, Method m, Method rm) {
+		super(declaringClass, m, rm);
 		this.m = m;
 	}
 
@@ -54,12 +55,27 @@
 	 *
 	 * @param declaringClass The class that declares this method.
 	 * @param m The method being wrapped.
+	 * @param rm The "real" method if the method above is defined against a CGLIB proxy.
 	 * @return A new {@link MethodInfo} object, or <jk>null</jk> if the method was null;
 	 */
-	public static MethodInfo of(ClassInfo declaringClass, Method m) {
+	public static MethodInfo of(ClassInfo declaringClass, Method m, Method rm) {
 		if (m == null)
 			return null;
-		return new MethodInfo(declaringClass, m);
+		return new MethodInfo(declaringClass, m, rm);
+	}
+
+	/**
+	 * Convenience method for instantiating a {@link MethodInfo};
+	 *
+	 * @param declaringClass The class that declares this method.
+	 * @param m The method being wrapped.
+	 * @param rm The "real" method if the method above is defined against a CGLIB proxy.
+	 * @return A new {@link MethodInfo} object, or <jk>null</jk> if the method was null;
+	 */
+	public static MethodInfo of(Class<?> declaringClass, Method m, Method rm) {
+		if (m == null)
+			return null;
+		return new MethodInfo(ClassInfo.of(declaringClass), m, rm);
 	}
 
 	/**
@@ -71,7 +87,7 @@
 	public static MethodInfo of(Method m) {
 		if (m == null)
 			return null;
-		return new MethodInfo(ClassInfo.of(m.getDeclaringClass()), m);
+		return new MethodInfo(ClassInfo.of(m.getDeclaringClass()), m, m);
 	}
 
 	/**
@@ -295,7 +311,7 @@
 			for (Annotation a2 :  m2.getAnnotations())
 				if (a.isInstance(a2))
 					return (T)a2;
-		return getReturnType().resolved().getAnnotation(a);
+		return null;
 	}
 
 	AnnotationList appendAnnotationList(AnnotationList al) {
@@ -370,6 +386,20 @@
 	}
 
 	/**
+	 * Returns the generic return type of this method as a {@link ClassInfo} object.
+	 * 
+	 * <p>
+	 * Unwraps the type if it's a {@link Value}.
+	 *
+	 * @return The generic return type of this method.
+	 */
+	public ClassInfo getResolvedReturnType() {
+		if (returnType == null)
+			returnType = ClassInfo.of(m.getReturnType(), m.getGenericReturnType());
+		return returnType.resolved();
+	}
+
+	/**
 	 * Returns <jk>true</jk> if this method has this return type.
 	 *
 	 * @param c The return type to test for.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
index fd95726..c45e52b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.reflect;
 
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.reflect.ReflectFlags.*;
 
 import java.util.concurrent.*;
@@ -146,7 +145,7 @@
 			};
 		}
 
-		ClassInfo ici = getClassInfo(ic), oci = getClassInfo(oc);
+		ClassInfo ici = ClassInfo.of(ic), oci = ClassInfo.of(oc);
 
 		for (ClassInfo pic : ici.getAllParents()) {
 			Mutater t = m.get(pic.inner());
@@ -156,7 +155,7 @@
 
 		if (ic == String.class) {
 			Class<?> oc2 = oci.hasPrimitiveWrapper() ? oci.getPrimitiveWrapper() : oc;
-			ClassInfo oc2i = getClassInfo(oc2);
+			ClassInfo oc2i = ClassInfo.of(oc2);
 
 			final MethodInfo createMethod = oc2i.getStaticCreateMethod(ic, "forName");
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/remote/RemoteInterfaceMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/remote/RemoteInterfaceMeta.java
index 80ca3ed..43fa8e9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/remote/RemoteInterfaceMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/remote/RemoteInterfaceMeta.java
@@ -14,8 +14,6 @@
 
 import static org.apache.juneau.internal.CollectionUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.lang.reflect.*;
 import java.util.*;
 
@@ -51,7 +49,7 @@
 	public RemoteInterfaceMeta(Class<?> c, String uri) {
 		this.c = c;
 		String path = "";
-		ClassInfo ci = getClassInfo(c);
+		ClassInfo ci = ClassInfo.of(c);
 		List<RemoteInterface> rr = ci.getAnnotationsParentFirst(RemoteInterface.class);
 		for (RemoteInterface r : rr)
 			if (! r.path().isEmpty())
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 455a175..2991a09 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -340,14 +340,14 @@
 				if (((Object[])value).length == 0)

 					return true;

 			}

-			if (cm.isCollection() || (cm.isObject() && getClassInfo(value).isChildOf(Collection.class))) {

+			if (cm.isCollection() || (cm.isObject() && ClassInfo.of(value).isChildOf(Collection.class))) {

 				if (((Collection<?>)value).isEmpty())

 					return true;

 			}

 		}

 

 		if (isTrimEmptyMaps()) {

-			if (cm.isMap() || (cm.isObject() && getClassInfo(value).isChildOf(Map.class))) {

+			if (cm.isMap() || (cm.isObject() && ClassInfo.of(value).isChildOf(Map.class))) {

 				if (((Map<?,?>)value).isEmpty())

 					return true;

 			}

@@ -586,7 +586,12 @@
 	 * @return The expected type.

 	 */

 	protected final ClassMeta<?> getExpectedRootType(Object o) {

-		return isAddRootType() ? object() : getClassMetaForObject(o);

+		if (isAddRootType())

+			return object();

+		ClassMeta<?> cm = getClassMetaForObject(o);

+		if (cm != null && cm.isOptional())

+			return cm.getElementType();

+		return cm;

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
index cc6efc7..c3a6d86 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
@@ -34,6 +34,14 @@
 @PropertyStoreApply(SerializerConfigApply.class)
 public @interface SerializerConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// OutputStreamSerializer
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/annotation/SoapXmlConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/annotation/SoapXmlConfig.java
index 2d1917f..1c10d1b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/annotation/SoapXmlConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/annotation/SoapXmlConfig.java
@@ -33,6 +33,14 @@
 @PropertyStoreApply(SoapXmlConfigApply.class)
 public @interface SoapXmlConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// SoapXmlSerializer
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/DefaultingVar.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/DefaultingVar.java
index cc24e01..534f51e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/DefaultingVar.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/DefaultingVar.java
@@ -12,8 +12,6 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.svl;

 

-import static org.apache.juneau.internal.StringUtils.*;

-

 /**

  * Interface for the resolution of vars with a default value if the <c>resolve()</c> method returns <jk>null</jk>.

  *

@@ -47,10 +45,11 @@
 		int i = s.indexOf(',');

 		if (i == -1)

 			return resolve(session, s.trim());

-		String[] s2 = split(s);

-		String v = resolve(session, s2[0]);

+		String s1 = s.substring(0, i);

+		String s2 = s.length() == i ? null : s.substring(i+1);

+		String v = resolve(session, s1);

 		if (v == null)

-			v = s2[1];

+			v = s2;

 		return v;

 	}

 }

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
index 9f5eab8..dafbd92 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
@@ -48,9 +48,9 @@
 
 		Map<String,Var> m = new ConcurrentSkipListMap<>();
 		for (Class<?> c : vars) {
-			ClassInfo ci = getClassInfo(c);
+			ClassInfo ci = ClassInfo.of(c);
 			if (! ci.isChildOf(Var.class))
-				throw new VarResolverException("Invalid variable class.  Must extend from Var");
+				throw new VarResolverException("Invalid variable class ''{0}''.  Must extend from Var.", ci);
 			Var v = castOrCreate(Var.class, c);
 			m.put(v.getName(), v);
 		}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
index 4d9d488..fd54c04 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
@@ -12,13 +12,12 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.transform;
 
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.beans.*;
 import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.reflect.*;
 
 /**
  * Builder class for {@link BeanFilter} objects.
@@ -73,7 +72,7 @@
 	 * Bean class is determined through reflection of the parameter type.
 	 */
 	protected BeanFilterBuilder() {
-		beanClass = getClassInfo(this.getClass()).getParameterType(0, BeanFilterBuilder.class);
+		beanClass = ClassInfo.of(this.getClass()).getParameterType(0, BeanFilterBuilder.class);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
index b83ec48..35c0674 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
@@ -12,8 +12,6 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.transform;

 

-import static org.apache.juneau.internal.ClassUtils.*;

-

 import java.lang.reflect.*;

 

 import org.apache.juneau.*;

@@ -142,12 +140,11 @@
 	 */

 	@SuppressWarnings("rawtypes")

 	public static BuilderSwap<?,?> findSwapFromBuilderClass(Class<?> builderClass, Visibility cVis, Visibility mVis) {

-		ClassInfo bci = getClassInfo(builderClass);

+		ClassInfo bci = ClassInfo.of(builderClass);

 		if (bci.isNotPublic())

 			return null;

 

-//		Class<?> pojoClass = getClassInfo(Builder.class).getParameterType(0, builderClass);

-		Class<?> pojoClass = getClassInfo(builderClass).getParameterType(0, Builder.class);

+		Class<?> pojoClass = ClassInfo.of(builderClass).getParameterType(0, Builder.class);

 

 		MethodInfo createPojoMethod, createBuilderMethod;

 		ConstructorInfo pojoConstructor;

@@ -160,7 +157,7 @@
 		if (pojoClass == null)

 			return null;

 

-		ClassInfo pci = getClassInfo(pojoClass);

+		ClassInfo pci = ClassInfo.of(pojoClass);

 

 		pojoConstructor = pci.getConstructor(cVis, builderClass);

 		if (pojoConstructor == null)

@@ -195,7 +192,7 @@
 		if (b != null && b.value() != Null.class)

 			builderClass = b.value();

 

-		ClassInfo pci = getClassInfo(pojoClass);

+		ClassInfo pci = ClassInfo.of(pojoClass);

 

 		builderCreateMethod = pci.getBuilderCreateMethod();

 

@@ -217,7 +214,7 @@
 		if (builderClass == null)

 			return null;

 

-		ClassInfo bci = getClassInfo(builderClass);

+		ClassInfo bci = ClassInfo.of(builderClass);

 		builderConstructor = bci.getNoArgConstructor(cVis);

 		if (builderConstructor == null && builderCreateMethod == null)

 			return null;

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java
index c86278a..78c7db0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/InterfaceBeanFilterBuilder.java
@@ -13,12 +13,11 @@
 package org.apache.juneau.transform;

 

 import static org.apache.juneau.internal.StringUtils.*;

-import static org.apache.juneau.internal.ClassUtils.*;

-

 import java.util.*;

 

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

+import org.apache.juneau.reflect.*;

 

 /**

  * Simple bean filter that simply identifies a class to be used as an interface class for all child classes.

@@ -54,7 +53,7 @@
 

 	private void init(Class<?> interfaceClass) {

 		interfaceClass(interfaceClass);

-		List<Bean> annotations = getClassInfo(interfaceClass).getAnnotations(Bean.class);

+		List<Bean> annotations = ClassInfo.of(interfaceClass).getAnnotations(Bean.class);

 

 		ListIterator<Bean> li = annotations.listIterator(annotations.size());

 		while (li.hasPrevious()) {

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/PojoSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/PojoSwap.java
index 0ebd06f..2d2d332 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/PojoSwap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/PojoSwap.java
@@ -12,8 +12,6 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.transform;

 

-import static org.apache.juneau.internal.ClassUtils.*;

-

 import java.util.*;

 

 import org.apache.juneau.*;

@@ -126,11 +124,11 @@
 	 * Constructor.

 	 */

 	protected PojoSwap() {

-		ClassInfo ci = getClassInfo(this.getClass());

+		ClassInfo ci = ClassInfo.of(this.getClass());

 		normalClass = (Class<T>)ci.getParameterType(0, PojoSwap.class);

 		swapClass = ci.getParameterType(1, PojoSwap.class);

-		normalClassInfo = getClassInfo(normalClass);

-		swapClassInfo = getClassInfo(swapClass);

+		normalClassInfo = ClassInfo.of(normalClass);

+		swapClassInfo = ClassInfo.of(swapClass);

 		forMediaTypes = forMediaTypes();

 		template = withTemplate();

 	}

@@ -144,8 +142,8 @@
 	protected PojoSwap(Class<T> normalClass, Class<?> swapClass) {

 		this.normalClass = normalClass;

 		this.swapClass = swapClass;

-		normalClassInfo = getClassInfo(normalClass);

-		swapClassInfo = getClassInfo(swapClass);

+		normalClassInfo = ClassInfo.of(normalClass);

+		swapClassInfo = ClassInfo.of(swapClass);

 		this.forMediaTypes = forMediaTypes();

 		this.template = withTemplate();

 	}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java
index 638f3ff..53290f6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/SurrogateSwap.java
@@ -12,8 +12,6 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.transform;

 

-import static org.apache.juneau.internal.ClassUtils.*;

-

 import java.lang.reflect.*;

 import java.util.*;

 

@@ -60,7 +58,7 @@
 	@SuppressWarnings({"unchecked", "rawtypes"})

 	public static List<SurrogateSwap<?,?>> findPojoSwaps(Class<?> c) {

 		List<SurrogateSwap<?,?>> l = new LinkedList<>();

-		ClassInfo ci = getClassInfo(c);

+		ClassInfo ci = ClassInfo.of(c);

 		for (ConstructorInfo cc : ci.getPublicConstructors()) {

 			if (cc.getAnnotation(BeanIgnore.class) == null && cc.hasNumParams(1) && cc.isPublic()) {

 				Class<?> pt = cc.getRawParamType(0);

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
index 7cc5e81..4bfe8ec 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
@@ -185,6 +185,10 @@
 			sType = swap.getSwapClassMeta(this);

 		else

 			sType = eType;

+		

+		if (sType.isOptional()) 

+			return (T)Optional.ofNullable(parseAnything(eType.getElementType(), r, outer, isUrlParamValue, pMeta));

+		

 		setCurrentClass(sType);

 

 		Object o = null;

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
index 3cfbdd3..1cb2b76 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
@@ -115,6 +115,13 @@
 			aType = object();

 		}

 

+		// Handle Optional<X>

+		if (isOptional(aType)) {

+			o = getOptionalValue(o);

+			eType = getOptionalType(eType);

+			aType = getClassMetaForObject(o, object());

+		}

+

 		sType = aType;

 		String typeName = getBeanTypeName(eType, aType, pMeta);

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
index 8425825..9e40c5b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
@@ -35,6 +35,14 @@
 @PropertyStoreApply(UonConfigApply.class)
 public @interface UonConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// UonParser
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
index 3fde0ca..5bbc18d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
@@ -95,6 +95,9 @@
 			sType = swap.getSwapClassMeta(this);

 		else

 			sType = eType;

+		

+		if (sType.isOptional()) 

+			return (T)Optional.ofNullable(parseAnything(eType.getElementType(), r, outer));

 

 		int c = r.peekSkipWs();

 		if (c == '?')

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
index 6e67f4d..090cc8d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/annotation/UrlEncodingConfig.java
@@ -33,6 +33,14 @@
 @PropertyStoreApply(UrlEncodingConfigApply.class)
 public @interface UrlEncodingConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// UrlEncodingSerializer
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/AList.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/AList.java
index 352a723..50195dc 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/AList.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/AList.java
@@ -43,6 +43,20 @@
 	}
 
 	/**
+	 * Convenience method for creating a list of objects.
+	 *
+	 * <p>
+	 * Identical to {@link #create(Object...)}.
+	 *
+	 * @param t The initial values.
+	 * @return A new list.
+	 */
+	@SafeVarargs
+	public static <T> AList<T> of(T...t) {
+		return new AList<T>().appendAll(t);
+	}
+
+	/**
 	 * Adds an entry to this list.
 	 *
 	 * @param t The entry to add to this list.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ASet.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ASet.java
index 5cd70aa..b42dc67 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ASet.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ASet.java
@@ -43,6 +43,20 @@
 	}
 
 	/**
+	 * Convenience method for creating a list of objects.
+	 *
+	 * <p>
+	 * Identical to {@link #create(Object...)}.
+	 *
+	 * @param t The initial values.
+	 * @return A new list.
+	 */
+	@SafeVarargs
+	public static <T> ASet<T> of(T...t) {
+		return new ASet<T>().appendAll(t);
+	}
+
+	/**
 	 * Adds an entry to this set.
 	 *
 	 * @param t The entry to add to this set.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ClasspathResourceFinderSimple.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ClasspathResourceFinderSimple.java
index 7eea5f3..eb97c8f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ClasspathResourceFinderSimple.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ClasspathResourceFinderSimple.java
@@ -65,10 +65,10 @@
 	 * @throws IOException Thrown by underlying stream.
 	 */
 	protected InputStream findClasspathResource(Class<?> baseClass, String name, Locale locale) throws IOException {
-		
-		if (locale == null) 
+
+		if (locale == null)
 			return getResourceAsStream(baseClass, name);
-		
+
 		for (String n : getCandidateFileNames(name, locale)) {
 			InputStream is = getResourceAsStream(baseClass, n);
 			if (is != null)
@@ -78,14 +78,7 @@
 	}
 
 	private InputStream getResourceAsStream(Class<?> baseClass, String name) {
-		InputStream is = baseClass.getResourceAsStream(name);
-		if (is != null)
-			return is;
-		if (! name.startsWith("/"))
-			is = baseClass.getResourceAsStream("/" + name);
-		if (is != null)
-			return is;
-		return null;
+		return baseClass.getResourceAsStream(name);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MetadataMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MetadataMap.java
index 7cc5543..207a36e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MetadataMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/MetadataMap.java
@@ -12,11 +12,10 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.utils;
 
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.lang.reflect.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.reflect.*;
 
 /**
  * Utility class for quick lookup of class metadata instances.
@@ -59,7 +58,7 @@
 			try {
 				for (Constructor<?> con : c.getConstructors()) {
 					Class<?>[] pt = con.getParameterTypes();
-					if (pt.length == 1 && getClassInfo(pt[0]).isParentOf(constructorArg.getClass())) {
+					if (pt.length == 1 && ClassInfo.of(pt[0]).isParentOf(constructorArg.getClass())) {
 						o = con.newInstance(constructorArg);
 						break;
 					}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
index 2285def..cdaed56 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
@@ -31,8 +31,8 @@
  * 	<li><js>"foo | bar | bqz"</js> - Multiple OR'ed arguments, pipe syntax.
  * 	<li><js>"foo || bar || bqz"</js> - Multiple OR'ed arguments, Java-OR syntax.
  * 	<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.
- * 	<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
- * 	<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
+ * 	<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
+ * 	<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
  * 	<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.
  * </ul>
  *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
index 7fca283..2ef487d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
@@ -287,6 +287,10 @@
 			sType = swap.getSwapClassMeta(this);

 		else

 			sType = eType;

+

+		if (sType.isOptional()) 

+			return (T)Optional.ofNullable(parseAnything(eType.getElementType(), currAttr, r, outer, isRoot, pMeta));

+

 		setCurrentClass(sType);

 

 		String wrapperAttr = (isRoot && isPreserveRootElement()) ? r.getName().getLocalPart() : null;

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index f69c2bb..775e188 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -271,6 +271,13 @@
 			aType = object();

 		}

 

+		// Handle Optional<X>

+		if (isOptional(aType)) {

+			o = getOptionalValue(o);

+			eType = getOptionalType(eType);

+			aType = getClassMetaForObject(o, object());

+		}

+

 		if (o != null) {

 

 			if (aType.isDelegate()) {

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
index 835ed66..e436ce8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
@@ -39,6 +39,14 @@
 @PropertyStoreApply(XmlConfigApply.class)
 public @interface XmlConfig {
 
+	/**
+	 * Optional rank for this config.
+	 *
+	 * <p>
+	 * Can be used to override default ordering and application of config annotations.
+	 */
+	int rank() default 0;
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// XmlParser
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xmlschema/XmlSchemaSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xmlschema/XmlSchemaSerializerSession.java
index e4be1cc..d81666a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xmlschema/XmlSchemaSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xmlschema/XmlSchemaSerializerSession.java
@@ -169,6 +169,8 @@
 
 		void process(Object o) throws IOException {
 			ClassMeta<?> cm = getClassMetaForObject(o);
+			if (cm != null && cm.isOptional())
+				cm = getClassMetaForObject(((Optional<?>)o).orElse(null));
 			Namespace ns = defaultNs;
 			if (cm == null)
 				queueElement(ns, "null", object());
@@ -311,6 +313,9 @@
 			int i = indent + 1;
 
 			cm = cm.getSerializedClassMeta(schemas.session);
+			while (cm.isOptional())
+				cm = cm.getElementType();
+
 			XmlBeanMeta xbm = cm.isBean() ? cm.getBeanMeta().getExtendedMeta(XmlBeanMeta.class) : null;
 
 			w.oTag(i, "complexType")
diff --git a/juneau-core/juneau-svl/pom.xml b/juneau-core/juneau-svl/pom.xml
index 5aa3a41..654b9c2 100644
--- a/juneau-core/juneau-svl/pom.xml
+++ b/juneau-core/juneau-svl/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-core</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-svl</artifactId>
diff --git a/juneau-core/pom.xml b/juneau-core/pom.xml
index c95bf83..f0bbeee 100644
--- a/juneau-core/pom.xml
+++ b/juneau-core/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-core</artifactId>
diff --git a/juneau-doc/docs/ReleaseNotes/8.1.0.html b/juneau-doc/docs/ReleaseNotes/8.1.0.html
index ef7599b..f6acfeb 100644
--- a/juneau-doc/docs/ReleaseNotes/8.1.0.html
+++ b/juneau-doc/docs/ReleaseNotes/8.1.0.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-8.1.0 (TBD)
+8.1.0 (Aug 21, 2019)
 
 <p>
 	8.1.0 introduces some significant new features including:
diff --git a/juneau-doc/docs/ReleaseNotes/8.1.1.html b/juneau-doc/docs/ReleaseNotes/8.1.1.html
new file mode 100644
index 0000000..2bda47c
--- /dev/null
+++ b/juneau-doc/docs/ReleaseNotes/8.1.1.html
@@ -0,0 +1,109 @@
+<!--
+/***************************************************************************************************************************
+ * 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.
+ ***************************************************************************************************************************/
+ -->
+
+8.1.1 (TBD)
+
+<p>
+	Juneau 8.1.1 is a minor release but introduces some new features/modifications.
+</p>
+
+<h5 class='topic w800'>juneau-marshall</h5>
+<ul class='spaced-list'>
+	<li>
+		Support for serializing/parsing {@link java.util.Optional} objects and bean properties.
+	<li>
+		Fixed a bug in the parsers where the generic subtype of a complex bean property type involving both collections and arrays
+		was not being found.  (e.g. <c>List&lt;Long&gt;[]</c>)
+	<li>
+		New packages of HTTP response/exceptions beans from <c>juneau-rest-server</c> bundle and REST proxy annotations from <c>juneau-rest-client</c> 
+		so that they can be used when building REST proxy interfaces while only pulling in the marshall bundle.
+		<ul>
+			<li class='jp'>{@link oaj.http.response}
+			<li class='jp'>{@link oaj.http.exception}
+			<li class='jp'>{@link oaj.http.remote}
+		</ul>
+		These replace the <c>org.apache.juneau.rest.response</c>, <c>org.apache.juneau.rest.exception</c>, and <c>org.apache.juneau.rest.client.remote</c> packages.
+	<li>
+		Defaulting SVL variables now won't ignore additional parameters.
+		<br><js>"$S{Foo,bar,baz}"</js> used to default to <js>"bar"</js> but now will default to <js>"bar,baz"</js>.
+	<li>
+		Ranking support has been added to all <ja>@XConfig</ja> annotations.
+		This allows you to override the normal precedence of application of config annotations on class and method hierarchies.
+</ul>
+
+<h5 class='topic w800'>juneau-rest-server</h5>
+<ul class='spaced-list'>
+	<li>
+		Support for {@link java.util.Optional} on method parameters annotated with {@link oaj.http.annotation.Header}, {@link oaj.http.annotation.FormData},  
+		{@link oaj.http.annotation.Query}, {@link oaj.http.annotation.Path}.
+	<li>
+		Fixed issue where {@link oajr.annotation.RestMethod#debug() RestMethod.debug()} annotation wasn't resulting
+		in the HTTP request being logged.
+	<li>
+		{@link oajr.RestException} has been deprecated and replaced by {@link oaj.http.exception.HttpException}.
+	<li>
+		Resolved issue where parameterized types on <ja>@RestMethod</ja>-annotated method parameters of Spring beans.
+		This is due to Spring relying on CGLIB for runtime-recompilation of beans that results in loss of parameterized-type
+		information.  
+		<br>In the following example, the <c>beans</c> parameter would resolve as an unparameterized <c>List</c>
+		which would typically result in getting a <c>List&lt;ObjectMap&gt;<c> and subsequent <c>ClassCastExceptions</c>.   
+		<p class='bpcode w800'>
+	<ja>@RestMethod</ja>
+	<jk>public void</jk> doFoo(<ja>@Body</ja> List&lt;MyBean&gt; beans) {...}
+		</p>
+		The fix involves resolving the original bean class for resolving parameterized type while leaving
+		method invocation on the proxy method so as not to bypass Spring features.
+	<li>
+		New methods on {@link oajr.BasicRest} to provide feature-parity with {@link oajr.RestServlet}:
+		<ul class='javatree'>
+			<li class='jc'>{@link oajr.BasicRest}
+			<ul>
+				<li class='jm'>{@link oajr.BasicRest#getContext() getContext()}
+				<li class='jm'>{@link oajr.BasicRest#getRequest() getRequest()}
+				<li class='jm'>{@link oajr.BasicRest#getResponse() getResponse()}
+				<li class='jm'>{@link oajr.BasicRest#log(String) log(String)}
+				<li class='jm'>{@link oajr.BasicRest#log(String,Throwable) log(String,Throwable)}
+				<li class='jm'>{@link oajr.BasicRest#log(Level,String,Object[]) log(Level,String,Object[])}
+				<li class='jm'>{@link oajr.BasicRest#logObjects(Level,String,Object[]) logObjects(Level,String,Object[])}
+				<li class='jm'>{@link oajr.BasicRest#log(Level,Throwable,String,Object[]) log(Level,Throwable,String,Object[])}
+			</ul>
+		</ul>
+	<li>
+		The <c>@RestResource(staticFiles)</c> annotation now supports absolute path locations and multiple mappings:
+		<p class='bpcode w800'>
+	<jc>// Resolves static files in root package "htdocs" or working directory "htdocs", and then relative package "htdocs".</jc>
+	<ja>@RestResource</ja>(staticFiles=<js>"htdocs:/htdocsfolder,htdocs:htdocs.package"</js>)
+		</p>
+	<li>
+		Fixed a bug in <c>@RestResource(staticFiles)</c> where the order of lookup between parent and child resources
+		was wrong.
+</ul>
+
+<h5 class='topic w800'>juneau-rest-client</h5>
+<ul class='spaced-list'>
+	<li>
+		Removed the dependency on the <c>juneau-rest-server</c> module.  
+		Allows the client API to be used without pulling in all the javax.servlet and server dependencies.
+</ul>
+
+<h5 class='topic w800'>juneau-examples</h5>
+<ul class='spaced-list'>
+	<li>
+		The PetStore application has been moved to a separate Git repository.
+		<ul>
+			<li><a class='doclink' href='https://github.com/apache/juneau-petstore'>GitHub Repo</a>
+			<li><a class='doclink' href='http://juneau.apache.org/index.html#petstore.html'>Documentation</a>
+		</ul>
+</ul>
diff --git a/juneau-doc/docs/Topics/01.Introduction/01.Features.html b/juneau-doc/docs/Topics/01.Introduction/01.Features.html
index aa65392..7020af7 100644
--- a/juneau-doc/docs/Topics/01.Introduction/01.Features.html
+++ b/juneau-doc/docs/Topics/01.Introduction/01.Features.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
  
-{updated} Features
+Features
 
 <ul class='spaced-list'>
 	<li>
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html b/juneau-doc/docs/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
index 8884759..692951d 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/06.ConfigurableProperties/02.CommonSerializer.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} Common Serializer Properties
+Common Serializer Properties
 
 <p>
 	In addition to the common properties above, the following properties are common to all serializers:
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/07.ConfigurableAnnotations.html b/juneau-doc/docs/Topics/02.juneau-marshall/07.ConfigurableAnnotations.html
index 9953f58..befd2ca 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/07.ConfigurableAnnotations.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/07.ConfigurableAnnotations.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} Configurable Annotations
+Configurable Annotations
 
 <p>
 	All configurable properties described in the previous section have annotation equivalents that can be applied on
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/01.PojoSwaps.html b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/01.PojoSwaps.html
index 7b412e5..d6f8182 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/01.PojoSwaps.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/01.PojoSwaps.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} PojoSwaps
+PojoSwaps
 
 <p>
 	{@link oaj.transform.PojoSwap PojoSwaps} are a critical component of Juneau.
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/03.AutoPojoSwaps.html b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/03.AutoPojoSwaps.html
index f222843..0ccbb7b 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/03.AutoPojoSwaps.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/03.AutoPojoSwaps.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} Auto-detected POJO swaps
+Auto-detected POJO swaps
 
 <p>
 	Various methods can be defined on a class directly to affect how it gets serialized.
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/04.PerMediaTypePojoSwaps.html b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/04.PerMediaTypePojoSwaps.html
index 0b83bde..801364d 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/04.PerMediaTypePojoSwaps.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/04.PerMediaTypePojoSwaps.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} Per-media-type PojoSwaps
+Per-media-type PojoSwaps
 
 <p>
 	Swaps can also be defined per-media-type.		
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/10.BeanPropertyAnnotation.html b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/10.BeanPropertyAnnotation.html
index 9b0f7cb..c20764e 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/10.BeanPropertyAnnotation.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/10.BeanPropertyAnnotation.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} @BeanProperty Annotation
+@BeanProperty Annotation
 
 <p>
 	The {@link oaj.annotation.BeanProperty @BeanProperty} annotation is used to tailor how 
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/11.BeanConstructorAnnotation.html b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/11.BeanConstructorAnnotation.html
index bf47665..47219c8 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/11.BeanConstructorAnnotation.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/11.Transforms/11.BeanConstructorAnnotation.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} @BeanConstructor Annotation
+@BeanConstructor Annotation
 
 <p>
 	The {@link oaj.annotation.BeanConstructor @BeanConstructor} annotation is used to 
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/19.PojoCategories.html b/juneau-doc/docs/Topics/02.juneau-marshall/19.PojoCategories.html
index 85bf42b..34ca92b 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/19.PojoCategories.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/19.PojoCategories.html
@@ -37,7 +37,7 @@
 	</tr>			
 	<tr class='dark bb' style='background-color:lightyellow'>
 		<td style='text-align:center'>2</td>
-		<td><b>Java Collections Framework objects and Java arrays</b></td>
+		<td><b>Java Collections Framework objects, Java arrays, Java Optionals</b></td>
 		<td>&nbsp;</td>
 		<td>&nbsp;</td>
 		<td>&nbsp;</td>
@@ -47,7 +47,7 @@
 		<td>
 			<b>With standard keys/values</b>
 			<br>Map keys are group [1, 4a, 6a] objects.
-			<br>Map, Collection, and array values are group [1, 2, 3ac, 4a, 6a] objects.	
+			<br>Map, Collection, Optional, and array values are group [1, 2, 3ac, 4a, 6a] objects.	
 		</td>
 		<td>
 			<ul class='normal'>
@@ -55,6 +55,7 @@
 				<li><c>TreeMap&lt;Integer,Bean&gt;</c>
 				<li><c>List&lt;<jk>int</jk>[][]&gt;</c>
 				<li><c>Bean[]</c>
+				<li><c>Optional&lt;Bean&gt;</c>
 			</ul>
 		</td>
 		<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
@@ -71,6 +72,7 @@
 			<ul class='normal'>
 				<li><c>HashSet&lt;Bean,Integer&gt;</c>
 				<li><c>TreeMap&lt;Integer,Reader&gt;</c>
+				<li><c>Optional&lt;Reader&gt;</c>
 			</ul>
 		</td>
 		<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
diff --git a/juneau-doc/docs/Topics/02.juneau-marshall/26.OpenApiDetails/03.Parsers.html b/juneau-doc/docs/Topics/02.juneau-marshall/26.OpenApiDetails/03.Parsers.html
index e54e6c3..086f0b3 100644
--- a/juneau-doc/docs/Topics/02.juneau-marshall/26.OpenApiDetails/03.Parsers.html
+++ b/juneau-doc/docs/Topics/02.juneau-marshall/26.OpenApiDetails/03.Parsers.html
@@ -216,6 +216,10 @@
 	</tr>
 </table>
 <p>
+	Additionally, any of the type above can also be wrapped as {@link java.util.Optional Optionals}.
+</p>
+
+<p>
 	For arrays, an example of "Any POJO transformable from arrays of the default types" is:
 </p>
 <p class='bpcode w800'>
diff --git a/juneau-doc/docs/Topics/05.juneau-svl/02.SvlVariables.html b/juneau-doc/docs/Topics/05.juneau-svl/02.SvlVariables.html
index 0374e0c..f8ee1b7 100644
--- a/juneau-doc/docs/Topics/05.juneau-svl/02.SvlVariables.html
+++ b/juneau-doc/docs/Topics/05.juneau-svl/02.SvlVariables.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} SVL Variables
+SVL Variables
 
 <p>
 	Variables are defined through the {@link oaj.svl.Var} API.
diff --git a/juneau-doc/docs/Topics/05.juneau-svl/04.DefaultVarResolver.html b/juneau-doc/docs/Topics/05.juneau-svl/04.DefaultVarResolver.html
index fd7cac8..a977fbc 100644
--- a/juneau-doc/docs/Topics/05.juneau-svl/04.DefaultVarResolver.html
+++ b/juneau-doc/docs/Topics/05.juneau-svl/04.DefaultVarResolver.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} VarResolver.DEFAULT
+VarResolver.DEFAULT
 
 <p>
 	{@link oaj.svl.VarResolver#DEFAULT} is a reusable variable resolver with default support for the following variables:
diff --git a/juneau-doc/docs/Topics/06.juneau-config/11.Imports.html b/juneau-doc/docs/Topics/06.juneau-config/11.Imports.html
index 6c4037c..5cf0bc7 100644
--- a/juneau-doc/docs/Topics/06.juneau-config/11.Imports.html
+++ b/juneau-doc/docs/Topics/06.juneau-config/11.Imports.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} Imports
+Imports
 
 <p>
 	Configurations can import values from other configurations using the following syntax: 
diff --git a/juneau-doc/docs/Topics/06.juneau-config/15.SystemDefaultConfig.html b/juneau-doc/docs/Topics/06.juneau-config/15.SystemDefaultConfig.html
index af95167..fb7b78e 100644
--- a/juneau-doc/docs/Topics/06.juneau-config/15.SystemDefaultConfig.html
+++ b/juneau-doc/docs/Topics/06.juneau-config/15.SystemDefaultConfig.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} System Default Config
+System Default Config
 
 <p>
 	Each JVM has a system default config.  This is a configuration file that serves as the default
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/02.ClassHierarchy.html b/juneau-doc/docs/Topics/07.juneau-rest-server/02.ClassHierarchy.html
index bab7e63..ddf2477 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/02.ClassHierarchy.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/02.ClassHierarchy.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} Class Hierarchy
+Class Hierarchy
 
 <p>
 	The class hierarchy for the REST servlet class is shown below:
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/02.BasicRestServlet.html b/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/02.BasicRestServlet.html
index 6b51783..ac30ce4 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/02.BasicRestServlet.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/02.BasicRestServlet.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} BasicRestServlet
+BasicRestServlet
 
 <p>
 	The {@link oajr.BasicRestServlet} class is a subclass of {@link oajr.RestServlet}
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/03.BasicRest.html b/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/03.BasicRest.html
index 2e2a476..2c2b6dc 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/03.BasicRest.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/03.BasicRest.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} BasicRest
+BasicRest
 
 <p>
 	The {@link oajr.BasicRest} class is identical to the {@link oajr.BasicRestServlet} class except that
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/05.BasicRestServletGroup.html b/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/05.BasicRestServletGroup.html
index fedff50..ed382b4 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/05.BasicRestServletGroup.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/05.BasicRestServletGroup.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} BasicRestServletGroup
+BasicRestServletGroup
 
 <p>
 	The {@link oajr.BasicRestServletGroup} class provides a default "router" page for 
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/06.BasicRestGroup.html b/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/06.BasicRestGroup.html
index 976698e..d6bb44c 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/06.BasicRestGroup.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/03.Instantiation/06.BasicRestGroup.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} BasicRestGroup
+BasicRestGroup
 
 <p>
 	The {@link oajr.BasicRestGroup} class is identical to the {@link oajr.BasicRestServletGroup} class except that
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/04.RestResource/02.RestResourcePath.html b/juneau-doc/docs/Topics/07.juneau-rest-server/04.RestResource/02.RestResourcePath.html
index 21c9aaf..0f419d3 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/04.RestResource/02.RestResourcePath.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/04.RestResource/02.RestResourcePath.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} @RestResource(path)
+@RestResource(path)
 
 <p>
 	The {@link oajr.annotation.RestResource#path() @RestResource(path)} annotation is used in the following situations:
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/06.RequestAttributes.html b/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/06.RequestAttributes.html
index 3b86915..1f2adab 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/06.RequestAttributes.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/06.RequestAttributes.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} RequestAttributes
+RequestAttributes
 
 <p>
 	The {@link oajr.RequestAttributes} object is the API for accessing the standard servlet attributes on an HTTP request 
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/15.PredefinedResponses.html b/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/15.PredefinedResponses.html
index 1e2fa2e..55106d9 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/15.PredefinedResponses.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/15.PredefinedResponses.html
@@ -39,36 +39,36 @@
 	}
 </p>
 <ul class='javatree'>
-	<li class='jp'>{@link oajr.response}
+	<li class='jp'>{@link oaj.http.response}
 	<ul>
-		<li class='jc'>{@link oajr.response.Accepted}
-		<li class='jc'>{@link oajr.response.AlreadyReported}
-		<li class='jc'>{@link oajr.response.Continue}
-		<li class='jc'>{@link oajr.response.Created}
-		<li class='jc'>{@link oajr.response.EarlyHints}
-		<li class='jc'>{@link oajr.response.Found}
-		<li class='jc'>{@link oajr.response.IMUsed}
-		<li class='jc'>{@link oajr.response.MovedPermanently}
-		<li class='jc'>{@link oajr.response.MultipleChoices}
-		<li class='jc'>{@link oajr.response.MultiStatus}
-		<li class='jc'>{@link oajr.response.NoContent}
-		<li class='jc'>{@link oajr.response.NonAuthoritiveInformation}
-		<li class='jc'>{@link oajr.response.NotModified}
-		<li class='jc'>{@link oajr.response.Ok}
-		<li class='jc'>{@link oajr.response.PartialContent}
-		<li class='jc'>{@link oajr.response.PermanentRedirect}
-		<li class='jc'>{@link oajr.response.Processing}
-		<li class='jc'>{@link oajr.response.ResetContent}
-		<li class='jc'>{@link oajr.response.SeeOther}
-		<li class='jc'>{@link oajr.response.SwitchingProtocols}
-		<li class='jc'>{@link oajr.response.TemporaryRedirect}
-		<li class='jc'>{@link oajr.response.UseProxy}
+		<li class='jc'>{@link oaj.http.response.Accepted}
+		<li class='jc'>{@link oaj.http.response.AlreadyReported}
+		<li class='jc'>{@link oaj.http.response.Continue}
+		<li class='jc'>{@link oaj.http.response.Created}
+		<li class='jc'>{@link oaj.http.response.EarlyHints}
+		<li class='jc'>{@link oaj.http.response.Found}
+		<li class='jc'>{@link oaj.http.response.IMUsed}
+		<li class='jc'>{@link oaj.http.response.MovedPermanently}
+		<li class='jc'>{@link oaj.http.response.MultipleChoices}
+		<li class='jc'>{@link oaj.http.response.MultiStatus}
+		<li class='jc'>{@link oaj.http.response.NoContent}
+		<li class='jc'>{@link oaj.http.response.NonAuthoritiveInformation}
+		<li class='jc'>{@link oaj.http.response.NotModified}
+		<li class='jc'>{@link oaj.http.response.Ok}
+		<li class='jc'>{@link oaj.http.response.PartialContent}
+		<li class='jc'>{@link oaj.http.response.PermanentRedirect}
+		<li class='jc'>{@link oaj.http.response.Processing}
+		<li class='jc'>{@link oaj.http.response.ResetContent}
+		<li class='jc'>{@link oaj.http.response.SeeOther}
+		<li class='jc'>{@link oaj.http.response.SwitchingProtocols}
+		<li class='jc'>{@link oaj.http.response.TemporaryRedirect}
+		<li class='jc'>{@link oaj.http.response.UseProxy}
 	</ul>
 </ul>
 <p>
 	These predefined response beans are an example of {@link oaj.http.annotation.Response @Response}-annotated 
 	objects that are describe in detail later.
-	Without going into details, this is how the {@link oajr.response.SeeOther} is defined:
+	Without going into details, this is how the {@link oaj.http.response.SeeOther} is defined:
 </p>
 <p class='bpcode w800'>
 	<ja>@Response</ja>(
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/16.PredefinedExceptions.html b/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/16.PredefinedExceptions.html
index 4f04a72..4f47de9 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/16.PredefinedExceptions.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/06.RestMethod/16.PredefinedExceptions.html
@@ -38,41 +38,41 @@
 	}
 </p>
 <ul class='javatree'>
-	<li class='jp'>{@link oajr.exception}
+	<li class='jp'>{@link oaj.http.exception}
 	<ul>
-		<li class='jc'>{@link oajr.exception.BadRequest}
-		<li class='jc'>{@link oajr.exception.Conflict}
-		<li class='jc'>{@link oajr.exception.ExpectationFailed}
-		<li class='jc'>{@link oajr.exception.FailedDependency}
-		<li class='jc'>{@link oajr.exception.Forbidden}
-		<li class='jc'>{@link oajr.exception.Gone}
-		<li class='jc'>{@link oajr.exception.HttpVersionNotSupported}
-		<li class='jc'>{@link oajr.exception.InsufficientStorage}
-		<li class='jc'>{@link oajr.exception.InternalServerError}
-		<li class='jc'>{@link oajr.exception.LengthRequired}
-		<li class='jc'>{@link oajr.exception.Locked}
-		<li class='jc'>{@link oajr.exception.LoopDetected}
-		<li class='jc'>{@link oajr.exception.MethodNotAllowed}
-		<li class='jc'>{@link oajr.exception.MisdirectedRequest}
-		<li class='jc'>{@link oajr.exception.NetworkAuthenticationRequired}
-		<li class='jc'>{@link oajr.exception.NotAcceptable}
-		<li class='jc'>{@link oajr.exception.NotExtended}
-		<li class='jc'>{@link oajr.exception.NotFound}
-		<li class='jc'>{@link oajr.exception.NotImplemented}
-		<li class='jc'>{@link oajr.exception.PayloadTooLarge}
-		<li class='jc'>{@link oajr.exception.PreconditionFailed}
-		<li class='jc'>{@link oajr.exception.PreconditionRequired}
-		<li class='jc'>{@link oajr.exception.RangeNotSatisfiable}
-		<li class='jc'>{@link oajr.exception.RequestHeaderFieldsTooLarge}
-		<li class='jc'>{@link oajr.exception.ServiceUnavailable}
-		<li class='jc'>{@link oajr.exception.TooManyRequests}
-		<li class='jc'>{@link oajr.exception.Unauthorized}
-		<li class='jc'>{@link oajr.exception.UnavailableForLegalReasons}
-		<li class='jc'>{@link oajr.exception.UnprocessableEntity}
-		<li class='jc'>{@link oajr.exception.UnsupportedMediaType}
-		<li class='jc'>{@link oajr.exception.UpgradeRequired}
-		<li class='jc'>{@link oajr.exception.UriTooLong}
-		<li class='jc'>{@link oajr.exception.VariantAlsoNegotiates}
+		<li class='jc'>{@link oaj.http.exception.BadRequest}
+		<li class='jc'>{@link oaj.http.exception.Conflict}
+		<li class='jc'>{@link oaj.http.exception.ExpectationFailed}
+		<li class='jc'>{@link oaj.http.exception.FailedDependency}
+		<li class='jc'>{@link oaj.http.exception.Forbidden}
+		<li class='jc'>{@link oaj.http.exception.Gone}
+		<li class='jc'>{@link oaj.http.exception.HttpVersionNotSupported}
+		<li class='jc'>{@link oaj.http.exception.InsufficientStorage}
+		<li class='jc'>{@link oaj.http.exception.InternalServerError}
+		<li class='jc'>{@link oaj.http.exception.LengthRequired}
+		<li class='jc'>{@link oaj.http.exception.Locked}
+		<li class='jc'>{@link oaj.http.exception.LoopDetected}
+		<li class='jc'>{@link oaj.http.exception.MethodNotAllowed}
+		<li class='jc'>{@link oaj.http.exception.MisdirectedRequest}
+		<li class='jc'>{@link oaj.http.exception.NetworkAuthenticationRequired}
+		<li class='jc'>{@link oaj.http.exception.NotAcceptable}
+		<li class='jc'>{@link oaj.http.exception.NotExtended}
+		<li class='jc'>{@link oaj.http.exception.NotFound}
+		<li class='jc'>{@link oaj.http.exception.NotImplemented}
+		<li class='jc'>{@link oaj.http.exception.PayloadTooLarge}
+		<li class='jc'>{@link oaj.http.exception.PreconditionFailed}
+		<li class='jc'>{@link oaj.http.exception.PreconditionRequired}
+		<li class='jc'>{@link oaj.http.exception.RangeNotSatisfiable}
+		<li class='jc'>{@link oaj.http.exception.RequestHeaderFieldsTooLarge}
+		<li class='jc'>{@link oaj.http.exception.ServiceUnavailable}
+		<li class='jc'>{@link oaj.http.exception.TooManyRequests}
+		<li class='jc'>{@link oaj.http.exception.Unauthorized}
+		<li class='jc'>{@link oaj.http.exception.UnavailableForLegalReasons}
+		<li class='jc'>{@link oaj.http.exception.UnprocessableEntity}
+		<li class='jc'>{@link oaj.http.exception.UnsupportedMediaType}
+		<li class='jc'>{@link oaj.http.exception.UpgradeRequired}
+		<li class='jc'>{@link oaj.http.exception.UriTooLong}
+		<li class='jc'>{@link oaj.http.exception.VariantAlsoNegotiates}
 	</ul>
 </ul>
 <p>
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/01.Body.html b/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/01.Body.html
index a74a95c..769e505 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/01.Body.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/01.Body.html
@@ -98,6 +98,8 @@
 			<li><c><jk>public static</jk> T <jsm>forString</jsm>(String in) {...}</c>
 		</ul>
 		Note that this also includes all enums.
+	<li>
+		Any {@link java.util.Optional} of anything on this list.
 </ol>
 <p>
 	The {@link oaj.oapi.OpenApiSerializer} class can be used to serialize HTTP bodies to OpenAPI-based output.
@@ -187,6 +189,18 @@
 		<br>Values on methods override values on POJO classes.
 </ul>
 
+<div class='warn'>
+	If using this annotation on a Spring bean, note that you are likely to encounter issues when using on parameterized
+	types such as <code>List&lt;MyBean&gt;</code>.  This is due to the fact that Spring uses CGLIB to recompile classes
+ 	at runtime, and CGLIB was written before generics were introduced into Java and is a virtually-unsupported library.
+ 	Therefore, parameterized types will often be stripped from class definitions and replaced with unparameterized types
+	(e.g. <code>List</code>).  Under these circumstances, you are likely to get <code>ClassCastExceptions</code>
+	when trying to access generalized <code>ObjectMaps</code> as beans.  The best solution to this issue is to either
+	specify the parameter as a bean array (e.g. <code>MyBean[]</code>) or declare the method as final so that CGLIB
+	will not try to recompile it.
+</div>
+
+
 <ul class='seealso'>
 	<li class='jc'>{@link oajr.RequestBody}
 	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/02.FormData.html b/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/02.FormData.html
index e8ff562..f9d72f2 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/02.FormData.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/02.FormData.html
@@ -176,6 +176,18 @@
 	<br>The {@link oaj.http.annotation.Query @Query} annotation can be used to retrieve a URL parameter in the URL string without triggering the
 	servlet to drain the body content.
 </div>
+
+<div class='warn'>
+	If using this annotation on a Spring bean, note that you are likely to encounter issues when using on parameterized
+	types such as <code>List&lt;MyBean&gt;</code>.  This is due to the fact that Spring uses CGLIB to recompile classes
+ 	at runtime, and CGLIB was written before generics were introduced into Java and is a virtually-unsupported library.
+ 	Therefore, parameterized types will often be stripped from class definitions and replaced with unparameterized types
+	(e.g. <code>List</code>).  Under these circumstances, you are likely to get <code>ClassCastExceptions</code>
+	when trying to access generalized <code>ObjectMaps</code> as beans.  The best solution to this issue is to either
+	specify the parameter as a bean array (e.g. <code>MyBean[]</code>) or declare the method as final so that CGLIB
+	will not try to recompile it.
+</div>
+
 <ul class='seealso'>
 	<li class='jc'>{@link oajr.RequestFormData}
 	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/09.Response.html b/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/09.Response.html
index 91a32d4..028156e 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/09.Response.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/10.HttpPartAnnotations/09.Response.html
@@ -83,7 +83,7 @@
 	}
 </p>
 <p>
-	Custom exceptions can also extend from one of the predefined HTTP exceptions such as the {@link oajr.exception.Unauthorized} exception:
+	Custom exceptions can also extend from one of the predefined HTTP exceptions such as the {@link oaj.http.exception.Unauthorized} exception:
 </p>
 <p class='bpcode w800'>
 	<jc>// Our annotated exception.</jc>
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/15.ConfigurableProperties.html b/juneau-doc/docs/Topics/07.juneau-rest-server/15.ConfigurableProperties.html
index c14d708..23e6f1a 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/15.ConfigurableProperties.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/15.ConfigurableProperties.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} Configurable Properties
+Configurable Properties
 
 <p>
 	As shown in previous sections, Juneau serializers and parsers are highly-configurable through properties.
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/16.ConfigurableAnnotations.html b/juneau-doc/docs/Topics/07.juneau-rest-server/16.ConfigurableAnnotations.html
index b0d8d59..42a271a 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/16.ConfigurableAnnotations.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/16.ConfigurableAnnotations.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} Configurable Annotations
+Configurable Annotations
 
 <p>
 	Config annotations allow you to define serializer and parser properties using specialized annotations.
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/17.Transforms.html b/juneau-doc/docs/Topics/07.juneau-rest-server/17.Transforms.html
index 1ddaa3a..d8270a3 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/17.Transforms.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/17.Transforms.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} Transforms
+Transforms
 
 <p>
 	The Juneau serializers and parsers can be configured on how to handle POJOs through the use of Transforms.
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/20.RoleGuards.html b/juneau-doc/docs/Topics/07.juneau-rest-server/20.RoleGuards.html
index af7c85f..7649fc6 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/20.RoleGuards.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/20.RoleGuards.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} Role guards
+Role guards
  
 <p>
 	Specialized guards are provided for controlling access to servlet classes and methods based on user roles.
@@ -41,7 +41,7 @@
 	// can run any methods on this class.</jc>
 	<ja>@RestResource</ja>(
 		path=<js>"/foo"</js>,
-		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>
+		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>
 	)
 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {
 		...
@@ -56,8 +56,8 @@
 	<li><js>"foo | bar | baz"</js> - Multiple OR'ed arguments, pipe syntax.
 	<li><js>"foo || bar || baz"</js> - Multiple OR'ed arguments, Java-OR syntax.
 	<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.
-	<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
-	<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
+	<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
+	<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
 	<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.
 </ul>
 
@@ -71,7 +71,7 @@
 <p class='bpcode w800'>
 	<ja>@RestResource</ja>(
 		rolesDeclared=<js>"ROLE_ADMIN,ROLE_READ_WRITE,ROLE_READ_ONLY,ROLE_SPECIAL"</js>,
-		roleGuard=<js>"ROLE_ADMIN || (*WRITE* && *SPECIAL*)"</js>
+		roleGuard=<js>"ROLE_ADMIN || (*WRITE* &amp;&amp; *SPECIAL*)"</js>
 	)
 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {
 		...
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/29.Swagger/01.BasicRestServlet.html b/juneau-doc/docs/Topics/07.juneau-rest-server/29.Swagger/01.BasicRestServlet.html
index c8bc344..66c1551 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/29.Swagger/01.BasicRestServlet.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/29.Swagger/01.BasicRestServlet.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} BasicRestServlet
+BasicRestServlet
 
 <p>
 	Any subclass of {@link oajr.BasicRestServlet} gets an auto-generated Swagger UI when performing an <c>OPTIONS</c>
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/29.Swagger/06.ParameterExamples.html b/juneau-doc/docs/Topics/07.juneau-rest-server/29.Swagger/06.ParameterExamples.html
index 6699b6a..15dab92 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/29.Swagger/06.ParameterExamples.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/29.Swagger/06.ParameterExamples.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} Parameter Examples
+Parameter Examples
 
 <p>
 	The <c>model</c> select box in the parameters can be expanded to show examples:
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/30.HtmlDocAnnotation.html b/juneau-doc/docs/Topics/07.juneau-rest-server/30.HtmlDocAnnotation.html
index 885e420..1b161a2 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/30.HtmlDocAnnotation.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/30.HtmlDocAnnotation.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} @HtmlDocConfig
+@HtmlDocConfig
 
 <p>
 	The {@link oaj.html.annotation.HtmlDocConfig @HtmlDocConfig} annotation is used to customize the HTML 
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/30.HtmlDocAnnotation/05.Stylesheets.html b/juneau-doc/docs/Topics/07.juneau-rest-server/30.HtmlDocAnnotation/05.Stylesheets.html
index ec660f7..d4191fd 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/30.HtmlDocAnnotation/05.Stylesheets.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/30.HtmlDocAnnotation/05.Stylesheets.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} Stylesheets
+Stylesheets
 
 <p>
 	The sample root page renders in the default "devops" look-and-feel:
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/32.LoggingAndDebugging.html b/juneau-doc/docs/Topics/07.juneau-rest-server/32.LoggingAndDebugging.html
index 66b2d22..cee956d 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/32.LoggingAndDebugging.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/32.LoggingAndDebugging.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} Logging / Debugging
+Logging / Debugging
 
 <p>
 	The REST APIs provides support for fine-tuned control of logging for HTTP requests and responses.
diff --git a/juneau-doc/docs/Topics/07.juneau-rest-server/32.LoggingAndErrorHandling/01.LOG4J.html b/juneau-doc/docs/Topics/07.juneau-rest-server/32.LoggingAndErrorHandling/01.LOG4J.html
index 2321677..774f0e4 100644
--- a/juneau-doc/docs/Topics/07.juneau-rest-server/32.LoggingAndErrorHandling/01.LOG4J.html
+++ b/juneau-doc/docs/Topics/07.juneau-rest-server/32.LoggingAndErrorHandling/01.LOG4J.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} Using LOG4J for logging
+Using LOG4J for logging
 
 <p>
 	The REST API uses Java logging by default.  If you wish to use LOG4J logging, you simple need to add the following
diff --git a/juneau-doc/docs/Topics/09.juneau-rest-server-springboot/02.ChildResources.html b/juneau-doc/docs/Topics/09.juneau-rest-server-springboot/02.ChildResources.html
index 44f3975..2e94798 100644
--- a/juneau-doc/docs/Topics/09.juneau-rest-server-springboot/02.ChildResources.html
+++ b/juneau-doc/docs/Topics/09.juneau-rest-server-springboot/02.ChildResources.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} Child Resources
+Child Resources
 
 <p>
 	When using the <ja>@JuneauRestRoot</ja> annotation, servlet are given an instance of {@link oajr.springboot.SpringRestResourceResolver}.  
diff --git a/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies.html b/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies.html
index 96557f9..2662865 100644
--- a/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies.html
+++ b/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies.html
@@ -36,10 +36,10 @@
 	post parameters, or request/response bodies.
 </p>
 <ul class='javatree'>
-	<li class='jp'>{@link oajrc.remote}
+	<li class='jp'>{@link oaj.http.remote}
 	<ul>
-		<li class='ja'>{@link oajrc.remote.RemoteResource}
-		<li class='ja'>{@link oajrc.remote.RemoteMethod}
+		<li class='ja'>{@link oaj.http.remote.RemoteResource}
+		<li class='ja'>{@link oaj.http.remote.RemoteMethod}
 	</ul>
 	<li class='jp'>{@link oaj.http.annotation}
 	<ul>
diff --git a/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies/01.RemoteResource.html b/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies/01.RemoteResource.html
index 85c82e1..8be5ba7 100644
--- a/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies/01.RemoteResource.html
+++ b/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies/01.RemoteResource.html
@@ -16,13 +16,13 @@
 @RemoteResource
 
 <p>
-	The {@link oajrc.remote.RemoteResource @RemoteResource} annotation is used on your interface class
+	The {@link oaj.http.remote.RemoteResource @RemoteResource} annotation is used on your interface class
 	to identify it as a REST proxy interface.
 </p>
 <ul class='javatree'>
-	<li class='ja'>{@link oajrc.remote.RemoteResource}
+	<li class='ja'>{@link oaj.http.remote.RemoteResource}
 	<ul>
-		<li class='jf'>{@link oajrc.remote.RemoteResource#path path}
+		<li class='jf'>{@link oaj.http.remote.RemoteResource#path path}
 	</ul>
 </ul>
 <p>
@@ -31,7 +31,7 @@
 
 <h5 class='topic'>@RemoteResource(path)</h5>
 <p>
-	The {@link oajrc.remote.RemoteResource#path @RemoteResource(path)} annotation is used to define the
+	The {@link oaj.http.remote.RemoteResource#path @RemoteResource(path)} annotation is used to define the
 	HTTP path of the REST service.
 </p>
 <p>
diff --git a/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies/02.RemoteMethod.html b/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies/02.RemoteMethod.html
index 67978a3..74aa0a3 100644
--- a/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies/02.RemoteMethod.html
+++ b/juneau-doc/docs/Topics/10.juneau-rest-client/01.RestProxies/02.RemoteMethod.html
@@ -16,15 +16,15 @@
 @RemoteMethod
 
 <p>
-	The {@link oajrc.remote.RemoteMethod @RemoteMethod} annotation is applied to methods
+	The {@link oaj.http.remote.RemoteMethod @RemoteMethod} annotation is applied to methods
 	of <ja>@RemoteResource</ja>-annotated interfaces to identify REST endpoints.
 </p>
 <ul class='javatree'>
-	<li class='ja'>{@link oajrc.remote.RemoteMethod}
+	<li class='ja'>{@link oaj.http.remote.RemoteMethod}
 	<ul>
-		<li class='jf'>{@link oajrc.remote.RemoteMethod#method method}
-		<li class='jf'>{@link oajrc.remote.RemoteMethod#path path}
-		<li class='jf'>{@link oajrc.remote.RemoteMethod#returns returns}
+		<li class='jf'>{@link oaj.http.remote.RemoteMethod#method method}
+		<li class='jf'>{@link oaj.http.remote.RemoteMethod#path path}
+		<li class='jf'>{@link oaj.http.remote.RemoteMethod#returns returns}
 	</ul>
 </ul>
 <h5 class='topic'>@RemoteMethod(method/path)</h5>
@@ -146,8 +146,8 @@
 </ul>
 
 <p>
-	If you're only interested in the HTTP status code of the response, you can use the {@link oajrc.remote.RemoteMethod#returns() returns}
-	annotation with a value of {@link oajrc.remote.RemoteReturn#STATUS STATUS}:
+	If you're only interested in the HTTP status code of the response, you can use the {@link oaj.http.remote.RemoteMethod#returns() returns}
+	annotation with a value of {@link oaj.http.remote.RemoteReturn#STATUS STATUS}:
 </p>
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>	
diff --git a/juneau-doc/docs/Topics/11.juneau-rest-mock.html b/juneau-doc/docs/Topics/11.juneau-rest-mock.html
index b6a3314..c190573 100644
--- a/juneau-doc/docs/Topics/11.juneau-rest-mock.html
+++ b/juneau-doc/docs/Topics/11.juneau-rest-mock.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} juneau-rest-mock
+juneau-rest-mock
 
 <h5 class='figure'>Maven Dependency</h5>
 <p class='bpcode w500'>
@@ -48,7 +48,7 @@
 	<li class='jp'>{@link oajr.mock2}
 	<ul>
 		<li class='jc'>{@link oajr.mock2.MockRest} - API for unit testing {@link oajr.annotation.RestResource @RestResource}-annotated classes.
-		<li class='jc'>{@link oajr.mock2.MockRemoteResource} - API for unit testing {@link oajrc.remote.RemoteResource @RemoteResource}-annotated classes.
+		<li class='jc'>{@link oajr.mock2.MockRemoteResource} - API for unit testing {@link oaj.http.remote.RemoteResource @RemoteResource}-annotated classes.
 	</ul>
 </ul>
 
diff --git a/juneau-doc/docs/Topics/11.juneau-rest-mock/01.MockRest.html b/juneau-doc/docs/Topics/11.juneau-rest-mock/01.MockRest.html
index bcbc947..d8fff01 100644
--- a/juneau-doc/docs/Topics/11.juneau-rest-mock/01.MockRest.html
+++ b/juneau-doc/docs/Topics/11.juneau-rest-mock/01.MockRest.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{new} MockRest
+MockRest
 
 <p>
 	The {@link oajr.mock2.MockRest} class is used for performing serverless unit testing of {@link oajr.annotation.RestResource @RestResource}-annotated
diff --git a/juneau-doc/docs/Topics/11.juneau-rest-mock/02.MockRemoteResource.html b/juneau-doc/docs/Topics/11.juneau-rest-mock/02.MockRemoteResource.html
index 26bac40..8807116 100644
--- a/juneau-doc/docs/Topics/11.juneau-rest-mock/02.MockRemoteResource.html
+++ b/juneau-doc/docs/Topics/11.juneau-rest-mock/02.MockRemoteResource.html
@@ -13,10 +13,10 @@
  ***************************************************************************************************************************/
  -->
 
-{new} MockRemoteResource
+MockRemoteResource
 
 <p>
-	The {@link oajr.mock2.MockRemoteResource} class is used for serverless unit testing of {@link oajrc.remote.RemoteResource @RemoteResource}-annotated
+	The {@link oajr.mock2.MockRemoteResource} class is used for serverless unit testing of {@link oaj.http.remote.RemoteResource @RemoteResource}-annotated
 	classes.  
 </p>
 <p>
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/01.RootResources.html b/juneau-doc/docs/Topics/17.juneau-examples-rest/01.RootResources.html
index bb0bdef..694fe3e 100644
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/01.RootResources.html
+++ b/juneau-doc/docs/Topics/17.juneau-examples-rest/01.RootResources.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} RootResources
+RootResources
 
 <p>
 	The <l>RootResources</l> class is the main page for the REST microservice.
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/04.DtoExamples.html b/juneau-doc/docs/Topics/17.juneau-examples-rest/03.DtoExamples.html
similarity index 99%
rename from juneau-doc/docs/Topics/17.juneau-examples-rest/04.DtoExamples.html
rename to juneau-doc/docs/Topics/17.juneau-examples-rest/03.DtoExamples.html
index 110b0e7..66e70ac 100644
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/04.DtoExamples.html
+++ b/juneau-doc/docs/Topics/17.juneau-examples-rest/03.DtoExamples.html
@@ -13,7 +13,7 @@
  ***************************************************************************************************************************/
  -->
 
-{updated} DtoExamples
+DtoExamples
 
 <p>
 	The <l>DtoExamples</l> resource is a resource group for demonstrating various DTO examples.
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/03.PetStoreResource.html b/juneau-doc/docs/Topics/17.juneau-examples-rest/03.PetStoreResource.html
deleted file mode 100644
index c30f263..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/03.PetStoreResource.html
+++ /dev/null
@@ -1,1382 +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.
- ***************************************************************************************************************************/
- -->
-
-PetStore
-
-<p>
-	The <c>PetStore</c> application is an functional application meant to demonstrate the following:
-</p>
-<ul class='spaced-list'>
-	<li>
-		Creating a Juneau-based REST interface on top of JPA beans.
-	<li>
-		Creating sophisticated Swagger UI using only annotations.
-</ul>
-<p>
-	When you click the <l>petstore</l> link on the home page of the examples app, you should see this page:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.1.png'>
-
-<p>
-	The contents of this page is primarily defined via annotations defined on the <l>PetStoreResource</l> class:
-</p>
-
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		path=<js><js>"/petstore"</js></js>,
-		title=<js><js>"Petstore application"</js></js>,
-		description= {
-			<js><js>"This is a sample server Petstore server based on the Petstore sample at Swagger.io."</js></js>,
-			<js>"You can find out more about Swagger at &lt;a class='link' href='http://swagger.io'&gt;http://swagger.io&lt;/a&gt;."</js>,
-		},
-		htmldoc=<ja>@HtmlDoc</ja>(
-			widgets={
-				ContentTypeMenuItem.<jk>class</jk>,
-				ThemeMenuItem.<jk>class</jk>,
-			},
-			navlinks={
-				<js>"up: request:/.."</js>,
-				<js>"options: servlet:/?method=OPTIONS"</js>,
-				<js>"$W{ContentTypeMenuItem}"</js>,
-				<js>"$W{ThemeMenuItem}"</js>,
-				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/petstore/$R{servletClassSimple}.java"</js>
-			},
-			head={
-				<js>"&lt;link rel='icon' href='$U{servlet:/htdocs/cat.png}'/&gt;"</js>  <jc>// Add a cat icon to the page.</jc>
-			},
-			header={
-				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,
-				<js>"&lt;h2&gt;$R{methodSummary}&lt;/h2&gt;"</js>,
-				<js>"$C{PetStore/headerImage}"</js>
-			},
-			aside={
-				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
-				<js>"	&lt;p&gt;This page shows a standard nested REST resource.&lt;/p&gt;"</js>,
-				<js>"	&lt;p&gt;It shows how different properties can be rendered on the same bean in different views.&lt;/p&gt;"</js>,
-				<js>"	&lt;p&gt;It also shows examples of HtmlRender classes and @BeanProperty(format) annotations.&lt;/p&gt;"</js>,
-				<js>"	&lt;p&gt;It also shows how the Queryable converter and query widget can be used to create searchable interfaces.&lt;/p&gt;"</js>,
-				<js>"&lt;/div&gt;"</js>
-			},
-			stylesheet=<js>"servlet:/htdocs/themes/dark.css"</js>  <jc>// Use dark theme by default.</jc>
-		),
-		...
-		staticFiles={<js>"htdocs:htdocs"</js>},  <jc>// Expose static files in htdocs subpackage.</jc>  
-		children={
-			SqlQueryResource.<jk>class</jk>,
-			PhotosResource.<jk>class</jk>
-		}
-	)
-	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena {
-</p>
-<p>
-	The inner contents of the page are generated from this method which is used to define a jumping-off
-	page for the application:
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		name=<jsf>GET</jsf>,
-		path=<js>"/"</js>,
-		summary=<js>"Navigation page"</js>,
-		htmldoc=<ja>@HtmlDoc</ja>(
-			style={
-				<js>"INHERIT"</js>,  <jc>// Flag for inheriting resource-level CSS.</jc>
-				<js>"body { "</js>,
-					<js>"background-image: url('petstore/htdocs/background.jpg'); "</js>,
-					<js>"background-color: black; "</js>,
-					<js>"background-size: cover; "</js>,
-					<js>"background-attachment: fixed; "</js>,
-				<js>"}"</js>
-			}
-		)
-	)
-	<jk>public</jk> ResourceDescriptions getTopPage() {
-		<jk>return new</jk> ResourceDescriptions()
-			.append(<js>"pet"</js>, <js>"All pets in the store"</js>)
-			.append(<js>"store"</js>, <js>"Orders and inventory"</js>)
-			.append(<js>"user"</js>, <js>"Petstore users"</js>)
-			.append(<js>"photos"</js>, <js>"Photos service"</js>)
-			.append(<js>"sql"</js>, <js>"SQL query service"</js>)
-		;
-	}
-</p>
-<p>
-	Note how we used the <ja>@HtmlDoc</ja> annotation to add some CSS to our page
-	that renders our background image.  
-</p>
-<p>
-	The {@link oajr.helper.ResourceDescriptions} class used above is a convenience class for creating
-	hyperlinks to child resources. 
-</p>
-<hr>
-<p>
-	The application itself is defined in 3 packages:
-</p>
-<ul class='javatree'>
-	<li class='jp'><c>org.apache.juneau.rest.examples.rest.petstore</c>
-		<br>Defines the service for storing and retrieving Petstore data.
-		<br><img class='bordered' style='width:250px' src='doc-files/juneau-examples-rest.PetStoreResource.2a.png'>
-	<li class='jp'><c>org.apache.juneau.rest.examples.rest.petstore.dto</c>
-		<br>Data transfer objects.
-		<br>These are JPA beans that are used both to store data in our database and are serialized
-		directly by our REST interface.
-		<br><img class='bordered' style='width:250px' src='doc-files/juneau-examples-rest.PetStoreResource.2b.png'>
-	<li class='jp'><c>org.apache.juneau.rest.examples.rest.petstore.rest</c>
-		<br>The classes used for our REST interface.
-		<br><img class='bordered' style='width:250px' src='doc-files/juneau-examples-rest.PetStoreResource.2c.png'>
-</ul>
-<p>
-	We also define some static files in the <c>org.apache.juneau.rest.examples.rest.petstore</c> package:
-</p>
-<img class='bordered' style='width:250px' src='doc-files/juneau-examples-rest.PetStoreResource.2d.png'>
-<hr>
-<p>
-	The <l>PetStoreService</l> class is a pretty-straightforward service for storing and retrieving JPA beans:
-</p>
-<h5 class='figure'>PetStoreService.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> PetStoreService <jk>extends</jk> AbstractPersistenceService {
-	
-		<jk>public</jk> Pet getPet(<jk>long</jk> id) <jk>throws</jk> IdNotFound {
-			<jk>return</jk> find(Pet.<jk>class</jk>, id);
-		}
-	
-		<jk>public</jk> List&lt;Pet&gt; getPets() {
-			<jk>return</jk> query(<js>"select X from PetstorePet X"</js>, Pet.<jk>class</jk>, (SearchArgs)<jk>null</jk>);
-		}
-	
-		<jk>public</jk> Pet create(CreatePet c) {
-			<jk>return</jk> merge(new Pet().status(PetStatus.<jsf>AVAILABLE</jsf>).apply(c));
-		}
-	
-		<jk>public</jk> Pet update(UpdatePet u) <jk>throws</jk> IdNotFound {
-			EntityManager em = getEntityManager();
-			<jk>return</jk> merge(em, find(em, Pet.<jk>class</jk>, u.getId()).apply(u));
-		}
-	
-		<jk>public void</jk> removePet(<jk>long</jk> id) <jk>throws</jk> IdNotFound {
-			EntityManager em = getEntityManager();
-			remove(em, find(em, Pet.<jk>class</jk>, id));
-		}
-	
-		...
-	}
-</p>
-<p>
-	The DTOs are simply beans that combine both JPA and Juneau bean annotations:
-</p>
-<h5 class='figure'>Pet.java</h5>
-<p class='bpcode w800'>
-	<ja>@Bean</ja>(typeName=<js>"Pet"</js>, fluentSetters=<jk>true</jk>, properties=<js>"id,species,name,tags,price,status,photo"</js>)
-	<ja>@Entity</ja>(name=<js>"PetstorePet"</js>)
-	<jk>public class</jk> Pet {
-	
-		<ja>@Column @Id @GeneratedValue</ja>
-		<ja>@Schema</ja>(description=<js>"Unique identifier for this pet."</js>)
-		<ja>@Html</ja>(link=<js>"servlet:/pet/{id}"</js>)
-		<jk>private long</jk> <jf>id</jf>;
-	
-		<ja>@Column</ja>(length=50)
-		<ja>@Schema</ja>(description=<js>"Pet name."</js>, minLength=3, maxLength=50)
-		<jk>private</jk> String <jf>name</jf>;
-		
-		...
-	
-		<jk>public long</jk> getId() {
-			<jk>return</jk> <jf>id</jf>;
-		}
-	
-		<jk>public</jk> Pet id(<jk>long</jk> id) {
-			<jk>this</jk>.<jf>id</jf> = id;
-			<jk>return this</jk>;
-		}
-	
-		<jk>public</jk> String getName() {
-			<jk>return</jk> <jf>name</jf>;
-		}
-	
-		<jk>public</jk> Pet name(String name) {
-			<jk>this</jk>.<jf>name</jf> = name;
-			<jk>return this</jk>;
-		}
-		
-		...
-	}
-</p>
-<p>
-	The beans are found by JPA by adding them to the JPA persistence file. 
-</p>
-<h5 class='figure'>META-INF/persistence.xml</h5>
-<p class='bpcode w800'>
-	<xt>&lt;persistence&gt;</xt>
-		<xt>&lt;persistence-unit</xt> <xa>name</xa>=<xs>"test"</xs> <xa>transaction-type</xa>=<xs>"RESOURCE_LOCAL"</xs>&gt;</xt>
-			<xt>&lt;class&gt;</xt>org.apache.juneau.examples.rest.petstore.dto.Pet<xt>&lt;/class&gt;</xt>
-			<xt>&lt;class&gt;</xt>org.apache.juneau.examples.rest.petstore.dto.Order<xt>&lt;/class&gt;</xt>
-			<xt>&lt;class&gt;</xt>org.apache.juneau.examples.rest.petstore.dto.User<xt>&lt;/class&gt;</xt>
-			<xt>&lt;properties&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"javax.persistence.jdbc.driver"</xs> <xa>value</xa>=<xs>"org.apache.derby.jdbc.EmbeddedDriver"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"javax.persistence.jdbc.url"</xs> <xa>value</xa>=<xs>"jdbc:derby:target/derby/testDB;create=true"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"javax.persistence.jdbc.user"</xs> <xa>value</xa>=<xs>""</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"javax.persistence.jdbc.password"</xs> <xa>value</xa>=<xs>""</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"hibernate.dialect"</xs> <xa>value</xa>=<xs>"org.hibernate.dialect.DerbyDialect"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"hibernate.hbm2ddl.auto"</xs> <xa>value</xa>=<xs>"create-drop"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"show_sql"</xs> <xa>value</xa>=<xs>"true"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"hibernate.temp.use_jdbc_metadata_defaults"</xs> <xa>value</xa>=<xs>"false"</xs> <xt>/&gt;</xt>
-			<xt>&lt;/properties&gt;</xt>
-		<xt>&lt;/persistence-unit&gt;</xt>
-	<xt>&lt;/persistence&gt;</xt>
-</p>
-<p>
-	The Petstore service is instantiated in our REST interface using a hook.
-	Note that a real-world scenario would likely use some other means such as injection.
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena <jk>implements</jk> PetStore {
-	
-		<jk>private</jk> PetStoreService <jf>store</jf>;
-	
-		<ja>@RestHook</ja>(<jsf>INIT</jsf>)
-		<jk>public void</jk> startup(RestContextBuilder builder) <jk>throws</jk> Exception {
-			<jf>store</jf> = <jk>new</jk> PetStoreService();
-		}
-		
-		...
-</p>
-<hr>
-<p>
-	The Petstore database is empty by default.
-	The <l>INIT</l> link brings you to a page to initialize the contents of the database
-	from sample data:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/init
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.3a.png'>
-<p>
-	You can try loading the Petstore database using direct JPA or via REST calls through a client-side proxy.
-</p>
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.3b.png'>
-<p>
-	The initialize page is rendered using the following methods in our <l>PetStoreResource</l> class.
-	Note that we're using HTML5 beans to render the contents of the page, and 
-	the use of a direct unbuffered writer allowing for the creation
-	of a console-like window in an iframe.
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		summary=<js>"Initialize database form entry page"</js>
-	)
-	<jk>public</jk> Div getInit() {
-		<jk>return</jk> <jsm>div</jsm>(
-			<jsm>form</jsm>(<js>"servlet:/init"</js>).method(<jsf>POST</jsf>).target(<js>"buf"</js>).children(
-				<jsm>table</jsm>(
-					<jsm>tr</jsm>(
-						<jsm>th</jsm>(<js>"Initialize petstore database:"</js>),
-						<jsm>td</jsm>(<jsm>input</jsm>(<js>"radio"</js>).name(<js>"init-method"</js>).value(<js>"direct"</js>).checked(<jk>true</jk>), <js>"direct"</js>, <jsm>input</jsm>(<js>"radio"</js>).name(<js>"init-method"</js>).value(<js>"rest"</js>), <js>"rest"</js>),
-						<jsm>td</jsm>(<jsm>button</jsm>(<js>"submit"</js>, <js>"Submit"</js>).style(<js>"float:right"</js>).onclick(<js>"scrolling=true"</js>))
-					)
-				)
-			),
-			<jsm>br</jsm>(),
-			<jsm>iframe</jsm>().id(<js>"buf"</js>).name(<js>"buf"</js>).style(<js>"width:800px;height:600px;"</js>).onload(<js>"window.parent.scrolling=false;"</js>),
-			<jsm>script</jsm>(<js>"text/javascript"</js>,
-				<js>"var scrolling = false;"</js>,
-				<js>"function scroll() { if (scrolling) { document.getElementById('buf').contentWindow.scrollBy(0,50); } setTimeout('scroll()',200); } "</js>,
-				<js>"scroll();"</js>
-			)
-		);
-	}
-
-	<ja>@RestMethod</ja>(
-		summary=<js>"Initialize database"</js>
-	)
-	<jk>public void</jk> postInit(
-		<ja>@FormData</ja>(<js>"init-method"</js>) String initMethod,
-		RestResponse res
-	) <jk>throws</jk> Exception {
-		res.setHeader(<js>"Content-Encoding"</js>, <js>"identity"</js>);
-		<jk>if</jk> (<js>"direct"</js>.equals(initMethod))
-			<jf>store</jf>.initDirect(res.getDirectWriter(<js>"text/plain"</js>));
-		<jk>else</jk>
-			<jf>store</jf>.initViaRest(res.getDirectWriter(<js>"text/plain"</js>));
-	}
-</p>
-<p>
-	The direct initialization uses direct JPA to store beans in the database.
-	The following code in <l>PetStoreService</l> reads and parses DTOs from our init JSON files (e.g. <js>"init/Pets.json"</js>)
-	and stores them using the JPA <l>EntityManager</l> class.
-</p>
-<h5 class='figure'>PetStoreService.java</h5>
-<p class='bpcode w800'>
-	<jk>public</jk> PetStoreService initDirect(PrintWriter w) <jk>throws</jk> Exception {
-
-		EntityManager em = getEntityManager();
-		EntityTransaction et = em.getTransaction();
-		JsonParser parser = JsonParser.<jsm>create</jsm>().build();
-
-		et.begin();
-
-		<jk>for</jk> (Pet x : em.createQuery(<js>"select X from PetstorePet X"</js>, Pet.<jk>class</jk>).getResultList()) {
-			em.remove(x);
-			w.println(<jsm>format</jsm>(<js>"Deleted pet:  id={0}"</js>, x.getId()));
-		}
-		...
-
-		et.commit();
-		et.begin();
-
-		<jk>for</jk> (Pet x : parser.parse(getStream(<js>"init/Pets.json"</js>), Pet[].<jk>class</jk>)) {
-			x = em.merge(x);
-			w.println(<jsm>format</jsm>(<js>"Created pet:  id={0}, name={1}"</js>, x.getId(), x.getName()));
-		}
-		...
-
-		et.commit();
-
-		<jk>return this</jk>;
-	}
-
-	<jk>private</jk> InputStream getStream(String fileName) {
-		<jk>return</jk> getClass().getResourceAsStream(fileName);
-	}
-</p>
-<p>
-	The REST initialization uses a REST proxy interface to delete and store values in the database:
-	
-</p>
-<h5 class='figure'>PetStoreService.java</h5>
-<p class='bpcode w800'>
-	<jk>public</jk> PetStoreService initViaRest(PrintWriter w) <jk>throws</jk> Exception {
-		JsonParser parser = JsonParser.<jsm>create</jsm>().ignoreUnknownBeanProperties().build();
-
-		<jk>try</jk> (RestClient rc = RestClient.<jsm>create</jsm>().json().rootUrl(<js>"http://localhost:10000"</js>).build()) {
-			PetStore ps = rc.getRemoteResource(PetStore.<jk>class</jk>);
-
-			<jk>for</jk> (Pet x : ps.getPets()) {
-				ps.deletePet(<js>"apiKey"</js>, x.getId());
-				w.println(<jsm>format</jsm>(<js>"Deleted pet:  id={0}"</js>, x.getId()));
-			}
-			...
-			<jk>for</jk> (CreatePet x : parser.parse(getStream(<js>"init/Pets.json"</js>), CreatePet[].<jk>class</jk>)) {
-				<jk>long</jk> id = ps.postPet(x);
-				w.println(<jsm>format</jsm>(<js>"Created pet:  id={0}, name={1}"</js>, id, x.getName()));
-			}
-			...
-		}
-
-		<jk>return this</jk>;
-	}
-</p>
-<p>
-	The <l>PetStore</l> class is an interface annotated with <ja>@RemoteResource</ja> and <ja>@RemoteMethod</ja>
-	annotations defining how to communicate with our REST interface: 
-</p>
-<h5 class='figure'>PetStore.java</h5>
-<p class='bpcode w800'>
-	<ja>@RemoteResource</ja>(path=<js>"/petstore"</js>)
-	<jk>public interface</jk> PetStore {
-	
-		<ja>@RemoteMethod</ja>(method=<jsf>GET</jsf>, path=<js>"/pet"</js>)
-		<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable;
-	
-		<ja>@RemoteMethod</ja>(path=<js>"/pet/{petId}"</js>) <jc>/* method inferred from method name */</jc>
-		<jk>public</jk> Pet getPet(
-			<ja>@Path</ja>(
-				name=<js>"petId"</js>,
-				description=<js>"ID of pet to return"</js>,
-				example=<js>"123"</js>
-			)
-			<jk>long</jk> petId
-		) <jk>throws</jk> IdNotFound, NotAcceptable;
-	
-		<ja>@RemoteMethod</ja> <jc>/* method and path inferred from method name */</jc>
-		<jk>public long</jk> postPet(
-			<ja>@Body</ja>(
-				description=<js>"Pet object to add to the store"</js>
-			) CreatePet pet
-		) <jk>throws</jk> IdConflict, NotAcceptable, UnsupportedMediaType;
-	
-		<ja>@RemoteMethod</ja>(method=<jsf>PUT</jsf>, path=<js>"/pet/{petId}"</js>)
-		<jk>public</jk> Ok updatePet(
-			<ja>@Body</ja>(
-				description=<js>"Pet object that needs to be added to the store"</js>
-			) UpdatePet pet
-		) <jk>throws</jk> IdNotFound, NotAcceptable, UnsupportedMediaType;
-	
-		<ja>@RemoteMethod</ja>(method=<jsf>DELETE</jsf>, path=<js>"/pet/{petId}"</js>)
-		<jk>public</jk> Ok deletePet(
-			<ja>@Header</ja>(
-				name=<js>"api_key"</js>,
-				description=<js>"Security API key"</js>,
-				required=<jk>true</jk>,
-				example=<js>"foobar"</js>
-			)
-			String apiKey,
-			<ja>@Path</ja>(
-				name=<js>"petId"</js>,
-				description=<js>"Pet id to delete"</js>,
-				example=<js>"123"</js>
-			)
-			<jk>long</jk> petId
-		) <jk>throws</jk> IdNotFound, NotAcceptable;
-		
-		...
-	}
-</p>
-<p>
-	Note that this is the same interface used to define our server-side REST implementation!
-	The annotations defined on the method parameters used for client-side proxies are also
-	inherited by and used for our server-side implementation class.
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena <jk>implements</jk> PetStore {
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			name=<jsf>GET</jsf>,
-			path=<js>"/pet"</js>,
-			summary=<js>"All pets in the store"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				parameters={
-					Queryable.<jsf>SWAGGER_PARAMS</jsf>
-				}
-			),
-			bpx=<js>"Pet: tags,photo"</js>,
-			htmldoc=<ja>@HtmlDoc</ja>(
-				widgets={
-					QueryMenuItem.<jk>class</jk>,
-					AddPetMenuItem.<jk>class</jk>
-				},
-				navlinks={
-					<js>"INHERIT"</js>,                <jc>// Inherit links from class.</jc>
-					<js>"[2]:$W{QueryMenuItem}"</js>,  <jc>// Insert QUERY link in position 2.</jc>
-					<js>"[3]:$W{AddPetMenuItem}"</js>  <jc>// Insert ADD link in position 3.</jc>
-				}
-			),
-			converters={Queryable.<jk>class</jk>}
-		)
-		<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
-			<jk>return</jk> <jf>store</jf>.getPets();
-		}
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			name=<jsf>GET</jsf>,
-			path=<js>"/pet/{petId}"</js>,
-			summary=<js>"Find pet by ID"</js>,
-			description=<js>"Returns a single pet"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				value={
-					<js>"security:[ { api_key:[] } ]"</js>
-				}
-			)
-		)
-		<jk>public</jk> Pet getPet(<jk>long</jk> petId) <jk>throws</jk> IdNotFound, NotAcceptable {
-			<jk>return</jk> <jf>store</jf>.getPet(petId);
-		}
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			summary=<js>"Add a new pet to the store"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				value={
-					<js>"security:[ { petstore_auth:['write:pets','read:pets'] } ]"</js>
-				}
-			)
-		)
-		<jk>public long</jk> postPet(CreatePet pet) <jk>throws</jk> IdConflict, NotAcceptable, UnsupportedMediaType {
-			<jk>return</jk> <jf>store</jf>.create(pet).getId();
-		}
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			name=<jsf>PUT</jsf>,
-			path=<js>"/pet/{petId}"</js>,
-			summary=<js>"Update an existing pet"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				value={
-					<js>"security:[ { petstore_auth: ['write:pets','read:pets'] } ]"</js>
-				}
-			)
-		)
-		<jk>public</jk> Ok updatePet(UpdatePet pet) <jk>throws</jk> IdNotFound, NotAcceptable, UnsupportedMediaType {
-			<jf>store</jf>.update(pet);
-			<jk>return</jk> <jsf>OK</jsf>;
-		}
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			name=<jsf>DELETE</jsf>,
-			path=<js>"/pet/{petId}"</js>,
-			summary=<js>"Deletes a pet"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				value={
-					<js>"security:[ { petstore_auth:[ 'write:pets','read:pets' ] } ]"</js>
-				}
-			)
-		)
-		<jk>public</jk> Ok deletePet(String apiKey, <jk>long</jk> petId) <jk>throws</jk> IdNotFound, NotAcceptable {
-			<jf>store</jf>.removePet(petId);
-			<jk>return</jk> <jsf>OK</jsf>;
-		}
-		...
-	}
-</p>
-<p>
-	The advantage to using a common interface for both your server-side and client-side APIs is that you
-	have less of a chance of a mismatch between the server and client side definitions.
-</p>
-<hr>
-<p>	
-	Now that we've initialized the contents of our database, we can start exploring the REST interface.
-	We can start by click the <l>pet</l> link on the home page which takes you to a summary page of <l>Pet</l>
-	objects:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.4a.png'>
-
-<p>
-	Clicking on one of the ID links takes you to a details page:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet/1
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.4b.png'>
-<p>
-	You'll notice the details page shows <l>tags</l> and <l>photo</l> fields not shown on the summary page.
-	This was accomplished with the <c>bpx=<js>"Pet: tags,photo"</js></c> annotation on the <l>getPets()</l>
-	method which excludes those two properties from the view. 
-	This is a common way of defining summary and details views for POJOs.
-</p>
-<p>
-	The hyperlinks and special rendering for <l>Pet</l> objects is done through <ja>@Html</ja> annotations
-	and {@link oaj.html.HtmlRender} objects.
-</p>
-<h5 class='figure'>Pet.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> Pet {
-	
-		<ja>@Html</ja>(link=<js>"servlet:/pet/{id}"</js>)
-		<jk>private long</jk> <jf>id</jf>;
-	
-		<ja>@Html</ja>(render=PriceRender.<jk>class</jk>)
-		<jk>private float</jk> <jf>price</jf>;
-	
-		<jk>private</jk> Species <jf>species</jf>;
-	
-		<jk>private</jk> PetStatus <jf>status</jf>;
-		
-		...
-
-		<jk>public static final class</jk> PriceRender <jk>extends</jk> HtmlRender&lt;Float&gt; {
-			<ja>@Override</ja> <jc>/* HtmlRender */</jc>
-			<jk>public</jk> Object getContent(SerializerSession session, Float value) {
-				<jk>return</jk> value == <jk>null</jk> ? <jk>null</jk> : String.<jsm>format</jsm>(<js>"$%.2f"</js>, value);
-			}
-		}
-		
-		...
-</p>
-
-<h5 class='figure'>Species.java</h5>
-<p class='bpcode w800'>
-	<ja>@Html</ja>(render=Species.SpeciesRender.<jk>class</jk>)
-	<jk>public enum</jk> Species {
-	
-		<jsf>BIRD</jsf>, <jsf>CAT</jsf>, <jsf>DOG</jsf>, <jsf>FISH</jsf>, <jsf>MOUSE</jsf>, <jsf>RABBIT</jsf>, <jsf>SNAKE</jsf>;
-	
-		<jk>public static class</jk> SpeciesRender <jk>extends</jk> HtmlRender&lt;Species&gt; {
-			<ja>@Override</ja> <jc>/* HtmlRender */</jc>
-			<jk>public</jk> Object getContent(SerializerSession session, Species value) {
-				<jk>return new</jk> Img().src(<js>"servlet:/htdocs/"</js>+value.name().toLowerCase()+<js>".png"</js>);
-			}
-			<ja>@Override</ja> <jc>/* HtmlRender */</jc>
-			<jk>public</jk> String getStyle(SerializerSession session, Species value) {
-				<jk>return</jk> <js>"background-color:#FDF2E9"</js>;
-			}
-		}
-	}
-</p>
-
-<h5 class='figure'>PetStatus.java</h5>
-<p class='bpcode w800'>
-	<ja>@Html</ja>(render=PetStatus.PetStatusRender.<jk>class</jk>)
-	<jk>public enum</jk> PetStatus {
-		
-		<jsf>AVAILABLE</jsf>, <jsf>PENDING</jsf>, <jsf>SOLD</jsf>, <jsf>UNKNOWN</jsf>;
-	
-		<jk>public static class</jk> PetStatusRender <jk>extends</jk> HtmlRender&lt;PetStatus&gt; {
-			<ja>@Override</ja> <jc>/* HtmlRender */</jc>
-			<jk>public</jk> String getStyle(SerializerSession session, PetStatus value) {
-				<jk>switch</jk>(value) {
-					<jk>case</jk> <jsf>AVAILABLE</jsf>:  <jk>return</jk> <js>"background-color:#5cb85c;text-align:center;vertical-align:middle;"</js>;
-					<jk>case</jk> <jsf>PENDING</jsf>:  <jk>return</jk> <js>"background-color:#f0ad4e;text-align:center;vertical-align:middle;"</js>;
-					<jk>case</jk> <jsf>SOLD</jsf>:  <jk>return</jk> <js>"background-color:#888;text-align:center;vertical-align:middle;"</js>;
-					<jk>default</jk>:  <jk>return</jk> <js>"background-color:#777;text-align:center;vertical-align:middle;"</js>;
-				}
-			}
-		}
-	}
-</p>
-<p>
-	The <l>CONTENT-TYPE</l> menu items gives a shorthand way of showing our POJOs in any of the supported
-	serialization languages:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet/1
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.5a.png'>
-<p>
-	For example, selecting <l>APPLICATION/JSON+SIMPLE</l> shows us simplified JSON:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet?plainText=true&amp;Accept=application%2Fjson%2Bsimple
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.5b.png'>
-<p>
-	Note that we're using the convenience feature for specifying an <c>Accept</c> header via a query parameter.
-</p>
-<p>
-	The <l>THEME</l> menu items allows you to quickly change the stylesheet used on the page:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet/1
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.6a.png'>
-<p>
-	For example, selecting <l>LIGHT</l> shows us the page rendered using the light look-and-feel:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet?stylesheet=htdocs%2Fthemes%2Flight.css
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.6b.png'>
-<p>
-	Both the <l>CONTENT-TYPE</l> and <l>THEMES</l> menu items are implemented as widgets and
-	associated with the page contents through the use of <l>$W</l> variables in the navigation links:
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		htmldoc=<ja>@HtmlDoc</ja>(
-			widgets={
-				ContentTypeMenuItem.<jk>class</jk>,
-				ThemeMenuItem.<jk>class</jk>,
-			},
-			navlinks={
-				<js>"up: request:/.."</js>,
-				<js>"options: servlet:/?method=OPTIONS"</js>,
-				<js>"init: servlet:/init"</js>,
-				<js>"$W{ContentTypeMenuItem}"</js>,
-				<js>"$W{ThemeMenuItem}"</js>,
-				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/petstore/$R{servletClassSimple}.java"</js>
-			},
-			...
-		),
-		...
-</p>
-<p>
-	The implementation of a menu item contains methods for retrieving the label and HTML5 content of the menu item.
-</p>
-<h5 class='figure'>ContentTypeMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> ContentTypeMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) {
-			<jk>return</jk> <js>"content-type"</js>;
-		}
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> Div getContent(RestRequest req) {
-			Div div = <jsm>div</jsm>();
-			Set&lt;MediaType&gt; l = <jk>new</jk> TreeSet&lt;&gt;();
-			<jk>for</jk> (Serializer s : req.getSerializers().getSerializers())
-				l.add(s.getPrimaryMediaType());
-			<jk>for</jk> (MediaType mt : l) {
-				URI uri = req.getUri(<jk>true</jk>, <jk>new</jk> AMap&lt;String,String&gt;().append(<js>"plainText"</js>,<js>"true"</js>).append(<js>"Accept"</js>,mt.toString()));
-				div.children(<jsm>a</jsm>(uri, mt), <jsm>br</jsm>());
-			}
-			<jk>return</jk> div;
-		}
-	}
-</p>
-
-<h5 class='figure'>ThemeMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> ThemeMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<jk>private static final</jk> String[] <jsf>BUILT_IN_STYLES</jsf> = {<js>"devops"</js>, <js>"light"</js>, <js>"original"</js>, <js>"dark"</js>};
-	
-		<ja>@Override</ja> <jc>/* Widget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) {
-			<jk>return</jk> "themes";
-		}
-		
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> Div getContent(RestRequest req) <jk>throws</jk> Exception {
-			Div div = <jsm>div</jsm>();
-			<jk>for</jk> (String s : <jsf>BUILT_IN_STYLES</jsf>) {
-				java.net.URI uri = req.getUri(<jk>true</jk>, <jk>new</jk> AMap&lt;String,String&gt;().append(<js>"stylesheet"</js>, <js>"htdocs/themes/"</js>+s+<js>".css"</js>));
-				div.children(<jsm>a</jsm>(uri, s), <jsm>br</jsm>());
-			}
-			<jk>return</jk> div;
-		}
-	}
-</p>
-<p>
-	The <l>QUERY</l> menu item shows off the capabilities of the {@link oajr.converters.Queryable} converter.
-</p>
-
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet
-</p>		
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.7a.png'>
-<p>
-	The converter will take the POJOs to be serialized and filter them based on the provided query/view/sort/paging attributes:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet?s=name%3DHoppy*&amp;v=species%2Cname&amp;o=name&amp;p=0&amp;l=20
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.7b.png'>
-<p>
-	The <l>ADD</l> menu item is a custom menu item created for the petstore app for adding pets through the 
-	web interface.
-</p>
-
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.8a.png'>
-
-<p>
-	Both the <l>QUERY</l> and <l>ADD</l> menu items are only applicable for this page, and so are defined
-	on the <l>getPets()</l> method: 
-</p>
-
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@Override</ja> <jc>/* PetStore */</jc>
-	<ja>@RestMethod</ja>(
-		name=<jsf>GET</jsf>,
-		path=<js>"/pet"</js>,
-		summary=<js>"All pets in the store"</js>,
-		swagger=<ja>@MethodSwagger</ja>(
-			tags=<js>"pet"</js>,
-			parameters={
-				Queryable.<jsf>SWAGGER_PARAMS</jsf>
-			}
-		),
-		bpx=<js>"Pet: tags,photo"</js>,
-		htmldoc=<ja>@HtmlDoc</ja>(
-			widgets={
-				QueryMenuItem.<jk>class</jk>,
-				AddPetMenuItem.<jk>class</jk>
-			},
-			navlinks={
-				<js>"INHERIT"</js>,                <jc>// Inherit links from class.</jc>
-				<js>"[2]:$W{QueryMenuItem}"</js>,  <jc>// Insert QUERY link in position 2.</jc>
-				<js>"[3]:$W{AddPetMenuItem}"</js>  <jc>// Insert ADD link in position 3.</jc>
-			}
-		),
-		converters={Queryable.<jk>class</jk>}
-	)
-	<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
-		<jk>return</jk> <jf>store</jf>.getPets();
-	}
-</p>
-
-<h5 class='figure'>QueryMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> QueryMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<ja>@Override</ja> <jc>/* Widget */</jc>
-		<jk>public</jk> String getStyle(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return super</jk>.getStyle(req)
-				+ <js>"\n"</js>
-				+ <jsm>loadStyle</jsm>(<js>"QueryMenuItem.css"</js>);
-		}
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <js>"query"</js>;
-		}
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getContent(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <jsm>loadHtml</jsm>(<js>"QueryMenuItem.html"</js>);
-		}
-	}
-</p>
-
-<h5 class='figure'>AddPetMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> AddPetMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <js>"add"</js>;
-		}
-	
-		<ja>@Override</ja> <jc>/* Widget */</jc>
-		<jk>public</jk> Object getContent(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <jsm>div</jsm>(
-				<jsm>form</jsm>().id(<js>"form"</js>).action(<js>"servlet:/pet"</js>).method(<jsf>POST</jsf>).children(
-					<jsm>table</jsm>(
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"Name:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"name"</js>).type(<js>"text"</js>)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The name of the pet."</js>, <jsm>br</jsm>(), <js>"e.g. 'Fluffy'"</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"Species:"</js>),
-							<jsm>td</jsm>(
-								<jsm>select</jsm>().name(<js>"species"</js>).children(
-									<jsm>option</jsm>(<js>"CAT"</js>), <jsm>option</jsm>(<js>"DOG"</js>), <jsm>option</jsm>(<js>"BIRD"</js>), <jsm>option</jsm>(<js>"FISH"</js>), <jsm>option</jsm>(<js>"MOUSE"</js>), <jsm>option</jsm>(<js>"RABBIT"</js>), <jsm>option</jsm>(<js>"SNAKE"</js>)
-								)
-							),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The kind of animal."</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"Price:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"price"</js>).type(<js>"number"</js>).placeholder(<js>"1.0"</js>).step(<js>"0.01"</js>).min(1).max(100).value(9.99)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The price to charge for this pet."</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"Tags:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"tags"</js>).type(<js>"text"</js>)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"Arbitrary textual tags (comma-delimited)."</js>, <jsm>br</jsm>(), <js>"e.g. 'fluffy,friendly'"</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>td</jsm>().colspan(2).style(<js>"text-align:right"</js>).children(
-								<jsm>button</jsm>(<js>"reset"</js>, <js>"Reset"</js>),
-								<jsm>button</jsm>(<js>"button"</js>,<js>"Cancel"</js>).onclick(<js>"window.location.href='/'"</js>),
-								<jsm>button</jsm>(<js>"submit"</js>, <js>"Submit"</js>)
-							)
-						)
-					).style(<js>"white-space:nowrap"</js>)
-				)
-			);
-		}
-	}
-</p>
-<hr>
-<p>
-	The <l>OPTIONS</l> menu items takes you to the auto-generated Swagger UI for the application:
-</p>
-<p class='bpcode w900'>
-	http://localhost:10000/petstore/pet?method=OPTIONS
-</p>			
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9a.png'>
-<p>
-	Since we've defined tags on our annotations, the pet-related operations are all grouped under the <l>pet</l> tag:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9b.png'>
-<p>
-	Information for all HTTP parts is automatically generated:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9h.png'>
-<p>
-	The schema models for POJO models is available in the <l>Responses</l> section of an operation:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9c.png'>
-<p>
-	Auto-generated examples are available for all supported languages:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9d.png'>
-<p>
-	For example, <l>application/json+simple</l>:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9e.png'>
-<p>
-	Examples can be derived in a number of ways.  In our case, we've defined a static method on our <l>Pet</l>
-	class annotated with <ja>@Example</ja>:
-</p>
-<h5 class='figure'>Pet.java</h5>
-<p class='bpcode w800'>
-	<ja>@Example</ja>
-	<jk>public static</jk> Pet example() {
-		<jk>return new</jk> Pet()
-			.id(123)
-			.species(Species.<jsf>DOG</jsf>)
-			.name(<js>"Doggie"</js>)
-			.tags(<js>"friendly"</js>,<js>"smart"</js>)
-			.status(PetStatus.<jsf>AVAILABLE</jsf>);
-	}
-</p>
-<p>
-	Similar functionality exists for request bodies as well:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9f.png'>
-<p>
-	At the bottom of the page is a listing of the POJO models in the app:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9g.png'>
-<hr>
-<p>
-	The <l>PhotosResource</l> class provides capabilities for uploading and viewing image files.
-	It demonstrates the capabilities of defining your own custom serializers and parsers and using
-	multi-part form posts to upload binary data.
-</p>
-
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/photos
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.10a.png'>
-
-<p>
-	The <l>PhotoResource</l> 'database' is simply a map of keys to <l>Photo</l> beans and uses the Java-provided
-	<l>BufferedImage</l> class for representing images.
-</p>
-
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		path=<js>"/photos"</js>,
-		...
-	)
-	<jk>public class</jk> PhotosResource <jk>extends</jk> BasicRestServlet {
-	
-		<jd>/** Our cache of photos */</jd>
-		<jk>private</jk> Map&lt;String,Photo&gt; <jf>photos</jf> = <jk>new</jk> TreeMap&lt;&gt;();
-	
-		<jd>/** Our bean class for storing photos */</jd>
-		<jk>public static class</jk> Photo {
-			String <jf>id</jf>;
-			BufferedImage <jf>image</jf>;
-	
-			Photo(String id, BufferedImage image) {
-				<jk>this</jk>.<jf>id</jf> = id;
-				<jk>this</jk>.<jf>image</jf> = image;
-			}
-	
-			<jk>public</jk> URI getURI() <jk>throws</jk> URISyntaxException {
-				<jk>return new</jk> URI(<js>"servlet:/"</js> + id);
-			}
-		}
-</p>
-
-<p>
-	The contents of the home page simply renders our collection of photo beans:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>	
-	<ja>@RestMethod</ja>(
-		name=<jsf>GET</jsf>,
-		path=<js>"/"</js>,
-		summary=<js>"Show the list of all currently loaded photos"</js>
-	)
-	<jk>public</jk> Collection&lt;Photo&gt; getAllPhotos() <jk>throws</jk> Exception {
-		<jk>return</jk> <jf>photos</jf>.values();
-	}
-</p>
-
-<p>
-	Clicking on one of the hyperlinks renders the stored image for us:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/photos/cat
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.10b.png'>
-
-<p>
-	The method for retrieving images simply returns a <l>BufferedImage</l> file:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		name=<jsf>GET</jsf>,
-		path=<js>"/{id}"</js>,
-		serializers=ImageSerializer.<jk>class</jk>,
-		summary=<js>"Get a photo by ID"</js>,
-		description=<js>"Shows how to use a custom serializer to serialize a BufferedImage object to a stream."</js>
-	)
-	<ja>@Response</ja>(
-		schema=<ja>@Schema</ja>(type=<js>"file"</js>)
-	)
-	<jk>public</jk> BufferedImage getPhoto(<ja>@Path</ja>(<js>"id"</js>) String id) <jk>throws</jk> NotFound {
-		Photo p = <jf>photos</jf>.get(id);
-		<jk>if</jk> (p == <jk>null</jk>)
-			<jk>throw new</jk> NotFound(<js>"Photo not found"</js>);
-		<jk>return</jk> p.<jf>image</jf>;
-	}
-</p>
-
-<p>
-	The <l>BufferedImage</l> object is converted to a stream using a custom {@link oaj.serializer.OutputStreamSerializer}:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<jd>/** Serializer for converting images to byte streams */</jd>
-	<jk>public static class</jk> ImageSerializer <jk>extends</jk> OutputStreamSerializer {
-
-		<jk>public</jk> ImageSerializer(PropertyStore ps) {
-			<jk>super</jk>(ps, <jk>null</jk>, <js>"image/png,image/jpeg"</js>);
-		}
-
-		<ja>@Override</ja> <jc>/* Serializer */</jc>
-		<jk>public</jk> OutputStreamSerializerSession createSession(SerializerSessionArgs args) {
-			<jk>return new</jk> OutputStreamSerializerSession(args) {
-
-				<ja>@Override</ja> <jc>/* SerializerSession */</jc>
-				<jk>protected void</jk> doSerialize(SerializerPipe out, Object o) <jk>throws</jk> Exception {
-					RenderedImage image = (RenderedImage)o;
-					String mediaType = getProperty(<js>"mediaType"</js>, String.<jk>class</jk>, (String)<jk>null</jk>);
-					ImageIO.<jsm>write</jsm>(image, mediaType.substring(mediaType.indexOf(<js>'/'</js>)+1), out.getOutputStream());
-				}
-			};
-		}
-	}
-</p>
-<p>
-	Likewise, the body of requests can also be instances of <l>BufferedImage</l>:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		name=<jsf>PUT</jsf>,
-		path=<js>"/{id}"</js>,
-		parsers=ImageParser.<jf>class</jf>,
-		summary=<js>"Add or overwrite a photo"</js>,
-		description=<js>"Shows how to use a custom parser to parse a stream into a BufferedImage object."</js>
-	)
-	<jk>public</jk> String addPhoto(
-			<ja>@Path</ja>(<js>"id"</js>) String id,
-			<ja>@Body</ja>(
-				description=<js>"Binary contents of image."</js>,
-				schema=<ja>@Schema</ja>(type=<js>"file"</js>)
-			)
-			BufferedImage image
-		) <jk>throws</jk> Exception {
-		<jf>photos</jf>.put(id, <jk>new</jk> Photo(id, image));
-		<jk>return</jk> <js>"OK"</js>;
-	}
-</p>
-<p>
-	The <l>BufferedImage</l> object is created from a stream using a custom {@link oaj.parser.InputStreamParser}:
-</p>
-
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<jd>/** Parser for converting byte streams to images */</jd>
-	<jk>public static class</jk> ImageParser <jk>extends</jk> InputStreamParser {
-
-		<jk>public</jk> ImageParser(PropertyStore ps) {
-			<jk>super</jk>(ps, <js>"image/png"</js>, <js>"image/jpeg"</js>);
-		}
-
-		<ja>@Override</ja> <jc>/* Parser */</jc>
-		<jk>public</jk> InputStreamParserSession createSession(<jk>final</jk> ParserSessionArgs args) {
-			<jk>return new</jk> InputStreamParserSession(args) {
-
-				<ja>@Override</ja> <jc>/* ParserSession */</jc>
-				<jk>protected</jk> &lt;T&gt; T doParse(ParserPipe pipe, ClassMeta&lt;T&gt; type) <jk>throws</jk> Exception {
-					<jk>return</jk> (T)ImageIO.read(pipe.getInputStream());
-				}
-			};
-		}
-	}
-</p>
-<p>
-	A custom menu item is provided for uploading new images:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/photos
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.10c.png'>
-
-<p>
-	The menu item is defined as a <l>MenuItemWidget</l>:
-</p>
-
-<h5 class='figure'>UploadPhotoMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> UploadPhotoMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <js>"upload"</js>;
-		}
-	
-		<ja>@Override</ja> <jc>/* Widget */</jc>
-		<jk>public</jk> Object getContent(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <jsm>div</jsm>(
-				<jsm>form</jsm>().id(<js>"form"</js>).action(<js>"servlet:/upload"</js>).method(<jsf>POST</jsf>).enctype(<js>"multipart/form-data"</js>).children(
-					<jsm>table</jsm>(
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"ID:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"id"</js>).type(<js>"text"</js>)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The unique identifier of the photo."</js>, <jsm>br</jsm>(), <js>"e.g. 'Fluffy'"</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"File:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"file"</js>).type(<js>"file"</js>).accept(<js>"image/*"</js>)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The image file."</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>td</jsm>().colspan(2).style(<js>"text-align:right"</js>).children(
-								<jsm>button</jsm>(<js>"reset"</js>, <js>"Reset"</js>),
-								<jsm>button</jsm>(<js>"button"</js>,<js>"Cancel"</js>).onclick(<js>"window.location.href='/'"</js>),
-								<jsm>button</jsm>(<js>"submit"</js>, <js>"Submit"</js>)
-							)
-						)
-					).style(<js>"white-space:nowrap"</js>)
-				)
-			);
-		}
-	}
-</p>
-<p>
-	The menu item then submits multi-part form posts to the following method:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<hr>
-<p>
-	The <l>SqlQueryResource</l> class is a simple utility for performing raw SQL queries against our Derby database:
-</p>
-<p class='bpcode w900'>
-	http://localhost:10000/petstore/sql
-</p>			
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.11a.png'>
-<p>
-	For example, viewing all of the <l>Pet</l> objects in the database:
-</p>
-<p class='bpcode w900'>
-	http://localhost:10000/petstore/sql?sql=select+*+from+PetstorePet
-</p>			
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.11b.png'>
-
-<p>
-	The <l>SqlQueryResource</l> is implemented as a single class with database connection information:
-</p>
-
-<h5 class='figure'>SqlQueryResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		path=<js>"/sql"</js>,
-		title=<js>"SQL query service"</js>,
-		description=<js>"Executes queries against the local derby '$C{SqlQueryResource/connectionUrl}' database"</js>,
-		htmldoc=<ja>@HtmlDoc</ja>(
-			widgets={
-				ThemeMenuItem.<jk>class</jk>
-			},
-			navlinks={
-				<js>"up: request:/.."</js>,
-				<js>"options: servlet:/?method=OPTIONS"</js>,
-				<js>"$W{ThemeMenuItem}"</js>,
-				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
-			},
-			aside={
-				<js>"&lt;div style='min-width:200px' class='text'&gt;"</js>,
-				<js>"	&lt;p&gt;An example of a REST interface over a relational database that serializes ResultSet objects.&lt;/p&gt;"</js>,
-				<js>"	&lt;p&gt;Specify one or more queries delimited by semicolons.&lt;/p&gt;"</js>,
-				<js>"	&lt;h5&gt;Examples:&lt;/h5&gt;"</js>,
-				<js>"	&lt;ul&gt;"</js>,
-				<js>"		&lt;li&gt;&lt;a class='link' href='?sql=select+*+from+sys.systables'&gt;Tables&lt;/a&gt;"</js>,
-				<js>"		&lt;li&gt;&lt;a class='link' href='?sql=select+*+from+PetstorePet'&gt;Pets&lt;/a&gt;"</js>,
-				<js>"		&lt;li&gt;&lt;a class='link' href='?sql=select+*+from+PetstoreOrder'&gt;Orders&lt;/a&gt;"</js>,
-				<js>"		&lt;li&gt;&lt;a class='link' href='?sql=select+*+from+PetstoreUser'&gt;Users&lt;/a&gt;"</js>,
-				<js>"	&lt;/ul&gt;"</js>,
-				<js>"&lt;/div&gt;"</js>
-			},
-			stylesheet=<js>"servlet:/htdocs/themes/dark.css"</js>
-		),
-		swagger=<ja>@ResourceSwagger</ja>(
-			contact=<ja>@Contact</ja>(name=<js>"Juneau Developer"</js>,email=<js>"dev@juneau.apache.org"</js>),
-			license=<ja>@License</ja>(name=<js>"Apache 2.0"</js>,url=<js>"http://www.apache.org/licenses/LICENSE-2.0.html"</js>),
-			version=<js>"2.0"</js>,
-			termsOfService=<js>"You are on your own."</js>,
-			externalDocs=<ja>@ExternalDocs</ja>(description=<js>"Apache Juneau"</js>,url=<js>"http://juneau.apache.org"</js>)
-		)
-	)
-	<jk>public class</jk> SqlQueryResource <jk>extends</jk> BasicRestServlet {
-
-		<jk>private</jk> String <jf>driver</jf>, <jf>connectionUrl</jf>;
-		<jk>private boolean</jk> <jf>allowUpdates</jf>, <jf>allowTempUpdates</jf>, <jf>includeRowNums</jf>;
-
-		...
-</p>
-<p>
-	The connection information is pulled from the <l>examples.cfg</l> file using an init hook:
-</p>
-<h5 class='figure'>SqlQueryResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestHook</ja>(<jsf>INIT</jsf>)
-	<jk>public void</jk> initConnection(RestContextBuilder builder) <jk>throws</jk> Exception {
-		Config cf = builder.getConfig();
-
-		<jf>driver</jf> = cf.getString(<js>"SqlQueryResource/driver"</js>);
-		<jf>connectionUrl</jf> = cf.getString(<js>"SqlQueryResource/connectionUrl"</js>);
-		<jf>allowUpdates</jf> = cf.getBoolean(<js>"SqlQueryResource/allowUpdates"</js>, <jk>false</jk>);
-		<jf>allowTempUpdates</jf> = cf.getBoolean(<js>"SqlQueryResource/allowTempUpdates"</js>, <jk>false</jk>);
-		<jf>includeRowNums</jf> = cf.getBoolean(<js>"SqlQueryResource/includeRowNums"</js>, <jk>false</jk>);
-
-		<jk>try</jk> {
-			Class.<jsm>forName</jsm>(<jf>driver</jf>).newInstance();
-		} <jk>catch</jk> (Exception e) {
-			<jk>throw new</jk> RuntimeException(e);
-		}
-	}
-</p>
-<p>
-	The query entry page is rendered using HTML5 beans:
-</p>
-<h5 class='figure'>SqlQueryResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		summary=<js>"Display the query entry page"</js>
-	)
-	<jk>public</jk> Div get(
-			<ja>@Query</ja>(
-				name=<js>"sql"</js>, 
-				description=<js>"Text to prepopulate the SQL query field with."</js>, 
-				example=<js>"select * from sys.systables"</js>
-			) 
-			String sql
-		) {
-
-		<jk>return</jk> <jsm>div</jsm>(
-			<jsm>script</jsm>(<js>"text/javascript"</js>,
-				<js>"// Quick and dirty function to allow tabs in textarea."</js>,
-				<js>"function checkTab(e) {"</js>,
-				<js>"	if (e.keyCode == 9) {"</js>,
-				<js>"		var t = e.target;"</js>,
-				<js>"		var ss = t.selectionStart, se = t.selectionEnd;"</js>,
-				<js>"		t.value = t.value.slice(0,ss).concat('\\t').concat(t.value.slice(ss,t.value.length));"</js>,
-				<js>"		e.preventDefault();"</js>,
-				<js>"	}"</js>,
-				<js>"}"</js>,
-				<js>"// Load results from IFrame into this document."</js>,
-				<js>"function loadResults(b) {"</js>,
-				<js>"	var doc = b.contentDocument || b.contentWindow.document;"</js>,
-				<js>"	var data = doc.getElementById('data') || doc.getElementsByTagName('body')[0];"</js>,
-				<js>"	document.getElementById('results').innerHTML = data.innerHTML;"</js>,
-				<js>"}"</js>
-			),
-			<jsm>form</jsm>(<js>"servlet:/"</js>).method(<jsf>POST</jsf>).target(<js>"buf"</js>).children(
-				<jsm>table</jsm>(
-					<jsm>tr</jsm>(
-						<jsm>th</jsm>(<js>"Position (1-10000):"</js>).style(<js>"white-space:nowrap"</js>),
-						<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"pos"</js>).type(<js>"number"</js>).value(1)),
-						<jsm>th</jsm>(<js>"Limit (1-10000):"</js>).style(<js>"white-space:nowrap"</js>),
-						<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"limit"</js>).type(<js>"number"</js>).value(100)),
-						<jsm>td</jsm>(button(<js>"submit"</js>, <js>"Submit"</js>), <jsm>button</jsm>(<js>"reset"</js>, <js>"Reset"</js>))
-					),
-					<jsm>tr</jsm>(
-						<jsm>td</jsm>().colspan(5).children(
-							<jsm>textarea</jsm>().name(<js>"sql"</js>).text(sql == <jk>null</jk> ? " " : sql).style(<js>"width:100%;height:200px;font-family:Courier;font-size:9pt;"</js>).onkeydown(<js>"checkTab(event)"</js>)
-						)
-					)
-				)
-			),
-			<jsm>br</jsm>(),
-			<jsm>div</jsm>().id(<js>"results"</js>),
-			<jsm>iframe</jsm>().name(<js>"buf"</js>).style(<js>"display:none"</js>).onload(<js>"parent.loadResults(this)"</js>)
-		);
-	}
-</p>
-<p>
-	The form then submits its results to the following method using a form input bean:
-</p>
-<h5 class='figure'>SqlQueryResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		summary=<js>"Execute one or more queries"</js>
-	)
-	<ja>@Response</ja>(
-		description=<js>"Query results.\nEach entry in the array is a result of one query.\nEach result can be a result set (for queries) or update count (for updates)."</js>
-	)
-	<jk>public</jk> List&lt;Object&gt; post(
-			<ja>@Body</ja>(
-				description=<js>"Query input"</js>,
-				example=<js>"{sql:'select * from sys.systables',pos:1,limit:100}"</js>
-			)
-			PostInput in
-		) <jk>throws</jk> BadRequest {
-
-		List&lt;Object&gt; results = <jk>new</jk> LinkedList&lt;&gt;();
-
-		<jc>// Don't try to submit empty input.</jc>
-		<jk>if</jk> (isEmpty(in.<jf>sql</jf>))
-			<jk>return</jk> results;
-
-		<jk>if</jk> (in.<jf>pos</jf> &lt; 1 || in.<jf>pos</jf> > 10000)
-			<jk>throw new</jk> BadRequest(<js>"Invalid value for position.  Must be between 1-10000"</js>);
-		<jk>if</jk> (in.<jf>limit</jf> &lt; 1 || in.<jf>limit</jf> > 10000)
-			<jk>throw new</jk> BadRequest(<js>"Invalid value for limit.  Must be between 1-10000"</js>);
-
-		String sql = <jk>null</jk>;
-
-		<jc>// Create a connection and statement.
-		// If these fails, let the exception filter up as a 500 error.</jc>
-		<jk>try</jk> (Connection c = DriverManager.<jsm>getConnection</jsm>(connectionUrl)) {
-			c.setAutoCommit(<jk>false</jk>);
-			<jk>try</jk> (Statement st = c.createStatement()) {
-				<jk>for</jk> (String s : in.<jf>sql</jf>.split(<js>";"</js>)) {
-					sql = s.trim();
-					<jk>if</jk> (! sql.isEmpty()) {
-						Object o = <jk>null</jk>;
-						<jk>if</jk> (<jf>allowUpdates</jf> || (<jf>allowTempUpdates</jf> &amp;&amp; ! sql.matches(<js>"(?:i)commit.*"</js>))) {
-							<jk>if</jk> (st.execute(sql)) {
-								<jk>try</jk> (ResultSet rs = st.getResultSet()) {
-									o = <jk>new</jk> ResultSetList(rs, in.<jf>pos</jf>, in.<jf>limit</jf>, <jf>includeRowNums</jf>);
-								}
-							} <jk>else</jk> {
-								o = st.getUpdateCount();
-							}
-						} <jk>else</jk> {
-							<jk>try</jk> (ResultSet rs = st.executeQuery(sql)) {
-								o = <jk>new</jk> ResultSetList(rs, in.<jf>pos</jf>, in.<jf>limit</jf>, <jf>includeRowNums</jf>);
-							}
-						}
-						results.add(o);
-					}
-				}
-			}
-			<jk>if</jk> (<jf>allowUpdates</jf>)
-				c.commit();
-			<jk>else if</jk> (<jf>allowTempUpdates</jf>)
-				c.rollback();
-		} <jk>catch</jk> (SQLException e) {
-			<jk>throw new</jk> BadRequest(e, <js>"Invalid query:  {0}"</js>, sql);
-		}
-
-		<jk>return</jk> results;
-	}
-
-	<jk>public static class</jk> PostInput {
-		<jk>public</jk> String <jf>sql</jf> = <js>""</js>;
-		<jk>public int</jk> <jf>pos</jf> = 1, <jf>limit</jf> = 100;
-	}
-</p>
-<p>
-	Note that we could have also used <ja>@FormData</ja> parameters as well.
-</p>
-
-
-
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/05.ConfigResource.html b/juneau-doc/docs/Topics/17.juneau-examples-rest/04.ConfigResource.html
similarity index 100%
rename from juneau-doc/docs/Topics/17.juneau-examples-rest/05.ConfigResource.html
rename to juneau-doc/docs/Topics/17.juneau-examples-rest/04.ConfigResource.html
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/06.LogsResource.html b/juneau-doc/docs/Topics/17.juneau-examples-rest/05.LogsResource.html
similarity index 100%
rename from juneau-doc/docs/Topics/17.juneau-examples-rest/06.LogsResource.html
rename to juneau-doc/docs/Topics/17.juneau-examples-rest/05.LogsResource.html
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.1.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.1.png
deleted file mode 100644
index fc65f06..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.1.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10a.png
deleted file mode 100644
index 7c4fa71..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10b.png
deleted file mode 100644
index 86c1242..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10c.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10c.png
deleted file mode 100644
index 744a558..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.10c.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.11a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.11a.png
deleted file mode 100644
index 7ec5aa9..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.11a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.11b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.11b.png
deleted file mode 100644
index 97d4ff3..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.11b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2a.png
deleted file mode 100644
index 9515c5c..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2b.png
deleted file mode 100644
index 2afcbcf..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2c.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2c.png
deleted file mode 100644
index 7e27708..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2c.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2d.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2d.png
deleted file mode 100644
index 014fcf6..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.2d.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.3a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.3a.png
deleted file mode 100644
index ae029d8..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.3a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.3b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.3b.png
deleted file mode 100644
index 9193b1d..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.3b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.4a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.4a.png
deleted file mode 100644
index 2f47259..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.4a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.4b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.4b.png
deleted file mode 100644
index 5a91391..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.4b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.5a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.5a.png
deleted file mode 100644
index 5c88c5a..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.5a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.5b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.5b.png
deleted file mode 100644
index 46cd848..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.5b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.6a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.6a.png
deleted file mode 100644
index ddbee32..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.6a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.6b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.6b.png
deleted file mode 100644
index 9c04552..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.6b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.7a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.7a.png
deleted file mode 100644
index ffd41ce..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.7a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.7b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.7b.png
deleted file mode 100644
index e65d56c..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.7b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.8a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.8a.png
deleted file mode 100644
index 3cc3f6f..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.8a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9a.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9a.png
deleted file mode 100644
index 33a1791..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9b.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9b.png
deleted file mode 100644
index 85720f2..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9c.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9c.png
deleted file mode 100644
index 23a3e7f..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9c.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9d.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9d.png
deleted file mode 100644
index f183863..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9d.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9e.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9e.png
deleted file mode 100644
index 286a78f..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9e.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9f.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9f.png
deleted file mode 100644
index dd0013c..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9f.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9g.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9g.png
deleted file mode 100644
index a5c0b6c..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9g.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9h.png b/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9h.png
deleted file mode 100644
index 084e7ce..0000000
--- a/juneau-doc/docs/Topics/17.juneau-examples-rest/doc-files/juneau-examples-rest.PetStoreResource.9h.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/docs/docs.txt b/juneau-doc/docs/docs.txt
index 56d6f0b..4563d0f 100644
--- a/juneau-doc/docs/docs.txt
+++ b/juneau-doc/docs/docs.txt
@@ -4,6 +4,7 @@
 PojosConveribleToStrings = #PojosConveribleToStrings, POJOs Convertible to/from Strings
 PojosConveribleToOtherTypes = #PojosConveribleToOtherTypes, POJOs Convertible to/from Other Types
 ConfigurableProperties = #juneau-marshall.ConfigurableProperties, Configurable Properties
+SimpleJson = #juneau-marshall.JsonDetails.SimplifiedJson, Simple JSON
 
 SwaggerIO.v2 = https://swagger.io/specification/v2
 SwaggerIO.v3 = https://swagger.io/specification
diff --git a/juneau-doc/pom.xml b/juneau-doc/pom.xml
index f97fdee..166df11 100644
--- a/juneau-doc/pom.xml
+++ b/juneau-doc/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-doc</artifactId>
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.1.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.1.png
deleted file mode 100644
index fc65f06..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.1.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10a.png
deleted file mode 100644
index 7c4fa71..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10b.png
deleted file mode 100644
index 86c1242..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10c.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10c.png
deleted file mode 100644
index 744a558..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.10c.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.11a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.11a.png
deleted file mode 100644
index 7ec5aa9..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.11a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.11b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.11b.png
deleted file mode 100644
index 97d4ff3..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.11b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2a.png
deleted file mode 100644
index 9515c5c..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2b.png
deleted file mode 100644
index 2afcbcf..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2c.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2c.png
deleted file mode 100644
index 7e27708..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2c.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2d.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2d.png
deleted file mode 100644
index 014fcf6..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.2d.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.3a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.3a.png
deleted file mode 100644
index ae029d8..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.3a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.3b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.3b.png
deleted file mode 100644
index 9193b1d..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.3b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.4a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.4a.png
deleted file mode 100644
index 2f47259..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.4a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.4b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.4b.png
deleted file mode 100644
index 5a91391..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.4b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.5a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.5a.png
deleted file mode 100644
index 5c88c5a..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.5a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.5b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.5b.png
deleted file mode 100644
index 46cd848..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.5b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.6a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.6a.png
deleted file mode 100644
index ddbee32..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.6a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.6b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.6b.png
deleted file mode 100644
index 9c04552..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.6b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.7a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.7a.png
deleted file mode 100644
index ffd41ce..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.7a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.7b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.7b.png
deleted file mode 100644
index e65d56c..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.7b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.8a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.8a.png
deleted file mode 100644
index 3cc3f6f..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.8a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9a.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9a.png
deleted file mode 100644
index 33a1791..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9a.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9b.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9b.png
deleted file mode 100644
index 85720f2..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9b.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9c.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9c.png
deleted file mode 100644
index 23a3e7f..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9c.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9d.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9d.png
deleted file mode 100644
index f183863..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9d.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9e.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9e.png
deleted file mode 100644
index 286a78f..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9e.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9f.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9f.png
deleted file mode 100644
index dd0013c..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9f.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9g.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9g.png
deleted file mode 100644
index a5c0b6c..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9g.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9h.png b/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9h.png
deleted file mode 100644
index 084e7ce..0000000
--- a/juneau-doc/src/main/javadoc/doc-files/juneau-examples-rest.PetStoreResource.9h.png
+++ /dev/null
Binary files differ
diff --git a/juneau-doc/src/main/javadoc/javadoc.css b/juneau-doc/src/main/javadoc/javadoc.css
index dde428d..5788027 100755
--- a/juneau-doc/src/main/javadoc/javadoc.css
+++ b/juneau-doc/src/main/javadoc/javadoc.css
@@ -703,16 +703,3 @@
 	border-radius:10px;

 	font-size: 1.2em;

 }

-

-.new {

-	background-color:lightgreen;

-}

-

-.updated {

-	background-color:#CFC;

-}

-

-.todo {

-	background-color:#FD8;

-}

-

diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 1e4bdc3..6e50fbf 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -72,7 +72,7 @@
 <ol class='toc'>
 	<li><p class='toc2'><a class='doclink' href='#Introduction'>Introduction</a></p>
 	<ol>
-		<li><p class='updated'><a class='doclink' href='#Introduction.Features'>Features</a></p>
+		<li><p class=''><a class='doclink' href='#Introduction.Features'>Features</a></p>
 		<li><p class=''><a class='doclink' href='#Introduction.Components'>Components</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='#juneau-marshall'>juneau-marshall</a></p>
@@ -85,26 +85,26 @@
 		<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='updated'><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a></p>
 			<li><p class='update'><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonParser'>Common Parser Properties</a></p>
 		</ol>
-		<li><p class='new'><a class='doclink' href='#juneau-marshall.ConfigurableAnnotations'>Configurable Annotations</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-marshall.ConfigurableAnnotations'>Configurable Annotations</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.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>
 		<ol>
-			<li><p class='updated'><a class='doclink' href='#juneau-marshall.Transforms.PojoSwaps'>PojoSwaps</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.PojoSwaps'>PojoSwaps</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.DefaultPojoSwaps'>Default PojoSwaps</a></p>
-			<li><p class='new'><a class='doclink' href='#juneau-marshall.Transforms.AutoPojoSwaps'>Auto-detected POJO swaps</a></p>
-			<li><p class='updated'><a class='doclink' href='#juneau-marshall.Transforms.PerMediaTypePojoSwaps'>Per-media-type PojoSwaps</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.AutoPojoSwaps'>Auto-detected POJO swaps</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.PerMediaTypePojoSwaps'>Per-media-type PojoSwaps</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.OneWayPojoSwaps'>One-way PojoSwaps</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.SwapAnnotation'>@Swap Annotation</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.TemplatedSwaps'>Templated Swaps</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.SurrogateClasses'>Surrogate Classes</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.BeanAnnotation'>@Bean Annotation</a></p>
-			<li><p class='updated'><a class='doclink' href='#juneau-marshall.Transforms.BeanPropertyAnnotation'>@BeanProperty Annotation</a></p>
-			<li><p class='updated'><a class='doclink' href='#juneau-marshall.Transforms.BeanConstructorAnnotation'>@BeanConstructor Annotation</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.BeanPropertyAnnotation'>@BeanProperty Annotation</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.BeanConstructorAnnotation'>@BeanConstructor Annotation</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.BeanIgnoreAnnotation'>@BeanIgnore Annotation</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.NamePropertyAnnotation'>@NameProperty Annotation</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-marshall.Transforms.ParentPropertyAnnotation'>@ParentProperty Annotation</a></p>
@@ -206,9 +206,9 @@
 	<li><p class='toc2'><a class='doclink' href='#juneau-svl'>juneau-svl</a></p>
 	<ol>
 		<li><p class=''><a class='doclink' href='#juneau-svl.SimpleVarLanguage'>Simple Variable Language</a></p>
-		<li><p class='updated'><a class='doclink' href='#juneau-svl.SvlVariables'>SVL Variables</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-svl.SvlVariables'>SVL Variables</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-svl.VarResolvers'>VarResolvers and VarResolverSessions</a></p>
-		<li><p class='new'><a class='doclink' href='#juneau-svl.DefaultVarResolver'>VarResolver.DEFAULT</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-svl.DefaultVarResolver'>VarResolver.DEFAULT</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-svl.OtherNotes'>Other Notes</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='#juneau-config'>juneau-config</a></p>
@@ -241,7 +241,7 @@
 		</ol>
 		<li><p class=''><a class='doclink' href='#juneau-config.Listeners'>Listeners</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-config.Serializing'>Serializing</a></p>
-		<li><p class='new'><a class='doclink' href='#juneau-config.Imports'>Imports</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-config.Imports'>Imports</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-config.ConfigStores'>Config Stores</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='#juneau-config.ConfigStores.ConfigMemoryStore'>ConfigMemoryStore</a></p>
@@ -251,27 +251,27 @@
 		</ol>
 		<li><p class=''><a class='doclink' href='#juneau-config.ReadOnlyConfigs'>Read-only Configs</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-config.ClosingConfigs'>Closing Configs</a></p>
-		<li><p class='updated'><a class='doclink' href='#juneau-config.SystemDefaultConfig'>System Default Config</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-config.SystemDefaultConfig'>System Default Config</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='#juneau-rest-server'>juneau-rest-server</a></p>
 	<ol>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.HelloWorldExample'>Hello World Example</a></p>
-		<li><p class='updated'><a class='doclink' href='#juneau-rest-server.ClassHierarchy'>Class Hierarchy</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-server.ClassHierarchy'>Class Hierarchy</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation'>Instantiation</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation.RestServlet'>RestServlet</a></p>
-			<li><p class='updated'><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestServlet'>BasicRestServlet</a></p>
-			<li><p class='new'><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRest'>BasicRest</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestServlet'>BasicRestServlet</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRest'>BasicRest</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation.Children'>Children</a></p>
-			<li><p class='updated'><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestServletGroup'>BasicRestServletGroup</a></p>
-			<li><p class='new'><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestGroup'>BasicRestGroup</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestServletGroup'>BasicRestServletGroup</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestGroup'>BasicRestGroup</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation.ResourceResolvers'>Resource Resolvers</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Instantiation.LifecycleHooks'>Lifecycle Hooks</a></p>
 		</ol>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.RestResource'>@RestResource</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestResource.AnnotationInheritance'>Annotation Inheritance</a></p>
-			<li><p class='new'><a class='doclink' href='#juneau-rest-server.RestResource.RestResourcePath'>@RestResource(path)</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestResource.RestResourcePath'>@RestResource(path)</a></p>
 		</ol>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.RestContext'>RestContext</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.RestMethod'>@RestMethod</a></p>
@@ -281,7 +281,7 @@
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestMethod.RestResponse'>RestResponse</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestMethod.RequestBody'>RequestBody</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestMethod.RequestHeaders'>RequestHeaders</a></p>
-			<li><p class='new'><a class='doclink' href='#juneau-rest-server.RestMethod.RequestAttributes'>RequestAttributes</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestMethod.RequestAttributes'>RequestAttributes</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestMethod.RequestQuery'>RequestQuery</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestMethod.RequestFormData'>RequestFormData</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.RestMethod.RestMethodPath'>@RestMethod(path)</a></p>
@@ -315,12 +315,12 @@
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.HandlingMultiPartFormPosts'>Handling Multi-Part Form Posts</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.Serializers'>Serializers</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.Parsers'>Parsers</a></p>
-		<li><p class='updated'><a class='doclink' href='#juneau-rest-server.ConfigurableProperties'>Configurable Properties</a></p>
-		<li><p class='new'><a class='doclink' href='#juneau-rest-server.ConfigurableAnnotations'>Configurable Annotations</a></p>
-		<li><p class='updated'><a class='doclink' href='#juneau-rest-server.Transforms'>Transforms</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-server.ConfigurableProperties'>Configurable Properties</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-server.ConfigurableAnnotations'>Configurable Annotations</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-server.Transforms'>Transforms</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.URIs'>URIs</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.Guards'>Guards</a></p>
-		<li><p class='new'><a class='doclink' href='#juneau-rest-server.RoleGuards'>Role guards</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-server.RoleGuards'>Role guards</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.Converters'>Converters</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.Messages'>Messages</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.Encoders'>Encoders</a></p>
@@ -334,27 +334,27 @@
 		</ol>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger'>Swagger</a></p>
 		<ol>
-			<li><p class='updated'><a class='doclink' href='#juneau-rest-server.Swagger.BasicRestServlet'>BasicRestServlet</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.BasicRestServlet'>BasicRestServlet</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.BasicSwaggerInfo'>Basic Swagger Info</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.Tags'>Tags</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.Operations'>Operations</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.Parameters'>Parameters</a></p>
-			<li><p class='updated'><a class='doclink' href='#juneau-rest-server.Swagger.ParameterExamples'>Parameter Examples</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.ParameterExamples'>Parameter Examples</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.Responses'>Responses</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.ResponseExamples'>Response Examples</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.Models'>Models</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.Swagger.Stylesheet'>SwaggerUI.css</a></p>
 		</ol>
-		<li><p class='updated'><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation'>@HtmlDocConfig</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation'>@HtmlDocConfig</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.UIvsDI'>User Interfaces (UI) vs. Developer Interfaces (DI)</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.Widgets'>Widgets</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets'>Predefined Widgets</a></p>
 			<li><p class=''><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.UiCustomization'>UI Customization</a></p>
-			<li><p class='updated'><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.Stylesheets'>Stylesheets</a></p>
+			<li><p class=''><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.Stylesheets'>Stylesheets</a></p>
 		</ol>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.DefaultHeaders'>Default Headers</a></p>
-		<li><p class='new'><a class='doclink' href='#juneau-rest-server.LoggingAndDebugging'>Logging / Debugging</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-server.LoggingAndDebugging'>Logging / Debugging</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.HttpStatusCodes'>HTTP Status Codes</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.OverloadingHttpMethods'>Overloading HTTP Methods</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server.BuiltInParameters'>Built-in Parameters</a></p>
@@ -371,7 +371,7 @@
 	<li><p class='toc2'><a class='doclink' href='#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></p>
 	<ol>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server-springboot.Overview'>Overview</a></p>
-		<li><p class='new'><a class='doclink' href='#juneau-rest-server-springboot.ChildResources'>Child Resources</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-server-springboot.ChildResources'>Child Resources</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='#juneau-rest-client'>juneau-rest-client</a></p>
 	<ol>
@@ -402,10 +402,10 @@
 		<li><p class=''><a class='doclink' href='#juneau-rest-client.Interceptors'>Interceptors</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-rest-client.Other'>Other Useful Methods</a></p>
 	</ol>
-	<li><p class='new'><a class='doclink' href='#juneau-rest-mock'>juneau-rest-mock</a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-rest-mock'>juneau-rest-mock</a></p>
 	<ol>
-		<li><p class='new'><a class='doclink' href='#juneau-rest-mock.MockRest'>MockRest</a></p>
-		<li><p class='new'><a class='doclink' href='#juneau-rest-mock.MockRemoteResource'>MockRemoteResource</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-mock.MockRest'>MockRest</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-rest-mock.MockRemoteResource'>MockRemoteResource</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='#juneau-microservice-core'>juneau-microservice-core</a></p>
 	<ol>
@@ -450,10 +450,9 @@
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='#juneau-examples-rest'>juneau-examples-rest</a></p>
 	<ol>
-		<li><p class='updated'><a class='doclink' href='#juneau-examples-rest.RootResources'>RootResources</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-examples-rest.RootResources'>RootResources</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-examples-rest.HelloWorldResource'>HelloWorldResource</a></p>
-		<li><p class=''><a class='doclink' href='#juneau-examples-rest.PetStoreResource'>PetStore</a></p>
-		<li><p class='updated'><a class='doclink' href='#juneau-examples-rest.DtoExamples'>DtoExamples</a></p>
+		<li><p class=''><a class='doclink' href='#juneau-examples-rest.DtoExamples'>DtoExamples</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-examples-rest.ConfigResource'>ConfigResource</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-examples-rest.LogsResource'>LogsResource</a></p>
 	</ol>
@@ -597,7 +596,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic updated' onclick='toggle(this)'><a href='#Introduction.Features' id='Introduction.Features'>1.1 - Features</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#Introduction.Features' id='Introduction.Features'>1.1 - Features</a></h3>
 <div class='topic'><!-- START: 1.1 - Introduction.Features -->
 <ul class='spaced-list'>
 	<li>
@@ -1469,7 +1468,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.CommonSerializer' id='juneau-marshall.ConfigurableProperties.CommonSerializer'>2.6.2 - Common Serializer Properties</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.CommonSerializer' id='juneau-marshall.ConfigurableProperties.CommonSerializer'>2.6.2 - Common Serializer Properties</a></h4>
 <div class='topic'><!-- START: 2.6.2 - juneau-marshall.ConfigurableProperties.CommonSerializer -->
 <p>
 	In addition to the common properties above, the following properties are common to all serializers:
@@ -1544,7 +1543,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableAnnotations' id='juneau-marshall.ConfigurableAnnotations'>2.7 - Configurable Annotations</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableAnnotations' id='juneau-marshall.ConfigurableAnnotations'>2.7 - Configurable Annotations</a></h3>
 <div class='topic'><!-- START: 2.7 - juneau-marshall.ConfigurableAnnotations -->
 <p>
 	All configurable properties described in the previous section have annotation equivalents that can be applied on
@@ -1975,7 +1974,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PojoSwaps' id='juneau-marshall.Transforms.PojoSwaps'>2.11.1 - PojoSwaps</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PojoSwaps' id='juneau-marshall.Transforms.PojoSwaps'>2.11.1 - PojoSwaps</a></h4>
 <div class='topic'><!-- START: 2.11.1 - juneau-marshall.Transforms.PojoSwaps -->
 <p>
 	{@link org.apache.juneau.transform.PojoSwap PojoSwaps} are a critical component of Juneau.
@@ -2182,7 +2181,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.AutoPojoSwaps' id='juneau-marshall.Transforms.AutoPojoSwaps'>2.11.3 - Auto-detected POJO swaps</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.AutoPojoSwaps' id='juneau-marshall.Transforms.AutoPojoSwaps'>2.11.3 - Auto-detected POJO swaps</a></h4>
 <div class='topic'><!-- START: 2.11.3 - juneau-marshall.Transforms.AutoPojoSwaps -->
 <p>
 	Various methods can be defined on a class directly to affect how it gets serialized.
@@ -2341,7 +2340,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PerMediaTypePojoSwaps' id='juneau-marshall.Transforms.PerMediaTypePojoSwaps'>2.11.4 - Per-media-type PojoSwaps</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PerMediaTypePojoSwaps' id='juneau-marshall.Transforms.PerMediaTypePojoSwaps'>2.11.4 - Per-media-type PojoSwaps</a></h4>
 <div class='topic'><!-- START: 2.11.4 - juneau-marshall.Transforms.PerMediaTypePojoSwaps -->
 <p>
 	Swaps can also be defined per-media-type.		
@@ -2832,7 +2831,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanPropertyAnnotation' id='juneau-marshall.Transforms.BeanPropertyAnnotation'>2.11.10 - @BeanProperty Annotation</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanPropertyAnnotation' id='juneau-marshall.Transforms.BeanPropertyAnnotation'>2.11.10 - @BeanProperty Annotation</a></h4>
 <div class='topic'><!-- START: 2.11.10 - juneau-marshall.Transforms.BeanPropertyAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotation is used to tailor how 
@@ -3029,7 +3028,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanConstructorAnnotation' id='juneau-marshall.Transforms.BeanConstructorAnnotation'>2.11.11 - @BeanConstructor Annotation</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanConstructorAnnotation' id='juneau-marshall.Transforms.BeanConstructorAnnotation'>2.11.11 - @BeanConstructor Annotation</a></h4>
 <div class='topic'><!-- START: 2.11.11 - juneau-marshall.Transforms.BeanConstructorAnnotation -->
 <p>
 	The {@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor} annotation is used to 
@@ -4378,7 +4377,7 @@
 	</tr>			
 	<tr class='dark bb' style='background-color:lightyellow'>
 		<td style='text-align:center'>2</td>
-		<td><b>Java Collections Framework objects and Java arrays</b></td>
+		<td><b>Java Collections Framework objects, Java arrays, Java Optionals</b></td>
 		<td>&nbsp;</td>
 		<td>&nbsp;</td>
 		<td>&nbsp;</td>
@@ -4388,7 +4387,7 @@
 		<td>
 			<b>With standard keys/values</b>
 			<br>Map keys are group [1, 4a, 6a] objects.
-			<br>Map, Collection, and array values are group [1, 2, 3ac, 4a, 6a] objects.	
+			<br>Map, Collection, Optional, and array values are group [1, 2, 3ac, 4a, 6a] objects.	
 		</td>
 		<td>
 			<ul class='normal'>
@@ -4396,6 +4395,7 @@
 				<li><c>TreeMap&lt;Integer,Bean&gt;</c>
 				<li><c>List&lt;<jk>int</jk>[][]&gt;</c>
 				<li><c>Bean[]</c>
+				<li><c>Optional&lt;Bean&gt;</c>
 			</ul>
 		</td>
 		<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
@@ -4412,6 +4412,7 @@
 			<ul class='normal'>
 				<li><c>HashSet&lt;Bean,Integer&gt;</c>
 				<li><c>TreeMap&lt;Integer,Reader&gt;</c>
+				<li><c>Optional&lt;Reader&gt;</c>
 			</ul>
 		</td>
 		<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
@@ -9590,15 +9591,15 @@
 	)
 </p>
 <ul class='notes'>
-	<li class='note'>
+	<li>
 		Array properties can also use CSV/SSV/PIPES for array notation.
 		<br>Various notations can be mixed throughout.
-	<li class='note'>
+	<li>
 		Schemas and POJOs can be defined arbitrarily deep.
-	<li class='note'>
+	<li>
 		Schemas are optional.
 		They can be skipped or partially defined.
-	<li class='note'>
+	<li>
 		We make our best attempt to convert the input to the matching type.  
 		However, you will get <c>SerializeExceptions</c> if you attempt an impossible conversion.
 		(e.g. trying to serialize the string "foo" as a boolean). 
@@ -9810,6 +9811,10 @@
 	</tr>
 </table>
 <p>
+	Additionally, any of the type above can also be wrapped as {@link java.util.Optional Optionals}.
+</p>
+
+<p>
 	For arrays, an example of "Any POJO transformable from arrays of the default types" is:
 </p>
 <p class='bpcode w800'>
@@ -11188,7 +11193,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic updated' onclick='toggle(this)'><a href='#juneau-svl.SvlVariables' id='juneau-svl.SvlVariables'>5.2 - SVL Variables</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-svl.SvlVariables' id='juneau-svl.SvlVariables'>5.2 - SVL Variables</a></h3>
 <div class='topic'><!-- START: 5.2 - juneau-svl.SvlVariables -->
 <p>
 	Variables are defined through the {@link org.apache.juneau.svl.Var} API.
@@ -11445,7 +11450,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-svl.DefaultVarResolver' id='juneau-svl.DefaultVarResolver'>5.4 - VarResolver.DEFAULT</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-svl.DefaultVarResolver' id='juneau-svl.DefaultVarResolver'>5.4 - VarResolver.DEFAULT</a></h3>
 <div class='topic'><!-- START: 5.4 - juneau-svl.DefaultVarResolver -->
 <p>
 	{@link org.apache.juneau.svl.VarResolver#DEFAULT} is a reusable variable resolver with default support for the following variables:
@@ -12635,7 +12640,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-config.Imports' id='juneau-config.Imports'>6.11 - Imports</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-config.Imports' id='juneau-config.Imports'>6.11 - Imports</a></h3>
 <div class='topic'><!-- START: 6.11 - juneau-config.Imports -->
 <p>
 	Configurations can import values from other configurations using the following syntax: 
@@ -13150,7 +13155,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic updated' onclick='toggle(this)'><a href='#juneau-config.SystemDefaultConfig' id='juneau-config.SystemDefaultConfig'>6.15 - System Default Config</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-config.SystemDefaultConfig' id='juneau-config.SystemDefaultConfig'>6.15 - System Default Config</a></h3>
 <div class='topic'><!-- START: 6.15 - juneau-config.SystemDefaultConfig -->
 <p>
 	Each JVM has a system default config.  This is a configuration file that serves as the default
@@ -13406,7 +13411,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.ClassHierarchy' id='juneau-rest-server.ClassHierarchy'>7.2 - Class Hierarchy</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.ClassHierarchy' id='juneau-rest-server.ClassHierarchy'>7.2 - Class Hierarchy</a></h3>
 <div class='topic'><!-- START: 7.2 - juneau-rest-server.ClassHierarchy -->
 <p>
 	The class hierarchy for the REST servlet class is shown below:
@@ -13562,7 +13567,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestServlet' id='juneau-rest-server.Instantiation.BasicRestServlet'>7.3.2 - BasicRestServlet</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestServlet' id='juneau-rest-server.Instantiation.BasicRestServlet'>7.3.2 - BasicRestServlet</a></h4>
 <div class='topic'><!-- START: 7.3.2 - juneau-rest-server.Instantiation.BasicRestServlet -->
 <p>
 	The {@link org.apache.juneau.rest.BasicRestServlet} class is a subclass of {@link org.apache.juneau.rest.RestServlet}
@@ -13751,7 +13756,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRest' id='juneau-rest-server.Instantiation.BasicRest'>7.3.3 - BasicRest</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRest' id='juneau-rest-server.Instantiation.BasicRest'>7.3.3 - BasicRest</a></h4>
 <div class='topic'><!-- START: 7.3.3 - juneau-rest-server.Instantiation.BasicRest -->
 <p>
 	The {@link org.apache.juneau.rest.BasicRest} class is identical to the {@link org.apache.juneau.rest.BasicRestServlet} class except that
@@ -13870,7 +13875,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestServletGroup' id='juneau-rest-server.Instantiation.BasicRestServletGroup'>7.3.5 - BasicRestServletGroup</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestServletGroup' id='juneau-rest-server.Instantiation.BasicRestServletGroup'>7.3.5 - BasicRestServletGroup</a></h4>
 <div class='topic'><!-- START: 7.3.5 - juneau-rest-server.Instantiation.BasicRestServletGroup -->
 <p>
 	The {@link org.apache.juneau.rest.BasicRestServletGroup} class provides a default "router" page for 
@@ -13929,7 +13934,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestGroup' id='juneau-rest-server.Instantiation.BasicRestGroup'>7.3.6 - BasicRestGroup</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestGroup' id='juneau-rest-server.Instantiation.BasicRestGroup'>7.3.6 - BasicRestGroup</a></h4>
 <div class='topic'><!-- START: 7.3.6 - juneau-rest-server.Instantiation.BasicRestGroup -->
 <p>
 	The {@link org.apache.juneau.rest.BasicRestGroup} class is identical to the {@link org.apache.juneau.rest.BasicRestServletGroup} class except that
@@ -14205,7 +14210,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.RestResource.RestResourcePath' id='juneau-rest-server.RestResource.RestResourcePath'>7.4.2 - @RestResource(path)</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.RestResource.RestResourcePath' id='juneau-rest-server.RestResource.RestResourcePath'>7.4.2 - @RestResource(path)</a></h4>
 <div class='topic'><!-- START: 7.4.2 - juneau-rest-server.RestResource.RestResourcePath -->
 <p>
 	The {@link org.apache.juneau.rest.annotation.RestResource#path() @RestResource(path)} annotation is used in the following situations:
@@ -14747,7 +14752,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RequestAttributes' id='juneau-rest-server.RestMethod.RequestAttributes'>7.6.6 - RequestAttributes</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RequestAttributes' id='juneau-rest-server.RestMethod.RequestAttributes'>7.6.6 - RequestAttributes</a></h4>
 <div class='topic'><!-- START: 7.6.6 - juneau-rest-server.RestMethod.RequestAttributes -->
 <p>
 	The {@link org.apache.juneau.rest.RequestAttributes} object is the API for accessing the standard servlet attributes on an HTTP request 
@@ -15271,36 +15276,36 @@
 	}
 </p>
 <ul class='javatree'>
-	<li class='jp'>{@link org.apache.juneau.rest.response}
+	<li class='jp'>{@link org.apache.juneau.http.response}
 	<ul>
-		<li class='jc'>{@link org.apache.juneau.rest.response.Accepted}
-		<li class='jc'>{@link org.apache.juneau.rest.response.AlreadyReported}
-		<li class='jc'>{@link org.apache.juneau.rest.response.Continue}
-		<li class='jc'>{@link org.apache.juneau.rest.response.Created}
-		<li class='jc'>{@link org.apache.juneau.rest.response.EarlyHints}
-		<li class='jc'>{@link org.apache.juneau.rest.response.Found}
-		<li class='jc'>{@link org.apache.juneau.rest.response.IMUsed}
-		<li class='jc'>{@link org.apache.juneau.rest.response.MovedPermanently}
-		<li class='jc'>{@link org.apache.juneau.rest.response.MultipleChoices}
-		<li class='jc'>{@link org.apache.juneau.rest.response.MultiStatus}
-		<li class='jc'>{@link org.apache.juneau.rest.response.NoContent}
-		<li class='jc'>{@link org.apache.juneau.rest.response.NonAuthoritiveInformation}
-		<li class='jc'>{@link org.apache.juneau.rest.response.NotModified}
-		<li class='jc'>{@link org.apache.juneau.rest.response.Ok}
-		<li class='jc'>{@link org.apache.juneau.rest.response.PartialContent}
-		<li class='jc'>{@link org.apache.juneau.rest.response.PermanentRedirect}
-		<li class='jc'>{@link org.apache.juneau.rest.response.Processing}
-		<li class='jc'>{@link org.apache.juneau.rest.response.ResetContent}
-		<li class='jc'>{@link org.apache.juneau.rest.response.SeeOther}
-		<li class='jc'>{@link org.apache.juneau.rest.response.SwitchingProtocols}
-		<li class='jc'>{@link org.apache.juneau.rest.response.TemporaryRedirect}
-		<li class='jc'>{@link org.apache.juneau.rest.response.UseProxy}
+		<li class='jc'>{@link org.apache.juneau.http.response.Accepted}
+		<li class='jc'>{@link org.apache.juneau.http.response.AlreadyReported}
+		<li class='jc'>{@link org.apache.juneau.http.response.Continue}
+		<li class='jc'>{@link org.apache.juneau.http.response.Created}
+		<li class='jc'>{@link org.apache.juneau.http.response.EarlyHints}
+		<li class='jc'>{@link org.apache.juneau.http.response.Found}
+		<li class='jc'>{@link org.apache.juneau.http.response.IMUsed}
+		<li class='jc'>{@link org.apache.juneau.http.response.MovedPermanently}
+		<li class='jc'>{@link org.apache.juneau.http.response.MultipleChoices}
+		<li class='jc'>{@link org.apache.juneau.http.response.MultiStatus}
+		<li class='jc'>{@link org.apache.juneau.http.response.NoContent}
+		<li class='jc'>{@link org.apache.juneau.http.response.NonAuthoritiveInformation}
+		<li class='jc'>{@link org.apache.juneau.http.response.NotModified}
+		<li class='jc'>{@link org.apache.juneau.http.response.Ok}
+		<li class='jc'>{@link org.apache.juneau.http.response.PartialContent}
+		<li class='jc'>{@link org.apache.juneau.http.response.PermanentRedirect}
+		<li class='jc'>{@link org.apache.juneau.http.response.Processing}
+		<li class='jc'>{@link org.apache.juneau.http.response.ResetContent}
+		<li class='jc'>{@link org.apache.juneau.http.response.SeeOther}
+		<li class='jc'>{@link org.apache.juneau.http.response.SwitchingProtocols}
+		<li class='jc'>{@link org.apache.juneau.http.response.TemporaryRedirect}
+		<li class='jc'>{@link org.apache.juneau.http.response.UseProxy}
 	</ul>
 </ul>
 <p>
 	These predefined response beans are an example of {@link org.apache.juneau.http.annotation.Response @Response}-annotated 
 	objects that are describe in detail later.
-	Without going into details, this is how the {@link org.apache.juneau.rest.response.SeeOther} is defined:
+	Without going into details, this is how the {@link org.apache.juneau.http.response.SeeOther} is defined:
 </p>
 <p class='bpcode w800'>
 	<ja>@Response</ja>(
@@ -15385,41 +15390,41 @@
 	}
 </p>
 <ul class='javatree'>
-	<li class='jp'>{@link org.apache.juneau.rest.exception}
+	<li class='jp'>{@link org.apache.juneau.http.exception}
 	<ul>
-		<li class='jc'>{@link org.apache.juneau.rest.exception.BadRequest}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.Conflict}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.ExpectationFailed}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.FailedDependency}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.Forbidden}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.Gone}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.HttpVersionNotSupported}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.InsufficientStorage}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.InternalServerError}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.LengthRequired}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.Locked}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.LoopDetected}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.MethodNotAllowed}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.MisdirectedRequest}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.NetworkAuthenticationRequired}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.NotAcceptable}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.NotExtended}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.NotFound}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.NotImplemented}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.PayloadTooLarge}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.PreconditionFailed}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.PreconditionRequired}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.RangeNotSatisfiable}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.RequestHeaderFieldsTooLarge}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.ServiceUnavailable}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.TooManyRequests}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.Unauthorized}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.UnavailableForLegalReasons}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.UnprocessableEntity}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.UnsupportedMediaType}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.UpgradeRequired}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.UriTooLong}
-		<li class='jc'>{@link org.apache.juneau.rest.exception.VariantAlsoNegotiates}
+		<li class='jc'>{@link org.apache.juneau.http.exception.BadRequest}
+		<li class='jc'>{@link org.apache.juneau.http.exception.Conflict}
+		<li class='jc'>{@link org.apache.juneau.http.exception.ExpectationFailed}
+		<li class='jc'>{@link org.apache.juneau.http.exception.FailedDependency}
+		<li class='jc'>{@link org.apache.juneau.http.exception.Forbidden}
+		<li class='jc'>{@link org.apache.juneau.http.exception.Gone}
+		<li class='jc'>{@link org.apache.juneau.http.exception.HttpVersionNotSupported}
+		<li class='jc'>{@link org.apache.juneau.http.exception.InsufficientStorage}
+		<li class='jc'>{@link org.apache.juneau.http.exception.InternalServerError}
+		<li class='jc'>{@link org.apache.juneau.http.exception.LengthRequired}
+		<li class='jc'>{@link org.apache.juneau.http.exception.Locked}
+		<li class='jc'>{@link org.apache.juneau.http.exception.LoopDetected}
+		<li class='jc'>{@link org.apache.juneau.http.exception.MethodNotAllowed}
+		<li class='jc'>{@link org.apache.juneau.http.exception.MisdirectedRequest}
+		<li class='jc'>{@link org.apache.juneau.http.exception.NetworkAuthenticationRequired}
+		<li class='jc'>{@link org.apache.juneau.http.exception.NotAcceptable}
+		<li class='jc'>{@link org.apache.juneau.http.exception.NotExtended}
+		<li class='jc'>{@link org.apache.juneau.http.exception.NotFound}
+		<li class='jc'>{@link org.apache.juneau.http.exception.NotImplemented}
+		<li class='jc'>{@link org.apache.juneau.http.exception.PayloadTooLarge}
+		<li class='jc'>{@link org.apache.juneau.http.exception.PreconditionFailed}
+		<li class='jc'>{@link org.apache.juneau.http.exception.PreconditionRequired}
+		<li class='jc'>{@link org.apache.juneau.http.exception.RangeNotSatisfiable}
+		<li class='jc'>{@link org.apache.juneau.http.exception.RequestHeaderFieldsTooLarge}
+		<li class='jc'>{@link org.apache.juneau.http.exception.ServiceUnavailable}
+		<li class='jc'>{@link org.apache.juneau.http.exception.TooManyRequests}
+		<li class='jc'>{@link org.apache.juneau.http.exception.Unauthorized}
+		<li class='jc'>{@link org.apache.juneau.http.exception.UnavailableForLegalReasons}
+		<li class='jc'>{@link org.apache.juneau.http.exception.UnprocessableEntity}
+		<li class='jc'>{@link org.apache.juneau.http.exception.UnsupportedMediaType}
+		<li class='jc'>{@link org.apache.juneau.http.exception.UpgradeRequired}
+		<li class='jc'>{@link org.apache.juneau.http.exception.UriTooLong}
+		<li class='jc'>{@link org.apache.juneau.http.exception.VariantAlsoNegotiates}
 	</ul>
 </ul>
 <p>
@@ -16287,6 +16292,8 @@
 			<li><c><jk>public static</jk> T <jsm>forString</jsm>(String in) {...}</c>
 		</ul>
 		Note that this also includes all enums.
+	<li>
+		Any {@link java.util.Optional} of anything on this list.
 </ol>
 <p>
 	The {@link org.apache.juneau.oapi.OpenApiSerializer} class can be used to serialize HTTP bodies to OpenAPI-based output.
@@ -16376,6 +16383,18 @@
 		<br>Values on methods override values on POJO classes.
 </ul>
 
+<div class='warn'>
+	If using this annotation on a Spring bean, note that you are likely to encounter issues when using on parameterized
+	types such as <code>List&lt;MyBean&gt;</code>.  This is due to the fact that Spring uses CGLIB to recompile classes
+ 	at runtime, and CGLIB was written before generics were introduced into Java and is a virtually-unsupported library.
+ 	Therefore, parameterized types will often be stripped from class definitions and replaced with unparameterized types
+	(e.g. <code>List</code>).  Under these circumstances, you are likely to get <code>ClassCastExceptions</code>
+	when trying to access generalized <code>ObjectMaps</code> as beans.  The best solution to this issue is to either
+	specify the parameter as a bean array (e.g. <code>MyBean[]</code>) or declare the method as final so that CGLIB
+	will not try to recompile it.
+</div>
+
+
 <ul class='seealso'>
 	<li class='jc'>{@link org.apache.juneau.rest.RequestBody}
 	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
@@ -16547,6 +16566,18 @@
 	<br>The {@link org.apache.juneau.http.annotation.Query @Query} annotation can be used to retrieve a URL parameter in the URL string without triggering the
 	servlet to drain the body content.
 </div>
+
+<div class='warn'>
+	If using this annotation on a Spring bean, note that you are likely to encounter issues when using on parameterized
+	types such as <code>List&lt;MyBean&gt;</code>.  This is due to the fact that Spring uses CGLIB to recompile classes
+ 	at runtime, and CGLIB was written before generics were introduced into Java and is a virtually-unsupported library.
+ 	Therefore, parameterized types will often be stripped from class definitions and replaced with unparameterized types
+	(e.g. <code>List</code>).  Under these circumstances, you are likely to get <code>ClassCastExceptions</code>
+	when trying to access generalized <code>ObjectMaps</code> as beans.  The best solution to this issue is to either
+	specify the parameter as a bean array (e.g. <code>MyBean[]</code>) or declare the method as final so that CGLIB
+	will not try to recompile it.
+</div>
+
 <ul class='seealso'>
 	<li class='jc'>{@link org.apache.juneau.rest.RequestFormData}
 	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
@@ -17347,7 +17378,7 @@
 	}
 </p>
 <p>
-	Custom exceptions can also extend from one of the predefined HTTP exceptions such as the {@link org.apache.juneau.rest.exception.Unauthorized} exception:
+	Custom exceptions can also extend from one of the predefined HTTP exceptions such as the {@link org.apache.juneau.http.exception.Unauthorized} exception:
 </p>
 <p class='bpcode w800'>
 	<jc>// Our annotated exception.</jc>
@@ -18082,7 +18113,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.ConfigurableProperties' id='juneau-rest-server.ConfigurableProperties'>7.15 - Configurable Properties</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.ConfigurableProperties' id='juneau-rest-server.ConfigurableProperties'>7.15 - Configurable Properties</a></h3>
 <div class='topic'><!-- START: 7.15 - juneau-rest-server.ConfigurableProperties -->
 <p>
 	As shown in previous sections, Juneau serializers and parsers are highly-configurable through properties.
@@ -18168,7 +18199,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.ConfigurableAnnotations' id='juneau-rest-server.ConfigurableAnnotations'>7.16 - Configurable Annotations</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.ConfigurableAnnotations' id='juneau-rest-server.ConfigurableAnnotations'>7.16 - Configurable Annotations</a></h3>
 <div class='topic'><!-- START: 7.16 - juneau-rest-server.ConfigurableAnnotations -->
 <p>
 	Config annotations allow you to define serializer and parser properties using specialized annotations.
@@ -18231,7 +18262,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.Transforms' id='juneau-rest-server.Transforms'>7.17 - Transforms</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.Transforms' id='juneau-rest-server.Transforms'>7.17 - Transforms</a></h3>
 <div class='topic'><!-- START: 7.17 - juneau-rest-server.Transforms -->
 <p>
 	The Juneau serializers and parsers can be configured on how to handle POJOs through the use of Transforms.
@@ -18453,7 +18484,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.RoleGuards' id='juneau-rest-server.RoleGuards'>7.20 - Role guards</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.RoleGuards' id='juneau-rest-server.RoleGuards'>7.20 - Role guards</a></h3>
 <div class='topic'><!-- START: 7.20 - juneau-rest-server.RoleGuards -->
 <p>
 	Specialized guards are provided for controlling access to servlet classes and methods based on user roles.
@@ -18481,7 +18512,7 @@
 	// can run any methods on this class.</jc>
 	<ja>@RestResource</ja>(
 		path=<js>"/foo"</js>,
-		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>
+		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>
 	)
 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {
 		...
@@ -18496,8 +18527,8 @@
 	<li><js>"foo | bar | baz"</js> - Multiple OR'ed arguments, pipe syntax.
 	<li><js>"foo || bar || baz"</js> - Multiple OR'ed arguments, Java-OR syntax.
 	<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.
-	<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
-	<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
+	<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
+	<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
 	<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.
 </ul>
 
@@ -18511,7 +18542,7 @@
 <p class='bpcode w800'>
 	<ja>@RestResource</ja>(
 		rolesDeclared=<js>"ROLE_ADMIN,ROLE_READ_WRITE,ROLE_READ_ONLY,ROLE_SPECIAL"</js>,
-		roleGuard=<js>"ROLE_ADMIN || (*WRITE* && *SPECIAL*)"</js>
+		roleGuard=<js>"ROLE_ADMIN || (*WRITE* &amp;&amp; *SPECIAL*)"</js>
 	)
 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {
 		...
@@ -19344,7 +19375,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.BasicRestServlet' id='juneau-rest-server.Swagger.BasicRestServlet'>7.29.1 - BasicRestServlet</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.BasicRestServlet' id='juneau-rest-server.Swagger.BasicRestServlet'>7.29.1 - BasicRestServlet</a></h4>
 <div class='topic'><!-- START: 7.29.1 - juneau-rest-server.Swagger.BasicRestServlet -->
 <p>
 	Any subclass of {@link org.apache.juneau.rest.BasicRestServlet} gets an auto-generated Swagger UI when performing an <c>OPTIONS</c>
@@ -19876,7 +19907,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.ParameterExamples' id='juneau-rest-server.Swagger.ParameterExamples'>7.29.6 - Parameter Examples</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.ParameterExamples' id='juneau-rest-server.Swagger.ParameterExamples'>7.29.6 - Parameter Examples</a></h4>
 <div class='topic'><!-- START: 7.29.6 - juneau-rest-server.Swagger.ParameterExamples -->
 <p>
 	The <c>model</c> select box in the parameters can be expanded to show examples:
@@ -20483,7 +20514,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation' id='juneau-rest-server.HtmlDocAnnotation'>7.30 - @HtmlDocConfig</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation' id='juneau-rest-server.HtmlDocAnnotation'>7.30 - @HtmlDocConfig</a></h3>
 <div class='topic'><!-- START: 7.30 - juneau-rest-server.HtmlDocAnnotation -->
 <p>
 	The {@link org.apache.juneau.html.annotation.HtmlDocConfig @HtmlDocConfig} annotation is used to customize the HTML 
@@ -21157,7 +21188,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic updated' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation.Stylesheets' id='juneau-rest-server.HtmlDocAnnotation.Stylesheets'>7.30.5 - Stylesheets</a></h4>
+<h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation.Stylesheets' id='juneau-rest-server.HtmlDocAnnotation.Stylesheets'>7.30.5 - Stylesheets</a></h4>
 <div class='topic'><!-- START: 7.30.5 - juneau-rest-server.HtmlDocAnnotation.Stylesheets -->
 <p>
 	The sample root page renders in the default "devops" look-and-feel:
@@ -21320,7 +21351,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.LoggingAndDebugging' id='juneau-rest-server.LoggingAndDebugging'>7.32 - Logging / Debugging</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server.LoggingAndDebugging' id='juneau-rest-server.LoggingAndDebugging'>7.32 - Logging / Debugging</a></h3>
 <div class='topic'><!-- START: 7.32 - juneau-rest-server.LoggingAndDebugging -->
 <p>
 	The REST APIs provides support for fine-tuned control of logging for HTTP requests and responses.
@@ -22330,7 +22361,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server-springboot.ChildResources' id='juneau-rest-server-springboot.ChildResources'>9.2 - Child Resources</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-server-springboot.ChildResources' id='juneau-rest-server-springboot.ChildResources'>9.2 - Child Resources</a></h3>
 <div class='topic'><!-- START: 9.2 - juneau-rest-server-springboot.ChildResources -->
 <p>
 	When using the <ja>@JuneauRestRoot</ja> annotation, servlet are given an instance of {@link org.apache.juneau.rest.springboot.SpringRestResourceResolver}.  
@@ -22614,10 +22645,10 @@
 	post parameters, or request/response bodies.
 </p>
 <ul class='javatree'>
-	<li class='jp'>{@link org.apache.juneau.rest.client.remote}
+	<li class='jp'>{@link org.apache.juneau.http.remote}
 	<ul>
-		<li class='ja'>{@link org.apache.juneau.rest.client.remote.RemoteResource}
-		<li class='ja'>{@link org.apache.juneau.rest.client.remote.RemoteMethod}
+		<li class='ja'>{@link org.apache.juneau.http.remote.RemoteResource}
+		<li class='ja'>{@link org.apache.juneau.http.remote.RemoteMethod}
 	</ul>
 	<li class='jp'>{@link org.apache.juneau.http.annotation}
 	<ul>
@@ -22672,13 +22703,13 @@
 <h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.RemoteResource' id='juneau-rest-client.RestProxies.RemoteResource'>10.1.1 - @RemoteResource</a></h4>
 <div class='topic'><!-- START: 10.1.1 - juneau-rest-client.RestProxies.RemoteResource -->
 <p>
-	The {@link org.apache.juneau.rest.client.remote.RemoteResource @RemoteResource} annotation is used on your interface class
+	The {@link org.apache.juneau.http.remote.RemoteResource @RemoteResource} annotation is used on your interface class
 	to identify it as a REST proxy interface.
 </p>
 <ul class='javatree'>
-	<li class='ja'>{@link org.apache.juneau.rest.client.remote.RemoteResource}
+	<li class='ja'>{@link org.apache.juneau.http.remote.RemoteResource}
 	<ul>
-		<li class='jf'>{@link org.apache.juneau.rest.client.remote.RemoteResource#path path}
+		<li class='jf'>{@link org.apache.juneau.http.remote.RemoteResource#path path}
 	</ul>
 </ul>
 <p>
@@ -22687,7 +22718,7 @@
 
 <h5 class='topic'>@RemoteResource(path)</h5>
 <p>
-	The {@link org.apache.juneau.rest.client.remote.RemoteResource#path @RemoteResource(path)} annotation is used to define the
+	The {@link org.apache.juneau.http.remote.RemoteResource#path @RemoteResource(path)} annotation is used to define the
 	HTTP path of the REST service.
 </p>
 <p>
@@ -22732,15 +22763,15 @@
 <h4 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.RemoteMethod' id='juneau-rest-client.RestProxies.RemoteMethod'>10.1.2 - @RemoteMethod</a></h4>
 <div class='topic'><!-- START: 10.1.2 - juneau-rest-client.RestProxies.RemoteMethod -->
 <p>
-	The {@link org.apache.juneau.rest.client.remote.RemoteMethod @RemoteMethod} annotation is applied to methods
+	The {@link org.apache.juneau.http.remote.RemoteMethod @RemoteMethod} annotation is applied to methods
 	of <ja>@RemoteResource</ja>-annotated interfaces to identify REST endpoints.
 </p>
 <ul class='javatree'>
-	<li class='ja'>{@link org.apache.juneau.rest.client.remote.RemoteMethod}
+	<li class='ja'>{@link org.apache.juneau.http.remote.RemoteMethod}
 	<ul>
-		<li class='jf'>{@link org.apache.juneau.rest.client.remote.RemoteMethod#method method}
-		<li class='jf'>{@link org.apache.juneau.rest.client.remote.RemoteMethod#path path}
-		<li class='jf'>{@link org.apache.juneau.rest.client.remote.RemoteMethod#returns returns}
+		<li class='jf'>{@link org.apache.juneau.http.remote.RemoteMethod#method method}
+		<li class='jf'>{@link org.apache.juneau.http.remote.RemoteMethod#path path}
+		<li class='jf'>{@link org.apache.juneau.http.remote.RemoteMethod#returns returns}
 	</ul>
 </ul>
 <h5 class='topic'>@RemoteMethod(method/path)</h5>
@@ -22862,8 +22893,8 @@
 </ul>
 
 <p>
-	If you're only interested in the HTTP status code of the response, you can use the {@link org.apache.juneau.rest.client.remote.RemoteMethod#returns() returns}
-	annotation with a value of {@link org.apache.juneau.rest.client.remote.RemoteReturn#STATUS STATUS}:
+	If you're only interested in the HTTP status code of the response, you can use the {@link org.apache.juneau.http.remote.RemoteMethod#returns() returns}
+	annotation with a value of {@link org.apache.juneau.http.remote.RemoteReturn#STATUS STATUS}:
 </p>
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>	
@@ -24314,7 +24345,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h2 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-mock' id='juneau-rest-mock'>11 - juneau-rest-mock</a></h2>
+<h2 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-mock' id='juneau-rest-mock'>11 - juneau-rest-mock</a></h2>
 <div class='topic'><!-- START: 11 - juneau-rest-mock -->
 <h5 class='figure'>Maven Dependency</h5>
 <p class='bpcode w500'>
@@ -24349,13 +24380,13 @@
 	<li class='jp'>{@link org.apache.juneau.rest.mock2}
 	<ul>
 		<li class='jc'>{@link org.apache.juneau.rest.mock2.MockRest} - API for unit testing {@link org.apache.juneau.rest.annotation.RestResource @RestResource}-annotated classes.
-		<li class='jc'>{@link org.apache.juneau.rest.mock2.MockRemoteResource} - API for unit testing {@link org.apache.juneau.rest.client.remote.RemoteResource @RemoteResource}-annotated classes.
+		<li class='jc'>{@link org.apache.juneau.rest.mock2.MockRemoteResource} - API for unit testing {@link org.apache.juneau.http.remote.RemoteResource @RemoteResource}-annotated classes.
 	</ul>
 </ul>
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-mock.MockRest' id='juneau-rest-mock.MockRest'>11.1 - MockRest</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-mock.MockRest' id='juneau-rest-mock.MockRest'>11.1 - MockRest</a></h3>
 <div class='topic'><!-- START: 11.1 - juneau-rest-mock.MockRest -->
 <p>
 	The {@link org.apache.juneau.rest.mock2.MockRest} class is used for performing serverless unit testing of {@link org.apache.juneau.rest.annotation.RestResource @RestResource}-annotated
@@ -24617,10 +24648,10 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-mock.MockRemoteResource' id='juneau-rest-mock.MockRemoteResource'>11.2 - MockRemoteResource</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-rest-mock.MockRemoteResource' id='juneau-rest-mock.MockRemoteResource'>11.2 - MockRemoteResource</a></h3>
 <div class='topic'><!-- START: 11.2 - juneau-rest-mock.MockRemoteResource -->
 <p>
-	The {@link org.apache.juneau.rest.mock2.MockRemoteResource} class is used for serverless unit testing of {@link org.apache.juneau.rest.client.remote.RemoteResource @RemoteResource}-annotated
+	The {@link org.apache.juneau.rest.mock2.MockRemoteResource} class is used for serverless unit testing of {@link org.apache.juneau.http.remote.RemoteResource @RemoteResource}-annotated
 	classes.  
 </p>
 <p>
@@ -27063,7 +27094,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic updated' onclick='toggle(this)'><a href='#juneau-examples-rest.RootResources' id='juneau-examples-rest.RootResources'>17.1 - RootResources</a></h3>
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-examples-rest.RootResources' id='juneau-examples-rest.RootResources'>17.1 - RootResources</a></h3>
 <div class='topic'><!-- START: 17.1 - juneau-examples-rest.RootResources -->
 <p>
 	The <l>RootResources</l> class is the main page for the REST microservice.
@@ -27276,1376 +27307,8 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-examples-rest.PetStoreResource' id='juneau-examples-rest.PetStoreResource'>17.3 - PetStore</a></h3>
-<div class='topic'><!-- START: 17.3 - juneau-examples-rest.PetStoreResource -->
-<p>
-	The <c>PetStore</c> application is an functional application meant to demonstrate the following:
-</p>
-<ul class='spaced-list'>
-	<li>
-		Creating a Juneau-based REST interface on top of JPA beans.
-	<li>
-		Creating sophisticated Swagger UI using only annotations.
-</ul>
-<p>
-	When you click the <l>petstore</l> link on the home page of the examples app, you should see this page:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.1.png'>
-
-<p>
-	The contents of this page is primarily defined via annotations defined on the <l>PetStoreResource</l> class:
-</p>
-
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		path=<js><js>"/petstore"</js></js>,
-		title=<js><js>"Petstore application"</js></js>,
-		description= {
-			<js><js>"This is a sample server Petstore server based on the Petstore sample at Swagger.io."</js></js>,
-			<js>"You can find out more about Swagger at &lt;a class='link' href='http://swagger.io'&gt;http://swagger.io&lt;/a&gt;."</js>,
-		},
-		htmldoc=<ja>@HtmlDoc</ja>(
-			widgets={
-				ContentTypeMenuItem.<jk>class</jk>,
-				ThemeMenuItem.<jk>class</jk>,
-			},
-			navlinks={
-				<js>"up: request:/.."</js>,
-				<js>"options: servlet:/?method=OPTIONS"</js>,
-				<js>"$W{ContentTypeMenuItem}"</js>,
-				<js>"$W{ThemeMenuItem}"</js>,
-				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/petstore/$R{servletClassSimple}.java"</js>
-			},
-			head={
-				<js>"&lt;link rel='icon' href='$U{servlet:/htdocs/cat.png}'/&gt;"</js>  <jc>// Add a cat icon to the page.</jc>
-			},
-			header={
-				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,
-				<js>"&lt;h2&gt;$R{methodSummary}&lt;/h2&gt;"</js>,
-				<js>"$C{PetStore/headerImage}"</js>
-			},
-			aside={
-				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
-				<js>"	&lt;p&gt;This page shows a standard nested REST resource.&lt;/p&gt;"</js>,
-				<js>"	&lt;p&gt;It shows how different properties can be rendered on the same bean in different views.&lt;/p&gt;"</js>,
-				<js>"	&lt;p&gt;It also shows examples of HtmlRender classes and @BeanProperty(format) annotations.&lt;/p&gt;"</js>,
-				<js>"	&lt;p&gt;It also shows how the Queryable converter and query widget can be used to create searchable interfaces.&lt;/p&gt;"</js>,
-				<js>"&lt;/div&gt;"</js>
-			},
-			stylesheet=<js>"servlet:/htdocs/themes/dark.css"</js>  <jc>// Use dark theme by default.</jc>
-		),
-		...
-		staticFiles={<js>"htdocs:htdocs"</js>},  <jc>// Expose static files in htdocs subpackage.</jc>  
-		children={
-			SqlQueryResource.<jk>class</jk>,
-			PhotosResource.<jk>class</jk>
-		}
-	)
-	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena {
-</p>
-<p>
-	The inner contents of the page are generated from this method which is used to define a jumping-off
-	page for the application:
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		name=<jsf>GET</jsf>,
-		path=<js>"/"</js>,
-		summary=<js>"Navigation page"</js>,
-		htmldoc=<ja>@HtmlDoc</ja>(
-			style={
-				<js>"INHERIT"</js>,  <jc>// Flag for inheriting resource-level CSS.</jc>
-				<js>"body { "</js>,
-					<js>"background-image: url('petstore/htdocs/background.jpg'); "</js>,
-					<js>"background-color: black; "</js>,
-					<js>"background-size: cover; "</js>,
-					<js>"background-attachment: fixed; "</js>,
-				<js>"}"</js>
-			}
-		)
-	)
-	<jk>public</jk> ResourceDescriptions getTopPage() {
-		<jk>return new</jk> ResourceDescriptions()
-			.append(<js>"pet"</js>, <js>"All pets in the store"</js>)
-			.append(<js>"store"</js>, <js>"Orders and inventory"</js>)
-			.append(<js>"user"</js>, <js>"Petstore users"</js>)
-			.append(<js>"photos"</js>, <js>"Photos service"</js>)
-			.append(<js>"sql"</js>, <js>"SQL query service"</js>)
-		;
-	}
-</p>
-<p>
-	Note how we used the <ja>@HtmlDoc</ja> annotation to add some CSS to our page
-	that renders our background image.  
-</p>
-<p>
-	The {@link org.apache.juneau.rest.helper.ResourceDescriptions} class used above is a convenience class for creating
-	hyperlinks to child resources. 
-</p>
-<hr>
-<p>
-	The application itself is defined in 3 packages:
-</p>
-<ul class='javatree'>
-	<li class='jp'><c>org.apache.juneau.rest.examples.rest.petstore</c>
-		<br>Defines the service for storing and retrieving Petstore data.
-		<br><img class='bordered' style='width:250px' src='doc-files/juneau-examples-rest.PetStoreResource.2a.png'>
-	<li class='jp'><c>org.apache.juneau.rest.examples.rest.petstore.dto</c>
-		<br>Data transfer objects.
-		<br>These are JPA beans that are used both to store data in our database and are serialized
-		directly by our REST interface.
-		<br><img class='bordered' style='width:250px' src='doc-files/juneau-examples-rest.PetStoreResource.2b.png'>
-	<li class='jp'><c>org.apache.juneau.rest.examples.rest.petstore.rest</c>
-		<br>The classes used for our REST interface.
-		<br><img class='bordered' style='width:250px' src='doc-files/juneau-examples-rest.PetStoreResource.2c.png'>
-</ul>
-<p>
-	We also define some static files in the <c>org.apache.juneau.rest.examples.rest.petstore</c> package:
-</p>
-<img class='bordered' style='width:250px' src='doc-files/juneau-examples-rest.PetStoreResource.2d.png'>
-<hr>
-<p>
-	The <l>PetStoreService</l> class is a pretty-straightforward service for storing and retrieving JPA beans:
-</p>
-<h5 class='figure'>PetStoreService.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> PetStoreService <jk>extends</jk> AbstractPersistenceService {
-	
-		<jk>public</jk> Pet getPet(<jk>long</jk> id) <jk>throws</jk> IdNotFound {
-			<jk>return</jk> find(Pet.<jk>class</jk>, id);
-		}
-	
-		<jk>public</jk> List&lt;Pet&gt; getPets() {
-			<jk>return</jk> query(<js>"select X from PetstorePet X"</js>, Pet.<jk>class</jk>, (SearchArgs)<jk>null</jk>);
-		}
-	
-		<jk>public</jk> Pet create(CreatePet c) {
-			<jk>return</jk> merge(new Pet().status(PetStatus.<jsf>AVAILABLE</jsf>).apply(c));
-		}
-	
-		<jk>public</jk> Pet update(UpdatePet u) <jk>throws</jk> IdNotFound {
-			EntityManager em = getEntityManager();
-			<jk>return</jk> merge(em, find(em, Pet.<jk>class</jk>, u.getId()).apply(u));
-		}
-	
-		<jk>public void</jk> removePet(<jk>long</jk> id) <jk>throws</jk> IdNotFound {
-			EntityManager em = getEntityManager();
-			remove(em, find(em, Pet.<jk>class</jk>, id));
-		}
-	
-		...
-	}
-</p>
-<p>
-	The DTOs are simply beans that combine both JPA and Juneau bean annotations:
-</p>
-<h5 class='figure'>Pet.java</h5>
-<p class='bpcode w800'>
-	<ja>@Bean</ja>(typeName=<js>"Pet"</js>, fluentSetters=<jk>true</jk>, properties=<js>"id,species,name,tags,price,status,photo"</js>)
-	<ja>@Entity</ja>(name=<js>"PetstorePet"</js>)
-	<jk>public class</jk> Pet {
-	
-		<ja>@Column @Id @GeneratedValue</ja>
-		<ja>@Schema</ja>(description=<js>"Unique identifier for this pet."</js>)
-		<ja>@Html</ja>(link=<js>"servlet:/pet/{id}"</js>)
-		<jk>private long</jk> <jf>id</jf>;
-	
-		<ja>@Column</ja>(length=50)
-		<ja>@Schema</ja>(description=<js>"Pet name."</js>, minLength=3, maxLength=50)
-		<jk>private</jk> String <jf>name</jf>;
-		
-		...
-	
-		<jk>public long</jk> getId() {
-			<jk>return</jk> <jf>id</jf>;
-		}
-	
-		<jk>public</jk> Pet id(<jk>long</jk> id) {
-			<jk>this</jk>.<jf>id</jf> = id;
-			<jk>return this</jk>;
-		}
-	
-		<jk>public</jk> String getName() {
-			<jk>return</jk> <jf>name</jf>;
-		}
-	
-		<jk>public</jk> Pet name(String name) {
-			<jk>this</jk>.<jf>name</jf> = name;
-			<jk>return this</jk>;
-		}
-		
-		...
-	}
-</p>
-<p>
-	The beans are found by JPA by adding them to the JPA persistence file. 
-</p>
-<h5 class='figure'>META-INF/persistence.xml</h5>
-<p class='bpcode w800'>
-	<xt>&lt;persistence&gt;</xt>
-		<xt>&lt;persistence-unit</xt> <xa>name</xa>=<xs>"test"</xs> <xa>transaction-type</xa>=<xs>"RESOURCE_LOCAL"</xs>&gt;</xt>
-			<xt>&lt;class&gt;</xt>org.apache.juneau.examples.rest.petstore.dto.Pet<xt>&lt;/class&gt;</xt>
-			<xt>&lt;class&gt;</xt>org.apache.juneau.examples.rest.petstore.dto.Order<xt>&lt;/class&gt;</xt>
-			<xt>&lt;class&gt;</xt>org.apache.juneau.examples.rest.petstore.dto.User<xt>&lt;/class&gt;</xt>
-			<xt>&lt;properties&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"javax.persistence.jdbc.driver"</xs> <xa>value</xa>=<xs>"org.apache.derby.jdbc.EmbeddedDriver"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"javax.persistence.jdbc.url"</xs> <xa>value</xa>=<xs>"jdbc:derby:target/derby/testDB;create=true"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"javax.persistence.jdbc.user"</xs> <xa>value</xa>=<xs>""</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"javax.persistence.jdbc.password"</xs> <xa>value</xa>=<xs>""</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"hibernate.dialect"</xs> <xa>value</xa>=<xs>"org.hibernate.dialect.DerbyDialect"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"hibernate.hbm2ddl.auto"</xs> <xa>value</xa>=<xs>"create-drop"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"show_sql"</xs> <xa>value</xa>=<xs>"true"</xs> <xt>/&gt;</xt>
-				<xt>&lt;property</xt> <xa>name</xa>=<xs>"hibernate.temp.use_jdbc_metadata_defaults"</xs> <xa>value</xa>=<xs>"false"</xs> <xt>/&gt;</xt>
-			<xt>&lt;/properties&gt;</xt>
-		<xt>&lt;/persistence-unit&gt;</xt>
-	<xt>&lt;/persistence&gt;</xt>
-</p>
-<p>
-	The Petstore service is instantiated in our REST interface using a hook.
-	Note that a real-world scenario would likely use some other means such as injection.
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena <jk>implements</jk> PetStore {
-	
-		<jk>private</jk> PetStoreService <jf>store</jf>;
-	
-		<ja>@RestHook</ja>(<jsf>INIT</jsf>)
-		<jk>public void</jk> startup(RestContextBuilder builder) <jk>throws</jk> Exception {
-			<jf>store</jf> = <jk>new</jk> PetStoreService();
-		}
-		
-		...
-</p>
-<hr>
-<p>
-	The Petstore database is empty by default.
-	The <l>INIT</l> link brings you to a page to initialize the contents of the database
-	from sample data:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/init
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.3a.png'>
-<p>
-	You can try loading the Petstore database using direct JPA or via REST calls through a client-side proxy.
-</p>
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.3b.png'>
-<p>
-	The initialize page is rendered using the following methods in our <l>PetStoreResource</l> class.
-	Note that we're using HTML5 beans to render the contents of the page, and 
-	the use of a direct unbuffered writer allowing for the creation
-	of a console-like window in an iframe.
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		summary=<js>"Initialize database form entry page"</js>
-	)
-	<jk>public</jk> Div getInit() {
-		<jk>return</jk> <jsm>div</jsm>(
-			<jsm>form</jsm>(<js>"servlet:/init"</js>).method(<jsf>POST</jsf>).target(<js>"buf"</js>).children(
-				<jsm>table</jsm>(
-					<jsm>tr</jsm>(
-						<jsm>th</jsm>(<js>"Initialize petstore database:"</js>),
-						<jsm>td</jsm>(<jsm>input</jsm>(<js>"radio"</js>).name(<js>"init-method"</js>).value(<js>"direct"</js>).checked(<jk>true</jk>), <js>"direct"</js>, <jsm>input</jsm>(<js>"radio"</js>).name(<js>"init-method"</js>).value(<js>"rest"</js>), <js>"rest"</js>),
-						<jsm>td</jsm>(<jsm>button</jsm>(<js>"submit"</js>, <js>"Submit"</js>).style(<js>"float:right"</js>).onclick(<js>"scrolling=true"</js>))
-					)
-				)
-			),
-			<jsm>br</jsm>(),
-			<jsm>iframe</jsm>().id(<js>"buf"</js>).name(<js>"buf"</js>).style(<js>"width:800px;height:600px;"</js>).onload(<js>"window.parent.scrolling=false;"</js>),
-			<jsm>script</jsm>(<js>"text/javascript"</js>,
-				<js>"var scrolling = false;"</js>,
-				<js>"function scroll() { if (scrolling) { document.getElementById('buf').contentWindow.scrollBy(0,50); } setTimeout('scroll()',200); } "</js>,
-				<js>"scroll();"</js>
-			)
-		);
-	}
-
-	<ja>@RestMethod</ja>(
-		summary=<js>"Initialize database"</js>
-	)
-	<jk>public void</jk> postInit(
-		<ja>@FormData</ja>(<js>"init-method"</js>) String initMethod,
-		RestResponse res
-	) <jk>throws</jk> Exception {
-		res.setHeader(<js>"Content-Encoding"</js>, <js>"identity"</js>);
-		<jk>if</jk> (<js>"direct"</js>.equals(initMethod))
-			<jf>store</jf>.initDirect(res.getDirectWriter(<js>"text/plain"</js>));
-		<jk>else</jk>
-			<jf>store</jf>.initViaRest(res.getDirectWriter(<js>"text/plain"</js>));
-	}
-</p>
-<p>
-	The direct initialization uses direct JPA to store beans in the database.
-	The following code in <l>PetStoreService</l> reads and parses DTOs from our init JSON files (e.g. <js>"init/Pets.json"</js>)
-	and stores them using the JPA <l>EntityManager</l> class.
-</p>
-<h5 class='figure'>PetStoreService.java</h5>
-<p class='bpcode w800'>
-	<jk>public</jk> PetStoreService initDirect(PrintWriter w) <jk>throws</jk> Exception {
-
-		EntityManager em = getEntityManager();
-		EntityTransaction et = em.getTransaction();
-		JsonParser parser = JsonParser.<jsm>create</jsm>().build();
-
-		et.begin();
-
-		<jk>for</jk> (Pet x : em.createQuery(<js>"select X from PetstorePet X"</js>, Pet.<jk>class</jk>).getResultList()) {
-			em.remove(x);
-			w.println(<jsm>format</jsm>(<js>"Deleted pet:  id={0}"</js>, x.getId()));
-		}
-		...
-
-		et.commit();
-		et.begin();
-
-		<jk>for</jk> (Pet x : parser.parse(getStream(<js>"init/Pets.json"</js>), Pet[].<jk>class</jk>)) {
-			x = em.merge(x);
-			w.println(<jsm>format</jsm>(<js>"Created pet:  id={0}, name={1}"</js>, x.getId(), x.getName()));
-		}
-		...
-
-		et.commit();
-
-		<jk>return this</jk>;
-	}
-
-	<jk>private</jk> InputStream getStream(String fileName) {
-		<jk>return</jk> getClass().getResourceAsStream(fileName);
-	}
-</p>
-<p>
-	The REST initialization uses a REST proxy interface to delete and store values in the database:
-	
-</p>
-<h5 class='figure'>PetStoreService.java</h5>
-<p class='bpcode w800'>
-	<jk>public</jk> PetStoreService initViaRest(PrintWriter w) <jk>throws</jk> Exception {
-		JsonParser parser = JsonParser.<jsm>create</jsm>().ignoreUnknownBeanProperties().build();
-
-		<jk>try</jk> (RestClient rc = RestClient.<jsm>create</jsm>().json().rootUrl(<js>"http://localhost:10000"</js>).build()) {
-			PetStore ps = rc.getRemoteResource(PetStore.<jk>class</jk>);
-
-			<jk>for</jk> (Pet x : ps.getPets()) {
-				ps.deletePet(<js>"apiKey"</js>, x.getId());
-				w.println(<jsm>format</jsm>(<js>"Deleted pet:  id={0}"</js>, x.getId()));
-			}
-			...
-			<jk>for</jk> (CreatePet x : parser.parse(getStream(<js>"init/Pets.json"</js>), CreatePet[].<jk>class</jk>)) {
-				<jk>long</jk> id = ps.postPet(x);
-				w.println(<jsm>format</jsm>(<js>"Created pet:  id={0}, name={1}"</js>, id, x.getName()));
-			}
-			...
-		}
-
-		<jk>return this</jk>;
-	}
-</p>
-<p>
-	The <l>PetStore</l> class is an interface annotated with <ja>@RemoteResource</ja> and <ja>@RemoteMethod</ja>
-	annotations defining how to communicate with our REST interface: 
-</p>
-<h5 class='figure'>PetStore.java</h5>
-<p class='bpcode w800'>
-	<ja>@RemoteResource</ja>(path=<js>"/petstore"</js>)
-	<jk>public interface</jk> PetStore {
-	
-		<ja>@RemoteMethod</ja>(method=<jsf>GET</jsf>, path=<js>"/pet"</js>)
-		<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable;
-	
-		<ja>@RemoteMethod</ja>(path=<js>"/pet/{petId}"</js>) <jc>/* method inferred from method name */</jc>
-		<jk>public</jk> Pet getPet(
-			<ja>@Path</ja>(
-				name=<js>"petId"</js>,
-				description=<js>"ID of pet to return"</js>,
-				example=<js>"123"</js>
-			)
-			<jk>long</jk> petId
-		) <jk>throws</jk> IdNotFound, NotAcceptable;
-	
-		<ja>@RemoteMethod</ja> <jc>/* method and path inferred from method name */</jc>
-		<jk>public long</jk> postPet(
-			<ja>@Body</ja>(
-				description=<js>"Pet object to add to the store"</js>
-			) CreatePet pet
-		) <jk>throws</jk> IdConflict, NotAcceptable, UnsupportedMediaType;
-	
-		<ja>@RemoteMethod</ja>(method=<jsf>PUT</jsf>, path=<js>"/pet/{petId}"</js>)
-		<jk>public</jk> Ok updatePet(
-			<ja>@Body</ja>(
-				description=<js>"Pet object that needs to be added to the store"</js>
-			) UpdatePet pet
-		) <jk>throws</jk> IdNotFound, NotAcceptable, UnsupportedMediaType;
-	
-		<ja>@RemoteMethod</ja>(method=<jsf>DELETE</jsf>, path=<js>"/pet/{petId}"</js>)
-		<jk>public</jk> Ok deletePet(
-			<ja>@Header</ja>(
-				name=<js>"api_key"</js>,
-				description=<js>"Security API key"</js>,
-				required=<jk>true</jk>,
-				example=<js>"foobar"</js>
-			)
-			String apiKey,
-			<ja>@Path</ja>(
-				name=<js>"petId"</js>,
-				description=<js>"Pet id to delete"</js>,
-				example=<js>"123"</js>
-			)
-			<jk>long</jk> petId
-		) <jk>throws</jk> IdNotFound, NotAcceptable;
-		
-		...
-	}
-</p>
-<p>
-	Note that this is the same interface used to define our server-side REST implementation!
-	The annotations defined on the method parameters used for client-side proxies are also
-	inherited by and used for our server-side implementation class.
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena <jk>implements</jk> PetStore {
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			name=<jsf>GET</jsf>,
-			path=<js>"/pet"</js>,
-			summary=<js>"All pets in the store"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				parameters={
-					Queryable.<jsf>SWAGGER_PARAMS</jsf>
-				}
-			),
-			bpx=<js>"Pet: tags,photo"</js>,
-			htmldoc=<ja>@HtmlDoc</ja>(
-				widgets={
-					QueryMenuItem.<jk>class</jk>,
-					AddPetMenuItem.<jk>class</jk>
-				},
-				navlinks={
-					<js>"INHERIT"</js>,                <jc>// Inherit links from class.</jc>
-					<js>"[2]:$W{QueryMenuItem}"</js>,  <jc>// Insert QUERY link in position 2.</jc>
-					<js>"[3]:$W{AddPetMenuItem}"</js>  <jc>// Insert ADD link in position 3.</jc>
-				}
-			),
-			converters={Queryable.<jk>class</jk>}
-		)
-		<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
-			<jk>return</jk> <jf>store</jf>.getPets();
-		}
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			name=<jsf>GET</jsf>,
-			path=<js>"/pet/{petId}"</js>,
-			summary=<js>"Find pet by ID"</js>,
-			description=<js>"Returns a single pet"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				value={
-					<js>"security:[ { api_key:[] } ]"</js>
-				}
-			)
-		)
-		<jk>public</jk> Pet getPet(<jk>long</jk> petId) <jk>throws</jk> IdNotFound, NotAcceptable {
-			<jk>return</jk> <jf>store</jf>.getPet(petId);
-		}
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			summary=<js>"Add a new pet to the store"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				value={
-					<js>"security:[ { petstore_auth:['write:pets','read:pets'] } ]"</js>
-				}
-			)
-		)
-		<jk>public long</jk> postPet(CreatePet pet) <jk>throws</jk> IdConflict, NotAcceptable, UnsupportedMediaType {
-			<jk>return</jk> <jf>store</jf>.create(pet).getId();
-		}
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			name=<jsf>PUT</jsf>,
-			path=<js>"/pet/{petId}"</js>,
-			summary=<js>"Update an existing pet"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				value={
-					<js>"security:[ { petstore_auth: ['write:pets','read:pets'] } ]"</js>
-				}
-			)
-		)
-		<jk>public</jk> Ok updatePet(UpdatePet pet) <jk>throws</jk> IdNotFound, NotAcceptable, UnsupportedMediaType {
-			<jf>store</jf>.update(pet);
-			<jk>return</jk> <jsf>OK</jsf>;
-		}
-	
-		<ja>@Override</ja> <jc>/* PetStore */</jc>
-		<ja>@RestMethod</ja>(
-			name=<jsf>DELETE</jsf>,
-			path=<js>"/pet/{petId}"</js>,
-			summary=<js>"Deletes a pet"</js>,
-			swagger=<ja>@MethodSwagger</ja>(
-				tags=<js>"pet"</js>,
-				value={
-					<js>"security:[ { petstore_auth:[ 'write:pets','read:pets' ] } ]"</js>
-				}
-			)
-		)
-		<jk>public</jk> Ok deletePet(String apiKey, <jk>long</jk> petId) <jk>throws</jk> IdNotFound, NotAcceptable {
-			<jf>store</jf>.removePet(petId);
-			<jk>return</jk> <jsf>OK</jsf>;
-		}
-		...
-	}
-</p>
-<p>
-	The advantage to using a common interface for both your server-side and client-side APIs is that you
-	have less of a chance of a mismatch between the server and client side definitions.
-</p>
-<hr>
-<p>	
-	Now that we've initialized the contents of our database, we can start exploring the REST interface.
-	We can start by click the <l>pet</l> link on the home page which takes you to a summary page of <l>Pet</l>
-	objects:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.4a.png'>
-
-<p>
-	Clicking on one of the ID links takes you to a details page:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet/1
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.4b.png'>
-<p>
-	You'll notice the details page shows <l>tags</l> and <l>photo</l> fields not shown on the summary page.
-	This was accomplished with the <c>bpx=<js>"Pet: tags,photo"</js></c> annotation on the <l>getPets()</l>
-	method which excludes those two properties from the view. 
-	This is a common way of defining summary and details views for POJOs.
-</p>
-<p>
-	The hyperlinks and special rendering for <l>Pet</l> objects is done through <ja>@Html</ja> annotations
-	and {@link org.apache.juneau.html.HtmlRender} objects.
-</p>
-<h5 class='figure'>Pet.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> Pet {
-	
-		<ja>@Html</ja>(link=<js>"servlet:/pet/{id}"</js>)
-		<jk>private long</jk> <jf>id</jf>;
-	
-		<ja>@Html</ja>(render=PriceRender.<jk>class</jk>)
-		<jk>private float</jk> <jf>price</jf>;
-	
-		<jk>private</jk> Species <jf>species</jf>;
-	
-		<jk>private</jk> PetStatus <jf>status</jf>;
-		
-		...
-
-		<jk>public static final class</jk> PriceRender <jk>extends</jk> HtmlRender&lt;Float&gt; {
-			<ja>@Override</ja> <jc>/* HtmlRender */</jc>
-			<jk>public</jk> Object getContent(SerializerSession session, Float value) {
-				<jk>return</jk> value == <jk>null</jk> ? <jk>null</jk> : String.<jsm>format</jsm>(<js>"$%.2f"</js>, value);
-			}
-		}
-		
-		...
-</p>
-
-<h5 class='figure'>Species.java</h5>
-<p class='bpcode w800'>
-	<ja>@Html</ja>(render=Species.SpeciesRender.<jk>class</jk>)
-	<jk>public enum</jk> Species {
-	
-		<jsf>BIRD</jsf>, <jsf>CAT</jsf>, <jsf>DOG</jsf>, <jsf>FISH</jsf>, <jsf>MOUSE</jsf>, <jsf>RABBIT</jsf>, <jsf>SNAKE</jsf>;
-	
-		<jk>public static class</jk> SpeciesRender <jk>extends</jk> HtmlRender&lt;Species&gt; {
-			<ja>@Override</ja> <jc>/* HtmlRender */</jc>
-			<jk>public</jk> Object getContent(SerializerSession session, Species value) {
-				<jk>return new</jk> Img().src(<js>"servlet:/htdocs/"</js>+value.name().toLowerCase()+<js>".png"</js>);
-			}
-			<ja>@Override</ja> <jc>/* HtmlRender */</jc>
-			<jk>public</jk> String getStyle(SerializerSession session, Species value) {
-				<jk>return</jk> <js>"background-color:#FDF2E9"</js>;
-			}
-		}
-	}
-</p>
-
-<h5 class='figure'>PetStatus.java</h5>
-<p class='bpcode w800'>
-	<ja>@Html</ja>(render=PetStatus.PetStatusRender.<jk>class</jk>)
-	<jk>public enum</jk> PetStatus {
-		
-		<jsf>AVAILABLE</jsf>, <jsf>PENDING</jsf>, <jsf>SOLD</jsf>, <jsf>UNKNOWN</jsf>;
-	
-		<jk>public static class</jk> PetStatusRender <jk>extends</jk> HtmlRender&lt;PetStatus&gt; {
-			<ja>@Override</ja> <jc>/* HtmlRender */</jc>
-			<jk>public</jk> String getStyle(SerializerSession session, PetStatus value) {
-				<jk>switch</jk>(value) {
-					<jk>case</jk> <jsf>AVAILABLE</jsf>:  <jk>return</jk> <js>"background-color:#5cb85c;text-align:center;vertical-align:middle;"</js>;
-					<jk>case</jk> <jsf>PENDING</jsf>:  <jk>return</jk> <js>"background-color:#f0ad4e;text-align:center;vertical-align:middle;"</js>;
-					<jk>case</jk> <jsf>SOLD</jsf>:  <jk>return</jk> <js>"background-color:#888;text-align:center;vertical-align:middle;"</js>;
-					<jk>default</jk>:  <jk>return</jk> <js>"background-color:#777;text-align:center;vertical-align:middle;"</js>;
-				}
-			}
-		}
-	}
-</p>
-<p>
-	The <l>CONTENT-TYPE</l> menu items gives a shorthand way of showing our POJOs in any of the supported
-	serialization languages:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet/1
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.5a.png'>
-<p>
-	For example, selecting <l>APPLICATION/JSON+SIMPLE</l> shows us simplified JSON:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet?plainText=true&amp;Accept=application%2Fjson%2Bsimple
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.5b.png'>
-<p>
-	Note that we're using the convenience feature for specifying an <c>Accept</c> header via a query parameter.
-</p>
-<p>
-	The <l>THEME</l> menu items allows you to quickly change the stylesheet used on the page:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet/1
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.6a.png'>
-<p>
-	For example, selecting <l>LIGHT</l> shows us the page rendered using the light look-and-feel:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet?stylesheet=htdocs%2Fthemes%2Flight.css
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.6b.png'>
-<p>
-	Both the <l>CONTENT-TYPE</l> and <l>THEMES</l> menu items are implemented as widgets and
-	associated with the page contents through the use of <l>$W</l> variables in the navigation links:
-</p>
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		htmldoc=<ja>@HtmlDoc</ja>(
-			widgets={
-				ContentTypeMenuItem.<jk>class</jk>,
-				ThemeMenuItem.<jk>class</jk>,
-			},
-			navlinks={
-				<js>"up: request:/.."</js>,
-				<js>"options: servlet:/?method=OPTIONS"</js>,
-				<js>"init: servlet:/init"</js>,
-				<js>"$W{ContentTypeMenuItem}"</js>,
-				<js>"$W{ThemeMenuItem}"</js>,
-				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/petstore/$R{servletClassSimple}.java"</js>
-			},
-			...
-		),
-		...
-</p>
-<p>
-	The implementation of a menu item contains methods for retrieving the label and HTML5 content of the menu item.
-</p>
-<h5 class='figure'>ContentTypeMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> ContentTypeMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) {
-			<jk>return</jk> <js>"content-type"</js>;
-		}
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> Div getContent(RestRequest req) {
-			Div div = <jsm>div</jsm>();
-			Set&lt;MediaType&gt; l = <jk>new</jk> TreeSet&lt;&gt;();
-			<jk>for</jk> (Serializer s : req.getSerializers().getSerializers())
-				l.add(s.getPrimaryMediaType());
-			<jk>for</jk> (MediaType mt : l) {
-				URI uri = req.getUri(<jk>true</jk>, <jk>new</jk> AMap&lt;String,String&gt;().append(<js>"plainText"</js>,<js>"true"</js>).append(<js>"Accept"</js>,mt.toString()));
-				div.children(<jsm>a</jsm>(uri, mt), <jsm>br</jsm>());
-			}
-			<jk>return</jk> div;
-		}
-	}
-</p>
-
-<h5 class='figure'>ThemeMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> ThemeMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<jk>private static final</jk> String[] <jsf>BUILT_IN_STYLES</jsf> = {<js>"devops"</js>, <js>"light"</js>, <js>"original"</js>, <js>"dark"</js>};
-	
-		<ja>@Override</ja> <jc>/* Widget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) {
-			<jk>return</jk> "themes";
-		}
-		
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> Div getContent(RestRequest req) <jk>throws</jk> Exception {
-			Div div = <jsm>div</jsm>();
-			<jk>for</jk> (String s : <jsf>BUILT_IN_STYLES</jsf>) {
-				java.net.URI uri = req.getUri(<jk>true</jk>, <jk>new</jk> AMap&lt;String,String&gt;().append(<js>"stylesheet"</js>, <js>"htdocs/themes/"</js>+s+<js>".css"</js>));
-				div.children(<jsm>a</jsm>(uri, s), <jsm>br</jsm>());
-			}
-			<jk>return</jk> div;
-		}
-	}
-</p>
-<p>
-	The <l>QUERY</l> menu item shows off the capabilities of the {@link org.apache.juneau.rest.converters.Queryable} converter.
-</p>
-
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet
-</p>		
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.7a.png'>
-<p>
-	The converter will take the POJOs to be serialized and filter them based on the provided query/view/sort/paging attributes:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet?s=name%3DHoppy*&amp;v=species%2Cname&amp;o=name&amp;p=0&amp;l=20
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.7b.png'>
-<p>
-	The <l>ADD</l> menu item is a custom menu item created for the petstore app for adding pets through the 
-	web interface.
-</p>
-
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/pet
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.8a.png'>
-
-<p>
-	Both the <l>QUERY</l> and <l>ADD</l> menu items are only applicable for this page, and so are defined
-	on the <l>getPets()</l> method: 
-</p>
-
-<h5 class='figure'>PetStoreResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@Override</ja> <jc>/* PetStore */</jc>
-	<ja>@RestMethod</ja>(
-		name=<jsf>GET</jsf>,
-		path=<js>"/pet"</js>,
-		summary=<js>"All pets in the store"</js>,
-		swagger=<ja>@MethodSwagger</ja>(
-			tags=<js>"pet"</js>,
-			parameters={
-				Queryable.<jsf>SWAGGER_PARAMS</jsf>
-			}
-		),
-		bpx=<js>"Pet: tags,photo"</js>,
-		htmldoc=<ja>@HtmlDoc</ja>(
-			widgets={
-				QueryMenuItem.<jk>class</jk>,
-				AddPetMenuItem.<jk>class</jk>
-			},
-			navlinks={
-				<js>"INHERIT"</js>,                <jc>// Inherit links from class.</jc>
-				<js>"[2]:$W{QueryMenuItem}"</js>,  <jc>// Insert QUERY link in position 2.</jc>
-				<js>"[3]:$W{AddPetMenuItem}"</js>  <jc>// Insert ADD link in position 3.</jc>
-			}
-		),
-		converters={Queryable.<jk>class</jk>}
-	)
-	<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
-		<jk>return</jk> <jf>store</jf>.getPets();
-	}
-</p>
-
-<h5 class='figure'>QueryMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> QueryMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<ja>@Override</ja> <jc>/* Widget */</jc>
-		<jk>public</jk> String getStyle(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return super</jk>.getStyle(req)
-				+ <js>"\n"</js>
-				+ <jsm>loadStyle</jsm>(<js>"QueryMenuItem.css"</js>);
-		}
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <js>"query"</js>;
-		}
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getContent(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <jsm>loadHtml</jsm>(<js>"QueryMenuItem.html"</js>);
-		}
-	}
-</p>
-
-<h5 class='figure'>AddPetMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> AddPetMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <js>"add"</js>;
-		}
-	
-		<ja>@Override</ja> <jc>/* Widget */</jc>
-		<jk>public</jk> Object getContent(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <jsm>div</jsm>(
-				<jsm>form</jsm>().id(<js>"form"</js>).action(<js>"servlet:/pet"</js>).method(<jsf>POST</jsf>).children(
-					<jsm>table</jsm>(
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"Name:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"name"</js>).type(<js>"text"</js>)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The name of the pet."</js>, <jsm>br</jsm>(), <js>"e.g. 'Fluffy'"</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"Species:"</js>),
-							<jsm>td</jsm>(
-								<jsm>select</jsm>().name(<js>"species"</js>).children(
-									<jsm>option</jsm>(<js>"CAT"</js>), <jsm>option</jsm>(<js>"DOG"</js>), <jsm>option</jsm>(<js>"BIRD"</js>), <jsm>option</jsm>(<js>"FISH"</js>), <jsm>option</jsm>(<js>"MOUSE"</js>), <jsm>option</jsm>(<js>"RABBIT"</js>), <jsm>option</jsm>(<js>"SNAKE"</js>)
-								)
-							),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The kind of animal."</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"Price:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"price"</js>).type(<js>"number"</js>).placeholder(<js>"1.0"</js>).step(<js>"0.01"</js>).min(1).max(100).value(9.99)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The price to charge for this pet."</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"Tags:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"tags"</js>).type(<js>"text"</js>)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"Arbitrary textual tags (comma-delimited)."</js>, <jsm>br</jsm>(), <js>"e.g. 'fluffy,friendly'"</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>td</jsm>().colspan(2).style(<js>"text-align:right"</js>).children(
-								<jsm>button</jsm>(<js>"reset"</js>, <js>"Reset"</js>),
-								<jsm>button</jsm>(<js>"button"</js>,<js>"Cancel"</js>).onclick(<js>"window.location.href='/'"</js>),
-								<jsm>button</jsm>(<js>"submit"</js>, <js>"Submit"</js>)
-							)
-						)
-					).style(<js>"white-space:nowrap"</js>)
-				)
-			);
-		}
-	}
-</p>
-<hr>
-<p>
-	The <l>OPTIONS</l> menu items takes you to the auto-generated Swagger UI for the application:
-</p>
-<p class='bpcode w900'>
-	http://localhost:10000/petstore/pet?method=OPTIONS
-</p>			
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9a.png'>
-<p>
-	Since we've defined tags on our annotations, the pet-related operations are all grouped under the <l>pet</l> tag:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9b.png'>
-<p>
-	Information for all HTTP parts is automatically generated:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9h.png'>
-<p>
-	The schema models for POJO models is available in the <l>Responses</l> section of an operation:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9c.png'>
-<p>
-	Auto-generated examples are available for all supported languages:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9d.png'>
-<p>
-	For example, <l>application/json+simple</l>:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9e.png'>
-<p>
-	Examples can be derived in a number of ways.  In our case, we've defined a static method on our <l>Pet</l>
-	class annotated with <ja>@Example</ja>:
-</p>
-<h5 class='figure'>Pet.java</h5>
-<p class='bpcode w800'>
-	<ja>@Example</ja>
-	<jk>public static</jk> Pet example() {
-		<jk>return new</jk> Pet()
-			.id(123)
-			.species(Species.<jsf>DOG</jsf>)
-			.name(<js>"Doggie"</js>)
-			.tags(<js>"friendly"</js>,<js>"smart"</js>)
-			.status(PetStatus.<jsf>AVAILABLE</jsf>);
-	}
-</p>
-<p>
-	Similar functionality exists for request bodies as well:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9f.png'>
-<p>
-	At the bottom of the page is a listing of the POJO models in the app:
-</p>
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.9g.png'>
-<hr>
-<p>
-	The <l>PhotosResource</l> class provides capabilities for uploading and viewing image files.
-	It demonstrates the capabilities of defining your own custom serializers and parsers and using
-	multi-part form posts to upload binary data.
-</p>
-
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/photos
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.10a.png'>
-
-<p>
-	The <l>PhotoResource</l> 'database' is simply a map of keys to <l>Photo</l> beans and uses the Java-provided
-	<l>BufferedImage</l> class for representing images.
-</p>
-
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		path=<js>"/photos"</js>,
-		...
-	)
-	<jk>public class</jk> PhotosResource <jk>extends</jk> BasicRestServlet {
-	
-		<jd>/** Our cache of photos */</jd>
-		<jk>private</jk> Map&lt;String,Photo&gt; <jf>photos</jf> = <jk>new</jk> TreeMap&lt;&gt;();
-	
-		<jd>/** Our bean class for storing photos */</jd>
-		<jk>public static class</jk> Photo {
-			String <jf>id</jf>;
-			BufferedImage <jf>image</jf>;
-	
-			Photo(String id, BufferedImage image) {
-				<jk>this</jk>.<jf>id</jf> = id;
-				<jk>this</jk>.<jf>image</jf> = image;
-			}
-	
-			<jk>public</jk> URI getURI() <jk>throws</jk> URISyntaxException {
-				<jk>return new</jk> URI(<js>"servlet:/"</js> + id);
-			}
-		}
-</p>
-
-<p>
-	The contents of the home page simply renders our collection of photo beans:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>	
-	<ja>@RestMethod</ja>(
-		name=<jsf>GET</jsf>,
-		path=<js>"/"</js>,
-		summary=<js>"Show the list of all currently loaded photos"</js>
-	)
-	<jk>public</jk> Collection&lt;Photo&gt; getAllPhotos() <jk>throws</jk> Exception {
-		<jk>return</jk> <jf>photos</jf>.values();
-	}
-</p>
-
-<p>
-	Clicking on one of the hyperlinks renders the stored image for us:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/photos/cat
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.10b.png'>
-
-<p>
-	The method for retrieving images simply returns a <l>BufferedImage</l> file:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		name=<jsf>GET</jsf>,
-		path=<js>"/{id}"</js>,
-		serializers=ImageSerializer.<jk>class</jk>,
-		summary=<js>"Get a photo by ID"</js>,
-		description=<js>"Shows how to use a custom serializer to serialize a BufferedImage object to a stream."</js>
-	)
-	<ja>@Response</ja>(
-		schema=<ja>@Schema</ja>(type=<js>"file"</js>)
-	)
-	<jk>public</jk> BufferedImage getPhoto(<ja>@Path</ja>(<js>"id"</js>) String id) <jk>throws</jk> NotFound {
-		Photo p = <jf>photos</jf>.get(id);
-		<jk>if</jk> (p == <jk>null</jk>)
-			<jk>throw new</jk> NotFound(<js>"Photo not found"</js>);
-		<jk>return</jk> p.<jf>image</jf>;
-	}
-</p>
-
-<p>
-	The <l>BufferedImage</l> object is converted to a stream using a custom {@link org.apache.juneau.serializer.OutputStreamSerializer}:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<jd>/** Serializer for converting images to byte streams */</jd>
-	<jk>public static class</jk> ImageSerializer <jk>extends</jk> OutputStreamSerializer {
-
-		<jk>public</jk> ImageSerializer(PropertyStore ps) {
-			<jk>super</jk>(ps, <jk>null</jk>, <js>"image/png,image/jpeg"</js>);
-		}
-
-		<ja>@Override</ja> <jc>/* Serializer */</jc>
-		<jk>public</jk> OutputStreamSerializerSession createSession(SerializerSessionArgs args) {
-			<jk>return new</jk> OutputStreamSerializerSession(args) {
-
-				<ja>@Override</ja> <jc>/* SerializerSession */</jc>
-				<jk>protected void</jk> doSerialize(SerializerPipe out, Object o) <jk>throws</jk> Exception {
-					RenderedImage image = (RenderedImage)o;
-					String mediaType = getProperty(<js>"mediaType"</js>, String.<jk>class</jk>, (String)<jk>null</jk>);
-					ImageIO.<jsm>write</jsm>(image, mediaType.substring(mediaType.indexOf(<js>'/'</js>)+1), out.getOutputStream());
-				}
-			};
-		}
-	}
-</p>
-<p>
-	Likewise, the body of requests can also be instances of <l>BufferedImage</l>:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		name=<jsf>PUT</jsf>,
-		path=<js>"/{id}"</js>,
-		parsers=ImageParser.<jf>class</jf>,
-		summary=<js>"Add or overwrite a photo"</js>,
-		description=<js>"Shows how to use a custom parser to parse a stream into a BufferedImage object."</js>
-	)
-	<jk>public</jk> String addPhoto(
-			<ja>@Path</ja>(<js>"id"</js>) String id,
-			<ja>@Body</ja>(
-				description=<js>"Binary contents of image."</js>,
-				schema=<ja>@Schema</ja>(type=<js>"file"</js>)
-			)
-			BufferedImage image
-		) <jk>throws</jk> Exception {
-		<jf>photos</jf>.put(id, <jk>new</jk> Photo(id, image));
-		<jk>return</jk> <js>"OK"</js>;
-	}
-</p>
-<p>
-	The <l>BufferedImage</l> object is created from a stream using a custom {@link org.apache.juneau.parser.InputStreamParser}:
-</p>
-
-<h5 class='figure'>PhotosResource.java</h5>
-<p class='bpcode w800'>
-	<jd>/** Parser for converting byte streams to images */</jd>
-	<jk>public static class</jk> ImageParser <jk>extends</jk> InputStreamParser {
-
-		<jk>public</jk> ImageParser(PropertyStore ps) {
-			<jk>super</jk>(ps, <js>"image/png"</js>, <js>"image/jpeg"</js>);
-		}
-
-		<ja>@Override</ja> <jc>/* Parser */</jc>
-		<jk>public</jk> InputStreamParserSession createSession(<jk>final</jk> ParserSessionArgs args) {
-			<jk>return new</jk> InputStreamParserSession(args) {
-
-				<ja>@Override</ja> <jc>/* ParserSession */</jc>
-				<jk>protected</jk> &lt;T&gt; T doParse(ParserPipe pipe, ClassMeta&lt;T&gt; type) <jk>throws</jk> Exception {
-					<jk>return</jk> (T)ImageIO.read(pipe.getInputStream());
-				}
-			};
-		}
-	}
-</p>
-<p>
-	A custom menu item is provided for uploading new images:
-</p>
-<p class='bpcode w800'>
-	http://localhost:10000/petstore/photos
-</p>			
-<img class='bordered w800' src='doc-files/juneau-examples-rest.PetStoreResource.10c.png'>
-
-<p>
-	The menu item is defined as a <l>MenuItemWidget</l>:
-</p>
-
-<h5 class='figure'>UploadPhotoMenuItem.java</h5>
-<p class='bpcode w800'>
-	<jk>public class</jk> UploadPhotoMenuItem <jk>extends</jk> MenuItemWidget {
-	
-		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
-		<jk>public</jk> String getLabel(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <js>"upload"</js>;
-		}
-	
-		<ja>@Override</ja> <jc>/* Widget */</jc>
-		<jk>public</jk> Object getContent(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> <jsm>div</jsm>(
-				<jsm>form</jsm>().id(<js>"form"</js>).action(<js>"servlet:/upload"</js>).method(<jsf>POST</jsf>).enctype(<js>"multipart/form-data"</js>).children(
-					<jsm>table</jsm>(
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"ID:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"id"</js>).type(<js>"text"</js>)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The unique identifier of the photo."</js>, <jsm>br</jsm>(), <js>"e.g. 'Fluffy'"</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>th</jsm>(<js>"File:"</js>),
-							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"file"</js>).type(<js>"file"</js>).accept(<js>"image/*"</js>)),
-							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"&amp;#x2753;"</js>, <js>"The image file."</js>))
-						),
-						<jsm>tr</jsm>(
-							<jsm>td</jsm>().colspan(2).style(<js>"text-align:right"</js>).children(
-								<jsm>button</jsm>(<js>"reset"</js>, <js>"Reset"</js>),
-								<jsm>button</jsm>(<js>"button"</js>,<js>"Cancel"</js>).onclick(<js>"window.location.href='/'"</js>),
-								<jsm>button</jsm>(<js>"submit"</js>, <js>"Submit"</js>)
-							)
-						)
-					).style(<js>"white-space:nowrap"</js>)
-				)
-			);
-		}
-	}
-</p>
-<p>
-	The menu item then submits multi-part form posts to the following method:
-</p>
-<h5 class='figure'>PhotosResource.java</h5>
-<hr>
-<p>
-	The <l>SqlQueryResource</l> class is a simple utility for performing raw SQL queries against our Derby database:
-</p>
-<p class='bpcode w900'>
-	http://localhost:10000/petstore/sql
-</p>			
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.11a.png'>
-<p>
-	For example, viewing all of the <l>Pet</l> objects in the database:
-</p>
-<p class='bpcode w900'>
-	http://localhost:10000/petstore/sql?sql=select+*+from+PetstorePet
-</p>			
-<img class='bordered w900' src='doc-files/juneau-examples-rest.PetStoreResource.11b.png'>
-
-<p>
-	The <l>SqlQueryResource</l> is implemented as a single class with database connection information:
-</p>
-
-<h5 class='figure'>SqlQueryResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestResource</ja>(
-		path=<js>"/sql"</js>,
-		title=<js>"SQL query service"</js>,
-		description=<js>"Executes queries against the local derby '$C{SqlQueryResource/connectionUrl}' database"</js>,
-		htmldoc=<ja>@HtmlDoc</ja>(
-			widgets={
-				ThemeMenuItem.<jk>class</jk>
-			},
-			navlinks={
-				<js>"up: request:/.."</js>,
-				<js>"options: servlet:/?method=OPTIONS"</js>,
-				<js>"$W{ThemeMenuItem}"</js>,
-				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
-			},
-			aside={
-				<js>"&lt;div style='min-width:200px' class='text'&gt;"</js>,
-				<js>"	&lt;p&gt;An example of a REST interface over a relational database that serializes ResultSet objects.&lt;/p&gt;"</js>,
-				<js>"	&lt;p&gt;Specify one or more queries delimited by semicolons.&lt;/p&gt;"</js>,
-				<js>"	&lt;h5&gt;Examples:&lt;/h5&gt;"</js>,
-				<js>"	&lt;ul&gt;"</js>,
-				<js>"		&lt;li&gt;&lt;a class='link' href='?sql=select+*+from+sys.systables'&gt;Tables&lt;/a&gt;"</js>,
-				<js>"		&lt;li&gt;&lt;a class='link' href='?sql=select+*+from+PetstorePet'&gt;Pets&lt;/a&gt;"</js>,
-				<js>"		&lt;li&gt;&lt;a class='link' href='?sql=select+*+from+PetstoreOrder'&gt;Orders&lt;/a&gt;"</js>,
-				<js>"		&lt;li&gt;&lt;a class='link' href='?sql=select+*+from+PetstoreUser'&gt;Users&lt;/a&gt;"</js>,
-				<js>"	&lt;/ul&gt;"</js>,
-				<js>"&lt;/div&gt;"</js>
-			},
-			stylesheet=<js>"servlet:/htdocs/themes/dark.css"</js>
-		),
-		swagger=<ja>@ResourceSwagger</ja>(
-			contact=<ja>@Contact</ja>(name=<js>"Juneau Developer"</js>,email=<js>"dev@juneau.apache.org"</js>),
-			license=<ja>@License</ja>(name=<js>"Apache 2.0"</js>,url=<js>"http://www.apache.org/licenses/LICENSE-2.0.html"</js>),
-			version=<js>"2.0"</js>,
-			termsOfService=<js>"You are on your own."</js>,
-			externalDocs=<ja>@ExternalDocs</ja>(description=<js>"Apache Juneau"</js>,url=<js>"http://juneau.apache.org"</js>)
-		)
-	)
-	<jk>public class</jk> SqlQueryResource <jk>extends</jk> BasicRestServlet {
-
-		<jk>private</jk> String <jf>driver</jf>, <jf>connectionUrl</jf>;
-		<jk>private boolean</jk> <jf>allowUpdates</jf>, <jf>allowTempUpdates</jf>, <jf>includeRowNums</jf>;
-
-		...
-</p>
-<p>
-	The connection information is pulled from the <l>examples.cfg</l> file using an init hook:
-</p>
-<h5 class='figure'>SqlQueryResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestHook</ja>(<jsf>INIT</jsf>)
-	<jk>public void</jk> initConnection(RestContextBuilder builder) <jk>throws</jk> Exception {
-		Config cf = builder.getConfig();
-
-		<jf>driver</jf> = cf.getString(<js>"SqlQueryResource/driver"</js>);
-		<jf>connectionUrl</jf> = cf.getString(<js>"SqlQueryResource/connectionUrl"</js>);
-		<jf>allowUpdates</jf> = cf.getBoolean(<js>"SqlQueryResource/allowUpdates"</js>, <jk>false</jk>);
-		<jf>allowTempUpdates</jf> = cf.getBoolean(<js>"SqlQueryResource/allowTempUpdates"</js>, <jk>false</jk>);
-		<jf>includeRowNums</jf> = cf.getBoolean(<js>"SqlQueryResource/includeRowNums"</js>, <jk>false</jk>);
-
-		<jk>try</jk> {
-			Class.<jsm>forName</jsm>(<jf>driver</jf>).newInstance();
-		} <jk>catch</jk> (Exception e) {
-			<jk>throw new</jk> RuntimeException(e);
-		}
-	}
-</p>
-<p>
-	The query entry page is rendered using HTML5 beans:
-</p>
-<h5 class='figure'>SqlQueryResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		summary=<js>"Display the query entry page"</js>
-	)
-	<jk>public</jk> Div get(
-			<ja>@Query</ja>(
-				name=<js>"sql"</js>, 
-				description=<js>"Text to prepopulate the SQL query field with."</js>, 
-				example=<js>"select * from sys.systables"</js>
-			) 
-			String sql
-		) {
-
-		<jk>return</jk> <jsm>div</jsm>(
-			<jsm>script</jsm>(<js>"text/javascript"</js>,
-				<js>"// Quick and dirty function to allow tabs in textarea."</js>,
-				<js>"function checkTab(e) {"</js>,
-				<js>"	if (e.keyCode == 9) {"</js>,
-				<js>"		var t = e.target;"</js>,
-				<js>"		var ss = t.selectionStart, se = t.selectionEnd;"</js>,
-				<js>"		t.value = t.value.slice(0,ss).concat('\\t').concat(t.value.slice(ss,t.value.length));"</js>,
-				<js>"		e.preventDefault();"</js>,
-				<js>"	}"</js>,
-				<js>"}"</js>,
-				<js>"// Load results from IFrame into this document."</js>,
-				<js>"function loadResults(b) {"</js>,
-				<js>"	var doc = b.contentDocument || b.contentWindow.document;"</js>,
-				<js>"	var data = doc.getElementById('data') || doc.getElementsByTagName('body')[0];"</js>,
-				<js>"	document.getElementById('results').innerHTML = data.innerHTML;"</js>,
-				<js>"}"</js>
-			),
-			<jsm>form</jsm>(<js>"servlet:/"</js>).method(<jsf>POST</jsf>).target(<js>"buf"</js>).children(
-				<jsm>table</jsm>(
-					<jsm>tr</jsm>(
-						<jsm>th</jsm>(<js>"Position (1-10000):"</js>).style(<js>"white-space:nowrap"</js>),
-						<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"pos"</js>).type(<js>"number"</js>).value(1)),
-						<jsm>th</jsm>(<js>"Limit (1-10000):"</js>).style(<js>"white-space:nowrap"</js>),
-						<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"limit"</js>).type(<js>"number"</js>).value(100)),
-						<jsm>td</jsm>(button(<js>"submit"</js>, <js>"Submit"</js>), <jsm>button</jsm>(<js>"reset"</js>, <js>"Reset"</js>))
-					),
-					<jsm>tr</jsm>(
-						<jsm>td</jsm>().colspan(5).children(
-							<jsm>textarea</jsm>().name(<js>"sql"</js>).text(sql == <jk>null</jk> ? " " : sql).style(<js>"width:100%;height:200px;font-family:Courier;font-size:9pt;"</js>).onkeydown(<js>"checkTab(event)"</js>)
-						)
-					)
-				)
-			),
-			<jsm>br</jsm>(),
-			<jsm>div</jsm>().id(<js>"results"</js>),
-			<jsm>iframe</jsm>().name(<js>"buf"</js>).style(<js>"display:none"</js>).onload(<js>"parent.loadResults(this)"</js>)
-		);
-	}
-</p>
-<p>
-	The form then submits its results to the following method using a form input bean:
-</p>
-<h5 class='figure'>SqlQueryResource.java</h5>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(
-		summary=<js>"Execute one or more queries"</js>
-	)
-	<ja>@Response</ja>(
-		description=<js>"Query results.\nEach entry in the array is a result of one query.\nEach result can be a result set (for queries) or update count (for updates)."</js>
-	)
-	<jk>public</jk> List&lt;Object&gt; post(
-			<ja>@Body</ja>(
-				description=<js>"Query input"</js>,
-				example=<js>"{sql:'select * from sys.systables',pos:1,limit:100}"</js>
-			)
-			PostInput in
-		) <jk>throws</jk> BadRequest {
-
-		List&lt;Object&gt; results = <jk>new</jk> LinkedList&lt;&gt;();
-
-		<jc>// Don't try to submit empty input.</jc>
-		<jk>if</jk> (isEmpty(in.<jf>sql</jf>))
-			<jk>return</jk> results;
-
-		<jk>if</jk> (in.<jf>pos</jf> &lt; 1 || in.<jf>pos</jf> > 10000)
-			<jk>throw new</jk> BadRequest(<js>"Invalid value for position.  Must be between 1-10000"</js>);
-		<jk>if</jk> (in.<jf>limit</jf> &lt; 1 || in.<jf>limit</jf> > 10000)
-			<jk>throw new</jk> BadRequest(<js>"Invalid value for limit.  Must be between 1-10000"</js>);
-
-		String sql = <jk>null</jk>;
-
-		<jc>// Create a connection and statement.
-		// If these fails, let the exception filter up as a 500 error.</jc>
-		<jk>try</jk> (Connection c = DriverManager.<jsm>getConnection</jsm>(connectionUrl)) {
-			c.setAutoCommit(<jk>false</jk>);
-			<jk>try</jk> (Statement st = c.createStatement()) {
-				<jk>for</jk> (String s : in.<jf>sql</jf>.split(<js>";"</js>)) {
-					sql = s.trim();
-					<jk>if</jk> (! sql.isEmpty()) {
-						Object o = <jk>null</jk>;
-						<jk>if</jk> (<jf>allowUpdates</jf> || (<jf>allowTempUpdates</jf> &amp;&amp; ! sql.matches(<js>"(?:i)commit.*"</js>))) {
-							<jk>if</jk> (st.execute(sql)) {
-								<jk>try</jk> (ResultSet rs = st.getResultSet()) {
-									o = <jk>new</jk> ResultSetList(rs, in.<jf>pos</jf>, in.<jf>limit</jf>, <jf>includeRowNums</jf>);
-								}
-							} <jk>else</jk> {
-								o = st.getUpdateCount();
-							}
-						} <jk>else</jk> {
-							<jk>try</jk> (ResultSet rs = st.executeQuery(sql)) {
-								o = <jk>new</jk> ResultSetList(rs, in.<jf>pos</jf>, in.<jf>limit</jf>, <jf>includeRowNums</jf>);
-							}
-						}
-						results.add(o);
-					}
-				}
-			}
-			<jk>if</jk> (<jf>allowUpdates</jf>)
-				c.commit();
-			<jk>else if</jk> (<jf>allowTempUpdates</jf>)
-				c.rollback();
-		} <jk>catch</jk> (SQLException e) {
-			<jk>throw new</jk> BadRequest(e, <js>"Invalid query:  {0}"</js>, sql);
-		}
-
-		<jk>return</jk> results;
-	}
-
-	<jk>public static class</jk> PostInput {
-		<jk>public</jk> String <jf>sql</jf> = <js>""</js>;
-		<jk>public int</jk> <jf>pos</jf> = 1, <jf>limit</jf> = 100;
-	}
-</p>
-<p>
-	Note that we could have also used <ja>@FormData</ja> parameters as well.
-</p>
-</div><!-- END: 17.3 - juneau-examples-rest.PetStoreResource -->
-
-<!-- ==================================================================================================== -->
-
-<h3 class='topic updated' onclick='toggle(this)'><a href='#juneau-examples-rest.DtoExamples' id='juneau-examples-rest.DtoExamples'>17.4 - DtoExamples</a></h3>
-<div class='topic'><!-- START: 17.4 - juneau-examples-rest.DtoExamples -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-examples-rest.DtoExamples' id='juneau-examples-rest.DtoExamples'>17.3 - DtoExamples</a></h3>
+<div class='topic'><!-- START: 17.3 - juneau-examples-rest.DtoExamples -->
 <p>
 	The <l>DtoExamples</l> resource is a resource group for demonstrating various DTO examples.
 </p>
@@ -28861,12 +27524,12 @@
 		} 
 	} 		
 </p>
-</div><!-- END: 17.4 - juneau-examples-rest.DtoExamples -->
+</div><!-- END: 17.3 - juneau-examples-rest.DtoExamples -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-examples-rest.ConfigResource' id='juneau-examples-rest.ConfigResource'>17.5 - ConfigResource</a></h3>
-<div class='topic'><!-- START: 17.5 - juneau-examples-rest.ConfigResource -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-examples-rest.ConfigResource' id='juneau-examples-rest.ConfigResource'>17.4 - ConfigResource</a></h3>
+<div class='topic'><!-- START: 17.4 - juneau-examples-rest.ConfigResource -->
 <p>
 	The {@link org.apache.juneau.microservice.resources.ConfigResource} class is a predefined reusable resource.
 	It provides a REST interface for reading and altering the microservice config file.
@@ -29016,12 +27679,12 @@
 		} 
 	} 		
 </p>
-</div><!-- END: 17.5 - juneau-examples-rest.ConfigResource -->
+</div><!-- END: 17.4 - juneau-examples-rest.ConfigResource -->
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-examples-rest.LogsResource' id='juneau-examples-rest.LogsResource'>17.6 - LogsResource</a></h3>
-<div class='topic'><!-- START: 17.6 - juneau-examples-rest.LogsResource -->
+<h3 class='topic ' onclick='toggle(this)'><a href='#juneau-examples-rest.LogsResource' id='juneau-examples-rest.LogsResource'>17.5 - LogsResource</a></h3>
+<div class='topic'><!-- START: 17.5 - juneau-examples-rest.LogsResource -->
 <p>
 	The {@link org.apache.juneau.microservice.resources.LogsResource} class is a reusable predefined resource.
 	It provides a REST interface for the log files generated by the microservice.
@@ -29033,7 +27696,7 @@
 	http://localhost:10000/logs
 </p>			
 <img class='bordered w800' src='doc-files/juneau-examples-rest.LogsResource.1.png'>
-</div><!-- END: 17.6 - juneau-examples-rest.LogsResource -->
+</div><!-- END: 17.5 - juneau-examples-rest.LogsResource -->
 </div><!-- END: 17 - juneau-examples-rest -->
 
 <!-- ==================================================================================================== -->
@@ -30038,7 +28701,8 @@
 <li><p><a class='doclink' href='#7.2.1'>7.2.1 (Oct 23, 2018)</a></p>
 <li><p><a class='doclink' href='#7.2.2'>7.2.2 (Nov 7, 2018)</a></p>
 <li><p><a class='doclink' href='#8.0.0'>8.0.0 (Jan 01, 2019)</a></p>
-<li><p><a class='doclink' href='#8.1.0'>8.1.0 (TBD)</a></p>
+<li><p><a class='doclink' href='#8.1.0'>8.1.0 (Aug 21, 2019)</a></p>
+<li><p><a class='doclink' href='#8.1.1'>8.1.1 (TBD)</a></p>
 </ul>
 
 	
@@ -36176,7 +34840,7 @@
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic' onclick='toggle(this)'><a href='#8.1.0' id='8.1.0'>8.1.0 (TBD)</a></h3>
+<h3 class='topic' onclick='toggle(this)'><a href='#8.1.0' id='8.1.0'>8.1.0 (Aug 21, 2019)</a></h3>
 <div class='topic'><!-- START: 8.1.0 -->
 <p>
 	8.1.0 introduces some significant new features including:
@@ -36517,5 +35181,93 @@
 </ul>
 </div><!-- END: 8.1.0 -->
 
+<!-- ==================================================================================================== -->
+
+<h3 class='topic' onclick='toggle(this)'><a href='#8.1.1' id='8.1.1'>8.1.1 (TBD)</a></h3>
+<div class='topic'><!-- START: 8.1.1 -->
+<p>
+	TODO
+</p>
+
+<h5 class='topic w800'>juneau-marshall</h5>
+<ul class='spaced-list'>
+	<li>
+		Support for serializing/parsing {@link java.util.Optional} objects and bean properties.
+	<li>
+		Fixed a bug in the parsers where the generic subtype of a complex bean property type involving both collections and arrays
+		was not being found.  (e.g. <c>List&lt;Long&gt;[]</c>)
+	<li>
+		New packages of HTTP response/exceptions beans from <c>juneau-rest-server</c> bundle and REST proxy annotations from <c>juneau-rest-client</c> 
+		so that they can be used when building REST proxy interfaces while only pulling in the marshall bundle.
+		<ul>
+			<li class='jp'>{@link org.apache.juneau.http.response}
+			<li class='jp'>{@link org.apache.juneau.http.exception}
+			<li class='jp'>{@link org.apache.juneau.http.remote}
+		</ul>
+		These replace the <c>org.apache.juneau.rest.response</c>, <c>org.apache.juneau.rest.exception</c>, and <c>org.apache.juneau.rest.client.remote</c> packages.
+	<li>
+		Defaulting SVL variables now won't ignore additional parameters.
+		<br><js>"$S{Foo,bar,baz}"</js> used to default to <js>"bar"</js> but now will default to <js>"bar,baz"</js>.
+	<li>
+		Ranking support has been added to all <ja>@XConfig</ja> annotations.
+		This allows you to override the normal precedence of application of config annotations on class and method hierarchies.
+</ul>
+
+<h5 class='topic w800'>juneau-rest-server</h5>
+<ul class='spaced-list'>
+	<li>
+		Support for {@link java.util.Optional} on method parameters annotated with {@link org.apache.juneau.http.annotation.Header}, {@link org.apache.juneau.http.annotation.FormData},  
+		{@link org.apache.juneau.http.annotation.Query}, {@link org.apache.juneau.http.annotation.Path}.
+	<li>
+		Fixed issue where {@link org.apache.juneau.rest.annotation.RestMethod#debug() RestMethod.debug()} annotation wasn't resulting
+		in the HTTP request being logged.
+	<li>
+		{@link org.apache.juneau.rest.RestException} has been deprecated and replaced by {@link org.apache.juneau.http.exception.HttpException}.
+	<li>
+		Resolved issue where parameterized types on <ja>@RestMethod</ja>-annotated method parameters of Spring beans.
+		This is due to Spring relying on CGLIB for runtime-recompilation of beans that results in loss of parameterized-type
+		information.  
+		<br>In the following example, the <c>beans</c> parameter would resolve as an unparameterized <c>List</c>
+		which would typically result in getting a <c>List&lt;ObjectMap&gt;<c> and subsequent <c>ClassCastExceptions</c>.   
+		<p class='bpcode w800'>
+	<ja>@RestMethod</ja>
+	<jk>public void</jk> doFoo(<ja>@Body</ja> List&lt;MyBean&gt; beans) {...}
+		</p>
+		The fix involves resolving the original bean class for resolving parameterized type while leaving
+		method invocation on the proxy method so as not to bypass Spring features.
+	<li>
+		New methods on {@link org.apache.juneau.rest.BasicRest} to provide feature-parity with {@link org.apache.juneau.rest.RestServlet}:
+		<ul class='javatree'>
+			<li class='jc'>{@link org.apache.juneau.rest.BasicRest}
+			<ul>
+				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#getContext() getContext()}
+				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#getRequest() getRequest()}
+				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#getResponse() getResponse()}
+				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#log(String) log(String)}
+				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#log(String,Throwable) log(String,Throwable)}
+				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#log(Level,String,Object[]) log(Level,String,Object[])}
+				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#logObjects(Level,String,Object[]) logObjects(Level,String,Object[])}
+				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#log(Level,Throwable,String,Object[]) log(Level,Throwable,String,Object[])}
+			</ul>
+		</ul>
+	<li>
+		The <c>@RestResource(staticFiles)</c> annotation now supports absolute path locations and multiple mappings:
+		<p class='bpcode w800'>
+	<jc>// Resolves static files in root package "htdocs" or working directory "htdocs", and then relative package "htdocs".</jc>
+	<ja>@RestResource</ja>(staticFiles=<js>"htdocs:/htdocsfolder,htdocs:htdocs.package"</js>)
+		</p>
+	<li>
+		Fixed a bug in <c>@RestResource(staticFiles)</c> where the order of lookup between parent and child resources
+		was wrong.
+</ul>
+
+<h5 class='topic w800'>juneau-rest-client</h5>
+<ul class='spaced-list'>
+	<li>
+		Removed the dependency on the <c>juneau-rest-server</c> module.  
+		Allows the client API to be used without pulling in all the javax.servlet and server dependencies.
+</ul>
+</div><!-- END: 8.1.1 -->
+
 </div>
 </body>								
diff --git a/juneau-doc/src/main/javadoc/resources/docs.txt b/juneau-doc/src/main/javadoc/resources/docs.txt
index 06c0958..1ab4526 100644
--- a/juneau-doc/src/main/javadoc/resources/docs.txt
+++ b/juneau-doc/src/main/javadoc/resources/docs.txt
@@ -32,6 +32,7 @@
 Security.juneau-marshall = #Security.juneau-marshall, Overview > Security Best-Practices > juneau-marshall
 Security.juneau-rest-server = #Security.juneau-rest-server, Overview > Security Best-Practices > juneau-rest-server
 Security.juneau-svl = #Security.juneau-svl, Overview > Security Best-Practices > juneau-svl
+SimpleJson = #juneau-marshall.JsonDetails.SimplifiedJson, Simple JSON
 Source.juneau- = https://github.com/apache/juneau/blob/master/juneau-core/juneau-dto, Source
 Source.juneau-config = https://github.com/apache/juneau/blob/master/juneau-core/juneau-config, Source
 Source.juneau-dto = https://github.com/apache/juneau/blob/master/juneau-core/juneau-dto, Source
@@ -114,7 +115,6 @@
 juneau-examples-rest.DtoExamples = #juneau-examples-rest.DtoExamples, Overview > juneau-examples-rest > DtoExamples
 juneau-examples-rest.HelloWorldResource = #juneau-examples-rest.HelloWorldResource, Overview > juneau-examples-rest > HelloWorldResource
 juneau-examples-rest.LogsResource = #juneau-examples-rest.LogsResource, Overview > juneau-examples-rest > LogsResource
-juneau-examples-rest.PetStoreResource = #juneau-examples-rest.PetStoreResource, Overview > juneau-examples-rest > PetStore
 juneau-examples-rest.RootResources = #juneau-examples-rest.RootResources, Overview > juneau-examples-rest > RootResources
 juneau-marshall = #juneau-marshall, Overview > juneau-marshall
 juneau-marshall-rdf = #juneau-marshall-rdf, Overview > juneau-marshall-rdf
diff --git a/juneau-doc/src/main/javadoc/resources/fragments/toc.html b/juneau-doc/src/main/javadoc/resources/fragments/toc.html
index 41c7c83..316eb6e 100644
--- a/juneau-doc/src/main/javadoc/resources/fragments/toc.html
+++ b/juneau-doc/src/main/javadoc/resources/fragments/toc.html
@@ -15,7 +15,7 @@
 <ol class='toc'>
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#Introduction'>Introduction</a></p>
 	<ol>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#Introduction.Features'>Features</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#Introduction.Features'>Features</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#Introduction.Components'>Components</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall'>juneau-marshall</a></p>
@@ -28,26 +28,26 @@
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ConfigurableProperties'>Configurable Properties</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ConfigurableProperties.Common'>Common Serializer Properties</a></p>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a></p>
 			<li><p class='update'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ConfigurableProperties.CommonParser'>Common Parser Properties</a></p>
 		</ol>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ConfigurableAnnotations'>Configurable Annotations</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ConfigurableAnnotations'>Configurable Annotations</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ObjectMap'>ObjectMap and ObjectList</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Groups'>SerializerGroups and ParserGroups</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.ContextsBuildersSessionsPropertyStores'>Contexts, Builders, Sessions, and PropertyStores</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms'>Transforms</a></p>
 		<ol>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.PojoSwaps'>PojoSwaps</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.PojoSwaps'>PojoSwaps</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.DefaultPojoSwaps'>Default PojoSwaps</a></p>
-			<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.AutoPojoSwaps'>Auto-detected POJO swaps</a></p>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.PerMediaTypePojoSwaps'>Per-media-type PojoSwaps</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.AutoPojoSwaps'>Auto-detected POJO swaps</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.PerMediaTypePojoSwaps'>Per-media-type PojoSwaps</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.OneWayPojoSwaps'>One-way PojoSwaps</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.SwapAnnotation'>@Swap Annotation</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.TemplatedSwaps'>Templated Swaps</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.SurrogateClasses'>Surrogate Classes</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.BeanAnnotation'>@Bean Annotation</a></p>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.BeanPropertyAnnotation'>@BeanProperty Annotation</a></p>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.BeanConstructorAnnotation'>@BeanConstructor Annotation</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.BeanPropertyAnnotation'>@BeanProperty Annotation</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.BeanConstructorAnnotation'>@BeanConstructor Annotation</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.BeanIgnoreAnnotation'>@BeanIgnore Annotation</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.NamePropertyAnnotation'>@NameProperty Annotation</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-marshall.Transforms.ParentPropertyAnnotation'>@ParentProperty Annotation</a></p>
@@ -149,9 +149,9 @@
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-svl'>juneau-svl</a></p>
 	<ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-svl.SimpleVarLanguage'>Simple Variable Language</a></p>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-svl.SvlVariables'>SVL Variables</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-svl.SvlVariables'>SVL Variables</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-svl.VarResolvers'>VarResolvers and VarResolverSessions</a></p>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-svl.DefaultVarResolver'>VarResolver.DEFAULT</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-svl.DefaultVarResolver'>VarResolver.DEFAULT</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-svl.OtherNotes'>Other Notes</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-config'>juneau-config</a></p>
@@ -184,7 +184,7 @@
 		</ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-config.Listeners'>Listeners</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-config.Serializing'>Serializing</a></p>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-config.Imports'>Imports</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-config.Imports'>Imports</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-config.ConfigStores'>Config Stores</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-config.ConfigStores.ConfigMemoryStore'>ConfigMemoryStore</a></p>
@@ -194,27 +194,27 @@
 		</ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-config.ReadOnlyConfigs'>Read-only Configs</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-config.ClosingConfigs'>Closing Configs</a></p>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-config.SystemDefaultConfig'>System Default Config</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-config.SystemDefaultConfig'>System Default Config</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server'>juneau-rest-server</a></p>
 	<ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HelloWorldExample'>Hello World Example</a></p>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.ClassHierarchy'>Class Hierarchy</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.ClassHierarchy'>Class Hierarchy</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation'>Instantiation</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.RestServlet'>RestServlet</a></p>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.BasicRestServlet'>BasicRestServlet</a></p>
-			<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.BasicRest'>BasicRest</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.BasicRestServlet'>BasicRestServlet</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.BasicRest'>BasicRest</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.Children'>Children</a></p>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.BasicRestServletGroup'>BasicRestServletGroup</a></p>
-			<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.BasicRestGroup'>BasicRestGroup</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.BasicRestServletGroup'>BasicRestServletGroup</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.BasicRestGroup'>BasicRestGroup</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.ResourceResolvers'>Resource Resolvers</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Instantiation.LifecycleHooks'>Lifecycle Hooks</a></p>
 		</ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestResource'>@RestResource</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestResource.AnnotationInheritance'>Annotation Inheritance</a></p>
-			<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestResource.RestResourcePath'>@RestResource(path)</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestResource.RestResourcePath'>@RestResource(path)</a></p>
 		</ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestContext'>RestContext</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod'>@RestMethod</a></p>
@@ -224,7 +224,7 @@
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod.RestResponse'>RestResponse</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod.RequestBody'>RequestBody</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod.RequestHeaders'>RequestHeaders</a></p>
-			<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod.RequestAttributes'>RequestAttributes</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod.RequestAttributes'>RequestAttributes</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod.RequestQuery'>RequestQuery</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod.RequestFormData'>RequestFormData</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RestMethod.RestMethodPath'>@RestMethod(path)</a></p>
@@ -258,12 +258,12 @@
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HandlingMultiPartFormPosts'>Handling Multi-Part Form Posts</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Serializers'>Serializers</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Parsers'>Parsers</a></p>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.ConfigurableProperties'>Configurable Properties</a></p>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.ConfigurableAnnotations'>Configurable Annotations</a></p>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Transforms'>Transforms</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.ConfigurableProperties'>Configurable Properties</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.ConfigurableAnnotations'>Configurable Annotations</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Transforms'>Transforms</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.URIs'>URIs</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Guards'>Guards</a></p>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RoleGuards'>Role guards</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.RoleGuards'>Role guards</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Converters'>Converters</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Messages'>Messages</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Encoders'>Encoders</a></p>
@@ -277,27 +277,27 @@
 		</ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger'>Swagger</a></p>
 		<ol>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.BasicRestServlet'>BasicRestServlet</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.BasicRestServlet'>BasicRestServlet</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.BasicSwaggerInfo'>Basic Swagger Info</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.Tags'>Tags</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.Operations'>Operations</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.Parameters'>Parameters</a></p>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.ParameterExamples'>Parameter Examples</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.ParameterExamples'>Parameter Examples</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.Responses'>Responses</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.ResponseExamples'>Response Examples</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.Models'>Models</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.Swagger.Stylesheet'>SwaggerUI.css</a></p>
 		</ol>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HtmlDocAnnotation'>@HtmlDocConfig</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HtmlDocAnnotation'>@HtmlDocConfig</a></p>
 		<ol>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HtmlDocAnnotation.UIvsDI'>User Interfaces (UI) vs. Developer Interfaces (DI)</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HtmlDocAnnotation.Widgets'>Widgets</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets'>Predefined Widgets</a></p>
 			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HtmlDocAnnotation.UiCustomization'>UI Customization</a></p>
-			<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HtmlDocAnnotation.Stylesheets'>Stylesheets</a></p>
+			<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HtmlDocAnnotation.Stylesheets'>Stylesheets</a></p>
 		</ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.DefaultHeaders'>Default Headers</a></p>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.LoggingAndDebugging'>Logging / Debugging</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.LoggingAndDebugging'>Logging / Debugging</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.HttpStatusCodes'>HTTP Status Codes</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.OverloadingHttpMethods'>Overloading HTTP Methods</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server.BuiltInParameters'>Built-in Parameters</a></p>
@@ -314,7 +314,7 @@
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></p>
 	<ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot.Overview'>Overview</a></p>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot.ChildResources'>Child Resources</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot.ChildResources'>Child Resources</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-client'>juneau-rest-client</a></p>
 	<ol>
@@ -345,10 +345,10 @@
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-client.Interceptors'>Interceptors</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-client.Other'>Other Useful Methods</a></p>
 	</ol>
-	<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-mock'>juneau-rest-mock</a></p>
+	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-mock'>juneau-rest-mock</a></p>
 	<ol>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-mock.MockRest'>MockRest</a></p>
-		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-mock.MockRemoteResource'>MockRemoteResource</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-mock.MockRest'>MockRest</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-mock.MockRemoteResource'>MockRemoteResource</a></p>
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-microservice-core'>juneau-microservice-core</a></p>
 	<ol>
@@ -393,10 +393,9 @@
 	</ol>
 	<li><p class='toc2'><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest'>juneau-examples-rest</a></p>
 	<ol>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.RootResources'>RootResources</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.RootResources'>RootResources</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.HelloWorldResource'>HelloWorldResource</a></p>
-		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.PetStoreResource'>PetStore</a></p>
-		<li><p class='updated'><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.DtoExamples'>DtoExamples</a></p>
+		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.DtoExamples'>DtoExamples</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.ConfigResource'>ConfigResource</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.LogsResource'>LogsResource</a></p>
 	</ol>
diff --git a/juneau-doc/src/main/javadoc/resources/juneau-doc.css b/juneau-doc/src/main/javadoc/resources/juneau-doc.css
index 6ee48e0..6236e11 100755
--- a/juneau-doc/src/main/javadoc/resources/juneau-doc.css
+++ b/juneau-doc/src/main/javadoc/resources/juneau-doc.css
@@ -110,9 +110,20 @@
 	cursor: zoom-out;

 	max-width: 1000px;

 }

+h5.topic {

+	margin-bottom: 20px;

+	margin-top: 40px;

+	padding-top: 3px;

+	padding-left: 10px;

+	color: #2c4557;

+	border-top: 1px groove #9eadc0;

+	max-width: 1000px;

+}

+

 h2.topic { font-size: 14pt; }

 h3.topic { font-size: 13pt; }

 h4.topic { font-size: 12pt; }

+h5.topic { font-size: 11pt; }

 

 .topic p {

 	max-width: 800px;

@@ -213,7 +224,6 @@
 

 /* Light-colored background headers */

 h5.toc, 

-h5.topic, 

 h2.title,

 div.docSummary > div.block,

 div.contentContainer > div.block > p:first-child {

@@ -245,13 +255,6 @@
 	box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.5);

 }

 

-h5.topic {

-	color: #2C4557;

-	padding: 5px 20px;

-	margin: 30px 10px 10px 0px;

-	text-decoration: none;

-}

-

 /* Light-colored title on package summary pages */

 div.docSummary > div.block,

 div.contentContainer > div.block > p:first-child {

@@ -487,3 +490,15 @@
 	background-color: #faced3;

 	border-left: 3px solid #b32400;

 }

+

+.new {

+	background-color:lightgreen;

+}

+

+.updated {

+	background-color:#CFC;

+}

+

+.todo {

+	background-color:#FD8;

+}

diff --git a/juneau-examples/juneau-examples-core/pom.xml b/juneau-examples/juneau-examples-core/pom.xml
index e04a311..6081bc7 100644
--- a/juneau-examples/juneau-examples-core/pom.xml
+++ b/juneau-examples/juneau-examples-core/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<artifactId>juneau-examples</artifactId>
 		<groupId>org.apache.juneau</groupId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-examples-core</artifactId>
diff --git a/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/oapi/OapiExample.java b/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/oapi/OapiExample.java
index e8be9bd..c540715 100644
--- a/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/oapi/OapiExample.java
+++ b/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/oapi/OapiExample.java
@@ -21,7 +21,7 @@
 import org.apache.juneau.oapi.OpenApiSerializer;
 
 /**
- * Sample class which shows the simple usage of OpenApiSerializer
+ * Sample class which shows the simple usage of OpenApiSerializer.
  *
  * <ul class='seealso'>
  * 	<li class='extlink'>{@source}
diff --git a/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/svl/SvlExample.java b/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/svl/SvlExample.java
index 2ea51d4..5c6c989 100644
--- a/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/svl/SvlExample.java
+++ b/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/svl/SvlExample.java
@@ -15,7 +15,7 @@
 import org.apache.juneau.svl.*;
 
 /**
- * TODO
+ * TODO.
  *
  * <ul class='seealso'>
  * 	<li class='extlink'>{@source}
diff --git a/juneau-examples/juneau-examples-rest-jetty-ftest/pom.xml b/juneau-examples/juneau-examples-rest-jetty-ftest/pom.xml
index ab724ac..15c14f7 100644
--- a/juneau-examples/juneau-examples-rest-jetty-ftest/pom.xml
+++ b/juneau-examples/juneau-examples-rest-jetty-ftest/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-examples</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-examples-rest-jetty-ftest</artifactId>
diff --git a/juneau-examples/juneau-examples-rest-jetty/pom.xml b/juneau-examples/juneau-examples-rest-jetty/pom.xml
index 6d57b75..5b8f82d 100644
--- a/juneau-examples/juneau-examples-rest-jetty/pom.xml
+++ b/juneau-examples/juneau-examples-rest-jetty/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-examples</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-examples-rest-jetty</artifactId>
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/devops.css b/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/devops.css
deleted file mode 100644
index ad7188a..0000000
--- a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/devops.css
+++ /dev/null
@@ -1,276 +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.                                              *

- ***************************************************************************************************************************/

- 

-/** DevOps look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	background-color: #3B4B54;

-	margin: 0px;

-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;

-	color: #B3B3B3;

-	height: 100%;	

-}

-

-body {

-	font-size: 14px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                        **/

-/**********************************************************************************************************************/

-

-header {

-	background-color: #26343F;

-}

-

-header * {

-    font-size: 14px;

-	color: #B3B3B3;

-	margin: 0px;

-	text-decoration: none;

-	font-weight: normal;

-}

-

-header h1 {

-	padding: 10px 20px;

-	font-size: 16px;

-	border-bottom: 2px solid #34534B;

-	color: white;

-}

-

-header h2 {

-	padding: 10px 20px;

-	font-size: 14px;

-	border-bottom: 2px solid #34534B;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 10px 20px 10px 20px;

-	color: #94A3AB;

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-	content: " - ";

-}

-

-nav a {

-	font-size: 10pt;

-	color: #94A3AB;

-	text-decoration: none;

-	margin: 0px 15px;

-	text-transform: uppercase;

-	cursor: pointer;

-}

-

-nav a:active, nav a:hover {

-	color: white;

-	text-decoration: underline;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                        **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin-bottom: 50px;

-}

-

-article {

-	display: table-cell;

-}

-

-article * {

-	font-size: 9pt;

-	color: #26343F;

-}

-

-article div.data {

-	padding: 10px;

-	background-color: white;

-	border-radius: 4px;

-	margin: 20px;

-	display: inline-block;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	font-family: sans-serif;

-	color: #26343F;

-}

-

-article table {

-	border: none;

-	width: 100%;

-}

-

-article th {

-	border-top: 1px solid #D9DCDE;

-	padding: 4px 8px;

-	font-weight: bold;

-	text-align: center;

-	background-color: #F4F6F9;

-}

-

-article td {

-	vertical-align: top;

-	border-bottom: 1px solid #d9dcde;

-	border-right: 1px solid #d9dcde;

-	padding: 2px 5px;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-article a {

-	color: #116998;

-	text-decoration: none;

-}

-

-article a:hover {

-	text-decoration: underline;

-}

-

-article iframe {

-	background-color: #F6F7F9;

-	border: 1px solid gray;

-	padding: 0px;

-	overflow: hidden;

-	width: 100%;

-	min-height: 400px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	padding: 10px;

-	width: 100%;

-	bottom: 0;

-	position: fixed;

-	background-color: #26343F;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #f4f6f9;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	color: black;

-	font-size: 11px;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display:block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

-

diff --git a/juneau-examples/juneau-examples-rest-springboot/pom.xml b/juneau-examples/juneau-examples-rest-springboot/pom.xml
index 56395c1..897030f 100644
--- a/juneau-examples/juneau-examples-rest-springboot/pom.xml
+++ b/juneau-examples/juneau-examples-rest-springboot/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <groupId>org.apache.juneau</groupId>
         <artifactId>juneau-examples</artifactId>
-        <version>8.1.1-SNAPSHOT</version>
+        <version>8.1.2-SNAPSHOT</version>
     </parent>
 
     <artifactId>juneau-examples-rest-springboot</artifactId>
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/asf.png b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/asf.png
deleted file mode 100644
index ce28113..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/asf.png
+++ /dev/null
Binary files differ
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/juneau.png b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/juneau.png
deleted file mode 100644
index 42a1656..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/juneau.png
+++ /dev/null
Binary files differ
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/styles/SwaggerUI.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/styles/SwaggerUI.css
deleted file mode 100644
index b55ffc6..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/styles/SwaggerUI.css
+++ /dev/null
@@ -1,342 +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.                                              *
- ***************************************************************************************************************************
-*/
-
-.swagger-ui {	
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Header key-value pairs
- ----------------------------------------------------------------------------------------------------------*/
-
-.swagger-ui table.header {
-    margin-bottom: 15px;
-	width: 95%;
-	border: none;
-}
-
-.swagger-ui table.header * {
-	vertical-align: middle;
-}
-
-.swagger-ui table.header th {
-    font-weight: bold;
-    padding: 5px 10px;
-    text-align: left;
-    white-space: nowrap;
-	border: none;
-	border-radius: 3px;
-}
-
-.swagger-ui table.header td {
-	padding: 5px 10px;
-    text-align: left;
-    vertical-align: middle;
-	border: none;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Method buttons (e.g GET/PUT/... buttons)                                                                
- ----------------------------------------------------------------------------------------------------------*/
-.method-button {
-  	display: inline-block;
-    font-weight: bold;
-    min-width: 60px;
-    padding: 6px 15px;
-    text-align: center;
-    border-radius: 3px;
-    text-shadow: 0 1px 0 rgba(0,0,0,.1);
-    color: #fff;
-}
-.get .method-button        { background: rgb(97,175,254); }
-.put .method-button        { background: rgb(252,161,48); }
-.post .method-button       { background: rgb(73,204,144); }
-.delete .method-button     { background: rgb(249,62,62); }
-.options .method-button    { background: rgb(153,102,255); }
-.deprecated .method-button { background: rgb(170,170,170); }
-.model .method-button      { background: rgb(150,150,150); min-width: 120px;}
-.other .method-button      { background: rgb(230,230,0); }
-
-
-/*-----------------------------------------------------------------------------------------------------------
- - Tag block                                                                                                -
- - Encapsulates one or more op-blocks.
- ----------------------------------------------------------------------------------------------------------*/
-
-.tag-block {
-	min-width: 800px;
-}
-
-.tag-block-summary {
-	margin: 10px 0px;
-	padding: 5px 0px;
-    align-items: center;
-    cursor: pointer;
-	border-bottom: 1px solid rgba(59,65,81,.2);
-	user-select: none;
-	transition: all .2s;
-}
-.tag-block-summary:hover {
-	background-color: rgba(59,65,81,.1);
-}
-
-.tag-block-summary .name {
-	font-size: 18px;
-	padding: 0px 20px;
-}
-.tag-block-summary .description {
-	font-size: 14px;
-	padding: 0px 20px;
-}
-.tag-block-summary .extdocs {
-	float: right;
-	font-size: 14px;
-	padding: 0px 20px;
-}
-
-.tag-block-open .tag-block-contents { display: block; }
-.tag-block-closed .tag-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block                                                                                          
- - Encapsulates a single http-method + http-path
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block {
-	margin-bottom: 10px;
-    align-items: center;
-    border-radius: 4px;
-}
-
-.op-block.get        { background: rgba(97,175,254,.1); border: 1px solid rgb(97,175,254); }
-.op-block.put        { background: rgba(252,161,48,.1); border: 1px solid rgb(252,161,48); }
-.op-block.post       { background: rgba(73,204,144,.1); border: 1px solid rgb(73,204,144); }
-.op-block.options    { background: rgba(153,102,255,.1); border: 1px solid rgb(153,102,255); }
-.op-block.delete     { background: rgba(249,62,62,.1); border: 1px solid rgb(249,62,62); }
-.op-block.deprecated { background: rgba(170,170,170,.1); border: 1px solid rgb(170,170,170); }
-.op-block.model      { background: rgba(0,0,0,.05); border: 1px solid rgb(170,170,170); }
-.op-block.other      { background: rgba(230,230,0,0.1); border: 1px solid rgb(230,230,0); }
-
-.op-block-summary {	
-	padding: 5px;
-    cursor: pointer;
-	user-select: none;
-}
-
-.op-block-summary .path {
-	font-size: 14px;
-	word-break: break-all;
-    font-family: monospace;
-    font-weight: bold;
-    padding:10px;
-}
-
-.op-block.deprecated .op-block-summary .path { color: #8f9199; text-decoration: line-through;}
-.op-block.deprecated .op-block-summary .description { color: #8f9199 }
-
-.op-block-summary .summary {
-    font-size: 14px;
-    padding: 10px;
-}
-
-.op-block-description {
-    font-size: 14px;
-    padding: 10px;
-}
-
-
-.op-block-open .op-block-contents { display: block; }
-.op-block-closed .op-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block section header                                                                                               -
- - 'Parameters' and 'Responses' subsections in an op-block
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-section-header {
-    padding: 8px 15px;
-    background: hsla(0,0%,100%,.3);
-    box-shadow: 1px 2px 3px rgba(0,0,0,.3);
-    margin: 10px;
-    border-radius: 4px;
-}
-
-.op-block-section-header .title {
-    font-size: 14px;
-    margin: 0px;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameters and Responses sections
- ----------------------------------------------------------------------------------------------------------*/
-
-table.parameters, table.responses {
-    border-collapse: collapse;
-    margin: 20px;
-	width: 95%;
-	border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-th.parameter-key, th.response-key {
-	font-size: 12px;
-    font-weight: bold;
-    text-align: left;
-	border: none;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-	background-color: inherit;
-}
-
-td.parameter-key, td.response-key {
-	font-size: 12px;
-    padding: 10px;
-    text-align: left;
-	border: none;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-	background-color: inherit;
-}
-
-td.parameter-value, td.response-value {
-    padding: 10px;
-    text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameter name
- ----------------------------------------------------------------------------------------------------------*/
-
-.parameter-key .in {
-	font-size: 12px;
-    font-family: monospace;
-    font-weight: bold;
-    font-style: italic;
-    color: gray;
-}
-
-.parameter-key .name {
-	font-size: 14px;
-}
-
-.parameter-key .name.required {
-    font-weight: bold;
-}
-
-.parameter-key .requiredlabel {
-	font-size: 10px;
-    color: rgba(255,0,0,.6);    
-    font-weight: bold;
-}
-
-.parameter-key .type {
-    font-size: 12px;
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Examples
- ----------------------------------------------------------------------------------------------------------*/
- 
-.op-block-contents .example-select {
-    margin: 10px 0 5px 0;
-	border-width: 1px;
-	font-weight:bold;
-    padding: 5px 40px 5px 10px;
-    border: 1px solid #41444e;
-    border-radius: 4px;
-    box-shadow: 0 1px 2px 0 rgba(0,0,0,.25);
-    background: hsla(0,0%,100%,.3);
-}
-
-.op-block-contents .example-select:disabled {
-    color: rgba(0,0,0,.50);
-    border: 1px solid rgba(0,0,0,.50);
-}
-
-.op-block-contents .example {
-    margin: 0;
-    padding: 5px 20px;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-    hyphens: auto;
-    border-radius: 4px;
-    background: #41444e;
-    overflow-wrap: break-word;
-    font-family: monospace;
-    font-weight: 400;
-    color: limegreen;
-	display: none;
-	max-width: 800px;
-	max-height: 800px;
-	text-overflow: auto;
-	overflow: auto;
-}
-
-.op-block-contents .example.active {
-	display:block;
-}
-
-.op-block-contents .model {
-	display: none;
-}
-
-.op-block-contents .model.active {
-	display:block;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Headers
- ----------------------------------------------------------------------------------------------------------*/
-
-.section {
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-}
-
-.headers .name {
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-div.headers {
-	margin: 20px 0px;
-}
-
-.headers .type {
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-.section-name {
-	display: inline-block;
-	vertical-align: top;
-	margin-right: 20px;
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-}
-
-.section-table {
-/*	display: inline-block;*/
-}
-
-.responses .section-table td {
-	padding: 5px 20px 5px 0px;
-	text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-}
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/dark.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/dark.css
deleted file mode 100644
index c81702d..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/dark.css
+++ /dev/null
@@ -1,285 +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.                                              *
- ***************************************************************************************************************************/
- 
-/** Dark look-and-feel */ 
- 
-/**********************************************************************************************************************/
-/**  Body                                                                                                            **/
-/**********************************************************************************************************************/
-
-body {
-	background-color: #212121 ;
-	margin: 0px;
-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
-	color: #EEE;
-	height: 100%;
-}
-
-body {
-	font-size: 14px;
-}
-
-body textarea, body pre {
-	-moz-tab-size: 3; 
-	-o-tab-size: 3; 
-	-webkit-tab-size: 3; 
-	tab-size: 3; 
-}
-
-/**********************************************************************************************************************/
-/**  Header                                                                                                        **/
-/**********************************************************************************************************************/
-
-header {
-	background-color: #373a3c;
-}
-
-header * {
-    font-size: 14px;
-	color: #B3B3B3;
-	margin: 0px;
-	text-decoration: none;
-	font-weight: normal;
-}
-
-header h1 {
-	padding: 10px 20px;
-	font-size: 16px;
-	border-bottom: 2px solid #000000;
-	color: white;
-}
-
-header h2 {
-	padding: 10px 20px;
-	font-size: 14px;
-	border-bottom: 2px solid #000000;
-}
-
-/**********************************************************************************************************************/
-/**  Nav                                                                                                             **/
-/**********************************************************************************************************************/
-
-nav {
-	margin: 10px 20px 10px 20px;
-	color: #94A3AB;
-}
-
-nav>ol {
-	list-style-type: none;
-	margin: 0px 10px;
-	padding: 0px;
-}
-
-nav>ol>li {
-	display: inline;
-}
-
-nav li:not(:first-child):before {
-	content: " - ";
-}
-
-nav a {
-	font-size: 10pt;
-	color: #94A3AB;
-	text-decoration: none;
-	margin: 0px 15px;
-	text-transform: uppercase;
-	cursor: pointer;
-}
-
-nav a:active, nav a:hover {
-	color: white;
-	text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/**  Content                                                                                                        **/
-/**********************************************************************************************************************/
-
-section {
-	display: table;
-	width: 100%;
-	margin-bottom: 50px;
-}
-
-article {
-	display: table-cell;
-}
-
-article * {
-	font-size: 9pt;
-	color: #EEE;
-}
-
-article textarea, article input, article button {
-	color: #111;
-}
-
-article textarea, article input {
-	background-color: #EEE;
-}
-
-article div.data {
-	padding: 10px;
-	background-color: #373a3c;
-	border-radius: 4px;
-	margin: 20px;
-	display: inline-block;
-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
-	font-family: sans-serif;
-}
-
-article table {
-	border: none;
-	width: 100%;
-}
-
-article th {
-	padding: 4px 8px;
-	font-weight: normal;
-	text-align: center;
-	background-color: #0275d8;
-}
-
-article td {
-	vertical-align: top;
-	border-bottom: 1px solid #000000;
-	border-right: 1px solid #000000;
-	padding: 2px 5px;
-}
-
-article td:last-child {
-    width: 100%;
-}
-
-article ul {
-	margin: 0px;
-	padding-left: 20px;
-}
-
-article a {
-	color: #3d8bb5;
-	text-decoration: none;
-}
-
-article a:hover {
-	text-decoration: underline;
-}
-
-article iframe {
-	background-color: #F6F7F9;
-	border: 1px solid gray;
-	padding: 0px;
-	overflow: hidden;
-	width: 100%;
-	min-height: 400px;
-}
-
-aside {
-	display: table-cell;
-	vertical-align: top;
-	padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/**  Footer                                                                                                          **/
-/**********************************************************************************************************************/
-
-footer { 
-	padding: 10px;
-	width: 100%;
-	bottom: 0;
-	position: fixed;
-	background-color: #373a3c;
-}
-
-/**********************************************************************************************************************/
-/**  Popup windows                                                                                                   **/
-/**********************************************************************************************************************/
-
-.popup-content {
-	display: none;
-	position: absolute;
-	background-color: #DDD;
-	white-space: nowrap;
-	padding: 5px;
-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
-	z-index: 1;
-	margin-top: 10px;
-	border-radius: 4px;
-}
-
-.popup-content * {
-	color: black;
-	font-size: 11px;
-}
-
-.popup-content a:hover {
-	color: #94A3AB;
-}
-
-.popup-show {
-	display:block;
-}
-
-/**********************************************************************************************************************/
-/**  Tooltips                                                                                                        **/
-/**********************************************************************************************************************/
-
-.tooltip {
-	position: relative;
-	display: inline-block;	    
-}
-
-.tooltip .tooltiptext {
-	visibility: hidden;
-	background-color: #FEF9E7;
-	color: black;
-	padding: 5px;
-	border-radius: 6px;
-	position: absolute;
-	z-index: 1;
-	top: 0;
-	left: 0;
-	margin-left: 30px;
-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
-	opacity: 0;
-	transition: opacity 0.5s;
-	font-weight: normal;
-}
-
-.tooltip .tooltiptext * {
-	color: black;
-}
-
-.tooltip:hover .tooltiptext {
-	visibility: visible;
-	opacity: 1;
-}	
-
-.tooltiptext {
-	white-space: nowrap;
-	float: left;
-	border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/**  Other classes                                                                                                   **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/devops.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/devops.css
deleted file mode 100644
index ad7188a..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/devops.css
+++ /dev/null
@@ -1,276 +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.                                              *

- ***************************************************************************************************************************/

- 

-/** DevOps look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	background-color: #3B4B54;

-	margin: 0px;

-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;

-	color: #B3B3B3;

-	height: 100%;	

-}

-

-body {

-	font-size: 14px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                        **/

-/**********************************************************************************************************************/

-

-header {

-	background-color: #26343F;

-}

-

-header * {

-    font-size: 14px;

-	color: #B3B3B3;

-	margin: 0px;

-	text-decoration: none;

-	font-weight: normal;

-}

-

-header h1 {

-	padding: 10px 20px;

-	font-size: 16px;

-	border-bottom: 2px solid #34534B;

-	color: white;

-}

-

-header h2 {

-	padding: 10px 20px;

-	font-size: 14px;

-	border-bottom: 2px solid #34534B;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 10px 20px 10px 20px;

-	color: #94A3AB;

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-	content: " - ";

-}

-

-nav a {

-	font-size: 10pt;

-	color: #94A3AB;

-	text-decoration: none;

-	margin: 0px 15px;

-	text-transform: uppercase;

-	cursor: pointer;

-}

-

-nav a:active, nav a:hover {

-	color: white;

-	text-decoration: underline;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                        **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin-bottom: 50px;

-}

-

-article {

-	display: table-cell;

-}

-

-article * {

-	font-size: 9pt;

-	color: #26343F;

-}

-

-article div.data {

-	padding: 10px;

-	background-color: white;

-	border-radius: 4px;

-	margin: 20px;

-	display: inline-block;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	font-family: sans-serif;

-	color: #26343F;

-}

-

-article table {

-	border: none;

-	width: 100%;

-}

-

-article th {

-	border-top: 1px solid #D9DCDE;

-	padding: 4px 8px;

-	font-weight: bold;

-	text-align: center;

-	background-color: #F4F6F9;

-}

-

-article td {

-	vertical-align: top;

-	border-bottom: 1px solid #d9dcde;

-	border-right: 1px solid #d9dcde;

-	padding: 2px 5px;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-article a {

-	color: #116998;

-	text-decoration: none;

-}

-

-article a:hover {

-	text-decoration: underline;

-}

-

-article iframe {

-	background-color: #F6F7F9;

-	border: 1px solid gray;

-	padding: 0px;

-	overflow: hidden;

-	width: 100%;

-	min-height: 400px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	padding: 10px;

-	width: 100%;

-	bottom: 0;

-	position: fixed;

-	background-color: #26343F;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #f4f6f9;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	color: black;

-	font-size: 11px;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display:block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

-

diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/light.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/light.css
deleted file mode 100644
index aa91f98..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/light.css
+++ /dev/null
@@ -1,273 +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.                                              *

- ***************************************************************************************************************************/

- 

-/** Light look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	margin: 0px;

-	font-size: 10px;

-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;

-	color: #2c4557;

-	height: 100%;	

-}

-

-body * {

-	font-size: 14px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                          **/

-/**********************************************************************************************************************/

-

-header {

-	background-color: #e8ebef;

-	padding: 10px 20px;

-	box-shadow: 5px 5px 2px #999999;

-	text-shadow: rgba(1,1,1,.2) 2px 4px 5px, rgba(125,32,191,.05) 0 -10px 30px;

-	white-space: nowrap;

-}

-

-header * {

-	color: #af2222;;

-	font-weight: lighter;

-}

-

-header h1 {

-	font-size: 18px;

-	margin: 0px;

-	padding: 2px;

-}

-

-header h2 {

-	font-size: 14px;

-	margin: 0px;

-	padding: 2px;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 10px;

-	padding: 5px;

-	box-shadow: 5px 5px 2px #999999;

-	background-color: #eef3f7;

-}

-

-nav * {

-	font-size: 12px;

-	font-weight: lighter;

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-	content: " - ";

-}

-

-nav a {

-	font-size: 10pt;

-	color: #2c4557;

-	text-decoration: none;

-	margin: 0px 10px;

-	text-transform: uppercase;

-	cursor: pointer;

-}

-

-nav a:active, nav a:hover {

-	text-decoration: none;

-	color: #94a3ab;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                         **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin: 0px 0px 50px 0px;

-}

-

-article {

-	display: table-cell;

-	padding: 20px 40px;

-}

-

-article * {

-	font-size: 9pt;

-}

-

-article div.data {

-	padding: 0px;

-	margin: 0px;

-	display: inline-block;

-	font-family: sans-serif;

-}

-

-article table {

-	border: none;

-	width: 100%;

-}

-

-article td {

-	vertical-align: top;

-	border-bottom: 1px solid #d9dcde;

-	border-right: 1px solid #d9dcde;

-	padding: 2px 5px;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article th {

-	padding: 4px 8px;

-	text-align: center;

-	background-color: #eef3f7;

-	box-shadow: 1px 1px 2px #999999;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-article a {

-	color: #416e8e;

-	text-decoration: none;

-}

-

-article iframe {

-	background-color: #F6F7F9;

-	border: 1px solid gray;

-	padding: 0px;

-	overflow: hidden;

-	width: 100%;

-	min-height: 400px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	padding: 10px;

-	width: 100%;

-	bottom: 0;

-	position: fixed;

-	background-color: #e8ebef;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #eef3f7;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	color: #2c4557;

-	font-size: 10pt;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display: block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/original.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/original.css
deleted file mode 100644
index 2052281..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/original.css
+++ /dev/null
@@ -1,237 +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.                                              *

- ***************************************************************************************************************************/

-

-/** Original look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	background-image: linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);

-	background-image: -webkit-linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);

-	background-attachment: fixed;

-	font-family: Sans-Serif;

-	color: #2c4557;

-	height: 100%;

-	margin: 0px;

-}

-

-body * {

-	font-size: 12px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                          **/

-/**********************************************************************************************************************/

-

-header {

-	padding: 10px 20px;

-}

-

-header h1 {

-    font-size: 16px;

-	margin-bottom: 10px;

-	margin-right: 40px;

-	padding: 5px 30px;

-	border-radius: 15px;

-	text-decoration: none;

-	font-weight: normal;

-	background: linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;

-	background: -webkit-gradient(linear, left top, left bottom, from(#F5F5F5), to(#DEE3E9));

-}

-

-header h2 {

-	font-weight: normal;

-	margin-left: 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 0px 25px;	

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-    content: " - ";

-}

-

-nav a {

-	text-decoration: underline;

-	cursor: pointer;

-	color: -webkit-link;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                        **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin: 0px 0px 50px 0px;

-}

-

-article {

-	display: table-cell;

-	padding: 20px 40px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-article div.data {

-	padding: 0px;

-	margin: 0px;

-	display: inline-block;

-	font-family: sans-serif;

-}

-

-article table {

-	border:1px solid #CCCC99;

-	border-collapse: collapse;

-	margin: 5px 0px;

-	width: 100%;

-}

-

-article th {

-	border-top: 1px solid #CCCC99;

-	padding: 3px 5px;

-	color: #666666;

-	text-align: center;

-	background-image: linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);

-	background-image: -webkit-linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);

-}

-

-article td {

-	border: 1px solid #E9EACB;

-	padding: 2px 5px;

-	color: #005C87;

-	vertical-align: top;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	display: none;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #eef3f7;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	font-size: 9pt;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display: block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

-

diff --git a/juneau-examples/juneau-examples-rest/pom.xml b/juneau-examples/juneau-examples-rest/pom.xml
index 71dcf40..133bbfe 100644
--- a/juneau-examples/juneau-examples-rest/pom.xml
+++ b/juneau-examples/juneau-examples-rest/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-examples</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-examples-rest</artifactId>
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
index 56949f6..589271b 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.examples.rest;

 

 import org.apache.juneau.examples.rest.dto.*;

-import org.apache.juneau.examples.rest.petstore.rest.*;

 import org.apache.juneau.html.annotation.*;

 import org.apache.juneau.microservice.resources.*;

 import org.apache.juneau.rest.*;

@@ -34,7 +33,6 @@
 	description="Example of a router resource page.",

 	children={

 		HelloWorldResource.class,

-		PetStoreResource.class,

 		DtoExamples.class,

 		ConfigResource.class,

 		LogsResource.class,

diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/DtoExamples.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/DtoExamples.java
index 55bd573..bb06628 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/DtoExamples.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/DtoExamples.java
@@ -31,8 +31,7 @@
 	description="Example serialization of predefined Data Transfer Objects.",

 	children={

 		AtomFeedResource.class,

-		JsonSchemaResource.class,

-		PredefinedLabelsResource.class,

+		JsonSchemaResource.class

 	}

 )

 @HtmlDocConfig(

diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.java
deleted file mode 100644
index c29feb0..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.java
+++ /dev/null
@@ -1,95 +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.examples.rest.dto;

-

-import org.apache.juneau.jsonschema.annotation.ExternalDocs;

-import org.apache.juneau.dto.*;

-import org.apache.juneau.examples.rest.petstore.dto.*;

-import org.apache.juneau.html.annotation.*;

-import org.apache.juneau.http.annotation.*;

-import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.helper.*;

-import org.apache.juneau.rest.widget.*;

-

-/**

- * Sample REST resource for rendering predefined label beans.

- *

- * <ul class='seealso'>

- * 	<li class='extlink'>{@source}

- * </ul>

- */

-@RestResource(

-	path="/predefinedLabels",

-	title="Predefined Label Beans",

-	description="Shows examples of predefined label beans",

-	swagger=@ResourceSwagger(

-		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),

-		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),

-		version="2.0",

-		termsOfService="You are on your own.",

-		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")

-	)

-)

-@HtmlDocConfig(

-	widgets={

-		ContentTypeMenuItem.class,

-		ThemeMenuItem.class

-	},

-	navlinks={

-		"up: request:/..",

-		"options: servlet:/?method=OPTIONS",

-		"$W{ContentTypeMenuItem}",

-		"$W{ThemeMenuItem}",

-		"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/dto/$R{servletClassSimple}.java"

-	}

-)

-public class PredefinedLabelsResource extends BasicRestServlet {

-	private static final long serialVersionUID = 1L;

-

-	/**

-	 * Returns the list of child resource descriptions.

-	 *

-	 * @return The list of child resource descriptions.

-	 */

-	@RestMethod

-	public ResourceDescriptions get() {

-		return new ResourceDescriptions()

-			.append("beanDescription", "BeanDescription")

-			.append("htmlLinks", "HtmlLink")

-		;

-	}

-

-	/**

-	 * Returns the bean description of the {@link Pet} class.

-	 *

-	 * @return The bean description of the {@link Pet} class.

-	 */

-	@RestMethod

-	public BeanDescription getBeanDescription() {

-		return new BeanDescription(Pet.class);

-	}

-

-	/**

-	 * Returns a list of hyperlinked strings.

-	 *

-	 * @return A list of hyperlinked strings.

-	 */

-	@RestMethod

-	public LinkString[] getHtmlLinks() {

-		return new LinkString[] {

-			new LinkString("apache", "http://apache.org"),

-			new LinkString("juneau", "http://juneau.apache.org")

-		};

-	}

-}

diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.java
deleted file mode 100644
index 2f0deb6..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.java
+++ /dev/null
@@ -1,273 +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.examples.rest.petstore;
-
-import java.util.*;
-
-import javax.persistence.*;
-
-import org.apache.juneau.utils.*;
-
-/**
- * Superclass for DAOs that use the JPA entity manager.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-public class AbstractPersistenceService {
-
-	private final EntityManagerFactory entityManagerFactory;
-
-	/**
-	 * Constructor.
-	 */
-	public AbstractPersistenceService() {
-		entityManagerFactory = Persistence.createEntityManagerFactory("test");
-	}
-
-	/**
-	 * Retrieves an entity manager session.
-	 *
-	 * @return The entity manager session.
-	 */
-	protected EntityManager getEntityManager() {
-		return entityManagerFactory.createEntityManager();
-	}
-
-	/**
-	 * Retrieves the specified JPA bean from the repository.
-	 *
-	 * @param em The entity manager to use to retrieve the bean.
-	 * @param t The bean type to retrieve.
-	 * @param id The primary key value.
-	 * @return The JPA bean, or null if not found.
-	 */
-	protected <T> T find(EntityManager em, Class<T> t, Object id) {
-		return em.find(t, id);
-	}
-
-	/**
-	 * Same as {@link #find(EntityManager, Class, Object)} but uses a new entity manager.
-	 *
-	 * @param t The bean type to retrieve.
-	 * @param id The primary key value.
-	 * @return The JPA bean, or null if not found.
-	 */
-	protected <T> T find(Class<T> t, Object id) {
-		return find(getEntityManager(), t, id);
-	}
-
-	/**
-	 * Store the specified JPA bean in the repository.
-	 *
-	 * @param em The entity manager to use to store and merge the bean.
-	 * @param t The bean to store.
-	 * @return The merged JPA bean returned by the {@link EntityManager#merge(Object)} method, or null if the bean was null.
-	 */
-	protected <T> T merge(EntityManager em, T t) {
-		if (t == null)
-			return null;
-		try {
-			EntityTransaction et = em.getTransaction();
-			et.begin();
-			t = em.merge(t);
-			et.commit();
-			return t;
-		} finally {
-			em.close();
-		}
-	}
-
-	/**
-	 * Same as {@link #merge(EntityManager, Object)} but uses a new entity manager.
-	 *
-	 * @param t The bean to store.
-	 * @return The merged JPA bean returned by the {@link EntityManager#merge(Object)} method, or null if the bean was null.
-	 */
-	protected <T> T merge(T t) {
-		return merge(getEntityManager(), t);
-	}
-
-	/**
-	 * Store the specified JPA beans in the repository.
-	 *
-	 * All values are persisted in the same transaction.
-	 *
-	 * @param em The entity manager to use to store and merge the beans.
-	 * @param c The collection of beans to store.
-	 * @return The merged JPA beans returned by the {@link EntityManager#merge(Object)} method.
-	 */
-	protected <T> Collection<T> merge(EntityManager em, Collection<T> c) {
-		Collection<T> c2 = new ArrayList<>();
-		try {
-			EntityTransaction et = em.getTransaction();
-			et.begin();
-			for (T t : c)
-				c2.add(em.merge(t));
-			et.commit();
-			return c2;
-		} finally {
-			em.close();
-		}
-	}
-
-	/**
-	 * Same as {@link #merge(EntityManager, Collection)} but uses a new entity manager.
-	 *
-	 * @param c The collection of beans to store.
-	 * @return The merged JPA beans returned by the {@link EntityManager#merge(Object)} method.
-	 */
-	protected <T> Collection<T> merge(Collection<T> c) {
-		return merge(getEntityManager(), c);
-	}
-
-	/**
-	 * Remove the specified JPA bean from the repository.
-	 *
-	 * @param t The bean type to remove.
-	 * @param id The primary key value.
-	 */
-	protected <T> void remove(Class<T> t, Object id) {
-		EntityManager em = getEntityManager();
-		remove(em, find(em, t, id));
-	}
-
-	/**
-	 * Remove the specified JPA bean from the repository.
-	 *
-	 * @param em The entity manager used to retrieve the bean.
-	 * @param t The bean to remove.  Can be null.
-	 */
-	protected <T> void remove(EntityManager em, T t) {
-		if (t == null)
-			return;
-		try {
-			EntityTransaction et = em.getTransaction();
-			et.begin();
-			em.remove(t);
-			et.commit();
-		} finally {
-			em.close();
-		}
-	}
-
-	/**
-	 * Runs a JPA query and returns the results.
-	 *
-	 * @param <T> The bean type.
-	 * @param em The entity manager to use to retrieve the beans.
-	 * @param query The JPA query.
-	 * @param t The bean type.
-	 * @param searchArgs Optional search arguments.
-	 * @return The results.
-	 */
-	protected <T> List<T> query(EntityManager em, String query, Class<T> t, SearchArgs searchArgs) {
-		TypedQuery<T> q = em.createQuery(query, t);
-		if (searchArgs != null) {
-			q.setMaxResults(searchArgs.getLimit() == 0 ? 100 : searchArgs.getLimit());
-			q.setFirstResult(searchArgs.getPosition());
-		}
-		return em.createQuery(query, t).getResultList();
-	}
-
-	/**
-	 * Same as {@link #query(EntityManager,String,Class,SearchArgs)} but uses a new entity manager.
-	 *
-	 * @param <T> The bean type.
-	 * @param query The JPA query.
-	 * @param t The bean type.
-	 * @param searchArgs Optional search arguments.
-	 * @return The results.
-	 */
-	protected <T> List<T> query(String query, Class<T> t, SearchArgs searchArgs) {
-		return query(getEntityManager(), query, t, searchArgs);
-	}
-
-	/**
-	 * Runs a JPA parameterized query and returns the results.
-	 *
-	 * @param em The entity manager to use to retrieve the beans.
-	 * @param query The JPA query.
-	 * @param t The bean type.
-	 * @param params The query parameter values.
-	 * @return The results.
-	 */
-	protected <T> List<T> query(EntityManager em, String query, Class<T> t, Map<String,Object> params) {
-		TypedQuery<T> tq = em.createQuery(query, t);
-		for (Map.Entry<String,Object> e : params.entrySet()) {
-			tq.setParameter(e.getKey(), e.getValue());
-		}
-		return tq.getResultList();
-	}
-
-	/**
-	 * Same as {@link #query(EntityManager,String,Class,Map)} but uses a new entity manager.
-	 *
-	 * @param query The JPA query.
-	 * @param t The bean type.
-	 * @param params The query parameter values.
-	 * @return The results.
-	 */
-	protected <T> List<T> query(String query, Class<T> t, Map<String,Object> params) {
-		return query(getEntityManager(), query, t, params);
-	}
-
-	/**
-	 * Runs a JPA update statement.
-	 *
-	 * @param em The entity manager to use to run the statement.
-	 * @param query The JPA update statement.
-	 * @return The number of rows modified.
-	 */
-	protected int update(EntityManager em, String query) {
-		return em.createQuery(query).executeUpdate();
-	}
-
-	/**
-	 * Same as {@link #update(EntityManager,String)} but uses a new entity manager.
-	 *
-	 * @param query The JPA update statement.
-	 * @return The number of rows modified.
-	 */
-	protected int update(String query) {
-		return update(getEntityManager(), query);
-	}
-
-	/**
-	 * Runs a JPA parameterized update statement.
-	 *
-	 * @param em The entity manager to use to run the statement.
-	 * @param query The JPA update statement.
-	 * @param params The query parameter values.
-	 * @return The number of rows modified.
-	 */
-	protected int update(EntityManager em, String query, Map<String,Object> params) {
-		Query q = em.createQuery(query);
-		for (Map.Entry<String,Object> e : params.entrySet()) {
-			q.setParameter(e.getKey(), e.getValue());
-		}
-		return q.executeUpdate();
-	}
-
-	/**
-	 * Same as {@link #update(EntityManager,String,Map)} but uses a new entity manager.
-	 *
-	 * @param query The JPA update statement.
-	 * @param params The query parameter values.
-	 * @return The number of rows modified.
-	 */
-	protected int update(String query, Map<String,Object> params) {
-		return update(getEntityManager(), query, params);
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdConflict.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdConflict.java
deleted file mode 100644
index 1a2d8e5..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdConflict.java
+++ /dev/null
@@ -1,38 +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.examples.rest.petstore;
-
-import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
-
-/**
- * Exception thrown when trying to add an entry where the ID is already in use.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@SuppressWarnings("serial")
-@Response(description="ID already in use")
-public class IdConflict extends Conflict {
-
-	/**
-	 * Constructor.
-	 *
-	 * @param id The duplicate ID.
-	 * @param c The object type..
-	 */
-	public IdConflict(Object id, Class<?> c) {
-		super("ID ''{0}'' already in use for type ''{1}''", id, c.getSimpleName());
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidId.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidId.java
deleted file mode 100644
index 40a1385..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidId.java
+++ /dev/null
@@ -1,35 +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.examples.rest.petstore;
-
-import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
-
-/**
- * Exception thrown when trying to add an entry where the ID is already in use.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@SuppressWarnings("serial")
-@Response(description="Invalid ID provided")
-public class InvalidId extends BadRequest {
-
-	/**
-	 * Constructor.
-	 */
-	public InvalidId() {
-		super("Invalid ID provided.");
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidSpecies.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidSpecies.java
deleted file mode 100644
index 3a57e21..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidSpecies.java
+++ /dev/null
@@ -1,35 +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.examples.rest.petstore;
-
-import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
-
-/**
- * Exception thrown when an invalid species is looked up.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@SuppressWarnings("serial")
-@Response(description="Invalid species provided")
-public class InvalidSpecies extends BadRequest {
-
-	/**
-	 * Constructor.
-	 */
-	public InvalidSpecies() {
-		super("Invalid species provided.");
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidTag.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidTag.java
deleted file mode 100644
index 89157ee..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidTag.java
+++ /dev/null
@@ -1,35 +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.examples.rest.petstore;
-
-import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
-
-/**
- * Exception thrown when trying to add an entry where the ID is already in use.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@SuppressWarnings("serial")
-@Response(description="Invalid tag provided")
-public class InvalidTag extends BadRequest {
-
-	/**
-	 * Constructor.
-	 */
-	public InvalidTag() {
-		super("Invalid tag provided.  Must be at most 8 characters or digits.");
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidUsername.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidUsername.java
deleted file mode 100644
index a7de636..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidUsername.java
+++ /dev/null
@@ -1,35 +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.examples.rest.petstore;
-
-import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.exception.*;
-
-/**
- * Exception thrown when trying to add an entry where the ID is already in use.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@SuppressWarnings("serial")
-@Response(description="Invalid username provided")
-public class InvalidUsername extends BadRequest {
-
-	/**
-	 * Constructor.
-	 */
-	public InvalidUsername() {
-		super("Invalid username provided.  Must be between 3 and 8 characters or digits.");
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreService.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreService.java
deleted file mode 100644
index 8a6be2f..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreService.java
+++ /dev/null
@@ -1,374 +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.examples.rest.petstore;
-
-import static java.text.MessageFormat.*;
-
-import java.io.*;
-import java.util.*;
-
-import javax.persistence.*;
-
-import org.apache.juneau.examples.rest.petstore.dto.*;
-import org.apache.juneau.examples.rest.petstore.rest.*;
-import org.apache.juneau.json.*;
-import org.apache.juneau.parser.ParseException;
-import org.apache.juneau.rest.client.*;
-import org.apache.juneau.utils.*;
-
-/**
- * Pet store database application.
- * <p>
- * Uses JPA persistence to store and retrieve PetStore DTOs.
- * JPA beans are defined in <c>META-INF/persistence.xml</c>.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-public class PetStoreService extends AbstractPersistenceService {
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Initialization methods.
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Initialize the petstore database using JPA.
-	 *
-	 * @param w Console output.
-	 * @return This object (for method chaining).
-	 * @throws ParseException Malformed input encountered.
-	 * @throws IOException File could not be read from file system.
-	 */
-	public PetStoreService initDirect(PrintWriter w) throws ParseException, IOException {
-
-		EntityManager em = getEntityManager();
-		EntityTransaction et = em.getTransaction();
-		JsonParser parser = JsonParser.create().build();
-
-		et.begin();
-
-		for (Pet x : em.createQuery("select X from PetstorePet X", Pet.class).getResultList()) {
-			em.remove(x);
-			w.println(format("Deleted pet:  id={0}", x.getId()));
-		}
-		for (Order x : em.createQuery("select X from PetstoreOrder X", Order.class).getResultList()) {
-			em.remove(x);
-			w.println(format("Deleted order:  id={0}", x.getId()));
-		}
-		for (User x : em.createQuery("select X from PetstoreUser X", User.class).getResultList()) {
-			em.remove(x);
-			w.println(format("Deleted user:  username={0}", x.getUsername()));
-		}
-
-		et.commit();
-		et.begin();
-
-		for (Pet x : parser.parse(getStream("init/Pets.json"), Pet[].class)) {
-			x = em.merge(x);
-			w.println(format("Created pet:  id={0}, name={1}", x.getId(), x.getName()));
-		}
-		for (Order x : parser.parse(getStream("init/Orders.json"), Order[].class)) {
-			x = em.merge(x);
-			w.println(format("Created order:  id={0}", x.getId()));
-		}
-		for (User x: parser.parse(getStream("init/Users.json"), User[].class)) {
-			x = em.merge(x);
-			w.println(format("Created user:  username={0}", x.getUsername()));
-		}
-
-		et.commit();
-
-		return this;
-	}
-
-	/**
-	 * Initialize the petstore database by using a remote resource interface against our REST.
-	 *
-	 * @param w Console output.
-	 * @return This object (for method chaining).
-	 * @throws ParseException Malformed input encountered.
-	 * @throws IOException Thrown by client stream.
-	 */
-	public PetStoreService initViaRest(PrintWriter w) throws ParseException, IOException {
-		JsonParser parser = JsonParser.create().ignoreUnknownBeanProperties().build();
-
-		String port = System.getProperty("juneau.serverPort", "8000");
-
-		try (RestClient rc = RestClient.create().json().rootUrl("http://localhost:" + port).build()) {
-			PetStore ps = rc.getRemoteResource(PetStore.class);
-
-			for (Pet x : ps.getPets()) {
-				ps.deletePet("apiKey", x.getId());
-				w.println(format("Deleted pet:  id={0}", x.getId()));
-			}
-			for (Order x : ps.getOrders()) {
-				ps.deleteOrder(x.getId());
-				w.println(format("Deleted order:  id={0}", x.getId()));
-			}
-			for (User x : ps.getUsers()) {
-				ps.deleteUser(x.getUsername());
-				w.println(format("Deleted user:  username={0}", x.getUsername()));
-			}
-			for (CreatePet x : parser.parse(getStream("init/Pets.json"), CreatePet[].class)) {
-				long id = ps.postPet(x);
-				w.println(format("Created pet:  id={0}, name={1}", id, x.getName()));
-			}
-			for (Order x : parser.parse(getStream("init/Orders.json"), Order[].class)) {
-				long id = ps.placeOrder(x.getPetId(), x.getUsername());
-				w.println(format("Created order:  id={0}", id));
-			}
-			for (User x: parser.parse(getStream("init/Users.json"), User[].class)) {
-				ps.postUser(x);
-				w.println(format("Created user:  username={0}", x.getUsername()));
-			}
-		}
-
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Service methods.
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Returns the pet with the specified ID.
-	 *
-	 * @param id The pet ID.
-	 * @return The pet with the specified ID.  Never <jk>null</jk>.
-	 * @throws IdNotFound If pet was not found.
-	 */
-	public Pet getPet(long id) throws IdNotFound {
-		return find(Pet.class, id);
-	}
-
-	/**
-	 * Returns the order with the specified ID.
-	 *
-	 * @param id The order ID.
-	 * @return The order with the specified ID.  Never <jk>null</jk>.
-	 * @throws IdNotFound If order was not found.
-	 */
-	public Order getOrder(long id) throws IdNotFound {
-		return find(Order.class, id);
-	}
-
-	/**
-	 * Returns the user with the specified username.
-	 *
-	 * @param username The username.
-	 * @return The user with the specified username.  Never <jk>null</jk>.
-	 * @throws InvalidUsername Username was not valid.
-	 * @throws IdNotFound If order was not found.
-	 */
-	public User getUser(String username) throws InvalidUsername, IdNotFound  {
-		assertValidUsername(username);
-		return find(User.class, username);
-	}
-
-	/**
-	 * Returns all pets in the database.
-	 *
-	 * @return All pets in the database.
-	 */
-	public List<Pet> getPets() {
-		return query("select X from PetstorePet X", Pet.class, (SearchArgs)null);
-	}
-
-	/**
-	 * Returns all orders in the database.
-	 *
-	 * @return All orders in the database.
-	 */
-	public List<Order> getOrders() {
-		return query("select X from PetstoreOrder X", Order.class, (SearchArgs)null);
-	}
-
-	/**
-	 * Returns all users in the database.
-	 *
-	 * @return All users in the database.
-	 */
-	public List<User> getUsers() {
-		return query("select X from PetstoreUser X", User.class, (SearchArgs)null);
-	}
-
-	/**
-	 * Creates a new pet in the database.
-	 *
-	 * @param c The pet input data.
-	 * @return a new {@link Pet} object.
-	 */
-	public Pet create(CreatePet c) {
-		return merge(new Pet().status(PetStatus.AVAILABLE).apply(c));
-	}
-
-	/**
-	 * Creates a new order in the database.
-	 *
-	 * @param c The order input data.
-	 * @return a new {@link Order} object.
-	 */
-	public Order create(CreateOrder c) {
-		return merge(new Order().status(OrderStatus.PLACED).apply(c));
-	}
-
-	/**
-	 * Creates a new user in the database.
-	 *
-	 * @param c The user input data.
-	 * @return a new {@link User} object.
-	 */
-	public User create(User c) {
-		return merge(new User().apply(c));
-	}
-
-	/**
-	 * Updates a pet in the database.
-	 *
-	 * @param u The update information.
-	 * @return The updated {@link Pet} object.
-	 * @throws IdNotFound Pet was not found.
-	 */
-	public Pet update(UpdatePet u) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		return merge(em, find(em, Pet.class, u.getId()).apply(u));
-	}
-
-	/**
-	 * Updates an order in the database.
-	 *
-	 * @param o The update information.
-	 * @return The updated {@link Order} object.
-	 * @throws IdNotFound Order was not found.
-	 */
-	public Order update(Order o) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		return merge(em, find(em, Order.class, o.getId()).apply(o));
-	}
-
-	/**
-	 * Updates a user in the database.
-	 *
-	 * @param u The update information.
-	 * @return The updated {@link User} object.
-	 * @throws IdNotFound User was not found.
-	 * @throws InvalidUsername The username was not valid.
-	 */
-	public User update(User u) throws IdNotFound, InvalidUsername {
-		assertValidUsername(u.getUsername());
-		EntityManager em = getEntityManager();
-		return merge(em, find(em, User.class, u.getUsername()).apply(u));
-	}
-
-	/**
-	 * Removes a pet from the database.
-	 *
-	 * @param id The pet ID.
-	 * @throws IdNotFound Pet was not found.
-	 */
-	public void removePet(long id) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		remove(em, find(em, Pet.class, id));
-	}
-
-	/**
-	 * Removes an order from the database.
-	 *
-	 * @param id The order ID.
-	 * @throws IdNotFound Order was not found.
-	 */
-	public void removeOrder(long id) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		remove(em, find(em, Order.class, id));
-	}
-
-	/**
-	 * Removes a user from the database.
-	 *
-	 * @param username The username.
-	 * @throws IdNotFound User was not found.
-	 */
-	public void removeUser(String username) throws IdNotFound {
-		EntityManager em = getEntityManager();
-		remove(em, find(em, User.class, username));
-	}
-
-	/**
-	 * Returns all pets with the specified statuses.
-	 *
-	 * @param status Pet statuses.
-	 * @return Pets with the specified statuses.
-	 */
-	public Collection<Pet> getPetsByStatus(PetStatus[] status) {
-		return getEntityManager()
-			.createQuery("select X from PetstorePet X where X.status in :status", Pet.class)
-			.setParameter("status", status)
-			.getResultList();
-	}
-
-	/**
-	 * Returns all pets with the specified tags.
-	 *
-	 * @param tags Pet tags.
-	 * @return Pets with the specified tags.
-	 * @throws InvalidTag Tag name was invalid.
-	 */
-	public Collection<Pet> getPetsByTags(String[] tags) throws InvalidTag {
-		return getEntityManager()
-			.createQuery("select X from PetstorePet X where X.tags in :tags", Pet.class)
-			.setParameter("tags", tags)
-			.getResultList();
-	}
-
-	/**
-	 * Returns a summary of pet statuses and counts.
-	 *
-	 * @return A summary of pet statuses and counts.
-	 */
-	public Map<PetStatus,Integer> getInventory() {
-		Map<PetStatus,Integer> m = new LinkedHashMap<>();
-		for (Pet p : getPets()) {
-			PetStatus ps = p.getStatus();
-			if (! m.containsKey(ps))
-				m.put(ps, 1);
-			else
-				m.put(ps, m.get(ps) + 1);
-		}
-		return m;
-	}
-
-	/**
-	 * Returns <jk>true</jk> if the specified username and password is valid.
-	 *
-	 * @param username The username.
-	 * @param password The password.
-	 * @return <jk>true</jk> if the specified username and password is valid.
-	 */
-	public boolean isValid(String username, String password) {
-		return getUser(username).getPassword().equals(password);
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Helper methods
-	//-----------------------------------------------------------------------------------------------------------------
-
-	private void assertValidUsername(String username) throws InvalidUsername {
-		if (username == null || ! username.matches("[\\w\\d]{3,8}"))
-			throw new InvalidUsername();
-	}
-
-	private InputStream getStream(String fileName) {
-		return getClass().getResourceAsStream(fileName);
-	}
-}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.java
deleted file mode 100644
index 2d7564f..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.java
+++ /dev/null
@@ -1,96 +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.examples.rest.petstore.dto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * Bean for creating {@link Order} objects.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Bean(fluentSetters=true, properties="petId,username")
-public class CreateOrder {
-
-	private long petId;
-	private String username;
-
-	/**
-	 * Optional constructor.
-	 *
-	 * @param petId The <bc>petId</bc> property value.
-	 * @param username The <bc>username</bc> property value.
-	 */
-	@BeanConstructor(properties="petId,username")
-	public CreateOrder(long petId, String username) {
-		this.petId = petId;
-		this.username = username;
-	}
-
-	/**
-	 * Constructor needed by JPA.
-	 */
-	public CreateOrder() {}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Bean properties
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * @return The <bc>petId</bc> property value.
-	 */
-	public long getPetId() {
-		return petId;
-	}
-
-	/**
-	 * @param value The <bc>petId</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public CreateOrder petId(long value) {
-		this.petId = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>username</bc> property value.
-	 */
-	public String getUsername() {
-		return username;
-	}
-
-	/**
-	 * @param value The <bc>username</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public CreateOrder username(String value) {
-		this.username = value;
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Other
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Used to populate Swagger examples.
-	 * Example is inferred from the method name.
-	 *
-	 * @return An example POJO.
-	 */
-	public static CreateOrder example() {
-		return new CreateOrder(123, "sampleuser");
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreatePet.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreatePet.java
deleted file mode 100644
index 9ee643c..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreatePet.java
+++ /dev/null
@@ -1,160 +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.examples.rest.petstore.dto;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.jsonschema.annotation.*;
-
-/**
- * Bean for creating {@link Pet} objects.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Bean(fluentSetters=true, properties="name,price,species,tags,photo")
-public class CreatePet {
-
-	@Schema(description="Pet name.", minLength=3, maxLength=50)
-	private String name;
-
-	@Schema(description="Price of pet.", maximum="999.99")
-	private float price;
-
-	@Schema(description="Pet species.")
-	private Species species;
-
-	@Schema(description="Pet attributes.", example="friendly,smart")
-	private String[] tags;
-
-	@Schema(description="Photo URL.")
-	@URI
-	private String photo;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param name The <bc>name</bc> property value.
-	 * @param price The <bc>price</bc> property value.
-	 * @param species The <bc>species</bc> property value.
-	 * @param tags The <bc>tags</bc> property value.
-	 * @param photo The <bc>photo</bc> property value.
-	 */
-	public CreatePet(String name, float price, Species species, String[] tags, String photo) {
-		this.name = name;
-		this.price = price;
-		this.species = species;
-		this.tags = tags;
-		this.photo = photo;
-	}
-
-	/**
-	 * Empty constructor.
-	 */
-	public CreatePet() {}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Bean properties
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * @return The <bc>name</bc> property value.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @param value The <bc>name</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public CreatePet name(String value) {
-		this.name = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>price</bc> property value.
-	 */
-	public float getPrice() {
-		return price;
-	}
-
-	/**
-	 * @param value The <bc>price</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public CreatePet price(float value) {
-		this.price = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>species</bc> property value.
-	 */
-	public Species getSpecies() {
-		return species;
-	}
-
-	/**
-	 * @param value The <bc>species</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public CreatePet species(Species value) {
-		this.species = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>tags</bc> property value.
-	 */
-	public String[] getTags() {
-		return tags;
-	}
-
-	/**
-	 * @param value The <bc>tags</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public CreatePet tags(String...value) {
-		this.tags = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>photo</bc> property value.
-	 */
-	public String getPhoto() {
-		return photo;
-	}
-
-	/**
-	 * @param value The <bc>photo</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public CreatePet photo(String value) {
-		this.photo = value;
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Other
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * @return An example POJO.
-	 */
-	public static CreatePet example() {
-		return new CreatePet("Doggie", 9.99f, Species.DOG, new String[]{"smart","friendly"}, null);
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Order.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Order.java
deleted file mode 100644
index 846ab8e..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Order.java
+++ /dev/null
@@ -1,194 +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.examples.rest.petstore.dto;
-
-import static javax.persistence.TemporalType.*;
-
-import java.util.*;
-
-import javax.persistence.*;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.internal.*;
-import org.apache.juneau.jsonschema.annotation.*;
-import org.apache.juneau.transforms.*;
-
-/**
- * Order bean.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Bean(fluentSetters=true, properties="id,petId,username,status,shipDate")
-@Example("{id:123,petId:456,shipDate:'2012-12-21',status:'APPROVED'}")
-@Entity(name="PetstoreOrder")
-public class Order {
-
-	@Column @Id @GeneratedValue
-	@Schema(description="Unique identifier for this order.")
-	@Html(link="servlet:/store/order/{id}")
-	private long id;
-
-	@Column
-	@Schema(description="Pet unique identifier.")
-	@Html(link="servlet:/pet/{id}")
-	private long petId;
-
-	@Column(length=20)
-	@Schema(description="User who created this order.", minLength=3, maxLength=20)
-	@Html(link="servlet:/user/{username}")
-	private String username;
-
-	@Column
-	@Enumerated(EnumType.STRING)
-	@Schema(description="The current order status.")
-	private OrderStatus status;
-
-	@Column @Temporal(TIMESTAMP)
-	@Schema(description="The ship date for this order.", format="date-time")
-	@Swap(TemporalDateSwap.IsoLocalDate.class)
-	private Date shipDate;
-
-	/**
-	 * Applies the specified create data to this order.
-	 *
-	 * @param o The create data to apply.
-	 * @return This object.
-	 */
-	public Order apply(CreateOrder o) {
-		this.petId = o.getPetId();
-		this.username = o.getUsername();
-		return this;
-	}
-
-	/**
-	 * Applies the specified order this order.
-	 *
-	 * @param o The order to apply.
-	 * @return This object.
-	 */
-	public Order apply(Order o) {
-		this.id = o.getId();
-		this.petId = o.getPetId();
-		this.username = o.getUsername();
-		this.status = o.getStatus();
-		this.shipDate = o.getShipDate();
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Bean properties
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * @return The <bc>id</bc> property value.
-	 */
-	public long getId() {
-		return id;
-	}
-
-	/**
-	 * @param value The <bc>id</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Order id(long value) {
-		this.id = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>shipDate</bc> property value.
-	 */
-	public Date getShipDate() {
-		return shipDate;
-	}
-
-	/**
-	 * @param value The <bc>shipDate</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Order shipDate(Date value) {
-		this.shipDate = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>status</bc> property value.
-	 */
-	public OrderStatus getStatus() {
-		return status;
-	}
-
-	/**
-	 * @param value The <bc>status</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Order status(OrderStatus value) {
-		this.status = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>petId</bc> property value.
-	 */
-	public long getPetId() {
-		return petId;
-	}
-
-	/**
-	 * @param value The <bc>petId</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Order petId(long value) {
-		this.petId = value;;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>username</bc> property value.
-	 */
-	public String getUsername() {
-		return username;
-	}
-
-	/**
-	 * @param value The <bc>username</bc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Order username(String value) {
-		this.username = value;
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Other
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * This shows an example generated from a static method.
-	 *
-	 * @return The example POJO.
-	 */
-	@Example
-	public static Order example() {
-		return new Order()
-			.id(123)
-			.username("sampleuser")
-			.petId(456)
-			.status(OrderStatus.APPROVED)
-			.shipDate(DateUtils.parseISO8601("2020-10-10"))
-		;
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.java
deleted file mode 100644
index 9c67045..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.java
+++ /dev/null
@@ -1,45 +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.examples.rest.petstore.dto;
-
-import org.apache.juneau.html.*;
-import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Enum of all possible order statuses.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Html(render=OrderStatus.OrderStatusRender.class)
-@SuppressWarnings("javadoc")
-public enum OrderStatus {
-	PLACED, APPROVED, DELIVERED;
-
-	/**
-	 * Used to control how this enum is rendered in HTML view.
-	 */
-	public static class OrderStatusRender extends HtmlRender<OrderStatus> {
-		@Override /* HtmlRender */
-		public String getStyle(SerializerSession session, OrderStatus value) {
-			switch(value) {
-				case PLACED:  return "background-color:#5cb85c;text-align:center;vertical-align:middle;";
-				case APPROVED:  return "background-color:#f0ad4e;text-align:center;vertical-align:middle;";
-				case DELIVERED:  return "background-color:#777;text-align:center;vertical-align:middle;";
-				default:  return "background-color:#888;text-align:center;vertical-align:middle;";
-			}
-		}
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Pet.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Pet.java
deleted file mode 100644
index e9ef758..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Pet.java
+++ /dev/null
@@ -1,284 +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.examples.rest.petstore.dto;
-
-import static javax.persistence.EnumType.*;
-
-import java.util.*;
-
-import javax.persistence.*;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.html.*;
-import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.jsonschema.annotation.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Pet bean.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Bean(typeName="Pet", fluentSetters=true, properties="id,species,name,tags,price,status,photo")
-@Entity(name="PetstorePet")
-public class Pet {
-
-	@Column @Id @GeneratedValue
-	@Schema(description="Unique identifier for this pet.")
-	@Html(link="servlet:/pet/{id}")
-	private long id;
-
-	@Column(length=50)
-	@Schema(description="Pet name.", minLength=3, maxLength=50)
-	private String name;
-
-	@Column
-	@Schema(description="Price of pet.", maximum="999.99")
-	@Html(render=PriceRender.class)
-	private float price;
-
-	@Column
-	@Schema(description="Pet species.")
-	private Species species;
-
-	@ElementCollection @OrderColumn
-	@Schema(description="Pet attributes.", example="friendly,smart")
-	private List<String> tags;
-
-	@Column @Enumerated(STRING)
-	@Schema(description="Pet species.")
-	private PetStatus status;
-
-	@Column
-	@Schema(description="Photo URL.")
-	@URI
-	private String photo;
-
-	/**
-	 * Applies the specified data to this object.
-	 *
-	 * @param x The data to apply.
-	 * @return This object.
-	 */
-	public Pet apply(CreatePet x) {
-		this.name = x.getName();
-		this.price = x.getPrice();
-		this.species = x.getSpecies();
-		this.tags = x.getTags() == null ? null : Arrays.asList(x.getTags());
-		this.photo = x.getPhoto();
-		return this;
-	}
-
-	/**
-	 * Applies the specified data to this object.
-	 *
-	 * @param x The data to apply.
-	 * @return This object.
-	 */
-	public Pet apply(UpdatePet x) {
-		this.id = x.getId();
-		this.name = x.getName();
-		this.price = x.getPrice();
-		this.species = x.getSpecies();
-		this.tags = Arrays.asList(x.getTags());
-		this.status = x.getStatus();
-		this.photo = x.getPhoto();
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Bean properties
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * @return The <bc>id</jc> property value.
-	 */
-	public long getId() {
-		return id;
-	}
-
-	/**
-	 * @param value The <bc>id</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Pet id(long value) {
-		this.id = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>name</jc> property value.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @param value The <bc>name</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Pet name(String value) {
-		this.name = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>price</jc> property value.
-	 */
-	public float getPrice() {
-		return price;
-	}
-
-	/**
-	 * @param value The <bc>price</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Pet price(float value) {
-		this.price = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>species</jc> property value.
-	 */
-	public Species getSpecies() {
-		return species;
-	}
-
-	/**
-	 * @param value The <bc>species</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Pet species(Species value) {
-		this.species = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>tags</jc> property value.
-	 */
-	public List<String> getTags() {
-		return tags;
-	}
-
-	/**
-	 * @param value The <bc>tags</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Pet tags(List<String> value) {
-		this.tags = value;
-		return this;
-	}
-
-	/**
-	 * @param value The <bc>tags</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Pet tags(String...value) {
-		this.tags = Arrays.asList(value);
-		return this;
-	}
-
-	/**
-	 * @return The <bc>status</jc> property value.
-	 */
-	public PetStatus getStatus() {
-		return status;
-	}
-
-	/**
-	 * @param value The <bc>status</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Pet status(PetStatus value) {
-		this.status = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>photo</jc> property value.
-	 */
-	public String getPhoto() {
-		return photo;
-	}
-
-	/**
-	 * @param value The <bc>photo</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public Pet photo(String value) {
-		this.photo = value;
-		return this;
-	}
-
-	/**
-	 * @param statuses The statuses to match against.
-	 * @return <jk>true</jk> if this pet matches at least one of the specified statuses.
-	 */
-	public boolean hasStatus(PetStatus...statuses) {
-		for (PetStatus status : statuses)
-			if (this.status == status)
-				return true;
-		return false;
-	}
-
-	/**
-	 * @param tags The tags to match against.
-	 * @return <jk>true</jk> if this pet matches at least one of the specified tags.
-	 */
-	public boolean hasTag(String...tags) {
-		for (String tag : tags)
-			for (String t : this.tags)
-				if (t.equals(tag))
-					return true;
-		return false;
-	}
-
-	/**
-	 * @return Edit page link.
-	 */
-	public java.net.URI getEdit() {
-		return java.net.URI.create("servlet:/pet/edit/{id}");
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Other
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * This shows an example generated from a static method.
-	 *
-	 * @return POJO example.
-	 */
-	@Example
-	public static Pet example() {
-		return new Pet()
-			.id(123)
-			.species(Species.DOG)
-			.name("Doggie")
-			.tags("friendly","smart")
-			.status(PetStatus.AVAILABLE);
-	}
-
-	/**
-	 * Used to control format of prices in HTML view.
-	 */
-	public static final class PriceRender extends HtmlRender<Float> {
-		@Override
-		public Object getContent(SerializerSession session, Float value) {
-			return value == null ? null : String.format("$%.2f", value);
-		}
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetStatus.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetStatus.java
deleted file mode 100644
index fdc4d2a..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetStatus.java
+++ /dev/null
@@ -1,45 +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.examples.rest.petstore.dto;
-
-import org.apache.juneau.html.*;
-import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Enum of all possible pet statuses.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Html(render=PetStatus.PetStatusRender.class)
-@SuppressWarnings("javadoc")
-public enum PetStatus {
-	AVAILABLE, PENDING, SOLD, UNKNOWN;
-
-	/**
-	 * Used to control how this enum is rendered in HTML view.
-	 */
-	public static class PetStatusRender extends HtmlRender<PetStatus> {
-		@Override /* HtmlRender */
-		public String getStyle(SerializerSession session, PetStatus value) {
-			switch(value) {
-				case AVAILABLE:  return "background-color:#5cb85c;text-align:center;vertical-align:middle;";
-				case PENDING:  return "background-color:#f0ad4e;text-align:center;vertical-align:middle;";
-				case SOLD:  return "background-color:#888;text-align:center;vertical-align:middle;";
-				default:  return "background-color:#777;text-align:center;vertical-align:middle;";
-			}
-		}
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTag.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTag.java
deleted file mode 100644
index b996092..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTag.java
+++ /dev/null
@@ -1,87 +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.examples.rest.petstore.dto;
-
-import java.util.*;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.internal.*;
-
-/**
- * Pet tag bean.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Bean(typeName="Tag", fluentSetters=true)
-@Swap(PetTagNameSwap.class)
-public class PetTag {
-	private long id;
-	private String name;
-
-	/**
-	 * @return The <bc>id</jc> property value.
-	 */
-	public long getId() {
-		return id;
-	}
-
-	/**
-	 * @param value The <bc>id</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public PetTag id(long value) {
-		this.id = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>name</jc> property value.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @param value The <bc>name</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public PetTag name(String value) {
-		this.name = value;
-		return this;
-	}
-
-	/**
-	 * @return POJO example.
-	 */
-	@Example
-	public static PetTag example() {
-		return new PetTag()
-			.id(123)
-			.name("MyTag");
-	}
-
-	/**
-	 * @param tags Tags to convert to a simple string.
-	 * @return The specified tags as a simple comma-delimited list.
-	 */
-	public static String asString(List<PetTag> tags) {
-		if (tags == null)
-			return "";
-		List<String> l = new ArrayList<>(tags.size());
-		for (PetTag t : tags)
-			l.add(t.getName());
-		return StringUtils.join(l, ',');
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.java
deleted file mode 100644
index 2e23e63..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.java
+++ /dev/null
@@ -1,43 +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.examples.rest.petstore.dto;
-
-import org.apache.juneau.*;
-import org.apache.juneau.http.*;
-import org.apache.juneau.transform.*;
-
-/**
- * Swap for {@link PetTag} beans.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-public class PetTagNameSwap extends PojoSwap<PetTag,String> {
-
-	/**
-	 * Swap PetTag with name.
-	 */
-	@Override
-	public String swap(BeanSession bs, PetTag o) throws Exception {
-		return o.getName();
-	}
-
-	/**
-	 * This is only applicable to HTML serialization.
-	 */
-	@Override
-	public MediaType[] forMediaTypes() {
-		return new MediaType[] { MediaType.HTML };
-	}
-}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Species.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Species.java
deleted file mode 100644
index 5bcd655..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Species.java
+++ /dev/null
@@ -1,46 +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.examples.rest.petstore.dto;
-
-import org.apache.juneau.dto.html5.*;
-import org.apache.juneau.html.*;
-import org.apache.juneau.html.annotation.Html;
-import org.apache.juneau.serializer.*;
-
-/**
- * Enum of all possible animal types.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Html(render=Species.SpeciesRender.class)
-@SuppressWarnings("javadoc")
-public enum Species {
-
-	BIRD, CAT, DOG, FISH, MOUSE, RABBIT, SNAKE;
-
-	/**
-	 * Used to control how this enum is rendered in HTML view.
-	 */
-	public static class SpeciesRender extends HtmlRender<Species> {
-		@Override
-		public Object getContent(SerializerSession session, Species value) {
-			return new Img().src("servlet:/htdocs/"+value.name().toLowerCase()+".png");
-		}
-		@Override
-		public String getStyle(SerializerSession session, Species value) {
-			return "background-color:#FDF2E9";
-		}
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.java
deleted file mode 100644
index 99d1deb..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.java
+++ /dev/null
@@ -1,129 +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.examples.rest.petstore.dto;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.jsonschema.annotation.*;
-
-/**
- * Bean for updating {@link Pet} objects.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Bean(fluentSetters=true, properties="id,name,price,species,tags,photo,status")
-public class UpdatePet extends CreatePet {
-
-	@Schema(description="Pet identifier.", minimum="1")
-	private long id;
-
-	@Schema(description="Updated pet status.")
-	private PetStatus status;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param id The <bc>id</bc> property value.
-	 * @param name The <bc>name</bc> property value.
-	 * @param price The <bc>price</bc> property value.
-	 * @param species The <bc>species</bc> property value.
-	 * @param tags The <bc>tags</bc> property value.
-	 * @param status The <bc>status</bc> property value.
-	 * @param photo The <bc>photo</bc> property value.
-	 */
-	public UpdatePet(long id, String name, float price, Species species, String[] tags, PetStatus status, String photo) {
-		super(name, price, species, tags, photo);
-		this.id = id;
-		this.status = status;
-	}
-
-	/**
-	 * Empty constructor.
-	 */
-	public UpdatePet() {}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Bean properties
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * @return The <bc>id</jc> property value.
-	 */
-	public long getId() {
-		return id;
-	}
-
-	/**
-	 * @param value The <bc>id</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public UpdatePet id(long value) {
-		this.id = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>status</jc> property value.
-	 */
-	public PetStatus getStatus() {
-		return status;
-	}
-
-	/**
-	 * @param value The <bc>status</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public UpdatePet status(PetStatus value) {
-		this.status = value;
-		return this;
-	}
-
-	@Override
-	public UpdatePet name(String value) {
-		super.name(value);
-		return this;
-	}
-
-	@Override
-	public UpdatePet price(float value) {
-		super.price(value);
-		return this;
-	}
-
-	@Override
-	public UpdatePet species(Species value) {
-		super.species(value);
-		return this;
-	}
-
-	@Override
-	public UpdatePet tags(String...value) {
-		super.tags(value);
-		return this;
-	}
-
-	@Override
-	public UpdatePet photo(String value) {
-		super.photo(value);
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Other
-	//-----------------------------------------------------------------------------------------------------------------
-
-	public static UpdatePet example() {
-		return new UpdatePet(123, "Doggie", 9.99f, Species.DOG, new String[]{"smart","friendly"}, PetStatus.SOLD, null);
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/User.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/User.java
deleted file mode 100644
index 1b542f6..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/User.java
+++ /dev/null
@@ -1,213 +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.examples.rest.petstore.dto;
-
-import static javax.persistence.EnumType.*;
-
-import javax.persistence.*;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.jsonschema.annotation.*;
-
-/**
- * User bean.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Bean(typeName="User", fluentSetters=true, properties="username,firstName,lastName,email,password,phone,userStatus")
-@Entity(name="PetstoreUser")
-public class User {
-
-	@Id
-	@Column(length=8)
-	@Schema(description="Username.", minLength=3, maxLength=8)
-	@Html(link="servlet:/user/{username}")
-	private String username;
-
-	@Column(length=50)
-	@Schema(description="First name.", maxLength=50)
-	private String firstName;
-
-	@Column(length=50)
-	@Schema(description="First name.", maxLength=50)
-	private String lastName;
-
-	@Column(length=50)
-	@Schema(description="First name.", maxLength=50, pattern="\\S+\\@\\S+")
-	private String email;
-
-	@Column(length=8)
-	@Schema(description="Password.", minLength=3, maxLength=8, pattern="[\\w\\d]{3,8}")
-	private String password;
-
-	@Column
-	@Schema(description="Phone number.", minLength=12, maxLength=12, pattern="\\d{3}\\-\\d{3}\\-\\d{4}")
-	private String phone;
-
-	@Column
-	@Enumerated(STRING)
-	private UserStatus userStatus;
-
-	/**
-	 * Applies the specified data to this object.
-	 *
-	 * @param c The data to apply.
-	 * @return This object.
-	 */
-	public User apply(User c) {
-		this.username = c.getUsername();
-		this.firstName = c.getFirstName();
-		this.lastName = c.getLastName();
-		this.email = c.getEmail();
-		this.password = c.getPassword();
-		this.phone = c.getPhone();
-		this.userStatus = c.getUserStatus();
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Bean properties
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * @return The <bc>username</jc> property value.
-	 */
-	public String getUsername() {
-		return username;
-	}
-
-	/**
-	 * @param value The <bc>username</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public User username(String value) {
-		this.username = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>firstName</jc> property value.
-	 */
-	public String getFirstName() {
-		return firstName;
-	}
-
-	/**
-	 * @param value The <bc>firstName</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public User firstName(String value) {
-		this.firstName = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>lastName</jc> property value.
-	 */
-	public String getLastName() {
-		return lastName;
-	}
-
-	/**
-	 * @param value The <bc>lastName</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public User lastName(String value) {
-		this.lastName = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>email</jc> property value.
-	 */
-	public String getEmail() {
-		return email;
-	}
-
-	/**
-	 * @param value The <bc>email</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public User email(String value) {
-		this.email = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>password</jc> property value.
-	 */
-	public String getPassword() {
-		return password;
-	}
-
-	/**
-	 * @param value The <bc>password</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public User password(String value) {
-		this.password = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>phone</jc> property value.
-	 */
-	public String getPhone() {
-		return phone;
-	}
-
-	/**
-	 * @param value The <bc>phone</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public User phone(String value) {
-		this.phone = value;
-		return this;
-	}
-
-	/**
-	 * @return The <bc>userStatus</jc> property value.
-	 */
-	public UserStatus getUserStatus() {
-		return userStatus;
-	}
-
-	/**
-	 * @param value The <bc>userStatus</jc> property value.
-	 * @return This object (for method chaining).
-	 */
-	public User userStatus(UserStatus value) {
-		this.userStatus = value;
-		return this;
-	}
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// Other
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * This shows an example generated from a static method.
-	 */
-	@Example
-	public static User EXAMPLE = new User()
-		.username("billy")
-		.firstName("Billy")
-		.lastName("Bob")
-		.email("billy@apache.org")
-		.userStatus(UserStatus.ACTIVE)
-		.phone("111-222-3333");
-
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UserStatus.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UserStatus.java
deleted file mode 100644
index b089acd..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UserStatus.java
+++ /dev/null
@@ -1,44 +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.examples.rest.petstore.dto;
-
-import org.apache.juneau.html.*;
-import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.serializer.*;
-
-/**
- * Enum of all possible user statuses.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@Html(render=UserStatus.UserStatusRender.class)
-@SuppressWarnings("javadoc")
-public enum UserStatus {
-	ACTIVE, INACTIVE;
-
-	/**
-	 * Used to control how this enum is rendered in HTML view.
-	 */
-	public static class UserStatusRender extends HtmlRender<UserStatus> {
-		@Override /* HtmlRender */
-		public String getStyle(SerializerSession session, UserStatus value) {
-			switch(value) {
-				case ACTIVE:  return "background-color:#5cb85c;text-align:center;vertical-align:middle;";
-				case INACTIVE:  return "background-color:#888;text-align:center;vertical-align:middle;";
-				default:  return "";
-			}
-		}
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/package-info.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/package-info.java
deleted file mode 100755
index c235aa6..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/package-info.java
+++ /dev/null
@@ -1,18 +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.                                              *

-// ***************************************************************************************************************************

-

-/**

- * Examples

- */

-package org.apache.juneau.examples.rest.petstore.dto;

-

diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.java
deleted file mode 100644
index bc5021d..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.java
+++ /dev/null
@@ -1,68 +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.examples.rest.petstore.rest;
-
-import static org.apache.juneau.dto.html5.HtmlBuilder.*;
-import static org.apache.juneau.http.HttpMethodName.*;
-
-import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.widget.*;
-
-/**
- * Menu item for adding a Pet.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-public class AddOrderMenuItem extends MenuItemWidget {
-
-	@Override /* MenuItemWidget */
-	public String getLabel(RestRequest req, RestResponse res) throws Exception {
-		return "add";
-	}
-
-	@Override /* MenuItemWidget */
-	public String getBeforeShowScript(RestRequest req, RestResponse res) throws Exception {
-		return loadScript("AddOrderMenuItem_beforeShow.js");
-	}
-
-	@Override /* Widget */
-	public Object getContent(RestRequest req, RestResponse res) throws Exception {
-
-		return div(
-			form().id("form").action("servlet:/store/order").method(POST).children(
-				table(
-					tr(
-						th("Pet:"),
-						td(
-							select().id("addPet_names").name("petId")
-						),
-						td(new Tooltip("&#x2753;", "The pet to purchase."))
-					),
-					tr(
-						th("Ship date:"),
-						td(input().name("shipDate").type("date")),
-						td(new Tooltip("&#x2753;", "The requested ship date."))
-					),
-					tr(
-						td().colspan(2).style("text-align:right").children(
-							button("reset", "Reset"),
-							button("submit", "Submit")
-						)
-					)
-				).style("white-space:nowrap")
-			)
-		);
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.java
deleted file mode 100644
index 238c702..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.java
+++ /dev/null
@@ -1,75 +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.examples.rest.petstore.rest;
-
-import static org.apache.juneau.dto.html5.HtmlBuilder.*;
-import static org.apache.juneau.http.HttpMethodName.*;
-
-import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.widget.*;
-
-/**
- * Menu item for adding a Pet.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-public class AddPetMenuItem extends MenuItemWidget {
-
-	@Override /* MenuItemWidget */
-	public String getLabel(RestRequest req, RestResponse res) throws Exception {
-		return "add";
-	}
-
-	@Override /* Widget */
-	public Object getContent(RestRequest req, RestResponse res) throws Exception {
-		return div(
-			form().id("form").action("servlet:/pet").method(POST).children(
-				table(
-					tr(
-						th("Name:"),
-						td(input().name("name").type("text")),
-						td(new Tooltip("&#x2753;", "The name of the pet.", br(), "e.g. 'Fluffy'"))
-					),
-					tr(
-						th("Species:"),
-						td(
-							select().name("species").children(
-								option("CAT"), option("DOG"), option("BIRD"), option("FISH"), option("MOUSE"), option("RABBIT"), option("SNAKE")
-							)
-						),
-						td(new Tooltip("&#x2753;", "The kind of animal."))
-					),
-					tr(
-						th("Price:"),
-						td(input().name("price").type("number").placeholder("1.0").step("0.01").min(1).max(100).value(9.99)),
-						td(new Tooltip("&#x2753;", "The price to charge for this pet."))
-					),
-					tr(
-						th("Tags:"),
-						td(input().name("tags").type("text")),
-						td(new Tooltip("&#x2753;", "Arbitrary textual tags (comma-delimited).", br(), "e.g. 'fluffy,friendly'"))
-					),
-					tr(
-						td().colspan(2).style("text-align:right").children(
-							button("reset", "Reset"),
-							button("button","Cancel").onclick("window.location.href='/'"),
-							button("submit", "Submit")
-						)
-					)
-				).style("white-space:nowrap")
-			)
-		);
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStore.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStore.java
deleted file mode 100644
index 44260f5..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStore.java
+++ /dev/null
@@ -1,419 +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.examples.rest.petstore.rest;
-
-import static org.apache.juneau.http.HttpMethodName.*;
-
-import java.util.*;
-
-import org.apache.juneau.jsonschema.annotation.Items;
-import org.apache.juneau.*;
-import org.apache.juneau.examples.rest.petstore.*;
-import org.apache.juneau.examples.rest.petstore.dto.*;
-import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.client.remote.*;
-import org.apache.juneau.rest.exception.*;
-import org.apache.juneau.rest.response.*;
-
-/**
- * Defines the interface for both the server-side and client-side pet store application.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-@RemoteResource(path="/petstore")
-public interface PetStore {
-
-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-	// Pets
-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Returns all pets in the database.
-	 *
-	 * @return All pets in the database.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/pet")
-	public Collection<Pet> getPets() throws NotAcceptable;
-
-	/**
-	 * Returns a pet from the database.
-	 *
-	 * @param petId The ID of the pet to retrieve.
-	 * @return The pet.
-	 * @throws IdNotFound Pet was not found.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(path="/pet/{petId}") /* method inferred from method name */
-	public Pet getPet(
-		@Path(
-			name="petId",
-			description="ID of pet to return",
-			example="123"
-		)
-		long petId
-	) throws IdNotFound, NotAcceptable;
-
-	/**
-	 * Adds a pet to the database.
-	 *
-	 * @param pet The pet data to add to the database.
-	 * @return {@link Ok} if successful.
-	 * @throws IdConflict ID already in use.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 * @throws UnsupportedMediaType Unsupported <c>Content-Type</c> header specified.
-	 */
-	@RemoteMethod /* method and path inferred from method name */
-	public long postPet(
-		@Body(
-			description="Pet object to add to the store"
-		) CreatePet pet
-	) throws IdConflict, NotAcceptable, UnsupportedMediaType;
-
-	/**
-	 * Updates a pet in the database.
-	 *
-	 * @param pet The pet data to add to the database.
-	 * @return {@link Ok} if successful.
-	 * @throws IdNotFound ID not found.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 * @throws UnsupportedMediaType Unsupported <c>Content-Type</c> header specified.
-	 */
-	@RemoteMethod(method=PUT, path="/pet/{petId}")
-	public Ok updatePet(
-		@Body(
-			description="Pet object that needs to be added to the store"
-		) UpdatePet pet
-	) throws IdNotFound, NotAcceptable, UnsupportedMediaType;
-
-	/**
-	 * Find all pets with the matching statuses.
-	 *
-	 * @param status The statuses to match against.
-	 * @return The pets that match the specified statuses.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/pet/findByStatus")
-	public Collection<Pet> findPetsByStatus(
-		@Query(
-			name="status",
-			description="Status values that need to be considered for filter.",
-			required=true,
-			type="array",
-			collectionFormat="csv",
-			items=@Items(
-				type="string",
-				_enum="AVAILABLE,PENDING,SOLD",
-				_default="AVAILABLE"
-			),
-			example="AVALIABLE,PENDING"
-		)
-		PetStatus[] status
-	) throws NotAcceptable;
-
-	/**
-	 * Find all pets with the specified tags.
-	 *
-	 * @param tags The tags to match against.
-	 * @return The pets that match the specified tags.
-	 * @throws InvalidTag Invalid tag was specified.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/pet/findByTags")
-	@Deprecated
-	public Collection<Pet> findPetsByTags(
-		@Query(
-			name="tags",
-			description="Tags to filter by",
-			required=true,
-			example="['tag1','tag2']"
-		)
-		String[] tags
-	) throws InvalidTag, NotAcceptable;
-
-	/**
-	 * Deletes the specified pet.
-	 *
-	 * @param apiKey Security key.
-	 * @param petId ID of pet to delete.
-	 * @return {@link Ok} if successful.
-	 * @throws IdNotFound Pet not found.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=DELETE, path="/pet/{petId}")
-	public Ok deletePet(
-		@Header(
-			name="api_key",
-			description="Security API key",
-			required=true,
-			example="foobar"
-		)
-		String apiKey,
-		@Path(
-			name="petId",
-			description="Pet id to delete",
-			example="123"
-		)
-		long petId
-	) throws IdNotFound, NotAcceptable;
-
-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-	// Orders
-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Returns all orders in the database.
-	 *
-	 * @return All orders in the database.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/store/order")
-	public Collection<Order> getOrders() throws NotAcceptable;
-
-	/**
-	 * Returns an order from the database.
-	 *
-	 * @param orderId The ID of the order to retreieve.
-	 * @return The retrieved order.
-	 * @throws InvalidId ID was invalid.
-	 * @throws IdNotFound Order was not found.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/store/order/{orderId}")
-	public Order getOrder(
-		@Path(
-			name="orderId",
-			description="ID of order to fetch",
-			maximum="1000",
-			minimum="1",
-			example="123"
-		)
-		long orderId
-	) throws InvalidId, IdNotFound, NotAcceptable;
-
-	/**
-	 * Adds an order to the database.
-	 *
-	 * @param petId Id of pet to order.
-	 * @param username The username of the user placing the order.
-	 * @return The ID of the order.
-	 * @throws IdConflict ID was already in use.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 * @throws UnsupportedMediaType Unsupported <c>Content-Type</c> header specified.
-	 */
-	@RemoteMethod(method=POST, path="/store/order")
-	public long placeOrder(
-		@FormData(
-			name="petId",
-			description="Pet ID"
-		)
-		long petId,
-		@FormData(
-			name="username",
-			description="The username of the user creating the order"
-		)
-		String username
-	) throws IdConflict, NotAcceptable, UnsupportedMediaType;
-
-	/**
-	 * Deletes an order from the database.
-	 *
-	 * @param orderId The order ID.
-	 * @return {@link Ok} if successful.
-	 * @throws InvalidId ID not valid.
-	 * @throws IdNotFound Order not found.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=DELETE, path="/store/order/{orderId}")
-	public Ok deleteOrder(
-		@Path(
-			name="orderId",
-			description="ID of the order that needs to be deleted",
-			minimum="1",
-			example="5"
-		)
-		long orderId
-	) throws InvalidId, IdNotFound, NotAcceptable;
-
-	/**
-	 * Returns an inventory of pet statuses and counts.
-	 *
-	 * @return An inventory of pet statuses and counts.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/store/inventory")
-	public Map<PetStatus,Integer> getStoreInventory() throws NotAcceptable;
-
-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-	// Users
-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Returns all users in the database.
-	 *
-	 * @return All users in the database.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/user")
-	public Collection<User> getUsers() throws NotAcceptable;
-
-	/**
-	 * Returns a user from the database.
-	 *
-	 * @param username The username.
-	 * @return The user.
-	 * @throws InvalidUsername Invalid username.
-	 * @throws IdNotFound username not found.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/user/{username}")
-	public User getUser(
-		@Path(
-			name="username",
-			description="The name that needs to be fetched. Use user1 for testing."
-		)
-		String username
-	) throws InvalidUsername, IdNotFound, NotAcceptable;
-
-	/**
-	 * Adds a new user to the database.
-	 *
-	 * @param user The user to add to the database.
-	 * @return {@link Ok} if successful.
-	 * @throws InvalidUsername Username was invalid.
-	 * @throws IdConflict Username already in use.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 * @throws UnsupportedMediaType Unsupported <c>Content-Type</c> header specified.
-	 */
-	@RemoteMethod
-	public Ok postUser(
-		@Body(
-			description="Created user object"
-		)
-		User user
-	) throws InvalidUsername, IdConflict, NotAcceptable, UnsupportedMediaType;
-
-	/**
-	 * Bulk creates users.
-	 *
-	 * @param users The users to add to the database.
-	 * @return {@link Ok} if successful.
-	 * @throws InvalidUsername Username was invalid.
-	 * @throws IdConflict Username already in use.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 * @throws UnsupportedMediaType Unsupported <c>Content-Type</c> header specified.
-	 */
-	@RemoteMethod(method=POST, path="/user/createWithArray")
-	public Ok createUsers(
-		@Body(
-			description="List of user objects"
-		)
-		User[] users
-	) throws InvalidUsername, IdConflict, NotAcceptable, UnsupportedMediaType;
-
-	/**
-	 * Updates a user in the database.
-	 *
-	 * @param username The username.
-	 * @param user The updated information.
-	 * @return {@link Ok} if successful.
-	 * @throws InvalidUsername Username was invalid.
-	 * @throws IdNotFound User was not found.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 * @throws UnsupportedMediaType Unsupported <c>Content-Type</c> header specified.
-	 */
-	@RemoteMethod(method=PUT, path="/user/{username}")
-	public Ok updateUser(
-		@Path(
-			name="username",
-			description="Name that need to be updated"
-		)
-		String username,
-		@Body(
-			description="Updated user object"
-		)
-		User user
-	) throws InvalidUsername, IdNotFound, NotAcceptable, UnsupportedMediaType;
-
-	/**
-	 * Deletes a user from the database.
-	 *
-	 * @param username The username.
-	 * @return {@link Ok} if successful.
-	 * @throws InvalidUsername Username was not valid.
-	 * @throws IdNotFound User was not found.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=DELETE, path="/user/{username}")
-	public Ok deleteUser(
-		@Path(
-			name="username",
-			description="The name that needs to be deleted"
-		)
-		String username
-	) throws InvalidUsername, IdNotFound, NotAcceptable;
-
-	/**
-	 * User login.
-	 *
-	 * @param username The username for login.
-	 * @param password The password for login in clear text.
-	 * @param rateLimit Calls per hour allowed by the user.
-	 * @param expiresAfter The <bc>Expires-After</bc> response header.
-	 * @param req The servlet request.
-	 * @param res The servlet response.
-	 * @return {@link Ok} if successful.
-	 * @throws InvalidLogin Login was unsuccessful.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/user/login")
-	public Ok login(
-		@Query(
-			name="username",
-			description="The username for login.",
-			required=true,
-			example="myuser"
-		)
-		String username,
-		@Query(
-			name="password",
-			description="The password for login in clear text.",
-			required=true,
-			example="abc123"
-		)
-		String password,
-		@ResponseHeader(
-			name="X-Rate-Limit",
-			type="integer",
-			format="int32",
-			description="Calls per hour allowed by the user.",
-			example="123"
-		)
-		Value<Integer> rateLimit,
-		Value<ExpiresAfter> expiresAfter,
-		RestRequest req,
-		RestResponse res
-	) throws InvalidLogin, NotAcceptable;
-
-	/**
-	 * User logout.
-	 *
-	 * @return {@link Ok} if successful.
-	 * @throws NotAcceptable Unsupported <c>Accept</c> header specified.
-	 */
-	@RemoteMethod(method=GET, path="/user/logout")
-	public Ok logout() throws NotAcceptable;
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.java
deleted file mode 100644
index 1c4f8fd..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.java
+++ /dev/null
@@ -1,710 +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.examples.rest.petstore.rest;

-

-import static org.apache.juneau.dto.html5.HtmlBuilder.*;

-import static org.apache.juneau.dto.swagger.ui.SwaggerUI.*;

-import static org.apache.juneau.http.HttpMethodName.*;

-import static org.apache.juneau.rest.annotation.HookEvent.*;

-import static org.apache.juneau.rest.response.Ok.*;

-

-import java.util.*;

-import java.util.Map;

-

-import org.apache.juneau.jsonschema.annotation.ExternalDocs;

-import org.apache.juneau.*;

-import org.apache.juneau.annotation.*;

-import org.apache.juneau.dto.html5.*;

-import org.apache.juneau.examples.rest.petstore.*;

-import org.apache.juneau.examples.rest.petstore.dto.*;

-import org.apache.juneau.html.annotation.*;

-import org.apache.juneau.http.annotation.*;

-import org.apache.juneau.http.annotation.FormData;

-import org.apache.juneau.http.annotation.Path;

-import org.apache.juneau.internal.*;

-import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

-import org.apache.juneau.rest.helper.*;

-import org.apache.juneau.rest.response.*;

-import org.apache.juneau.rest.widget.*;

-import org.apache.juneau.transforms.*;

-import org.apache.juneau.rest.converters.*;

-

-/**

- * Sample Petstore application.

- *

- * <ul class='seealso'>

- * 	<li class='extlink'>{@source}

- * </ul>

- */

-@RestResource(

-	path="/petstore",

-	title="Petstore application",

-	description={

-		"This is a sample server Petstore server based on the Petstore sample at Swagger.io.",

-		"You can find out more about Swagger at http://swagger.io.",

-	},

-	properties= {

-		// Resolve recursive references when showing schema info in the swagger.

-		@Property(name=SWAGGERUI_resolveRefsMaxDepth, value="99")

-	},

-	swagger=@ResourceSwagger(

-		version="1.0.0",

-		title="Swagger Petstore",

-		termsOfService="You are on your own.",

-		contact=@Contact(

-			name="Juneau Development Team",

-			email="dev@juneau.apache.org",

-			url="http://juneau.apache.org"

-		),

-		license=@License(

-			name="Apache 2.0",

-			url="http://www.apache.org/licenses/LICENSE-2.0.html"

-		),

-		externalDocs=@ExternalDocs(

-			description="Find out more about Juneau",

-			url="http://juneau.apache.org"

-		),

-		tags={

-			@Tag(

-				name="pet",

-				description="Everything about your Pets",

-				externalDocs=@ExternalDocs(

-					description="Find out more",

-					url="http://juneau.apache.org"

-				)

-			),

-			@Tag(

-				name="store",

-				description="Access to Petstore orders"

-			),

-			@Tag(

-				name="user",

-				description="Operations about user",

-				externalDocs=@ExternalDocs(

-					description="Find out more about our store",

-					url="http://juneau.apache.org"

-				)

-			)

-		}

-	),

-	staticFiles={"htdocs:htdocs"},  // Expose static files in htdocs subpackage.

-	children={

-		SqlQueryResource.class,

-		PhotosResource.class

-	}

-)

-@HtmlDocConfig(

-	widgets={

-		ContentTypeMenuItem.class,

-		ThemeMenuItem.class,

-	},

-	navlinks={

-		"up: request:/..",

-		"options: servlet:/?method=OPTIONS",

-		"init: servlet:/init",

-		"$W{ContentTypeMenuItem}",

-		"$W{ThemeMenuItem}",

-		"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/petstore/$R{servletClassSimple}.java"

-	},

-	head={

-		"<link rel='icon' href='$U{servlet:/htdocs/cat.png}'/>"  // Add a cat icon to the page.

-	},

-	header={

-		"<h1>$R{resourceTitle}</h1>",

-		"<h2>$R{methodSummary}</h2>",

-		"$C{PetStore/headerImage}"

-	},

-	aside={

-		"<div style='max-width:400px' class='text'>",

-		"	<p>This page shows a standard nested REST resource.</p>",

-		"	<p>It shows how different properties can be rendered on the same bean in different views.</p>",

-		"	<p>It also shows examples of HtmlRender classes and @BeanProperty(format) annotations.</p>",

-		"	<p>It also shows how the Queryable converter and query widget can be used to create searchable interfaces.</p>",

-		"</div>"

-	},

-	stylesheet="servlet:/htdocs/themes/dark.css"  // Use dark theme by default.

-)

-public class PetStoreResource extends BasicRestJena implements PetStore {

-	private static final long serialVersionUID = 1L;

-

-	private PetStoreService store;

-

-	/**

-	 * Initializes our pet store service during servlet initialization.

-	 *

-	 * @param builder Optional access to rest context builder.

-	 */

-	@RestHook(INIT)

-	public void startup(RestContextBuilder builder) {

-		store = new PetStoreService();

-	}

-

-	/**

-	 * Navigation page

-	 *

-	 * @return Navigation page contents.

-	 */

-	@RestMethod(

-		name=GET,

-		path="/",

-		summary="Navigation page"

-	)

-	@HtmlDocConfig(

-		style={

-			"INHERIT",  // Flag for inheriting resource-level CSS.

-			"body { ",

-				"background-image: url('petstore/htdocs/background.jpg'); ",

-				"background-color: black; ",

-				"background-size: cover; ",

-				"background-attachment: fixed; ",

-			"}"

-		}

-	)

-	public ResourceDescriptions getTopPage() {

-		return new ResourceDescriptions()

-			.append("pet", "All pets in the store")

-			.append("store", "Orders and inventory")

-			.append("user", "Petstore users")

-			.append("photos", "Photos service")

-			.append("sql", "SQL query service")

-		;

-	}

-

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-	// Initialization

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-

-	/**

-	 * Initialize database form entry page.

-	 *

-	 * @return Initialize database form entry page contents.

-	 */

-	@RestMethod(

-		summary="Initialize database form entry page"

-	)

-	public Div getInit() {

-		return div(

-			form("servlet:/init").method(POST).target("buf").children(

-				table(

-					tr(

-						th("Initialize petstore database:"),

-						td(input("radio").name("init-method").value("direct").checked(true), "direct", input("radio").name("init-method").value("rest"), "rest"),

-						td(button("submit", "Submit").style("float:right").onclick("scrolling=true"))

-					)

-				)

-			),

-			br(),

-			iframe().id("buf").name("buf").style("width:800px;height:600px;").onload("window.parent.scrolling=false;"),

-			script("text/javascript",

-				"var scrolling = false;",

-				"function scroll() { if (scrolling) { document.getElementById('buf').contentWindow.scrollBy(0,50); } setTimeout('scroll()',200); } ",

-				"scroll();"

-			)

-		);

-	}

-

-	/**

-	 * Initialize database.

-	 *

-	 * @param initMethod The method used to initialize the database.

-	 * @param res HTTP request.

-	 * @throws Exception Error occurred.

-	 */

-	@RestMethod(

-		summary="Initialize database"

-	)

-	public void postInit(

-		@FormData("init-method") String initMethod,

-		RestResponse res

-	) throws Exception {

-		res.setHeader("Content-Encoding", "identity");

-		if ("direct".equals(initMethod))

-			store.initDirect(res.getDirectWriter("text/plain"));

-		else

-			store.initViaRest(res.getDirectWriter("text/plain"));

-	}

-

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-	// Pets

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-

-	@Override /* PetStore */

-	@RestMethod(

-		name=GET,

-		path="/pet",

-		summary="All pets in the store",

-		swagger=@MethodSwagger(

-			tags="pet",

-			parameters={

-				Queryable.SWAGGER_PARAMS

-			}

-		),

-		converters={Queryable.class}

-	)

-	@HtmlDocConfig(

-		widgets={

-			QueryMenuItem.class,

-			AddPetMenuItem.class

-		},

-		navlinks={

-			"INHERIT",                // Inherit links from class.

-			"[2]:$W{QueryMenuItem}",  // Insert QUERY link in position 2.

-			"[3]:$W{AddPetMenuItem}"  // Insert ADD link in position 3.

-		}

-	)

-	@BeanConfig(

-		bpx="Pet: tags,photo"

-	)

-	public Collection<Pet> getPets() throws NotAcceptable {

-		return store.getPets();

-	}

-

-	@Override /* PetStore */

-	@RestMethod(

-		name=GET,

-		path="/pet/{petId}",

-		summary="Find pet by ID",

-		description="Returns a single pet",

-		swagger=@MethodSwagger(

-			tags="pet",

-			value={

-				"security:[ { api_key:[] } ]"

-			}

-		)

-	)

-	public Pet getPet(long petId) throws IdNotFound, NotAcceptable {

-		return store.getPet(petId);

-	}

-

-	@Override /* PetStore */

-	@RestMethod(

-		summary="Add a new pet to the store",

-		swagger=@MethodSwagger(

-			tags="pet",

-			value={

-				"security:[ { petstore_auth:['write:pets','read:pets'] } ]"

-			}

-		)

-	)

-	public long postPet(CreatePet pet) throws IdConflict, NotAcceptable, UnsupportedMediaType {

-		return store.create(pet).getId();

-	}

-

-	@Override /* PetStore */

-	@RestMethod(

-		name=PUT,

-		path="/pet/{petId}",

-		summary="Update an existing pet",

-		swagger=@MethodSwagger(

-			tags="pet",

-			value={

-				"security:[ { petstore_auth: ['write:pets','read:pets'] } ]"

-			}

-		)

-	)

-	public Ok updatePet(UpdatePet pet) throws IdNotFound, NotAcceptable, UnsupportedMediaType {

-		store.update(pet);

-		return OK;

-	}

-

-	@Override /* PetStore */

-	@RestMethod(

-		name=GET,

-		path="/pet/findByStatus",

-		summary="Finds Pets by status",

-		description="Multiple status values can be provided with comma separated strings.",

-		swagger=@MethodSwagger(

-			tags="pet",

-			value={

-				"security:[{petstore_auth:['write:pets','read:pets']}]"

-			}

-		)

-	)

-	public Collection<Pet> findPetsByStatus(PetStatus[] status) throws NotAcceptable {

-		return store.getPetsByStatus(status);

-	}

-

-	@Override /* PetStore */

-	@RestMethod(

-		name=GET,

-		path="/pet/findByTags",

-		summary="Finds Pets by tags",

-		description="Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.",

-		swagger=@MethodSwagger(

-			tags="pet",

-			value={

-				"security:[ { petstore_auth:[ 'write:pets','read:pets' ] } ]"

-			}

-		)

-	)

-	@Deprecated

-	public Collection<Pet> findPetsByTags(String[] tags) throws InvalidTag, NotAcceptable {

-		return store.getPetsByTags(tags);

-	}

-

-	@Override /* PetStore */

-	@RestMethod(

-		name=DELETE,

-		path="/pet/{petId}",

-		summary="Deletes a pet",

-		swagger=@MethodSwagger(

-			tags="pet",

-			value={

-				"security:[ { petstore_auth:[ 'write:pets','read:pets' ] } ]"

-			}

-		)

-	)

-	public Ok deletePet(String apiKey, long petId) throws IdNotFound, NotAcceptable {

-		store.removePet(petId);

-		return OK;

-	}

-

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-	// Pets - extra methods

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-

-	/**

-	 * Displays the pet edit page.

-	 *

-	 * @param petId ID of pet to edit

-	 * @return Edit page contents.

-	 * @throws NotAcceptable Unsupported <bc>Accept</bc> header value specified.

-	 * @throws UnsupportedMediaType Unsupported <bc>Content-Type</bc> header value specified.

-	 */

-	@RestMethod(

-		name=GET,

-		path="/pet/{petId}/edit",

-		summary="Pet edit page",

-		swagger=@MethodSwagger(

-			tags="pet",

-			value={

-				"security:[ { petstore_auth:['write:pets','read:pets'] } ]"

-			}

-		)

-	)

-	public Div editPetPage(

-			@Path(

-				name="petId",

-				description="ID of pet to edit",

-				example="123"

-			)

-			long petId

-		) throws NotAcceptable, UnsupportedMediaType {

-

-		Pet pet = getPet(petId);

-

-		return div(

-			form().id("form").action("servlet:/pet/" + petId).method(POST).children(

-				table(

-					tr(

-						th("Id:"),

-						td(input().name("id").type("text").value(petId).readonly(true)),

-						td(new Tooltip("&#x2753;", "The name of the pet.", br(), "e.g. 'Fluffy'"))

-					),

-					tr(

-						th("Name:"),

-						td(input().name("name").type("text").value(pet.getName())),

-						td(new Tooltip("&#x2753;", "The name of the pet.", br(), "e.g. 'Fluffy'"))

-					),

-					tr(

-						th("Species:"),

-						td(

-							select().name("species").children(

-								option("cat"), option("dog"), option("bird"), option("fish"), option("mouse"), option("rabbit"), option("snake")

-							).choose(pet.getSpecies())

-						),

-						td(new Tooltip("&#x2753;", "The kind of animal."))

-					),

-					tr(

-						th("Price:"),

-						td(input().name("price").type("number").placeholder("1.0").step("0.01").min(1).max(100).value(pet.getPrice())),

-						td(new Tooltip("&#x2753;", "The price to charge for this pet."))

-					),

-					tr(

-						th("Tags:"),

-						td(input().name("tags").type("text").value(StringUtils.join(pet.getTags(), ','))),

-						td(new Tooltip("&#x2753;", "Arbitrary textual tags (comma-delimited).", br(), "e.g. 'fluffy,friendly'"))

-					),

-					tr(

-						th("Status:"),

-						td(

-							select().name("status").children(

-								option("AVAILABLE"), option("PENDING"), option("SOLD")

-							).choose(pet.getStatus())

-						),

-						td(new Tooltip("&#x2753;", "The current status of the animal."))

-					),

-					tr(

-						td().colspan(2).style("text-align:right").children(

-							button("reset", "Reset"),

-							button("button","Cancel").onclick("window.location.href='/'"),

-							button("submit", "Submit")

-						)

-					)

-				).style("white-space:nowrap")

-			)

-		);

-	}

-

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-	// Orders

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-

-	/**

-	 * Store navigation page.

-	 *

-	 * @return Store navigation page contents.

-	 */

-	@RestMethod(

-		summary="Store navigation page",

-		swagger=@MethodSwagger(

-			tags="store"

-		)

-	)

-	public ResourceDescriptions getStore() {

-		return new ResourceDescriptions()

-			.append("store/order", "Petstore orders")

-			.append("store/inventory", "Petstore inventory")

-		;

-	}

-

-	@Override

-	@RestMethod(

-		name=GET,

-		path="/store/order",

-		summary="Petstore orders",

-		swagger=@MethodSwagger(

-			tags="store"

-		)

-	)

-	@HtmlDocConfig(

-		widgets={

-			QueryMenuItem.class,

-			AddOrderMenuItem.class

-		},

-		navlinks={

-			"INHERIT",                // Inherit links from class.

-			"[2]:$W{QueryMenuItem}",  // Insert QUERY link in position 2.

-			"[3]:$W{AddOrderMenuItem}"  // Insert ADD link in position 3.

-		}

-	)

-	public Collection<Order> getOrders() throws NotAcceptable {

-		return store.getOrders();

-	}

-

-	@Override

-	@RestMethod(

-		name=GET,

-		path="/store/order/{orderId}",

-		summary="Find purchase order by ID",

-		description="Returns a purchase order by ID.",

-		swagger=@MethodSwagger(

-			tags="store"

-		)

-	)

-	public Order getOrder(long orderId) throws InvalidId, IdNotFound, NotAcceptable {

-		if (orderId < 1 || orderId > 1000)

-			throw new InvalidId();

-		return store.getOrder(orderId);

-	}

-

-	@Override

-	@RestMethod(

-		name=POST,

-		path="/store/order",

-		summary="Place an order for a pet",

-		swagger=@MethodSwagger(

-			tags="store"

-		),

-		pojoSwaps={

-			TemporalDateSwap.IsoLocalDate.class

-		}

-	)

-	public long placeOrder(long petId, String username) throws IdConflict, NotAcceptable, UnsupportedMediaType {

-		CreateOrder co = new CreateOrder(petId, username);

-		return store.create(co).getId();

-	}

-

-	@Override

-	@RestMethod(

-		name=DELETE,

-		path="/store/order/{orderId}",

-		summary="Delete purchase order by ID",

-		description= {

-			"For valid response try integer IDs with positive integer value.",

-			"Negative or non-integer values will generate API errors."

-		},

-		swagger=@MethodSwagger(

-			tags="store"

-		)

-	)

-	public Ok deleteOrder(long orderId) throws InvalidId, IdNotFound, NotAcceptable {

-		if (orderId < 0)

-			throw new InvalidId();

-		store.removeOrder(orderId);

-		return OK;

-	}

-

-	@Override

-	@RestMethod(

-		name=GET,

-		path="/store/inventory",

-		summary="Returns pet inventories by status",

-		description="Returns a map of status codes to quantities",

-		swagger=@MethodSwagger(

-			tags="store",

-			responses={

-				"200:{ 'x-example':{AVAILABLE:123} }",

-			},

-			value={

-				"security:[ { api_key:[] } ]"

-			}

-		)

-	)

-	public Map<PetStatus,Integer> getStoreInventory() throws NotAcceptable {

-		return store.getInventory();

-	}

-

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-	// Users

-	//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-

-	@Override

-	@RestMethod(

-		name=GET,

-		path="/user",

-		summary="Petstore users",

-		bpx="User: email,password,phone",

-		swagger=@MethodSwagger(

-			tags="user"

-		)

-	)

-	public Collection<User> getUsers() throws NotAcceptable {

-		return store.getUsers();

-	}

-

-	@Override

-	@RestMethod(

-		name=GET,

-		path="/user/{username}",

-		summary="Get user by user name",

-		swagger=@MethodSwagger(

-			tags="user"

-		)

-	)

-	public User getUser(String username) throws InvalidUsername, IdNotFound, NotAcceptable {

-		return store.getUser(username);

-	}

-

-	@Override

-	@RestMethod(

-		summary="Create user",

-		description="This can only be done by the logged in user.",

-		swagger=@MethodSwagger(

-			tags="user"

-		)

-	)

-	public Ok postUser(User user) throws InvalidUsername, IdConflict, NotAcceptable, UnsupportedMediaType {

-		store.create(user);

-		return OK;

-	}

-

-	@Override

-	@RestMethod(

-		name=POST,

-		path="/user/createWithArray",

-		summary="Creates list of users with given input array",

-		swagger=@MethodSwagger(

-			tags="user"

-		)

-	)

-	public Ok createUsers(User[] users) throws InvalidUsername, IdConflict, NotAcceptable, UnsupportedMediaType {

-		for (User user : users)

-			store.create(user);

-		return OK;

-	}

-

-	@Override

-	@RestMethod(

-		name=PUT,

-		path="/user/{username}",

-		summary="Update user",

-		description="This can only be done by the logged in user.",

-		swagger=@MethodSwagger(

-			tags="user"

-		)

-	)

-	public Ok updateUser(String username, User user) throws InvalidUsername, IdNotFound, NotAcceptable, UnsupportedMediaType {

-		store.update(user);

-		return OK;

-	}

-

-	@Override

-	@RestMethod(

-		name=DELETE,

-		path="/user/{username}",

-		summary="Delete user",

-		description="This can only be done by the logged in user.",

-		swagger=@MethodSwagger(

-			tags="user"

-		)

-	)

-	public Ok deleteUser(String username) throws InvalidUsername, IdNotFound, NotAcceptable {

-		store.removeUser(username);

-		return OK;

-	}

-

-	@Override

-	@RestMethod(

-		name=GET,

-		path="/user/login",

-		summary="Logs user into the system",

-		swagger=@MethodSwagger(

-			tags="user"

-		)

-	)

-	public Ok login(

-			String username,

-			String password,

-			Value<Integer> rateLimit,

-			Value<ExpiresAfter> expiresAfter,

-			RestRequest req,

-			RestResponse res

-		) throws InvalidLogin, NotAcceptable {

-

-		if (! store.isValid(username, password))

-			throw new InvalidLogin();

-

-		Date d = new Date(System.currentTimeMillis() + 30 * 60 * 1000);

-		req.getSession().setAttribute("login-expires", d);

-		rateLimit.set(1000);

-		expiresAfter.set(new ExpiresAfter(d));

-		return OK;

-	}

-

-	@Override

-	@RestMethod(

-		name=GET,

-		path="/user/logout",

-		summary="Logs out current logged in user session",

-		swagger=@MethodSwagger(

-			tags="user"

-		)

-	)

-	public Ok logout() throws NotAcceptable {

-		getRequest().getSession().removeAttribute("login-expires");

-		return OK;

-	}

-}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.java
deleted file mode 100644
index f50b5b4..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.java
+++ /dev/null
@@ -1,327 +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.examples.rest.petstore.rest;

-

-import static org.apache.juneau.http.HttpMethodName.*;

-

-import org.apache.juneau.jsonschema.annotation.ExternalDocs;

-import org.apache.juneau.jsonschema.annotation.Schema;

-import java.awt.image.*;

-import java.io.*;

-import java.net.*;

-import java.util.*;

-import java.util.Map;

-

-import javax.imageio.*;

-import javax.servlet.*;

-import javax.servlet.http.*;

-

-import org.apache.juneau.*;

-import org.apache.juneau.html.annotation.*;

-import org.apache.juneau.http.annotation.*;

-import org.apache.juneau.http.annotation.Body;

-import org.apache.juneau.http.annotation.Path;

-import org.apache.juneau.http.annotation.Response;

-import org.apache.juneau.internal.*;

-import org.apache.juneau.parser.*;

-import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

-import org.apache.juneau.rest.helper.*;

-import org.apache.juneau.rest.matchers.*;

-import org.apache.juneau.serializer.*;

-

-/**

- * Sample resource that allows images to be uploaded and retrieved.

- *

- * <ul class='seealso'>

- * 	<li class='extlink'>{@source}

- * </ul>

- */

-@RestResource(

-	path="/photos",

-	messages="nls/PhotosResource",

-	title="Photo REST service",

-	description="Sample resource that allows images to be uploaded and retrieved.",

-	swagger=@ResourceSwagger(

-		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),

-		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),

-		version="2.0",

-		termsOfService="You are on your own.",

-		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")

-	)

-)

-@HtmlDocConfig(

-	navlinks={

-		"up: request:/..",

-		"options: servlet:/?method=OPTIONS",

-		"$W{UploadPhotoMenuItem}",

-		"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"

-	},

-	aside={

-		"<div style='max-width:400px;min-width:200px' class='text'>",

-		"	<p>Shows an example of using custom serializers and parsers to create REST interfaces over binary resources.</p>",

-		"	<p>In this case, our resources are marshalled jpeg and png binary streams and are stored in an in-memory 'database' (also known as a <c>TreeMap</c>).</p>",

-		"</div>"

-	},

-	widgets={

-		UploadPhotoMenuItem.class

-	},

-	stylesheet="servlet:/htdocs/themes/dark.css"

-)

-@HtmlConfig(

-	// Make the anchor text on URLs be just the path relative to the servlet.

-	uriAnchorText="SERVLET_RELATIVE"

-)

-public class PhotosResource extends BasicRestServlet {

-	private static final long serialVersionUID = 1L;

-

-	// Our cache of photos

-	private Map<String,Photo> photos = new TreeMap<>();

-

-	@Override /* Servlet */

-	public void init() {

-		try (InputStream is = getClass().getResourceAsStream("photos/cat.jpg")) {

-			BufferedImage image = ImageIO.read(is);

-			Photo photo = new Photo("cat", image);

-			photos.put(photo.id, photo);

-		} catch (IOException e) {

-			throw new RuntimeException(e);

-		}

-	}

-

-	/** Our bean class for storing photos */

-	public static class Photo {

-		String id;

-		BufferedImage image;

-

-		Photo(String id, BufferedImage image) {

-			this.id = id;

-			this.image = image;

-		}

-

-		/**

-		 * @return The URI of this photo.

-		 * @throws URISyntaxException ID could not be converted to a URI.

-		 */

-		public URI getURI() throws URISyntaxException {

-			return new URI("servlet:/" + id);

-		}

-	}

-

-	//-----------------------------------------------------------------------------------------------------------------

-	// REST methods

-	//-----------------------------------------------------------------------------------------------------------------

-

-	/**

-	 * Show the list of all currently loaded photos

-	 *

-	 * @return The list of all currently loaded photos.

-	 * @throws Exception Error occurred.

-	 */

-	@RestMethod(

-		name=GET,

-		path="/",

-		summary="Show the list of all currently loaded photos"

-	)

-	public Collection<Photo> getAllPhotos() throws Exception {

-		return photos.values();

-	}

-

-	/**

-	 * Shows how to use a custom serializer to serialize a BufferedImage object to a stream.

-	 *

-	 * @param id The photo ID.

-	 * @return The image.

-	 * @throws NotFound Image was not found.

-	 */

-	@RestMethod(

-		name=GET,

-		path="/{id}",

-		serializers=ImageSerializer.class,

-		summary="Get a photo by ID",

-		description="Shows how to use a custom serializer to serialize a BufferedImage object to a stream."

-	)

-	@Response(

-		schema=@Schema(type="file")

-	)

-	public BufferedImage getPhoto(@Path("id") String id) throws NotFound {

-		Photo p = photos.get(id);

-		if (p == null)

-			throw new NotFound("Photo not found");

-		return p.image;

-	}

-

-	/**

-	 * Shows how to use a custom parser to parse a stream into a BufferedImage object.

-	 *

-	 * @param id The photo ID.

-	 * @param image Binary contents of image.

-	 * @return <js>"OK"</jk> if successful.

-	 * @throws Exception Error occurred.

-	 */

-	@RestMethod(

-		name=PUT,

-		path="/{id}",

-		parsers=ImageParser.class,

-		summary="Add or overwrite a photo",

-		description="Shows how to use a custom parser to parse a stream into a BufferedImage object."

-	)

-	public String addPhoto(

-			@Path("id") String id,

-			@Body(

-				description="Binary contents of image.",

-				schema=@Schema(type="file")

-			)

-			BufferedImage image

-		) throws Exception {

-		photos.put(id, new Photo(id, image));

-		return "OK";

-	}

-

-	/**

-	 * Shows how to use a custom parser to parse a stream into a BufferedImage object.

-	 *

-	 * @param image Binary contents of image.

-	 * @return The Photo bean.

-	 * @throws Exception Error occurred.

-	 */

-	@RestMethod(

-		name=POST,

-		path="/",

-		parsers=ImageParser.class,

-		summary="Add a photo",

-		description="Shows how to use a custom parser to parse a stream into a BufferedImage object."

-	)

-	public Photo setPhoto(

-			@Body(

-				description="Binary contents of image.",

-				schema=@Schema(type="file")

-			)

-			BufferedImage image

-		) throws Exception {

-		Photo p = new Photo(UUID.randomUUID().toString(), image);

-		photos.put(p.id, p);

-		return p;

-	}

-

-	/**

-	 * Upload a photo from a multipart form post.

-	 *

-	 * @param req HTTP request.

-	 * @return Redirect to servlet root.

-	 * @throws Exception Error occurred.

-	 */

-	@RestMethod(

-		name=POST,

-		path="/upload",

-		matchers=MultipartFormDataMatcher.class,

-		summary="Upload a photo from a multipart form post",

-		description="Shows how to parse a multipart form post containing a binary field.",

-		swagger=@MethodSwagger(

-			parameters={

-				"{in:'formData', name:'id', description:'Unique identifier to assign to image.', type:'string', required:false},",

-				"{in:'formData', name:'file', description:'The binary contents of the image file.', type:'file', required:true}"

-			}

-		)

-	)

-    public SeeOtherRoot uploadFile(RestRequest req) throws Exception {

-       MultipartConfigElement multipartConfigElement = new MultipartConfigElement((String)null);

-       req.setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement);

-       String id = UUID.randomUUID().toString();

-       BufferedImage img = null;

-       for (Part part : req.getParts()) {

-    	   switch (part.getName()) {

-    		   case "id":

-    			   id = IOUtils.read(part.getInputStream());

-    			   break;

-    		   case "file":

-    			   img = ImageIO.read(part.getInputStream());

-    	   }

-       }

-       addPhoto(id, img);

-       return new SeeOtherRoot(); // Redirect to the servlet root.

-    }

-

-	/**

-	 * Removes a photo from the database.

-	 *

-	 * @param id ID of photo to remove.

-	 * @return <js>"OK"</jk> if successful.

-	 * @throws NotFound Photo was not found.

-	 */

-	@RestMethod(

-		name=DELETE,

-		path="/{id}",

-		summary="Delete a photo by ID"

-	)

-	public String deletePhoto(@Path("id") String id) throws NotFound {

-		Photo p = photos.remove(id);

-		if (p == null)

-			throw new NotFound("Photo not found");

-		return "OK";

-	}

-

-	//-----------------------------------------------------------------------------------------------------------------

-	// Custom serializers and parsers.

-	//-----------------------------------------------------------------------------------------------------------------

-

-	/** Serializer for converting images to byte streams */

-	public static class ImageSerializer extends OutputStreamSerializer {

-

-		/**

-		 * Constructor.

-		 * @param ps The property store containing all the settings for this object.

-		 */

-		public ImageSerializer(PropertyStore ps) {

-			super(ps, null, "image/png,image/jpeg");

-		}

-

-		@Override /* Serializer */

-		public OutputStreamSerializerSession createSession(SerializerSessionArgs args) {

-			return new OutputStreamSerializerSession(args) {

-

-				@Override /* SerializerSession */

-				protected void doSerialize(SerializerPipe out, Object o) throws IOException, SerializeException {

-					RenderedImage image = (RenderedImage)o;

-					String mediaType = getProperty("mediaType", String.class, (String)null);

-					ImageIO.write(image, mediaType.substring(mediaType.indexOf('/')+1), out.getOutputStream());

-				}

-			};

-		}

-	}

-

-	/** Parser for converting byte streams to images */

-	public static class ImageParser extends InputStreamParser {

-

-		/**

-		 * Constructor.

-		 * @param ps The property store containing all the settings for this object.

-		 */

-		public ImageParser(PropertyStore ps) {

-			super(ps, "image/png", "image/jpeg");

-		}

-

-		@Override /* Parser */

-		public InputStreamParserSession createSession(final ParserSessionArgs args) {

-			return new InputStreamParserSession(args) {

-

-				@Override /* ParserSession */

-				@SuppressWarnings("unchecked")

-				protected <T> T doParse(ParserPipe pipe, ClassMeta<T> type) throws IOException, ParseException, ExecutableException {

-					return (T)ImageIO.read(pipe.getInputStream());

-				}

-			};

-		}

-	}

-}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.java
deleted file mode 100644
index 3562bb7..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.java
+++ /dev/null
@@ -1,249 +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.examples.rest.petstore.rest;

-

-import static org.apache.juneau.dto.html5.HtmlBuilder.*;

-import static org.apache.juneau.http.HttpMethodName.*;

-import static org.apache.juneau.internal.StringUtils.*;

-import static org.apache.juneau.rest.annotation.HookEvent.*;

-

-import java.sql.*;

-import java.util.*;

-

-import org.apache.juneau.jsonschema.annotation.ExternalDocs;

-import org.apache.juneau.config.*;

-import org.apache.juneau.dto.*;

-import org.apache.juneau.dto.html5.*;

-import org.apache.juneau.html.annotation.*;

-import org.apache.juneau.http.annotation.*;

-import org.apache.juneau.http.annotation.Body;

-import org.apache.juneau.http.annotation.Query;

-import org.apache.juneau.http.annotation.Response;

-import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

-import org.apache.juneau.rest.widget.*;

-

-/**

- * Sample resource that shows how Juneau can serialize ResultSets.

- *

- * <ul class='seealso'>

- * 	<li class='extlink'>{@source}

- * </ul>

- */

-@RestResource(

-	path="/sql",

-	title="SQL query service",

-	description="Executes queries against the local derby '$C{SqlQueryResource/connectionUrl}' database",

-	swagger=@ResourceSwagger(

-		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),

-		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),

-		version="2.0",

-		termsOfService="You are on your own.",

-		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")

-	)

-)

-@HtmlDocConfig(

-	widgets={

-		ThemeMenuItem.class

-	},

-	navlinks={

-		"up: request:/..",

-		"options: servlet:/?method=OPTIONS",

-		"$W{ThemeMenuItem}",

-		"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"

-	},

-	aside={

-		"<div style='min-width:200px' class='text'>",

-		"	<p>An example of a REST interface over a relational database that serializes ResultSet objects.</p>",

-		"	<p>Specify one or more queries delimited by semicolons.</p>",

-		"	<h5>Examples:</h5>",

-		"	<ul>",

-		"		<li><a class='link' href='?sql=select+*+from+sys.systables'>Tables</a>",

-		"		<li><a class='link' href='?sql=select+*+from+PetstorePet'>Pets</a>",

-		"		<li><a class='link' href='?sql=select+*+from+PetstoreOrder'>Orders</a>",

-		"		<li><a class='link' href='?sql=select+*+from+PetstoreUser'>Users</a>",

-		"	</ul>",

-		"</div>"

-	},

-	stylesheet="servlet:/htdocs/themes/dark.css"

-)

-public class SqlQueryResource extends BasicRestServlet {

-	private static final long serialVersionUID = 1L;

-

-	private String driver, connectionUrl;

-	private boolean allowUpdates, allowTempUpdates, includeRowNums;

-

-	/**

-	 * Initializes the registry URL and rest client.

-	 *

-	 * @param builder The resource config.

-	 */

-	@RestHook(INIT)

-	public void initConnection(RestContextBuilder builder) {

-		Config cf = builder.getConfig();

-

-		driver = cf.getString("SqlQueryResource/driver");

-		connectionUrl = cf.getString("SqlQueryResource/connectionUrl");

-		allowUpdates = cf.getBoolean("SqlQueryResource/allowUpdates", false);

-		allowTempUpdates = cf.getBoolean("SqlQueryResource/allowTempUpdates", false);

-		includeRowNums = cf.getBoolean("SqlQueryResource/includeRowNums", false);

-

-		try {

-			Class.forName(driver).newInstance();

-		} catch (Exception e) {

-			e.printStackTrace(System.err);

-			throw new RuntimeException(e);

-		}

-	}

-

-	/**

-	 * Displays the query entry page.

-	 *

-	 * @param sql Text to prepopulate the SQL query field with.

-	 * @return The HTML div tag to serialize.

-	 */

-	@RestMethod(

-		summary="Display the query entry page"

-	)

-	public Div get(

-			@Query(

-				name="sql",

-				description="Text to prepopulate the SQL query field with.",

-				example="select * from sys.systables"

-			)

-			String sql

-		) {

-

-		return div(

-			script("text/javascript",

-				"// Quick and dirty function to allow tabs in textarea.",

-				"function checkTab(e) {",

-				"	if (e.keyCode == 9) {",

-				"		var t = e.target;",

-				"		var ss = t.selectionStart, se = t.selectionEnd;",

-				"		t.value = t.value.slice(0,ss).concat('\\t').concat(t.value.slice(ss,t.value.length));",

-				"		e.preventDefault();",

-				"	}",

-				"}",

-				"// Load results from IFrame into this document.",

-				"function loadResults(b) {",

-				"	var doc = b.contentDocument || b.contentWindow.document;",

-				"	var data = doc.getElementById('data') || doc.getElementsByTagName('body')[0];",

-				"	document.getElementById('results').innerHTML = data.innerHTML;",

-				"}"

-			),

-			form("servlet:/").method(POST).target("buf").children(

-				table(

-					tr(

-						th("Position (1-10000):").style("white-space:nowrap"),

-						td(input().name("pos").type("number").value(1)),

-						th("Limit (1-10000):").style("white-space:nowrap"),

-						td(input().name("limit").type("number").value(100)),

-						td(button("submit", "Submit"), button("reset", "Reset"))

-					),

-					tr(

-						td().colspan(5).children(

-							textarea().name("sql").text(sql == null ? " " : sql).style("width:100%;height:200px;font-family:Courier;font-size:9pt;").onkeydown("checkTab(event)")

-						)

-					)

-				)

-			),

-			br(),

-			div().id("results"),

-			iframe().name("buf").style("display:none").onload("parent.loadResults(this)")

-		);

-	}

-

-	/**

-	 * Execute one or more queries.

-	 *

-	 * @param in

-	 * 	Query input

-	 * @return

-	 * 	Query results.

-	 * 	<br>Each entry in the array is a result of one query.

-	 * 	<b>Each result can be a result set (for queries) or update count (for updates).

-	 * @throws BadRequest Invalid SQL detected.

-	 */

-	@RestMethod(

-		summary="Execute one or more queries"

-	)

-	@Response(

-		description="Query results.\nEach entry in the array is a result of one query.\nEach result can be a result set (for queries) or update count (for updates)."

-	)

-	public List<Object> post(

-			@Body(

-				description="Query input",

-				example="{sql:'select * from sys.systables',pos:1,limit:100}"

-			)

-			PostInput in

-		) throws BadRequest {

-

-		List<Object> results = new LinkedList<>();

-

-		// Don't try to submit empty input.

-		if (isEmpty(in.sql))

-			return results;

-

-		if (in.pos < 1 || in.pos > 10000)

-			throw new BadRequest("Invalid value for position.  Must be between 1-10000");

-		if (in.limit < 1 || in.limit > 10000)

-			throw new BadRequest("Invalid value for limit.  Must be between 1-10000");

-

-		String sql = null;

-

-		// Create a connection and statement.

-		// If these fais, let the exception filter up as a 500 error.

-		try (Connection c = DriverManager.getConnection(connectionUrl)) {

-			c.setAutoCommit(false);

-			try (Statement st = c.createStatement()) {

-				for (String s : in.sql.split(";")) {

-					sql = s.trim();

-					if (! sql.isEmpty()) {

-						Object o = null;

-						if (allowUpdates || (allowTempUpdates && ! sql.matches("(?:i)commit.*"))) {

-							if (st.execute(sql)) {

-								try (ResultSet rs = st.getResultSet()) {

-									o = new ResultSetList(rs, in.pos, in.limit, includeRowNums);

-								}

-							} else {

-								o = st.getUpdateCount();

-							}

-						} else {

-							try (ResultSet rs = st.executeQuery(sql)) {

-								o = new ResultSetList(rs, in.pos, in.limit, includeRowNums);

-							}

-						}

-						results.add(o);

-					}

-				}

-			}

-			if (allowUpdates)

-				c.commit();

-			else if (allowTempUpdates)

-				c.rollback();

-		} catch (SQLException e) {

-			throw new BadRequest(e, "Invalid query:  {0}", sql);

-		}

-

-		return results;

-	}

-

-	/** The parsed form post */

-	@SuppressWarnings("javadoc")

-	public static class PostInput {

-		public String sql = "";

-		public int pos = 1, limit = 100;

-	}

-}

diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.java
deleted file mode 100644
index 53cf0b4..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.java
+++ /dev/null
@@ -1,61 +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.examples.rest.petstore.rest;
-
-import static org.apache.juneau.dto.html5.HtmlBuilder.*;
-import static org.apache.juneau.http.HttpMethodName.*;
-
-import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.widget.*;
-
-/**
- * Menu item for uploading a Photo.
- *
- * <ul class='seealso'>
- * 	<li class='extlink'>{@source}
- * </ul>
- */
-public class UploadPhotoMenuItem extends MenuItemWidget {
-
-	@Override /* MenuItemWidget */
-	public String getLabel(RestRequest req, RestResponse res) throws Exception {
-		return "upload";
-	}
-
-	@Override /* Widget */
-	public Object getContent(RestRequest req, RestResponse res) throws Exception {
-		return div(
-			form().id("form").action("servlet:/upload").method(POST).enctype("multipart/form-data").children(
-				table(
-					tr(
-						th("ID:"),
-						td(input().name("id").type("text")),
-						td(new Tooltip("&#x2753;", "The unique identifier of the photo.", br(), "e.g. 'Fluffy'"))
-					),
-					tr(
-						th("File:"),
-						td(input().name("file").type("file").accept("image/*")),
-						td(new Tooltip("&#x2753;", "The image file."))
-					),
-					tr(
-						td().colspan(2).style("text-align:right").children(
-							button("reset", "Reset"),
-							button("button","Cancel").onclick("window.location.href='/'"),
-							button("submit", "Submit")
-						)
-					)
-				).style("white-space:nowrap")
-			)
-		);
-	}
-}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/package-info.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/package-info.java
deleted file mode 100755
index 50c7038..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/package-info.java
+++ /dev/null
@@ -1,18 +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.                                              *

-// ***************************************************************************************************************************

-

-/**

- * Examples

- */

-package org.apache.juneau.examples.rest.petstore.rest;

-

diff --git a/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/PetStore.json b/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/PetStore.json
deleted file mode 100644
index 4e523f3..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/PetStore.json
+++ /dev/null
@@ -1,21 +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.                                              *
-// ***************************************************************************************************************************
-{
-	101: {kind:'CAT',name:'Mr. Frisky',price:39.99,breed:'Persian',getsAlongWith:['CAT','FISH','RABBIT'],birthDate:'2012-07-04'},
-	102: {kind:'DOG',name:'Kibbles',price:99.99,breed:'Husky',getsAlongWith:['DOG','BIRD','FISH','MOUSE','RABBIT'],birthDate:'2014-09-01'},
-	103: {kind:'RABBIT',name:'Hoppy',price:49.99,breed:'Angora',getsAlongWith:['DOG','BIRD','FISH','MOUSE'],birthDate:'2017-04-16'},
-	104: {kind:'RABBIT',name:'Hoppy 2',price:49.99,breed:'Angora',getsAlongWith:['DOG','BIRD','FISH','MOUSE'],birthDate:'2017-04-17'},
-	105: {kind:'FISH',name:'Gorton',price:1.99,breed:'Gold',getsAlongWith:['FISH'],birthDate:'2017-06-20'},
-	106: {kind:'MOUSE',name:'Hackwrench',price:4.99,breed:'Gadget',getsAlongWith:['FISH','MOUSE'],birthDate:'2017-06-20'},
-	107: {kind:'SNAKE',name:'Just Snake',price:9.99,breed:'Human',getsAlongWith:['SNAKE'],birthDate:'2017-06-21'}
-}
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/files/petstore.html b/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/files/petstore.html
deleted file mode 100644
index 080e07c..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/files/petstore.html
+++ /dev/null
@@ -1,545 +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.                                              *
- ***************************************************************************************************************************
--->
-
-<html>
-<head>
-
-<style class='text/css'>
-
-/*-----------------------------------------------------------------------------------------------------------
- - Method buttons (e.g GET/PUT/... buttons)                                                                
- ----------------------------------------------------------------------------------------------------------*/
-.method-button {
-  	display: inline-block;
-	font-size: 14px;
-    font-weight: bold;
-    min-width: 60px;
-    padding: 6px 15px;
-    text-align: center;
-    border-radius: 3px;
-    text-shadow: 0 1px 0 rgba(0,0,0,.1);
-    font-family: sans-serif;
-    color: #fff;
-}
-.get .method-button        { background: rgb(97,175,254); }
-.put .method-button        { background: rgb(252,161,48); }
-.post .method-button       { background: rgb(73,204,144); }
-.delete .method-button     { background: rgb(249,62,62); }
-.options .method-button    { background: rgb(153,102,255); }
-.deprecated .method-button { background: rgb(170,170,170); }
-.other .method-button      { background: rgb(230,230,0); }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Tag block                                                                                                -
- - Encapsulates one or more op-blocks.
- ----------------------------------------------------------------------------------------------------------*/
-
-.tag-block-summary {
-	margin: 10px 0px;
-	padding: 10px 0px;
-	font-family: sans-serif;	
-    align-items: center;
-    cursor: pointer;
-	border-bottom: 1px solid rgba(59,65,81,.2);
-}
-.tag-block-summary .name {
-	font-family: sans-serif;
-	font-size: 22px;
-	padding: 0px 20px;
-}
-.tag-block-summary .description {
-	font-size: 16px;
-	padding: 0px 20px;
-}
-.tag-block-summary .extdocs {
-	float: right;
-	font-size: 14px;
-	padding: 0px 20px;
-}
-
-.is-tag-block-open .tag-block-contents { display: block; }
-.is-tag-block-closed .tag-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block                                                                                          
- - Encapsulates a single http-method + http-path
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block {
-	margin-bottom: 10px;
-	font-family: sans-serif;	
-    align-items: center;
-    border-radius: 4px;
-}
-
-.op-block.get        { background: rgba(97,175,254,.1); border: 1px solid rgb(97,175,254); }
-.op-block.put        { background: rgba(252,161,48,.1); border: 1px solid rgb(252,161,48); }
-.op-block.post       { background: rgba(73,204,144,.1); border: 1px solid rgb(73,204,144); }
-.op-block.options    { background: rgba(153,102,255,.1); border: 1px solid rgb(153,102,255); }
-.op-block.delete     { background: rgba(249,62,62,.1); border: 1px solid rgb(249,62,62); }
-.op-block.deprecated { background: rgba(170,170,170,.1); border: 1px solid rgb(170,170,170); }
-.op-block.other      { background: rgba(230,230,0,0.1); border: 1px solid rgb(230,230,0); }
-
-.op-block-summary {	
-	padding: 5px;
-    cursor: pointer;
-}
-
-.op-block-summary .path {
-	font-size: 16px;
-	word-break: break-all;
-    font-family: monospace;
-    font-weight: bold;
-	color: #3b4151;
-    padding:10px;
-}
-
-.op-block.deprecated .op-block-summary .path { color: #8f9199; text-decoration: line-through;}
-.op-block.deprecated .op-block-summary .description { color: #8f9199 }
-
-.op-block-summary .description {
-    font-family: sans-serif;
-    color: #3b4151;
-    font-size: 14px;
-    padding: 10px;
-}
-
-.is-op-block-open .op-block-contents { display: block; }
-.is-op-block-closed .op-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block section header                                                                                               -
- - 'Parameters' and 'Responses' subsections in an op-block
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-section-header {
-	padding: 8px 20px;
-    background: hsla(0,0%,100%,.8);
-    box-shadow: 0 1px 2px rgba(0,0,0,.1);
-    font-family: sans-serif;
-    color: #8f9199;      
-}
-
-.op-block-section-header .title {
-    font-size: 14px;
-	font-family: sans-serif;
-    color: #3b4151;
-    margin: 0px;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameters and Respones sections
- ----------------------------------------------------------------------------------------------------------*/
-
-.parameters, .responses {
-    border-collapse: collapse;
-    margin: 20px;
-	width: 95%;
-	border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-.parameters th, .responses th {
-	font-size: 12px;
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-    font-family: sans-serif;
-    color: #3b4151;
-}
-
-.parameters td, .responses td {
-    padding: 12px 0;
-    text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameter name
- ----------------------------------------------------------------------------------------------------------*/
-
-.parameter-key .in {
-	font-size: 12px;
-    font-family: monospace;
-    font-weight: bold;
-    font-style: italic;
-    color: gray;
-}
-
-.parameter-key .name {
-	font-size: 16px;
-    font-family: sans-serif;
-    color: #3b4151;
-}
-
-.parameter-key .name.required {
-    font-weight: bold;
-}
-
-.parameter-key .type {
-    font-size: 12px;
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-    color: #3b4151;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Examples
- ----------------------------------------------------------------------------------------------------------*/
- 
-.tab {
-    display: flex;
-    margin: 20px 0 10px;
-    padding: 0;
-    list-style: none;
-    cursor: pointer;
-    font-family: sans-serif;
-    color: #3b4151;
-    font-size: 12px;
-}
-
-.tab li {
-	margin: 0px 2px;
-}
-
-.tab .active {
-    font-weight: bold;
-    cursor: auto;
-}
-
-.tab li:not(:last-child):after {
-    content: " -";
-    font-weight: normal;
-    box-sizing: inherit;
-}
-
-.tab li:hover {
-    font-weight: bold;
-}
-
-.example {
-    font-size: 12px;
-    margin: 0;
-    padding: 5px 20px;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-    hyphens: auto;
-    border-radius: 4px;
-    background: #41444e;
-    overflow-wrap: break-word;
-    font-family: monospace;
-    font-weight: 400;
-    color: #fff;
-	display: none;
-}
-
-.example.active {
-	display:block;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Headers
- ----------------------------------------------------------------------------------------------------------*/
-
-.section {
-	font-size: 12px;
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-    font-family: sans-serif;
-    color: #3b4151;
-}
-
-.headers .name {
-    font-size: 12px;
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-    color: #3b4151;
-}
-
-div.headers {
-	margin: 20px 0px;
-}
-
-.headers .type {
-    font-size: 12px;
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-    color: #3b4151;
-}
-
-.section-name {
-	display: inline-block;
-	vertical-align: top;
-	margin-right: 20px;
-	font-size: 12px;
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-    font-family: sans-serif;
-    color: #3b4151;
-	
-}
-
-.section-table {
-	display: inline-block;
-}
-
-.responses .section-table td {
-	padding: 5px 20px 5px 0px;
-	text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-	</style>
-	<script>
-
-	function toggleOpBlock(e) {
-		e = e.parentNode;
-		var isOpen = e.classList.contains("is-op-block-open");
-		if (isOpen) {
-			e.classList.add("is-op-block-closed");
-			e.classList.remove("is-op-block-open");
-		} else {
-			e.classList.add("is-op-block-open");
-			e.classList.remove("is-op-block-closed");
-		}
-		window.getSelection().removeAllRanges();
-	}
-	
-	function toggleTagBlock(e) {
-		e = e.parentNode;
-		var isOpen = e.classList.contains("is-tag-block-open");
-		if (isOpen) {
-			e.classList.add("is-tag-block-closed");
-			e.classList.remove("is-tag-block-open");
-		} else {
-			e.classList.add("is-tag-block-open");
-			e.classList.remove("is-tag-block-closed");
-		}
-		window.getSelection().removeAllRanges();
-	}
-
-	function selectExample(e) {
-		var dataName = e.getAttribute("data-name");
-		var examplesNode = e.parentNode.parentNode;
-		var lis = examplesNode.getElementsByTagName("li");
-		var divs = examplesNode.getElementsByTagName("div");
-		
-		for (var i in lis) {
-			var li = lis[i], div = divs[i];
-			if (li.getAttribute("data-name") == dataName) {
-				li.classList.add("active");
-				div.classList.add("active");
-			} else {
-				li.classList.remove("active");
-				div.classList.remove("active");
-			}
-		}
-	}
-	</script>
-</head>
-<body>
-
-<div class='tag-block is-tag-block-open'>
-	<div class='tag-block-summary' onclick='toggleTagBlock(this)'>
-		<span class='name'>pet</span>
-		<span class='description'>Everything about your Pets</span>
-		<span class='extdocs'><a href='http://apache.org'>Find out more</a></span>
-	</div>
-	<div class='tag-block-contents'>
-		<div class='op-block get is-op-block-open'>
-			<div class='op-block-summary' onclick='toggleOpBlock(this)'>
-				<span class='method-button'>GET</span>
-				<span class='path'>/pet</span>
-				<span class='description'>Everything about your Pets</span>
-			</div>
-			<div class='op-block-contents'>
-				<div class="table-container">
-					<div class='op-block-description'>
-					</div>			
-				
-					<div class="op-block-section-header">
-						<h4 class="title">Parameters</h4>
-					</div>	
-					<table class="parameters">
-						<tr>
-							<th>Name</th>
-							<th>Description</th>
-						</tr>
-						<tr>
-							<td class='parameter-key'>
-								<div class='name required'>body</div>
-								<div class='type'>integer</div>
-								<div class='deprecated'></div>
-								<div class='in'>(body)</div>
-							</td>
-							<td class='parameter-value'>
-								<div class='description'>Pet object that needs to be added to the store.</div>
-								<div class='examples'>
-									<ul class="tab">
-										<li class="active" data-name='model' onclick='selectExample(this)'>Model</li>
-										<li data-name='application/json' onclick='selectExample(this)'>application/json</li>
-										<li data-name='text/xml' onclick='selectExample(this)'>text/xml</li>
-										<li data-name='text/html' onclick='selectExample(this)'>text/html</li>
-										<li data-name='octal/messagepack' onclick='selectExample(this)'>octal/messagepack</li>
-									</ul>
-									<div data-name='model' class='example active'>
-		MODEL
-									</div>
-									<div data-name='application/json' class='example'>
-		APPLICATION/JSON
-									</div>
-									<div data-name='text/xml' class='example'>
-		TEXT/XML
-									</div>
-									<div data-name='text/html' class='example'>
-		TEXT/HTML
-									</div>
-									<div data-name='octal/messagepack' class='example'>
-		OCTAL/MESSAGEPACK
-									</div>
-								</div>
-							</td>
-						</tr>
-					</table>
-					<div class="op-block-section-header">
-						<h4 class="title">Responses</h4>
-					</div>	
-					<table class="responses">
-						<tr>
-							<th>Code</th>
-							<th>Description</th>
-						</tr>
-						<tr>
-							<td>200</td>
-							<td>
-								<div class='description'>Successful operation</div>
-								<div class='examples'>
-									<ul class="tab">
-										<li class="active" data-name='model' onclick='selectExample(this)'>Model</li>
-										<li data-name='application/json' onclick='selectExample(this)'>application/json</li>
-										<li data-name='text/xml' onclick='selectExample(this)'>text/xml</li>
-										<li data-name='text/html' onclick='selectExample(this)'>text/html</li>
-										<li data-name='octal/messagepack' onclick='selectExample(this)'>octal/messagepack</li>
-									</ul>
-									<div data-name='model' class='example active'>
-		MODEL
-									</div>
-									<div data-name='application/json' class='example'>
-		APPLICATION/JSON
-									</div>
-									<div data-name='text/xml' class='example'>
-		TEXT/XML
-									</div>
-									<div data-name='text/html' class='example'>
-		TEXT/HTML
-									</div>
-									<div data-name='octal/messagepack' class='example'>
-		OCTAL/MESSAGEPACK
-									</div>
-								</div>
-								<div class='headers'>
-									<div class='section-name'>Headers:</div>
-									<table class='section-table'>
-										<tr>
-											<th>Name</th>
-											<th>Description</th>
-											<th>Type</th>
-										</tr>
-										<tr>
-											<td class='name'>X-Rate-Limit</td>
-											<td class='description'>Calls per hour allowed by the user</td>
-											<td class='type'>integer</td>
-										</tr>
-									</table>
-								</div>
-							</td>
-						</tr>
-						<tr>
-							<td>400</td>
-							<td>
-								<div class='description'>Bad thing happened</div>
-							</td>
-						</tr>
-					</table>
-				</div>
-			</div>
-			
-		</div>
-		
-		<div class='op-block put is-closed' onclick='toggle(this)'>
-			<div class='op-block-summary'>
-				<span class='method-button'>PUT</span>
-				<span class='path'>/pet</span>
-				<span class='description'>Everything about your Pets</span>
-			</div>
-		</div>
-		
-		<div class='op-block post is-closed' onclick='toggle(this)'>
-			<div class='op-block-summary'>
-				<span class='method-button'>POST</span>
-				<span class='path'>/pet</span>
-				<span class='description'>Everything about your Pets</span>
-			</div>
-		</div>
-	</div>
-</div>
-<div class='tag-block is-tag-block-open'>
-	<div class='tag-block-summary' onclick='toggleTagBlock(this)'>
-		<span class='name'>owner</span>
-		<span class='description'>Everything about your Owner</span>
-		<span class='extdocs'><a href='http://apache.org'>Find out more</a></span>
-	</div>
-	<div class='tag-block-contents'>
-		<div class='op-block delete is-closed' onclick='toggle(this)'>
-			<div class='op-block-summary'>
-				<span class='method-button'>DELETE</span>
-				<span class='path'>/pet</span>
-				<span class='description'>Everything about your Pets</span>
-			</div>
-		</div>
-		<div class='op-block deprecated is-closed' onclick='toggle(this)'>
-			<div class='op-block-summary'>
-				<span class='method-button'>GET</span>
-				<span class='path'>/pet</span>
-				<span class='description'>Everything about your Pets</span>
-			</div>
-		</div>
-		
-		<div class='op-block other is-closed' onclick='toggle(this)'>
-			<div class='op-block-summary'>
-				<span class='method-button'>OTHER</span>
-				<span class='path'>/pet</span>
-				<span class='description'>Everything about your Pets</span>
-			</div>
-		</div>
-		
-		<div class='op-block options is-closed' onclick='toggle(this)'>
-			<div class='op-block-summary'>
-				<span class='method-button'>OPTIONS</span>
-				<span class='path'>/pet</span>
-				<span class='description'>Everything about your Pets</span>
-			</div>
-		</div>
-	</div>
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/files/petstore.json b/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/files/petstore.json
deleted file mode 100644
index 0c52155..0000000
--- a/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/files/petstore.json
+++ /dev/null
@@ -1,1081 +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.                                              *
-// ***************************************************************************************************************************
-
-{
-	"swagger": "2.0",
-	"info": {
-		"description": "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.",
-		"version": "1.0.0",
-		"title": "Swagger Petstore",
-		"termsOfService": "http://swagger.io/terms/",
-		"contact": {
-			"email": "apiteam@swagger.io"
-		},
-		"license": {
-			"name": "Apache 2.0",
-			"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
-		}
-	},
-	"host": "petstore.swagger.io",
-	"basePath": "/v2",
-	"tags": [
-		{
-			"name": "pet",
-			"description": "Everything about your Pets",
-			"externalDocs": {
-				"description": "Find out more",
-				"url": "http://swagger.io"
-			}
-		},
-		{
-			"name": "store",
-			"description": "Access to Petstore orders"
-		},
-		{
-			"name": "user",
-			"description": "Operations about user",
-			"externalDocs": {
-				"description": "Find out more about our store",
-				"url": "http://swagger.io"
-			}
-		}
-	],
-	"schemes": [
-		"http"
-	],
-	"paths": {
-		"/pet": {
-			"post": {
-				"tags": [
-					"pet"
-				],
-				"summary": "Add a new pet to the store",
-				"description": "",
-				"operationId": "addPet",
-				"consumes": [
-					"application/json",
-					"application/xml"
-				],
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"in": "body",
-						"name": "body",
-						"description": "Pet object that needs to be added to the store",
-						"required": true,
-						"schema": {
-							"$ref": "#/definitions/Pet"
-						}
-					}
-				],
-				"responses": {
-					"405": {
-						"description": "Invalid input"
-					}
-				},
-				"security": [
-					{
-						"petstore_auth": [
-							"write:pets",
-							"read:pets"
-						]
-					}
-				]
-			},
-			"put": {
-				"tags": [
-					"pet"
-				],
-				"summary": "Update an existing pet",
-				"description": "",
-				"operationId": "updatePet",
-				"consumes": [
-					"application/json",
-					"application/xml"
-				],
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"in": "body",
-						"name": "body",
-						"description": "Pet object that needs to be added to the store",
-						"required": true,
-						"schema": {
-							"$ref": "#/definitions/Pet"
-						}
-					}
-				],
-				"responses": {
-					"400": {
-						"description": "Invalid ID supplied"
-					},
-					"404": {
-						"description": "Pet not found"
-					},
-					"405": {
-						"description": "Validation exception"
-					}
-				},
-				"security": [
-					{
-						"petstore_auth": [
-							"write:pets",
-							"read:pets"
-						]
-					}
-				]
-			}
-		},
-		"/pet/findByStatus": {
-			"get": {
-				"summary": "Finds Pets by status",
-				"description": "Multiple status values can be provided with comma separated strings",
-				"operationId": "findPetsByStatus",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "status",
-						"in": "query",
-						"description": "Status values that need to be considered for filter",
-						"required": true,
-						"type": "array",
-						"items": {
-							"type": "string",
-							"enum": [
-								"available",
-								"pending",
-								"sold"
-							],
-							"default": "available"
-						},
-						"collectionFormat": "multi"
-					}
-				],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"type": "array",
-							"items": {
-								"$ref": "#/definitions/Pet"
-							}
-						}
-					},
-					"400": {
-						"description": "Invalid status value"
-					}
-				},
-				"security": [
-					{
-						"petstore_auth": [
-							"write:pets",
-							"read:pets"
-						]
-					}
-				]
-			}
-		},
-		"/pet/findByTags": {
-			"get": {
-				"tags": [
-					"pet"
-				],
-				"summary": "Finds Pets by tags",
-				"description": "Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.",
-				"operationId": "findPetsByTags",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "tags",
-						"in": "query",
-						"description": "Tags to filter by",
-						"required": true,
-						"type": "array",
-						"items": {
-							"type": "string"
-						},
-						"collectionFormat": "multi"
-					}
-				],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"type": "array",
-							"items": {
-								"$ref": "#/definitions/Pet"
-							}
-						}
-					},
-					"400": {
-						"description": "Invalid tag value"
-					}
-				},
-				"security": [
-					{
-						"petstore_auth": [
-							"write:pets",
-							"read:pets"
-						]
-					}
-				],
-				"deprecated": true
-			}
-		},
-		"/pet/{petId}": {
-			"get": {
-				"tags": [
-					"pet"
-				],
-				"summary": "Find pet by ID",
-				"description": "Returns a single pet",
-				"operationId": "getPetById",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "petId",
-						"in": "path",
-						"description": "ID of pet to return",
-						"required": true,
-						"type": "integer",
-						"format": "int64"
-					}
-				],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"$ref": "#/definitions/Pet"
-						}
-					},
-					"400": {
-						"description": "Invalid ID supplied"
-					},
-					"404": {
-						"description": "Pet not found"
-					}
-				},
-				"security": [
-					{
-						"api_key": []
-					}
-				]
-			},
-			"post": {
-				"tags": [
-					"pet"
-				],
-				"summary": "Updates a pet in the store with form data",
-				"description": "",
-				"operationId": "updatePetWithForm",
-				"consumes": [
-					"application/x-www-form-urlencoded"
-				],
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "petId",
-						"in": "path",
-						"description": "ID of pet that needs to be updated",
-						"required": true,
-						"type": "integer",
-						"format": "int64"
-					},
-					{
-						"name": "name",
-						"in": "formData",
-						"description": "Updated name of the pet",
-						"required": false,
-						"type": "string"
-					},
-					{
-						"name": "status",
-						"in": "formData",
-						"description": "Updated status of the pet",
-						"required": false,
-						"type": "string"
-					}
-				],
-				"responses": {
-					"405": {
-						"description": "Invalid input"
-					}
-				},
-				"security": [
-					{
-						"petstore_auth": [
-							"write:pets",
-							"read:pets"
-						]
-					}
-				]
-			},
-			"delete": {
-				"tags": [
-					"pet"
-				],
-				"summary": "Deletes a pet",
-				"description": "",
-				"operationId": "deletePet",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "api_key",
-						"in": "header",
-						"required": false,
-						"type": "string"
-					},
-					{
-						"name": "petId",
-						"in": "path",
-						"description": "Pet id to delete",
-						"required": true,
-						"type": "integer",
-						"format": "int64"
-					}
-				],
-				"responses": {
-					"400": {
-						"description": "Invalid ID supplied"
-					},
-					"404": {
-						"description": "Pet not found"
-					}
-				},
-				"security": [
-					{
-						"petstore_auth": [
-							"write:pets",
-							"read:pets"
-						]
-					}
-				]
-			}
-		},
-		"/pet/{petId}/uploadImage": {
-			"post": {
-				"tags": [
-					"pet"
-				],
-				"summary": "uploads an image",
-				"description": "",
-				"operationId": "uploadFile",
-				"consumes": [
-					"multipart/form-data"
-				],
-				"produces": [
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "petId",
-						"in": "path",
-						"description": "ID of pet to update",
-						"required": true,
-						"type": "integer",
-						"format": "int64"
-					},
-					{
-						"name": "additionalMetadata",
-						"in": "formData",
-						"description": "Additional data to pass to server",
-						"required": false,
-						"type": "string"
-					},
-					{
-						"name": "file",
-						"in": "formData",
-						"description": "file to upload",
-						"required": false,
-						"type": "file"
-					}
-				],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"$ref": "#/definitions/ApiResponse"
-						}
-					}
-				},
-				"security": [
-					{
-						"petstore_auth": [
-							"write:pets",
-							"read:pets"
-						]
-					}
-				]
-			}
-		},
-		"/store/inventory": {
-			"get": {
-				"tags": [
-					"store"
-				],
-				"summary": "Returns pet inventories by status",
-				"description": "Returns a map of status codes to quantities",
-				"operationId": "getInventory",
-				"produces": [
-					"application/json"
-				],
-				"parameters": [],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"type": "object",
-							"additionalProperties": {
-								"type": "integer",
-								"format": "int32"
-							}
-						}
-					}
-				},
-				"security": [
-					{
-						"api_key": []
-					}
-				]
-			}
-		},
-		"/store/order": {
-			"post": {
-				"tags": [
-					"store"
-				],
-				"summary": "Place an order for a pet",
-				"description": "",
-				"operationId": "placeOrder",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"in": "body",
-						"name": "body",
-						"description": "order placed for purchasing the pet",
-						"required": true,
-						"schema": {
-							"$ref": "#/definitions/Order"
-						}
-					}
-				],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"$ref": "#/definitions/Order"
-						}
-					},
-					"400": {
-						"description": "Invalid Order"
-					}
-				}
-			}
-		},
-		"/store/order/{orderId}": {
-			"get": {
-				"tags": [
-					"store"
-				],
-				"summary": "Find purchase order by ID",
-				"description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions",
-				"operationId": "getOrderById",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "orderId",
-						"in": "path",
-						"description": "ID of pet that needs to be fetched",
-						"required": true,
-						"type": "integer",
-						"maximum": 10.0,
-						"minimum": 1.0,
-						"format": "int64"
-					}
-				],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"$ref": "#/definitions/Order"
-						}
-					},
-					"400": {
-						"description": "Invalid ID supplied"
-					},
-					"404": {
-						"description": "Order not found"
-					}
-				}
-			},
-			"delete": {
-				"tags": [
-					"store"
-				],
-				"summary": "Delete purchase order by ID",
-				"description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors",
-				"operationId": "deleteOrder",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "orderId",
-						"in": "path",
-						"description": "ID of the order that needs to be deleted",
-						"required": true,
-						"type": "integer",
-						"minimum": 1.0,
-						"format": "int64"
-					}
-				],
-				"responses": {
-					"400": {
-						"description": "Invalid ID supplied"
-					},
-					"404": {
-						"description": "Order not found"
-					}
-				}
-			}
-		},
-		"/user": {
-			"post": {
-				"tags": [
-					"user"
-				],
-				"summary": "Create user",
-				"description": "This can only be done by the logged in user.",
-				"operationId": "createUser",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"in": "body",
-						"name": "body",
-						"description": "Created user object",
-						"required": true,
-						"schema": {
-							"$ref": "#/definitions/User"
-						}
-					}
-				],
-				"responses": {
-					"default": {
-						"description": "successful operation"
-					}
-				}
-			}
-		},
-		"/user/createWithArray": {
-			"post": {
-				"tags": [
-					"user"
-				],
-				"summary": "Creates list of users with given input array",
-				"description": "",
-				"operationId": "createUsersWithArrayInput",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"in": "body",
-						"name": "body",
-						"description": "List of user object",
-						"required": true,
-						"schema": {
-							"type": "array",
-							"items": {
-								"$ref": "#/definitions/User"
-							}
-						}
-					}
-				],
-				"responses": {
-					"default": {
-						"description": "successful operation"
-					}
-				}
-			}
-		},
-		"/user/createWithList": {
-			"post": {
-				"tags": [
-					"user"
-				],
-				"summary": "Creates list of users with given input array",
-				"description": "",
-				"operationId": "createUsersWithListInput",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"in": "body",
-						"name": "body",
-						"description": "List of user object",
-						"required": true,
-						"schema": {
-							"type": "array",
-							"items": {
-								"$ref": "#/definitions/User"
-							}
-						}
-					}
-				],
-				"responses": {
-					"default": {
-						"description": "successful operation"
-					}
-				}
-			}
-		},
-		"/user/login": {
-			"get": {
-				"tags": [
-					"user"
-				],
-				"summary": "Logs user into the system",
-				"description": "",
-				"operationId": "loginUser",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "username",
-						"in": "query",
-						"description": "The user name for login",
-						"required": true,
-						"type": "string"
-					},
-					{
-						"name": "password",
-						"in": "query",
-						"description": "The password for login in clear text",
-						"required": true,
-						"type": "string"
-					}
-				],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"type": "string"
-						},
-						"headers": {
-							"X-Rate-Limit": {
-								"type": "integer",
-								"format": "int32",
-								"description": "calls per hour allowed by the user"
-							},
-							"X-Expires-After": {
-								"type": "string",
-								"format": "date-time",
-								"description": "date in UTC when token expires"
-							}
-						}
-					},
-					"400": {
-						"description": "Invalid username/password supplied"
-					}
-				}
-			}
-		},
-		"/user/logout": {
-			"get": {
-				"tags": [
-					"user"
-				],
-				"summary": "Logs out current logged in user session",
-				"description": "",
-				"operationId": "logoutUser",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [],
-				"responses": {
-					"default": {
-						"description": "successful operation"
-					}
-				}
-			}
-		},
-		"/user/{username}": {
-			"get": {
-				"tags": [
-					"user"
-				],
-				"summary": "Get user by user name",
-				"description": "",
-				"operationId": "getUserByName",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "username",
-						"in": "path",
-						"description": "The name that needs to be fetched. Use user1 for testing. ",
-						"required": true,
-						"type": "string"
-					}
-				],
-				"responses": {
-					"200": {
-						"description": "successful operation",
-						"schema": {
-							"$ref": "#/definitions/User"
-						}
-					},
-					"400": {
-						"description": "Invalid username supplied"
-					},
-					"404": {
-						"description": "User not found"
-					}
-				}
-			},
-			"put": {
-				"tags": [
-					"user"
-				],
-				"summary": "Updated user",
-				"description": "This can only be done by the logged in user.",
-				"operationId": "updateUser",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "username",
-						"in": "path",
-						"description": "name that need to be updated",
-						"required": true,
-						"type": "string"
-					},
-					{
-						"in": "body",
-						"name": "body",
-						"description": "Updated user object",
-						"required": true,
-						"schema": {
-							"$ref": "#/definitions/User"
-						}
-					}
-				],
-				"responses": {
-					"400": {
-						"description": "Invalid user supplied"
-					},
-					"404": {
-						"description": "User not found"
-					}
-				}
-			},
-			"delete": {
-				"tags": [
-					"user"
-				],
-				"summary": "Delete user",
-				"description": "This can only be done by the logged in user.",
-				"operationId": "deleteUser",
-				"produces": [
-					"application/xml",
-					"application/json"
-				],
-				"parameters": [
-					{
-						"name": "username",
-						"in": "path",
-						"description": "The name that needs to be deleted",
-						"required": true,
-						"type": "string"
-					}
-				],
-				"responses": {
-					"400": {
-						"description": "Invalid username supplied"
-					},
-					"404": {
-						"description": "User not found"
-					}
-				}
-			}
-		}
-	},
-	"securityDefinitions": {
-		"petstore_auth": {
-			"type": "oauth2",
-			"authorizationUrl": "http://petstore.swagger.io/oauth/dialog",
-			"flow": "implicit",
-			"scopes": {
-				"write:pets": "modify pets in your account",
-				"read:pets": "read your pets"
-			}
-		},
-		"api_key": {
-			"type": "apiKey",
-			"name": "api_key",
-			"in": "header"
-		}
-	},
-	"definitions": {
-		"Order": {
-			"type": "object",
-			"properties": {
-				"id": {
-					"type": "integer",
-					"format": "int64"
-				},
-				"petId": {
-					"type": "integer",
-					"format": "int64"
-				},
-				"quantity": {
-					"type": "integer",
-					"format": "int32"
-				},
-				"shipDate": {
-					"type": "string",
-					"format": "date-time"
-				},
-				"status": {
-					"type": "string",
-					"description": "Order Status",
-					"enum": [
-						"placed",
-						"approved",
-						"delivered"
-					]
-				},
-				"complete": {
-					"type": "boolean",
-					"default": false
-				}
-			},
-			"xml": {
-				"name": "Order"
-			},
-			"x-examples": {
-				"application/json": "{\n\tfoo: 'bar',\n\tbaz: 123\n}",
-				"text/xml": "<foo>bar</foo>",
-				"text/html": "<table>foo</table>",
-				"octal-messagepack": "12 34 56 AB CD EF"
-			}
-		},
-		"User": {
-			"type": "object",
-			"properties": {
-				"id": {
-					"type": "integer",
-					"format": "int64"
-				},
-				"username": {
-					"type": "string"
-				},
-				"firstName": {
-					"type": "string"
-				},
-				"lastName": {
-					"type": "string"
-				},
-				"email": {
-					"type": "string"
-				},
-				"password": {
-					"type": "string"
-				},
-				"phone": {
-					"type": "string"
-				},
-				"userStatus": {
-					"type": "integer",
-					"format": "int32",
-					"description": "User Status"
-				}
-			},
-			"xml": {
-				"name": "User"
-			},
-			"x-examples": {
-				"application/json": "{\n\tfoo: 'bar',\n\tbaz: 123\n}",
-				"text/xml": "<foo>bar</foo>",
-				"text/html": "<table>foo</table>",
-				"octal-messagepack": "12 34 56 AB CD EF"
-			}
-		},
-		"Category": {
-			"type": "object",
-			"properties": {
-				"id": {
-					"type": "integer",
-					"format": "int64"
-				},
-				"name": {
-					"type": "string"
-				}
-			},
-			"xml": {
-				"name": "Category"
-			},
-			"x-examples": {
-				"application/json": "{\n\tfoo: 'bar',\n\tbaz: 123,\n\tflags:[\n\t\t'f1',\n\t\t'f1',\n\t\t'f3'\n\t]\n}",
-				"text/xml": "<foo>bar</foo>",
-				"text/html": "<table>foo</table>",
-				"octal-messagepack": "12 34 56 AB CD EF"
-			}
-		},
-		"Tag": {
-			"type": "object",
-			"properties": {
-				"id": {
-					"type": "integer",
-					"format": "int64"
-				},
-				"name": {
-					"type": "string"
-				}
-			},
-			"xml": {
-				"name": "Tag"
-			},
-			"x-examples": {
-				"application/json": "{\n\tfoo: 'bar',\n\tbaz: 123\n}",
-				"text/xml": "<foo>bar</foo>",
-				"text/html": "<table>foo</table>",
-				"octal-messagepack": "12 34 56 AB CD EF"
-			}
-		},
-		"Pet": {
-			"type": "object",
-			"required": [
-				"name",
-				"photoUrls"
-			],
-			"properties": {
-				"id": {
-					"type": "integer",
-					"format": "int64"
-				},
-				"category": {
-					"$ref": "#/definitions/Category"
-				},
-				"name": {
-					"type": "string",
-					"example": "doggie"
-				},
-				"photoUrls": {
-					"type": "array",
-					"xml": {
-						"name": "photoUrl",
-						"wrapped": true
-					},
-					"items": {
-						"type": "string"
-					}
-				},
-				"tags": {
-					"type": "array",
-					"xml": {
-						"name": "tag",
-						"wrapped": true
-					},
-					"items": {
-						"$ref": "#/definitions/Tag"
-					}
-				},
-				"status": {
-					"type": "string",
-					"description": "pet status in the store",
-					"enum": [
-						"available",
-						"pending",
-						"sold"
-					]
-				}
-			},
-			"xml": {
-				"name": "Pet"
-			},
-			"x-examples": {
-				"application/json": "{\n\tfoo: 'bar',\n\tbaz: 123,\n\tflags:[\n\t\t'f1',\n\t\t'f1',\n\t\t'f3'\n\t]\n}",
-				"text/xml": "<foo>bar</foo>",
-				"text/html": "<table>foo</table>",
-				"octal-messagepack": "12 34 56 AB CD EF"
-			},
-		},
-		"ApiResponse": {
-			"type": "object",
-			"properties": {
-				"code": {
-					"type": "integer",
-					"format": "int32"
-				},
-				"type": {
-					"type": "string"
-				},
-				"message": {
-					"type": "string"
-				}
-			},
-			"x-examples": {
-				"application/json": "{\n\tfoo: 'bar',\n\tbaz: 123\n}",
-				"text/xml": "<foo>bar</foo>",
-				"text/html": "<table>foo</table>",
-				"octal-messagepack": "12 34 56 AB CD EF"
-			}
-		}
-	},
-	"externalDocs": {
-		"description": "Find out more about Swagger",
-		"url": "http://swagger.io"
-	}
-}
\ No newline at end of file
diff --git a/juneau-examples/pom.xml b/juneau-examples/pom.xml
index cf817f0..6248de4 100644
--- a/juneau-examples/pom.xml
+++ b/juneau-examples/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-examples</artifactId>
diff --git a/juneau-microservice/juneau-microservice-core/pom.xml b/juneau-microservice/juneau-microservice-core/pom.xml
index 418139d..a6fb368 100644
--- a/juneau-microservice/juneau-microservice-core/pom.xml
+++ b/juneau-microservice/juneau-microservice-core/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-microservice</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-microservice-core</artifactId>
diff --git a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
index afd44d8..929446d 100755
--- a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
+++ b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
@@ -28,7 +28,7 @@
 import org.apache.juneau.parser.*;

 import org.apache.juneau.rest.*;

 import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 

 /**

  * Shows contents of the microservice configuration file.

diff --git a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
index f86c2dc..216cb62 100755
--- a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
+++ b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
@@ -28,7 +28,7 @@
 import org.apache.juneau.jsonschema.annotation.*;

 import org.apache.juneau.rest.*;

 import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.helper.*;

 import org.apache.juneau.utils.*;

 

diff --git a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
index ca5e545..a5ac800 100755
--- a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
+++ b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
@@ -30,7 +30,7 @@
 import org.apache.juneau.rest.*;

 import org.apache.juneau.rest.annotation.*;

 import org.apache.juneau.rest.converters.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.helper.*;

 

 /**

diff --git a/juneau-microservice/juneau-microservice-ftest/juneau-microservice-test.cfg b/juneau-microservice/juneau-microservice-ftest/juneau-microservice-test.cfg
index dbf37f3..5cabc07 100644
--- a/juneau-microservice/juneau-microservice-ftest/juneau-microservice-test.cfg
+++ b/juneau-microservice/juneau-microservice-ftest/juneau-microservice-test.cfg
@@ -43,9 +43,9 @@
 [Test]

 int1 = 1

 int2 = [1,2,3]

-int3 = $C{Test/int1, -1}

-int4 = $C{Test/int3, -1}

-int5 = $C{XXX, -1}

+int3 = $C{Test/int1,-1}

+int4 = $C{Test/int3,-1}

+int5 = $C{XXX,-1}

 boolean1 = true

 boolean2 = [true,true]

 testManifestEntry = $MF{Test-Entry}

diff --git a/juneau-microservice/juneau-microservice-ftest/pom.xml b/juneau-microservice/juneau-microservice-ftest/pom.xml
index da5ec09..ee4a338 100644
--- a/juneau-microservice/juneau-microservice-ftest/pom.xml
+++ b/juneau-microservice/juneau-microservice-ftest/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-microservice</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-microservice-ftest</artifactId>
diff --git a/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/RequestBeanProxyTest.java b/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/RequestBeanProxyTest.java
index fe65ba2..f8252d2 100644
--- a/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/RequestBeanProxyTest.java
+++ b/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/RequestBeanProxyTest.java
@@ -29,7 +29,7 @@
 import org.apache.juneau.rest.*;

 import org.apache.juneau.rest.annotation.*;

 import org.apache.juneau.rest.client.*;

-import org.apache.juneau.rest.client.remote.*;

+import org.apache.juneau.http.remote.*;

 import org.apache.juneau.rest.mock2.*;

 import org.apache.juneau.serializer.*;

 import org.apache.juneau.uon.*;

diff --git a/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/ThirdPartyProxyTest.java b/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/ThirdPartyProxyTest.java
index 9a02474..d89c438 100644
--- a/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/ThirdPartyProxyTest.java
+++ b/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/ThirdPartyProxyTest.java
@@ -29,7 +29,7 @@
 import org.apache.juneau.msgpack.*;

 import org.apache.juneau.parser.*;

 import org.apache.juneau.rest.client.*;

-import org.apache.juneau.rest.client.remote.*;

+import org.apache.juneau.http.remote.*;

 import org.apache.juneau.rest.test.*;

 import org.apache.juneau.rest.test.client.ThirdPartyProxyTest.ThirdPartyProxy.*;

 import org.apache.juneau.rest.testutils.*;

diff --git a/juneau-microservice/juneau-microservice-jetty/pom.xml b/juneau-microservice/juneau-microservice-jetty/pom.xml
index 32496b5..8f6adf1 100644
--- a/juneau-microservice/juneau-microservice-jetty/pom.xml
+++ b/juneau-microservice/juneau-microservice-jetty/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-microservice</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-microservice-jetty</artifactId>
diff --git a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
index 76f8f48..178af16 100644
--- a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
+++ b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
@@ -14,8 +14,6 @@
 
 import static org.apache.juneau.internal.SystemUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.io.*;
 import java.net.*;
 import java.util.*;
@@ -347,7 +345,7 @@
 
 		for (String s : cf.getStringArray("Jetty/servlets", new String[0])) {
 			try {
-				ClassInfo c = getClassInfo(Class.forName(s));
+				ClassInfo c = ClassInfo.of(Class.forName(s));
 				if (c.isChildOf(RestServlet.class)) {
 					RestServlet rs = (RestServlet)c.newInstance();
 					addServlet(rs, rs.getPath());
@@ -361,7 +359,7 @@
 
 		for (Map.Entry<String,Object> e : cf.getObjectMap("Jetty/servletMap", ObjectMap.EMPTY_MAP).entrySet()) {
 			try {
-				ClassInfo c = getClassInfo(Class.forName(e.getValue().toString()));
+				ClassInfo c = ClassInfo.of(Class.forName(e.getValue().toString()));
 				if (c.isChildOf(Servlet.class)) {
 					Servlet rs = (Servlet)c.newInstance();
 					addServlet(rs, e.getKey());
diff --git a/juneau-microservice/juneau-my-jetty-microservice/pom.xml b/juneau-microservice/juneau-my-jetty-microservice/pom.xml
index fea5e62..9ea7563 100644
--- a/juneau-microservice/juneau-my-jetty-microservice/pom.xml
+++ b/juneau-microservice/juneau-my-jetty-microservice/pom.xml
@@ -28,7 +28,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-microservice</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-my-jetty-microservice</artifactId>
@@ -36,7 +36,7 @@
 	<description>A template project developers use to start with to create a microservice.</description>
 	
 	<properties>
-		<juneau.version>8.1.1-SNAPSHOT</juneau.version>
+		<juneau.version>8.1.2-SNAPSHOT</juneau.version>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 	</properties>
 	
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/about.txt b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/about.txt
new file mode 100644
index 0000000..880c2aa
--- /dev/null
+++ b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/about.txt
@@ -0,0 +1,14 @@
+ ***************************************************************************************************************************
+ * 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.                                              *
+ ***************************************************************************************************************************
+
+This directory can be used to hold static files served up under the <servlet-path>/htdocs URI.
\ No newline at end of file
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/asf.png b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/asf.png
deleted file mode 100644
index ce28113..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/asf.png
+++ /dev/null
Binary files differ
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/juneau.png b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/juneau.png
deleted file mode 100644
index 42a1656..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/juneau.png
+++ /dev/null
Binary files differ
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/styles/SwaggerUI.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/styles/SwaggerUI.css
deleted file mode 100644
index e1c8a21..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/styles/SwaggerUI.css
+++ /dev/null
@@ -1,342 +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.                                              *
- ***************************************************************************************************************************
-*/
-
-.swagger-ui {	
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Header key-value pairs
- ----------------------------------------------------------------------------------------------------------*/
-
-.swagger-ui table.header {
-    margin-bottom: 15px;
-	width: 95%;
-	border: none;
-}
-
-.swagger-ui table.header * {
-	vertical-align: middle;
-}
-
-.swagger-ui table.header th {
-    font-weight: bold;
-    padding: 5px 10px;
-    text-align: left;
-    white-space: nowrap;
-	border: none;
-	border-radius: 3px;
-}
-
-.swagger-ui table.header td {
-	padding: 5px 10px;
-    text-align: left;
-    vertical-align: middle;
-	border: none;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Method buttons (e.g GET/PUT/... buttons)                                                                
- ----------------------------------------------------------------------------------------------------------*/
-.method-button {
-  	display: inline-block;
-    font-weight: bold;
-    min-width: 60px;
-    padding: 6px 15px;
-    text-align: center;
-    border-radius: 3px;
-    text-shadow: 0 1px 0 rgba(0,0,0,.1);
-    color: #fff;
-}
-.get .method-button        { background: rgb(97,175,254); }
-.put .method-button        { background: rgb(252,161,48); }
-.post .method-button       { background: rgb(73,204,144); }
-.delete .method-button     { background: rgb(249,62,62); }
-.options .method-button    { background: rgb(153,102,255); }
-.deprecated .method-button { background: rgb(170,170,170); }
-.model .method-button      { background: rgb(150,150,150); min-width: 120px;}
-.other .method-button      { background: rgb(230,230,0); }
-
-
-/*-----------------------------------------------------------------------------------------------------------
- - Tag block                                                                                                -
- - Encapsulates one or more op-blocks.
- ----------------------------------------------------------------------------------------------------------*/
-
-.tag-block {
-	min-width: 800px;
-}
-
-.tag-block-summary {
-	margin: 10px 0px;
-	padding: 5px 0px;
-    align-items: center;
-    cursor: pointer;
-	border-bottom: 1px solid rgba(59,65,81,.2);
-	user-select: none;
-	transition: all .2s;
-}
-.tag-block-summary:hover {
-	background-color: rgba(59,65,81,.1);
-}
-
-.tag-block-summary .name {
-	font-size: 18px;
-	padding: 0px 20px;
-}
-.tag-block-summary .description {
-	font-size: 14px;
-	padding: 0px 20px;
-}
-.tag-block-summary .extdocs {
-	float: right;
-	font-size: 14px;
-	padding: 0px 20px;
-}
-
-.tag-block-open .tag-block-contents { display: block; }
-.tag-block-closed .tag-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block                                                                                          
- - Encapsulates a single http-method + http-path
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block {
-	margin-bottom: 10px;
-    align-items: center;
-    border-radius: 4px;
-}
-
-.op-block.get        { background: rgba(97,175,254,.1); border: 1px solid rgb(97,175,254); }
-.op-block.put        { background: rgba(252,161,48,.1); border: 1px solid rgb(252,161,48); }
-.op-block.post       { background: rgba(73,204,144,.1); border: 1px solid rgb(73,204,144); }
-.op-block.options    { background: rgba(153,102,255,.1); border: 1px solid rgb(153,102,255); }
-.op-block.delete     { background: rgba(249,62,62,.1); border: 1px solid rgb(249,62,62); }
-.op-block.deprecated { background: rgba(170,170,170,.1); border: 1px solid rgb(170,170,170); }
-.op-block.model      { background: rgba(0,0,0,.05); border: 1px solid rgb(170,170,170); }
-.op-block.other      { background: rgba(230,230,0,0.1); border: 1px solid rgb(230,230,0); }
-
-.op-block-summary {	
-	padding: 5px;
-    cursor: pointer;
-	user-select: none;
-}
-
-.op-block-summary .path {
-	font-size: 14px;
-	word-break: break-all;
-    font-family: monospace;
-    font-weight: bold;
-    padding:10px;
-}
-
-.op-block.deprecated .op-block-summary .path { color: #8f9199; text-decoration: line-through;}
-.op-block.deprecated .op-block-summary .description { color: #8f9199 }
-
-.op-block-summary .summary {
-    font-size: 14px;
-    padding: 10px;
-}
-
-.op-block-description {
-    font-size: 14px;
-    padding: 10px;
-}
-
-
-.op-block-open .op-block-contents { display: block; }
-.op-block-closed .op-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block section header                                                                                               -
- - 'Parameters' and 'Responses' subsections in an op-block
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-section-header {
-    padding: 8px 15px;
-    background: hsla(0,0%,100%,.3);
-    box-shadow: 1px 2px 3px rgba(0,0,0,.3);
-    margin: 10px;
-    border-radius: 4px;
-}
-
-.op-block-section-header .title {
-    font-size: 14px;
-    margin: 0px;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameters and Responses sections
- ----------------------------------------------------------------------------------------------------------*/
-
-table.parameters, table.responses {
-    border-collapse: collapse;
-    margin: 20px;
-	width: 95%;
-	border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-th.parameter-key, th.response-key {
-	font-size: 12px;
-    font-weight: bold;
-    text-align: left;
-	border: none;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-	background-color: inherit;
-}
-
-td.parameter-key, td.response-key {
-	font-size: 12px;
-    padding: 10px;
-    text-align: left;
-	border: none;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-	background-color: inherit;
-}
-
-td.parameter-value, td.response-value {
-    padding: 10px;
-    text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameter name
- ----------------------------------------------------------------------------------------------------------*/
-
-.parameter-key .in {
-	font-size: 12px;
-    font-family: monospace;
-    font-weight: bold;
-    font-style: italic;
-    color: gray;
-}
-
-.parameter-key .name {
-	font-size: 14px;
-}
-
-.parameter-key .name.required {
-    font-weight: bold;
-}
-
-.parameter-key .requiredlabel {
-	font-size: 10px;
-    color: rgba(255,0,0,.6);    
-    font-weight: bold;
-}
-
-.parameter-key .type {
-    font-size: 12px;
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Examples
- ----------------------------------------------------------------------------------------------------------*/
- 
-.op-block-contents .example-select {
-    margin: 10px 0 5px 0;
-	border-width: 1px;
-	font-weight:bold;
-    padding: 5px 40px 5px 10px;
-    border: 1px solid #41444e;
-    border-radius: 4px;
-    box-shadow: 0 1px 2px 0 rgba(0,0,0,.25);
-    background: hsla(0,0%,100%,.3);
-}
-
-.op-block-contents .example-select:disabled {
-    color: rgba(0,0,0,.50);
-    border: 1px solid rgba(0,0,0,.50);
-}
-
-.op-block-contents .example {
-    margin: 0;
-    padding: 5px 20px;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-    hyphens: auto;
-    border-radius: 4px;
-    background: #41444e;
-    overflow-wrap: break-word;
-    font-family: monospace;
-    font-weight: 400;
-    color: #fff;
-	display: none;
-	max-width: 800px;
-	max-height: 800px;
-	text-overflow: auto;
-	overflow: auto;
-}
-
-.op-block-contents .example.active {
-	display:block;
-}
-
-.op-block-contents .model {
-	display: none;
-}
-
-.op-block-contents .model.active {
-	display:block;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Headers
- ----------------------------------------------------------------------------------------------------------*/
-
-.section {
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-}
-
-.headers .name {
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-div.headers {
-	margin: 20px 0px;
-}
-
-.headers .type {
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-.section-name {
-	display: inline-block;
-	vertical-align: top;
-	margin-right: 20px;
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-}
-
-.section-table {
-/*	display: inline-block;*/
-}
-
-.responses .section-table td {
-	padding: 5px 20px 5px 0px;
-	text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-}
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/dark.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/dark.css
deleted file mode 100644
index c81702d..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/dark.css
+++ /dev/null
@@ -1,285 +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.                                              *
- ***************************************************************************************************************************/
- 
-/** Dark look-and-feel */ 
- 
-/**********************************************************************************************************************/
-/**  Body                                                                                                            **/
-/**********************************************************************************************************************/
-
-body {
-	background-color: #212121 ;
-	margin: 0px;
-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
-	color: #EEE;
-	height: 100%;
-}
-
-body {
-	font-size: 14px;
-}
-
-body textarea, body pre {
-	-moz-tab-size: 3; 
-	-o-tab-size: 3; 
-	-webkit-tab-size: 3; 
-	tab-size: 3; 
-}
-
-/**********************************************************************************************************************/
-/**  Header                                                                                                        **/
-/**********************************************************************************************************************/
-
-header {
-	background-color: #373a3c;
-}
-
-header * {
-    font-size: 14px;
-	color: #B3B3B3;
-	margin: 0px;
-	text-decoration: none;
-	font-weight: normal;
-}
-
-header h1 {
-	padding: 10px 20px;
-	font-size: 16px;
-	border-bottom: 2px solid #000000;
-	color: white;
-}
-
-header h2 {
-	padding: 10px 20px;
-	font-size: 14px;
-	border-bottom: 2px solid #000000;
-}
-
-/**********************************************************************************************************************/
-/**  Nav                                                                                                             **/
-/**********************************************************************************************************************/
-
-nav {
-	margin: 10px 20px 10px 20px;
-	color: #94A3AB;
-}
-
-nav>ol {
-	list-style-type: none;
-	margin: 0px 10px;
-	padding: 0px;
-}
-
-nav>ol>li {
-	display: inline;
-}
-
-nav li:not(:first-child):before {
-	content: " - ";
-}
-
-nav a {
-	font-size: 10pt;
-	color: #94A3AB;
-	text-decoration: none;
-	margin: 0px 15px;
-	text-transform: uppercase;
-	cursor: pointer;
-}
-
-nav a:active, nav a:hover {
-	color: white;
-	text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/**  Content                                                                                                        **/
-/**********************************************************************************************************************/
-
-section {
-	display: table;
-	width: 100%;
-	margin-bottom: 50px;
-}
-
-article {
-	display: table-cell;
-}
-
-article * {
-	font-size: 9pt;
-	color: #EEE;
-}
-
-article textarea, article input, article button {
-	color: #111;
-}
-
-article textarea, article input {
-	background-color: #EEE;
-}
-
-article div.data {
-	padding: 10px;
-	background-color: #373a3c;
-	border-radius: 4px;
-	margin: 20px;
-	display: inline-block;
-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
-	font-family: sans-serif;
-}
-
-article table {
-	border: none;
-	width: 100%;
-}
-
-article th {
-	padding: 4px 8px;
-	font-weight: normal;
-	text-align: center;
-	background-color: #0275d8;
-}
-
-article td {
-	vertical-align: top;
-	border-bottom: 1px solid #000000;
-	border-right: 1px solid #000000;
-	padding: 2px 5px;
-}
-
-article td:last-child {
-    width: 100%;
-}
-
-article ul {
-	margin: 0px;
-	padding-left: 20px;
-}
-
-article a {
-	color: #3d8bb5;
-	text-decoration: none;
-}
-
-article a:hover {
-	text-decoration: underline;
-}
-
-article iframe {
-	background-color: #F6F7F9;
-	border: 1px solid gray;
-	padding: 0px;
-	overflow: hidden;
-	width: 100%;
-	min-height: 400px;
-}
-
-aside {
-	display: table-cell;
-	vertical-align: top;
-	padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/**  Footer                                                                                                          **/
-/**********************************************************************************************************************/
-
-footer { 
-	padding: 10px;
-	width: 100%;
-	bottom: 0;
-	position: fixed;
-	background-color: #373a3c;
-}
-
-/**********************************************************************************************************************/
-/**  Popup windows                                                                                                   **/
-/**********************************************************************************************************************/
-
-.popup-content {
-	display: none;
-	position: absolute;
-	background-color: #DDD;
-	white-space: nowrap;
-	padding: 5px;
-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
-	z-index: 1;
-	margin-top: 10px;
-	border-radius: 4px;
-}
-
-.popup-content * {
-	color: black;
-	font-size: 11px;
-}
-
-.popup-content a:hover {
-	color: #94A3AB;
-}
-
-.popup-show {
-	display:block;
-}
-
-/**********************************************************************************************************************/
-/**  Tooltips                                                                                                        **/
-/**********************************************************************************************************************/
-
-.tooltip {
-	position: relative;
-	display: inline-block;	    
-}
-
-.tooltip .tooltiptext {
-	visibility: hidden;
-	background-color: #FEF9E7;
-	color: black;
-	padding: 5px;
-	border-radius: 6px;
-	position: absolute;
-	z-index: 1;
-	top: 0;
-	left: 0;
-	margin-left: 30px;
-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
-	opacity: 0;
-	transition: opacity 0.5s;
-	font-weight: normal;
-}
-
-.tooltip .tooltiptext * {
-	color: black;
-}
-
-.tooltip:hover .tooltiptext {
-	visibility: visible;
-	opacity: 1;
-}	
-
-.tooltiptext {
-	white-space: nowrap;
-	float: left;
-	border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/**  Other classes                                                                                                   **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/devops.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/devops.css
deleted file mode 100644
index ad7188a..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/devops.css
+++ /dev/null
@@ -1,276 +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.                                              *

- ***************************************************************************************************************************/

- 

-/** DevOps look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	background-color: #3B4B54;

-	margin: 0px;

-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;

-	color: #B3B3B3;

-	height: 100%;	

-}

-

-body {

-	font-size: 14px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                        **/

-/**********************************************************************************************************************/

-

-header {

-	background-color: #26343F;

-}

-

-header * {

-    font-size: 14px;

-	color: #B3B3B3;

-	margin: 0px;

-	text-decoration: none;

-	font-weight: normal;

-}

-

-header h1 {

-	padding: 10px 20px;

-	font-size: 16px;

-	border-bottom: 2px solid #34534B;

-	color: white;

-}

-

-header h2 {

-	padding: 10px 20px;

-	font-size: 14px;

-	border-bottom: 2px solid #34534B;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 10px 20px 10px 20px;

-	color: #94A3AB;

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-	content: " - ";

-}

-

-nav a {

-	font-size: 10pt;

-	color: #94A3AB;

-	text-decoration: none;

-	margin: 0px 15px;

-	text-transform: uppercase;

-	cursor: pointer;

-}

-

-nav a:active, nav a:hover {

-	color: white;

-	text-decoration: underline;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                        **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin-bottom: 50px;

-}

-

-article {

-	display: table-cell;

-}

-

-article * {

-	font-size: 9pt;

-	color: #26343F;

-}

-

-article div.data {

-	padding: 10px;

-	background-color: white;

-	border-radius: 4px;

-	margin: 20px;

-	display: inline-block;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	font-family: sans-serif;

-	color: #26343F;

-}

-

-article table {

-	border: none;

-	width: 100%;

-}

-

-article th {

-	border-top: 1px solid #D9DCDE;

-	padding: 4px 8px;

-	font-weight: bold;

-	text-align: center;

-	background-color: #F4F6F9;

-}

-

-article td {

-	vertical-align: top;

-	border-bottom: 1px solid #d9dcde;

-	border-right: 1px solid #d9dcde;

-	padding: 2px 5px;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-article a {

-	color: #116998;

-	text-decoration: none;

-}

-

-article a:hover {

-	text-decoration: underline;

-}

-

-article iframe {

-	background-color: #F6F7F9;

-	border: 1px solid gray;

-	padding: 0px;

-	overflow: hidden;

-	width: 100%;

-	min-height: 400px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	padding: 10px;

-	width: 100%;

-	bottom: 0;

-	position: fixed;

-	background-color: #26343F;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #f4f6f9;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	color: black;

-	font-size: 11px;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display:block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

-

diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/light.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/light.css
deleted file mode 100644
index aa91f98..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/light.css
+++ /dev/null
@@ -1,273 +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.                                              *

- ***************************************************************************************************************************/

- 

-/** Light look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	margin: 0px;

-	font-size: 10px;

-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;

-	color: #2c4557;

-	height: 100%;	

-}

-

-body * {

-	font-size: 14px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                          **/

-/**********************************************************************************************************************/

-

-header {

-	background-color: #e8ebef;

-	padding: 10px 20px;

-	box-shadow: 5px 5px 2px #999999;

-	text-shadow: rgba(1,1,1,.2) 2px 4px 5px, rgba(125,32,191,.05) 0 -10px 30px;

-	white-space: nowrap;

-}

-

-header * {

-	color: #af2222;;

-	font-weight: lighter;

-}

-

-header h1 {

-	font-size: 18px;

-	margin: 0px;

-	padding: 2px;

-}

-

-header h2 {

-	font-size: 14px;

-	margin: 0px;

-	padding: 2px;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 10px;

-	padding: 5px;

-	box-shadow: 5px 5px 2px #999999;

-	background-color: #eef3f7;

-}

-

-nav * {

-	font-size: 12px;

-	font-weight: lighter;

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-	content: " - ";

-}

-

-nav a {

-	font-size: 10pt;

-	color: #2c4557;

-	text-decoration: none;

-	margin: 0px 10px;

-	text-transform: uppercase;

-	cursor: pointer;

-}

-

-nav a:active, nav a:hover {

-	text-decoration: none;

-	color: #94a3ab;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                         **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin: 0px 0px 50px 0px;

-}

-

-article {

-	display: table-cell;

-	padding: 20px 40px;

-}

-

-article * {

-	font-size: 9pt;

-}

-

-article div.data {

-	padding: 0px;

-	margin: 0px;

-	display: inline-block;

-	font-family: sans-serif;

-}

-

-article table {

-	border: none;

-	width: 100%;

-}

-

-article td {

-	vertical-align: top;

-	border-bottom: 1px solid #d9dcde;

-	border-right: 1px solid #d9dcde;

-	padding: 2px 5px;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article th {

-	padding: 4px 8px;

-	text-align: center;

-	background-color: #eef3f7;

-	box-shadow: 1px 1px 2px #999999;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-article a {

-	color: #416e8e;

-	text-decoration: none;

-}

-

-article iframe {

-	background-color: #F6F7F9;

-	border: 1px solid gray;

-	padding: 0px;

-	overflow: hidden;

-	width: 100%;

-	min-height: 400px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	padding: 10px;

-	width: 100%;

-	bottom: 0;

-	position: fixed;

-	background-color: #e8ebef;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #eef3f7;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	color: #2c4557;

-	font-size: 10pt;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display: block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/original.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/original.css
deleted file mode 100644
index 2052281..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/original.css
+++ /dev/null
@@ -1,237 +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.                                              *

- ***************************************************************************************************************************/

-

-/** Original look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	background-image: linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);

-	background-image: -webkit-linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);

-	background-attachment: fixed;

-	font-family: Sans-Serif;

-	color: #2c4557;

-	height: 100%;

-	margin: 0px;

-}

-

-body * {

-	font-size: 12px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                          **/

-/**********************************************************************************************************************/

-

-header {

-	padding: 10px 20px;

-}

-

-header h1 {

-    font-size: 16px;

-	margin-bottom: 10px;

-	margin-right: 40px;

-	padding: 5px 30px;

-	border-radius: 15px;

-	text-decoration: none;

-	font-weight: normal;

-	background: linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;

-	background: -webkit-gradient(linear, left top, left bottom, from(#F5F5F5), to(#DEE3E9));

-}

-

-header h2 {

-	font-weight: normal;

-	margin-left: 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 0px 25px;	

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-    content: " - ";

-}

-

-nav a {

-	text-decoration: underline;

-	cursor: pointer;

-	color: -webkit-link;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                        **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin: 0px 0px 50px 0px;

-}

-

-article {

-	display: table-cell;

-	padding: 20px 40px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-article div.data {

-	padding: 0px;

-	margin: 0px;

-	display: inline-block;

-	font-family: sans-serif;

-}

-

-article table {

-	border:1px solid #CCCC99;

-	border-collapse: collapse;

-	margin: 5px 0px;

-	width: 100%;

-}

-

-article th {

-	border-top: 1px solid #CCCC99;

-	padding: 3px 5px;

-	color: #666666;

-	text-align: center;

-	background-image: linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);

-	background-image: -webkit-linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);

-}

-

-article td {

-	border: 1px solid #E9EACB;

-	padding: 2px 5px;

-	color: #005C87;

-	vertical-align: top;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	display: none;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #eef3f7;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	font-size: 9pt;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display: block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

-

diff --git a/juneau-microservice/juneau-my-springboot-microservice/pom.xml b/juneau-microservice/juneau-my-springboot-microservice/pom.xml
index 140cda4..cb37dc8 100644
--- a/juneau-microservice/juneau-my-springboot-microservice/pom.xml
+++ b/juneau-microservice/juneau-my-springboot-microservice/pom.xml
@@ -28,7 +28,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-microservice</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-my-springboot-microservice</artifactId>
@@ -36,7 +36,7 @@
 	<description>A template project developers use to start with to create a microservice.</description>
 	
 	<properties>
-		<juneau.version>8.1.1-SNAPSHOT</juneau.version>
+		<juneau.version>8.1.2-SNAPSHOT</juneau.version>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 	</properties>
 	
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/about.txt b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/about.txt
new file mode 100644
index 0000000..880c2aa
--- /dev/null
+++ b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/about.txt
@@ -0,0 +1,14 @@
+ ***************************************************************************************************************************
+ * 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.                                              *
+ ***************************************************************************************************************************
+
+This directory can be used to hold static files served up under the <servlet-path>/htdocs URI.
\ No newline at end of file
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/asf.png b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/asf.png
deleted file mode 100644
index ce28113..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/asf.png
+++ /dev/null
Binary files differ
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/juneau.png b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/juneau.png
deleted file mode 100644
index 42a1656..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/juneau.png
+++ /dev/null
Binary files differ
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/styles/SwaggerUI.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/styles/SwaggerUI.css
deleted file mode 100644
index e1c8a21..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/styles/SwaggerUI.css
+++ /dev/null
@@ -1,342 +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.                                              *
- ***************************************************************************************************************************
-*/
-
-.swagger-ui {	
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Header key-value pairs
- ----------------------------------------------------------------------------------------------------------*/
-
-.swagger-ui table.header {
-    margin-bottom: 15px;
-	width: 95%;
-	border: none;
-}
-
-.swagger-ui table.header * {
-	vertical-align: middle;
-}
-
-.swagger-ui table.header th {
-    font-weight: bold;
-    padding: 5px 10px;
-    text-align: left;
-    white-space: nowrap;
-	border: none;
-	border-radius: 3px;
-}
-
-.swagger-ui table.header td {
-	padding: 5px 10px;
-    text-align: left;
-    vertical-align: middle;
-	border: none;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Method buttons (e.g GET/PUT/... buttons)                                                                
- ----------------------------------------------------------------------------------------------------------*/
-.method-button {
-  	display: inline-block;
-    font-weight: bold;
-    min-width: 60px;
-    padding: 6px 15px;
-    text-align: center;
-    border-radius: 3px;
-    text-shadow: 0 1px 0 rgba(0,0,0,.1);
-    color: #fff;
-}
-.get .method-button        { background: rgb(97,175,254); }
-.put .method-button        { background: rgb(252,161,48); }
-.post .method-button       { background: rgb(73,204,144); }
-.delete .method-button     { background: rgb(249,62,62); }
-.options .method-button    { background: rgb(153,102,255); }
-.deprecated .method-button { background: rgb(170,170,170); }
-.model .method-button      { background: rgb(150,150,150); min-width: 120px;}
-.other .method-button      { background: rgb(230,230,0); }
-
-
-/*-----------------------------------------------------------------------------------------------------------
- - Tag block                                                                                                -
- - Encapsulates one or more op-blocks.
- ----------------------------------------------------------------------------------------------------------*/
-
-.tag-block {
-	min-width: 800px;
-}
-
-.tag-block-summary {
-	margin: 10px 0px;
-	padding: 5px 0px;
-    align-items: center;
-    cursor: pointer;
-	border-bottom: 1px solid rgba(59,65,81,.2);
-	user-select: none;
-	transition: all .2s;
-}
-.tag-block-summary:hover {
-	background-color: rgba(59,65,81,.1);
-}
-
-.tag-block-summary .name {
-	font-size: 18px;
-	padding: 0px 20px;
-}
-.tag-block-summary .description {
-	font-size: 14px;
-	padding: 0px 20px;
-}
-.tag-block-summary .extdocs {
-	float: right;
-	font-size: 14px;
-	padding: 0px 20px;
-}
-
-.tag-block-open .tag-block-contents { display: block; }
-.tag-block-closed .tag-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block                                                                                          
- - Encapsulates a single http-method + http-path
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block {
-	margin-bottom: 10px;
-    align-items: center;
-    border-radius: 4px;
-}
-
-.op-block.get        { background: rgba(97,175,254,.1); border: 1px solid rgb(97,175,254); }
-.op-block.put        { background: rgba(252,161,48,.1); border: 1px solid rgb(252,161,48); }
-.op-block.post       { background: rgba(73,204,144,.1); border: 1px solid rgb(73,204,144); }
-.op-block.options    { background: rgba(153,102,255,.1); border: 1px solid rgb(153,102,255); }
-.op-block.delete     { background: rgba(249,62,62,.1); border: 1px solid rgb(249,62,62); }
-.op-block.deprecated { background: rgba(170,170,170,.1); border: 1px solid rgb(170,170,170); }
-.op-block.model      { background: rgba(0,0,0,.05); border: 1px solid rgb(170,170,170); }
-.op-block.other      { background: rgba(230,230,0,0.1); border: 1px solid rgb(230,230,0); }
-
-.op-block-summary {	
-	padding: 5px;
-    cursor: pointer;
-	user-select: none;
-}
-
-.op-block-summary .path {
-	font-size: 14px;
-	word-break: break-all;
-    font-family: monospace;
-    font-weight: bold;
-    padding:10px;
-}
-
-.op-block.deprecated .op-block-summary .path { color: #8f9199; text-decoration: line-through;}
-.op-block.deprecated .op-block-summary .description { color: #8f9199 }
-
-.op-block-summary .summary {
-    font-size: 14px;
-    padding: 10px;
-}
-
-.op-block-description {
-    font-size: 14px;
-    padding: 10px;
-}
-
-
-.op-block-open .op-block-contents { display: block; }
-.op-block-closed .op-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block section header                                                                                               -
- - 'Parameters' and 'Responses' subsections in an op-block
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-section-header {
-    padding: 8px 15px;
-    background: hsla(0,0%,100%,.3);
-    box-shadow: 1px 2px 3px rgba(0,0,0,.3);
-    margin: 10px;
-    border-radius: 4px;
-}
-
-.op-block-section-header .title {
-    font-size: 14px;
-    margin: 0px;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameters and Responses sections
- ----------------------------------------------------------------------------------------------------------*/
-
-table.parameters, table.responses {
-    border-collapse: collapse;
-    margin: 20px;
-	width: 95%;
-	border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-th.parameter-key, th.response-key {
-	font-size: 12px;
-    font-weight: bold;
-    text-align: left;
-	border: none;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-	background-color: inherit;
-}
-
-td.parameter-key, td.response-key {
-	font-size: 12px;
-    padding: 10px;
-    text-align: left;
-	border: none;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-	background-color: inherit;
-}
-
-td.parameter-value, td.response-value {
-    padding: 10px;
-    text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameter name
- ----------------------------------------------------------------------------------------------------------*/
-
-.parameter-key .in {
-	font-size: 12px;
-    font-family: monospace;
-    font-weight: bold;
-    font-style: italic;
-    color: gray;
-}
-
-.parameter-key .name {
-	font-size: 14px;
-}
-
-.parameter-key .name.required {
-    font-weight: bold;
-}
-
-.parameter-key .requiredlabel {
-	font-size: 10px;
-    color: rgba(255,0,0,.6);    
-    font-weight: bold;
-}
-
-.parameter-key .type {
-    font-size: 12px;
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Examples
- ----------------------------------------------------------------------------------------------------------*/
- 
-.op-block-contents .example-select {
-    margin: 10px 0 5px 0;
-	border-width: 1px;
-	font-weight:bold;
-    padding: 5px 40px 5px 10px;
-    border: 1px solid #41444e;
-    border-radius: 4px;
-    box-shadow: 0 1px 2px 0 rgba(0,0,0,.25);
-    background: hsla(0,0%,100%,.3);
-}
-
-.op-block-contents .example-select:disabled {
-    color: rgba(0,0,0,.50);
-    border: 1px solid rgba(0,0,0,.50);
-}
-
-.op-block-contents .example {
-    margin: 0;
-    padding: 5px 20px;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-    hyphens: auto;
-    border-radius: 4px;
-    background: #41444e;
-    overflow-wrap: break-word;
-    font-family: monospace;
-    font-weight: 400;
-    color: #fff;
-	display: none;
-	max-width: 800px;
-	max-height: 800px;
-	text-overflow: auto;
-	overflow: auto;
-}
-
-.op-block-contents .example.active {
-	display:block;
-}
-
-.op-block-contents .model {
-	display: none;
-}
-
-.op-block-contents .model.active {
-	display:block;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Headers
- ----------------------------------------------------------------------------------------------------------*/
-
-.section {
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-}
-
-.headers .name {
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-div.headers {
-	margin: 20px 0px;
-}
-
-.headers .type {
-    padding: 5px 0;
-    font-family: monospace;
-    font-weight: bold;
-}
-
-.section-name {
-	display: inline-block;
-	vertical-align: top;
-	margin-right: 20px;
-    font-weight: bold;
-    padding: 5px 0;
-    text-align: left;
-}
-
-.section-table {
-/*	display: inline-block;*/
-}
-
-.responses .section-table td {
-	padding: 5px 20px 5px 0px;
-	text-align: left;
-    border-bottom: 1px solid rgba(59,65,81,.2);
-}
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/dark.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/dark.css
deleted file mode 100644
index c81702d..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/dark.css
+++ /dev/null
@@ -1,285 +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.                                              *
- ***************************************************************************************************************************/
- 
-/** Dark look-and-feel */ 
- 
-/**********************************************************************************************************************/
-/**  Body                                                                                                            **/
-/**********************************************************************************************************************/
-
-body {
-	background-color: #212121 ;
-	margin: 0px;
-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
-	color: #EEE;
-	height: 100%;
-}
-
-body {
-	font-size: 14px;
-}
-
-body textarea, body pre {
-	-moz-tab-size: 3; 
-	-o-tab-size: 3; 
-	-webkit-tab-size: 3; 
-	tab-size: 3; 
-}
-
-/**********************************************************************************************************************/
-/**  Header                                                                                                        **/
-/**********************************************************************************************************************/
-
-header {
-	background-color: #373a3c;
-}
-
-header * {
-    font-size: 14px;
-	color: #B3B3B3;
-	margin: 0px;
-	text-decoration: none;
-	font-weight: normal;
-}
-
-header h1 {
-	padding: 10px 20px;
-	font-size: 16px;
-	border-bottom: 2px solid #000000;
-	color: white;
-}
-
-header h2 {
-	padding: 10px 20px;
-	font-size: 14px;
-	border-bottom: 2px solid #000000;
-}
-
-/**********************************************************************************************************************/
-/**  Nav                                                                                                             **/
-/**********************************************************************************************************************/
-
-nav {
-	margin: 10px 20px 10px 20px;
-	color: #94A3AB;
-}
-
-nav>ol {
-	list-style-type: none;
-	margin: 0px 10px;
-	padding: 0px;
-}
-
-nav>ol>li {
-	display: inline;
-}
-
-nav li:not(:first-child):before {
-	content: " - ";
-}
-
-nav a {
-	font-size: 10pt;
-	color: #94A3AB;
-	text-decoration: none;
-	margin: 0px 15px;
-	text-transform: uppercase;
-	cursor: pointer;
-}
-
-nav a:active, nav a:hover {
-	color: white;
-	text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/**  Content                                                                                                        **/
-/**********************************************************************************************************************/
-
-section {
-	display: table;
-	width: 100%;
-	margin-bottom: 50px;
-}
-
-article {
-	display: table-cell;
-}
-
-article * {
-	font-size: 9pt;
-	color: #EEE;
-}
-
-article textarea, article input, article button {
-	color: #111;
-}
-
-article textarea, article input {
-	background-color: #EEE;
-}
-
-article div.data {
-	padding: 10px;
-	background-color: #373a3c;
-	border-radius: 4px;
-	margin: 20px;
-	display: inline-block;
-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
-	font-family: sans-serif;
-}
-
-article table {
-	border: none;
-	width: 100%;
-}
-
-article th {
-	padding: 4px 8px;
-	font-weight: normal;
-	text-align: center;
-	background-color: #0275d8;
-}
-
-article td {
-	vertical-align: top;
-	border-bottom: 1px solid #000000;
-	border-right: 1px solid #000000;
-	padding: 2px 5px;
-}
-
-article td:last-child {
-    width: 100%;
-}
-
-article ul {
-	margin: 0px;
-	padding-left: 20px;
-}
-
-article a {
-	color: #3d8bb5;
-	text-decoration: none;
-}
-
-article a:hover {
-	text-decoration: underline;
-}
-
-article iframe {
-	background-color: #F6F7F9;
-	border: 1px solid gray;
-	padding: 0px;
-	overflow: hidden;
-	width: 100%;
-	min-height: 400px;
-}
-
-aside {
-	display: table-cell;
-	vertical-align: top;
-	padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/**  Footer                                                                                                          **/
-/**********************************************************************************************************************/
-
-footer { 
-	padding: 10px;
-	width: 100%;
-	bottom: 0;
-	position: fixed;
-	background-color: #373a3c;
-}
-
-/**********************************************************************************************************************/
-/**  Popup windows                                                                                                   **/
-/**********************************************************************************************************************/
-
-.popup-content {
-	display: none;
-	position: absolute;
-	background-color: #DDD;
-	white-space: nowrap;
-	padding: 5px;
-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
-	z-index: 1;
-	margin-top: 10px;
-	border-radius: 4px;
-}
-
-.popup-content * {
-	color: black;
-	font-size: 11px;
-}
-
-.popup-content a:hover {
-	color: #94A3AB;
-}
-
-.popup-show {
-	display:block;
-}
-
-/**********************************************************************************************************************/
-/**  Tooltips                                                                                                        **/
-/**********************************************************************************************************************/
-
-.tooltip {
-	position: relative;
-	display: inline-block;	    
-}
-
-.tooltip .tooltiptext {
-	visibility: hidden;
-	background-color: #FEF9E7;
-	color: black;
-	padding: 5px;
-	border-radius: 6px;
-	position: absolute;
-	z-index: 1;
-	top: 0;
-	left: 0;
-	margin-left: 30px;
-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
-	opacity: 0;
-	transition: opacity 0.5s;
-	font-weight: normal;
-}
-
-.tooltip .tooltiptext * {
-	color: black;
-}
-
-.tooltip:hover .tooltiptext {
-	visibility: visible;
-	opacity: 1;
-}	
-
-.tooltiptext {
-	white-space: nowrap;
-	float: left;
-	border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/**  Other classes                                                                                                   **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/devops.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/devops.css
deleted file mode 100644
index ad7188a..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/devops.css
+++ /dev/null
@@ -1,276 +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.                                              *

- ***************************************************************************************************************************/

- 

-/** DevOps look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	background-color: #3B4B54;

-	margin: 0px;

-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;

-	color: #B3B3B3;

-	height: 100%;	

-}

-

-body {

-	font-size: 14px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                        **/

-/**********************************************************************************************************************/

-

-header {

-	background-color: #26343F;

-}

-

-header * {

-    font-size: 14px;

-	color: #B3B3B3;

-	margin: 0px;

-	text-decoration: none;

-	font-weight: normal;

-}

-

-header h1 {

-	padding: 10px 20px;

-	font-size: 16px;

-	border-bottom: 2px solid #34534B;

-	color: white;

-}

-

-header h2 {

-	padding: 10px 20px;

-	font-size: 14px;

-	border-bottom: 2px solid #34534B;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 10px 20px 10px 20px;

-	color: #94A3AB;

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-	content: " - ";

-}

-

-nav a {

-	font-size: 10pt;

-	color: #94A3AB;

-	text-decoration: none;

-	margin: 0px 15px;

-	text-transform: uppercase;

-	cursor: pointer;

-}

-

-nav a:active, nav a:hover {

-	color: white;

-	text-decoration: underline;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                        **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin-bottom: 50px;

-}

-

-article {

-	display: table-cell;

-}

-

-article * {

-	font-size: 9pt;

-	color: #26343F;

-}

-

-article div.data {

-	padding: 10px;

-	background-color: white;

-	border-radius: 4px;

-	margin: 20px;

-	display: inline-block;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	font-family: sans-serif;

-	color: #26343F;

-}

-

-article table {

-	border: none;

-	width: 100%;

-}

-

-article th {

-	border-top: 1px solid #D9DCDE;

-	padding: 4px 8px;

-	font-weight: bold;

-	text-align: center;

-	background-color: #F4F6F9;

-}

-

-article td {

-	vertical-align: top;

-	border-bottom: 1px solid #d9dcde;

-	border-right: 1px solid #d9dcde;

-	padding: 2px 5px;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-article a {

-	color: #116998;

-	text-decoration: none;

-}

-

-article a:hover {

-	text-decoration: underline;

-}

-

-article iframe {

-	background-color: #F6F7F9;

-	border: 1px solid gray;

-	padding: 0px;

-	overflow: hidden;

-	width: 100%;

-	min-height: 400px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	padding: 10px;

-	width: 100%;

-	bottom: 0;

-	position: fixed;

-	background-color: #26343F;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #f4f6f9;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	color: black;

-	font-size: 11px;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display:block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

-

diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/light.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/light.css
deleted file mode 100644
index aa91f98..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/light.css
+++ /dev/null
@@ -1,273 +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.                                              *

- ***************************************************************************************************************************/

- 

-/** Light look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	margin: 0px;

-	font-size: 10px;

-	font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;

-	color: #2c4557;

-	height: 100%;	

-}

-

-body * {

-	font-size: 14px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                          **/

-/**********************************************************************************************************************/

-

-header {

-	background-color: #e8ebef;

-	padding: 10px 20px;

-	box-shadow: 5px 5px 2px #999999;

-	text-shadow: rgba(1,1,1,.2) 2px 4px 5px, rgba(125,32,191,.05) 0 -10px 30px;

-	white-space: nowrap;

-}

-

-header * {

-	color: #af2222;;

-	font-weight: lighter;

-}

-

-header h1 {

-	font-size: 18px;

-	margin: 0px;

-	padding: 2px;

-}

-

-header h2 {

-	font-size: 14px;

-	margin: 0px;

-	padding: 2px;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 10px;

-	padding: 5px;

-	box-shadow: 5px 5px 2px #999999;

-	background-color: #eef3f7;

-}

-

-nav * {

-	font-size: 12px;

-	font-weight: lighter;

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-	content: " - ";

-}

-

-nav a {

-	font-size: 10pt;

-	color: #2c4557;

-	text-decoration: none;

-	margin: 0px 10px;

-	text-transform: uppercase;

-	cursor: pointer;

-}

-

-nav a:active, nav a:hover {

-	text-decoration: none;

-	color: #94a3ab;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                         **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin: 0px 0px 50px 0px;

-}

-

-article {

-	display: table-cell;

-	padding: 20px 40px;

-}

-

-article * {

-	font-size: 9pt;

-}

-

-article div.data {

-	padding: 0px;

-	margin: 0px;

-	display: inline-block;

-	font-family: sans-serif;

-}

-

-article table {

-	border: none;

-	width: 100%;

-}

-

-article td {

-	vertical-align: top;

-	border-bottom: 1px solid #d9dcde;

-	border-right: 1px solid #d9dcde;

-	padding: 2px 5px;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article th {

-	padding: 4px 8px;

-	text-align: center;

-	background-color: #eef3f7;

-	box-shadow: 1px 1px 2px #999999;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-article a {

-	color: #416e8e;

-	text-decoration: none;

-}

-

-article iframe {

-	background-color: #F6F7F9;

-	border: 1px solid gray;

-	padding: 0px;

-	overflow: hidden;

-	width: 100%;

-	min-height: 400px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	padding: 10px;

-	width: 100%;

-	bottom: 0;

-	position: fixed;

-	background-color: #e8ebef;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #eef3f7;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	color: #2c4557;

-	font-size: 10pt;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display: block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/original.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/original.css
deleted file mode 100644
index 2052281..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/original.css
+++ /dev/null
@@ -1,237 +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.                                              *

- ***************************************************************************************************************************/

-

-/** Original look-and-feel */ 

- 

-/**********************************************************************************************************************/

-/**  Body                                                                                                            **/

-/**********************************************************************************************************************/

-

-body {

-	background-image: linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);

-	background-image: -webkit-linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);

-	background-attachment: fixed;

-	font-family: Sans-Serif;

-	color: #2c4557;

-	height: 100%;

-	margin: 0px;

-}

-

-body * {

-	font-size: 12px;

-}

-

-body textarea, body pre {

-	-moz-tab-size: 3; 

-	-o-tab-size: 3; 

-	-webkit-tab-size: 3; 

-	tab-size: 3; 

-}

-

-/**********************************************************************************************************************/

-/**  Header                                                                                                          **/

-/**********************************************************************************************************************/

-

-header {

-	padding: 10px 20px;

-}

-

-header h1 {

-    font-size: 16px;

-	margin-bottom: 10px;

-	margin-right: 40px;

-	padding: 5px 30px;

-	border-radius: 15px;

-	text-decoration: none;

-	font-weight: normal;

-	background: linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;

-	background: -webkit-gradient(linear, left top, left bottom, from(#F5F5F5), to(#DEE3E9));

-}

-

-header h2 {

-	font-weight: normal;

-	margin-left: 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Nav                                                                                                             **/

-/**********************************************************************************************************************/

-

-nav {

-	margin: 0px 25px;	

-}

-

-nav>ol {

-	list-style-type: none;

-	margin: 0px 10px;

-	padding: 0px;

-}

-

-nav>ol>li {

-	display: inline;

-}

-

-nav li:not(:first-child):before {

-    content: " - ";

-}

-

-nav a {

-	text-decoration: underline;

-	cursor: pointer;

-	color: -webkit-link;

-}

-

-/**********************************************************************************************************************/

-/**  Content                                                                                                        **/

-/**********************************************************************************************************************/

-

-section {

-	display: table;

-	width: 100%;

-	margin: 0px 0px 50px 0px;

-}

-

-article {

-	display: table-cell;

-	padding: 20px 40px;

-}

-

-aside {

-	display: table-cell;

-	vertical-align: top;

-	padding: 20px 20px;

-}

-

-article div.data {

-	padding: 0px;

-	margin: 0px;

-	display: inline-block;

-	font-family: sans-serif;

-}

-

-article table {

-	border:1px solid #CCCC99;

-	border-collapse: collapse;

-	margin: 5px 0px;

-	width: 100%;

-}

-

-article th {

-	border-top: 1px solid #CCCC99;

-	padding: 3px 5px;

-	color: #666666;

-	text-align: center;

-	background-image: linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);

-	background-image: -webkit-linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);

-}

-

-article td {

-	border: 1px solid #E9EACB;

-	padding: 2px 5px;

-	color: #005C87;

-	vertical-align: top;

-}

-

-article td:last-child {

-    width: 100%;

-}

-

-article ul {

-	margin: 0px;

-	padding-left: 20px;

-}

-

-/**********************************************************************************************************************/

-/**  Footer                                                                                                          **/

-/**********************************************************************************************************************/

-

-footer { 

-	display: none;

-}

-

-/**********************************************************************************************************************/

-/**  Popup windows                                                                                                   **/

-/**********************************************************************************************************************/

-

-.popup-content {

-	display: none;

-	position: absolute;

-	background-color: #eef3f7;

-	white-space: nowrap;

-	padding: 5px;

-	box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);

-	z-index: 1;

-	margin-top: 10px;

-	border-radius: 4px;

-}

-

-.popup-content * {

-	font-size: 9pt;

-}

-

-.popup-content a:hover {

-	color: #94A3AB;

-}

-

-.popup-show {

-	display: block;

-}

-

-/**********************************************************************************************************************/

-/**  Tooltips                                                                                                        **/

-/**********************************************************************************************************************/

-

-.tooltip {

-	position: relative;

-	display: inline-block;	    

-}

-

-.tooltip .tooltiptext {

-	visibility: hidden;

-	background-color: #FEF9E7;

-	color: black;

-	padding: 5px;

-	border-radius: 6px;

-	position: absolute;

-	z-index: 1;

-	top: 0;

-	left: 0;

-	margin-left: 30px;

-	box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);

-	opacity: 0;

-	transition: opacity 0.5s;

-	font-weight: normal;

-}

-

-.tooltip:hover .tooltiptext {

-	visibility: visible;

-	opacity: 1;

-}	

-

-.tooltiptext {

-	white-space: nowrap;

-	float: left;

-	border: 1px solid black;

-}

-

-/**********************************************************************************************************************/

-/**  Other classes                                                                                                   **/

-/**********************************************************************************************************************/

-

-.table {display:table;}

-.row {display:table-row;}

-.cell {display:table-cell;}

-.monospace {font-family:monospace;}

-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}

-.link:hover { text-decoration: underline; }

-

diff --git a/juneau-microservice/pom.xml b/juneau-microservice/pom.xml
index 896908b..aff11be 100644
--- a/juneau-microservice/pom.xml
+++ b/juneau-microservice/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-microservice</artifactId>
diff --git a/juneau-releng/juneau-all/pom.xml b/juneau-releng/juneau-all/pom.xml
index bf6735a..931a249 100644
--- a/juneau-releng/juneau-all/pom.xml
+++ b/juneau-releng/juneau-all/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-releng</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-all</artifactId>
diff --git a/juneau-releng/juneau-distrib/pom.xml b/juneau-releng/juneau-distrib/pom.xml
index 789a3e4..41f2c36 100644
--- a/juneau-releng/juneau-distrib/pom.xml
+++ b/juneau-releng/juneau-distrib/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-releng</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-distrib</artifactId>
diff --git a/juneau-releng/pom.xml b/juneau-releng/pom.xml
index 8a5501e..1c7f39f 100644
--- a/juneau-releng/pom.xml
+++ b/juneau-releng/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-releng</artifactId>
diff --git a/juneau-rest/juneau-rest-client-utest/pom.xml b/juneau-rest/juneau-rest-client-utest/pom.xml
index 87526be..dcbf8f2 100644
--- a/juneau-rest/juneau-rest-client-utest/pom.xml
+++ b/juneau-rest/juneau-rest-client-utest/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-client-utest</artifactId>
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/BodyAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/BodyAnnotationTest.java
index 534a9a4..4447839 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/BodyAnnotationTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.junit.Assert.*;
 
@@ -26,7 +26,7 @@
 import org.apache.juneau.marshall.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/EndToEndInterfaceTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/EndToEndInterfaceTest.java
index 1facd09..9331c3b 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/EndToEndInterfaceTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.apache.juneau.http.HttpMethodName.*;
 import static org.junit.Assert.*;
@@ -26,11 +26,12 @@
 import org.apache.juneau.json.*;
 import org.apache.juneau.marshall.*;
 import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.helper.*;
 import org.apache.juneau.rest.mock2.MockRemoteResource;
-import org.apache.juneau.rest.response.*;
+import org.apache.juneau.http.response.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/FormDataAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/FormDataAnnotationTest.java
index 2d16366..6a4f40c 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/FormDataAnnotationTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.junit.Assert.*;
 import static org.apache.juneau.testutils.TestUtils.*;
@@ -26,7 +26,7 @@
 import org.apache.juneau.http.annotation.Header;
 import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.utils.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/HeaderAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/HeaderAnnotationTest.java
index 7132944..753d032 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/HeaderAnnotationTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.apache.juneau.testutils.TestUtils.*;
 import static org.junit.Assert.*;
@@ -24,7 +24,7 @@
 import org.apache.juneau.http.annotation.Header;
 import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.utils.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/PathAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/PathAnnotationTest.java
index 6ee55cd..89c4559 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/PathAnnotationTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.apache.juneau.testutils.TestUtils.*;
 import static org.junit.Assert.*;
@@ -24,7 +24,7 @@
 import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.utils.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/QueryAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/QueryAnnotationTest.java
index 1234011..11d25e3 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/QueryAnnotationTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.apache.juneau.testutils.TestUtils.*;
 import static org.junit.Assert.*;
@@ -26,7 +26,7 @@
 import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.utils.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RemoteMethodAnnotationTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RemoteMethodAnnotationTest.java
index 808560e..e9af823 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RemoteMethodAnnotationTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.junit.Assert.*;
 
@@ -24,6 +24,7 @@
 import org.apache.juneau.marshall.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RemoteResourceAnnotationTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RemoteResourceAnnotationTest.java
index 536d1e5..5949e79 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RemoteResourceAnnotationTest.java
@@ -10,12 +10,12 @@
 // * "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.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.junit.Assert.*;
 
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.mock2.MockRemoteResource;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RequestAnnotationTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RequestAnnotationTest.java
index e183b94..edc0e15 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/RequestAnnotationTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.junit.Assert.*;
 
@@ -24,6 +24,7 @@
 import org.apache.juneau.http.annotation.Query;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/ResponseAnnotationTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java
rename to juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/ResponseAnnotationTest.java
index f6a6df9..7ecabf1 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client/ResponseAnnotationTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.remote;
+package org.apache.juneau.rest.client;
 
 import static org.junit.Assert.*;
 
@@ -21,6 +21,7 @@
 import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-client/pom.xml b/juneau-rest/juneau-rest-client/pom.xml
index f0f26d0..447809e 100644
--- a/juneau-rest/juneau-rest-client/pom.xml
+++ b/juneau-rest/juneau-rest-client/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-client</artifactId>
@@ -46,11 +46,6 @@
 			<groupId>com.sun.activation</groupId>
 			<artifactId>javax.activation</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-rest-server</artifactId>
-			<version>${project.version}</version>
-		</dependency>
 	</dependencies>
 
 	<properties>
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCallException.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCallException.java
index ff75a76..3fe7203 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCallException.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCallException.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.rest.client;

 

 import static java.lang.String.*;

-import static org.apache.juneau.internal.ClassUtils.*;

 import static org.apache.juneau.internal.StringUtils.*;

 import static org.apache.juneau.internal.IOUtils.*;

 import static org.apache.juneau.internal.StringUtils.format;

@@ -157,7 +156,7 @@
 				if (t.getName().endsWith(serverExceptionName))

 					doThrow(t, serverExceptionMessage);

 			try {

-				ClassInfo t = getClassInfo(cl.loadClass(serverExceptionName));

+				ClassInfo t = ClassInfo.of(cl.loadClass(serverExceptionName));

 				if (t.isChildOf(RuntimeException.class) || t.isChildOf(Error.class))

 					doThrow(t.inner(), serverExceptionMessage);

 			} catch (ClassNotFoundException e2) { /* Ignore */ }

@@ -166,7 +165,7 @@
 

 	private void doThrow(Class<?> t, String msg) throws Throwable {

 		ConstructorInfo c = null;

-		ClassInfo ci = getClassInfo(t);

+		ClassInfo ci = ClassInfo.of(t);

 		if (msg != null) {

 			c = ci.getPublicConstructor(String.class);

 			if (c != null)

diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index f2f041d..f2162e2 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -33,12 +33,15 @@
 import org.apache.http.impl.client.*;

 import org.apache.juneau.*;

 import org.apache.juneau.annotation.*;

+import org.apache.juneau.http.remote.RemoteReturn;

+import org.apache.juneau.http.remote.RemoteResource;

 import org.apache.juneau.httppart.*;

 import org.apache.juneau.httppart.bean.*;

 import org.apache.juneau.internal.*;

 import org.apache.juneau.json.*;

 import org.apache.juneau.oapi.*;

 import org.apache.juneau.parser.*;

+import org.apache.juneau.reflect.*;

 import org.apache.juneau.remote.*;

 import org.apache.juneau.rest.client.remote.*;

 import org.apache.juneau.serializer.*;

@@ -1191,7 +1194,7 @@
 							} else {

 								Object v = rc.getResponseBody(rmr.getReturnType());

 								if (v == null && method.getReturnType().isPrimitive())

-									v = getClassInfo(method.getReturnType()).getPrimitiveDefault();

+									v = ClassInfo.of(method.getReturnType()).getPrimitiveDefault();

 								return v;

 							}

 

@@ -1310,7 +1313,7 @@
 

 							Object v = rc.getResponse(method.getGenericReturnType());

 							if (v == null && method.getReturnType().isPrimitive())

-								v = getClassInfo(method.getReturnType()).getPrimitiveDefault();

+								v = ClassInfo.of(method.getReturnType()).getPrimitiveDefault();

 							return v;

 

 						} catch (RestCallException e) {

diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethod.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethod.java
index b86cca5..9802757 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethod.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethod.java
@@ -26,11 +26,14 @@
  * <ul class='seealso'>

  * 	<li class='link'>{@doc juneau-rest-client.RestProxies}

  * </ul>

+ *

+ * @deprecated Use {@link org.apache.juneau.http.remote.RemoteMethod}

  */

 @Documented

 @Target(METHOD)

 @Retention(RUNTIME)

 @Inherited

+@Deprecated

 public @interface RemoteMethod {

 

 	/**

diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodMeta.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodMeta.java
index 4cbe314..667655c 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodMeta.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodMeta.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.rest.client.remote;
 
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.httppart.HttpPartType.*;
 
 import java.lang.reflect.*;
@@ -21,6 +20,7 @@
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.*;
+import org.apache.juneau.http.remote.RemoteMethod;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.httppart.bean.*;
 import org.apache.juneau.internal.*;
@@ -85,14 +85,20 @@
 		RemoteMethodArg bodyArg;
 		RemoteMethodReturn methodReturn;
 
+		@SuppressWarnings("deprecation")
 		Builder(String parentPath, Method m, boolean useMethodSignatures, String defaultMethod) {
 
-			MethodInfo mi = getMethodInfo(m);
+			MethodInfo mi = MethodInfo.of(m);
 
+			org.apache.juneau.rest.client.remote.RemoteMethod orm = mi.getAnnotation(org.apache.juneau.rest.client.remote.RemoteMethod.class);
+			if (orm == null)
+				orm = mi.getResolvedReturnType().getAnnotation(org.apache.juneau.rest.client.remote.RemoteMethod.class);
 			RemoteMethod rm = mi.getAnnotation(RemoteMethod.class);
+			if (rm == null)
+				rm = mi.getResolvedReturnType().getAnnotation(RemoteMethod.class);
 
-			httpMethod = rm == null ? "" : rm.method();
-			path = rm == null ? "" : rm.path();
+			httpMethod = rm == null ? (orm == null ? "" : orm.method()) : rm.method();
+			path = rm == null ? (orm == null ? "" : orm.path()) : rm.path();
 
 			if (path.isEmpty()) {
 				path = HttpUtils.detectHttpPath(m, ! useMethodSignatures);
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodReturn.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodReturn.java
index d35add0..650c3f1 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodReturn.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodReturn.java
@@ -15,6 +15,8 @@
 import java.lang.reflect.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.http.remote.RemoteMethod;
+import org.apache.juneau.http.remote.RemoteReturn;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.httppart.bean.*;
 import org.apache.juneau.reflect.*;
@@ -32,16 +34,39 @@
 	private final RemoteReturn returnValue;
 	private final ResponseBeanMeta meta;
 
+	@SuppressWarnings("deprecation")
 	RemoteMethodReturn(MethodInfo m) {
-		RemoteMethod rm = m.getAnnotation(RemoteMethod.class);
 		ClassInfo rt = m.getReturnType();
-		RemoteReturn rv = rt.is(void.class) ? RemoteReturn.NONE : rm == null ? RemoteReturn.BODY : rm.returns();
+
+		org.apache.juneau.rest.client.remote.RemoteMethod orm = m.getAnnotation(org.apache.juneau.rest.client.remote.RemoteMethod.class);
+		if (orm == null)
+			orm = m.getResolvedReturnType().getAnnotation(org.apache.juneau.rest.client.remote.RemoteMethod.class);
+		RemoteMethod rm = m.getAnnotation(RemoteMethod.class);
+		if (rm == null)
+			rm = m.getResolvedReturnType().getAnnotation(RemoteMethod.class);
+
+		RemoteReturn rv = null;
+		if (rt.is(void.class))
+			rv = RemoteReturn.NONE;
+		else if (orm != null)
+			switch (orm.returns()) {
+				case BEAN: rv = RemoteReturn.BEAN; break;
+				case BODY: rv = RemoteReturn.BODY; break;
+				case NONE: rv = RemoteReturn.NONE; break;
+				case STATUS: rv = RemoteReturn.STATUS; break;
+			}
+		else if (rm != null)
+			rv = rm.returns();
+		else
+			rv = RemoteReturn.BODY;
+
 		if (rt.hasAnnotation(Response.class) && rt.isInterface()) {
 			this.meta = ResponseBeanMeta.create(m, PropertyStore.DEFAULT);
 			rv = RemoteReturn.BEAN;
 		} else {
 			this.meta = null;
 		}
+
 		this.returnType = m.getReturnType().innerType();
 		this.returnValue = rv;
 	}
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteResource.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteResource.java
index 80d7e40..1f45758 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteResource.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteResource.java
@@ -23,11 +23,14 @@
  * <ul class='seealso'>

  * 	<li class='link'>{@doc juneau-rest-client.RestProxies}

  * </ul>

+ *

+ * @deprecated Use {@link org.apache.juneau.http.remote.RemoteMethod}

  */

 @Documented

 @Target({TYPE})

 @Retention(RUNTIME)

 @Inherited

+@Deprecated

 public @interface RemoteResource {

 

 	/**

diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteResourceMeta.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteResourceMeta.java
index a29bec0..dcfef03 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteResourceMeta.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteResourceMeta.java
@@ -14,8 +14,6 @@
 
 import static org.apache.juneau.internal.CollectionUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import java.lang.reflect.*;
 import java.util.*;
 
@@ -25,7 +23,7 @@
  * Contains the meta-data about a REST proxy class.
  *
  * <p>
- * Captures the information in {@link RemoteResource @RemoteResource} and {@link RemoteMethod @RemoteMethod} annotations for
+ * Captures the information in {@link org.apache.juneau.http.remote.RemoteResource @RemoteResource} and {@link org.apache.juneau.http.remote.RemoteMethod @RemoteMethod} annotations for
  * caching and reuse.
  *
  * <ul class='seealso'>
@@ -40,15 +38,19 @@
 	/**
 	 * Constructor.
 	 *
-	 * @param c The interface class annotated with a {@link RemoteResource @RemoteResource} annotation (optional).
+	 * @param c The interface class annotated with a {@link org.apache.juneau.http.remote.RemoteResource @RemoteResource} annotation (optional).
 	 */
+	@SuppressWarnings("deprecation")
 	public RemoteResourceMeta(Class<?> c) {
 		String path = "";
 
-		ClassInfo ci = getClassInfo(c);
+		ClassInfo ci = ClassInfo.of(c);
 		for (RemoteResource r : ci.getAnnotationsParentFirst(RemoteResource.class))
 			if (! r.path().isEmpty())
 				path = trimSlashes(r.path());
+		for (org.apache.juneau.http.remote.RemoteResource r : ci.getAnnotationsParentFirst(org.apache.juneau.http.remote.RemoteResource.class))
+			if (! r.path().isEmpty())
+				path = trimSlashes(r.path());
 
 		Map<Method,RemoteMethodMeta> methods = new LinkedHashMap<>();
 		for (MethodInfo m : ci.getPublicMethods())
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteReturn.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteReturn.java
index be884f3..07a6297 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteReturn.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteReturn.java
@@ -14,7 +14,10 @@
 
 /**
  * Possible values for the {@link RemoteMethod#returns() @RemoteMethod(returns)} annotation.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.remote.RemoteReturn}
  */
+@Deprecated
 public enum RemoteReturn {
 
 	/** HTTP response body */
diff --git a/juneau-rest/juneau-rest-mock-utest/pom.xml b/juneau-rest/juneau-rest-mock-utest/pom.xml
index a432172..38c9c1a 100644
--- a/juneau-rest/juneau-rest-mock-utest/pom.xml
+++ b/juneau-rest/juneau-rest-mock-utest/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-mock-utest</artifactId>
diff --git a/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/ABean.java b/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/ABean.java
index 439937a..bde2c9a 100644
--- a/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/ABean.java
+++ b/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/ABean.java
@@ -12,6 +12,8 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.testutils;
 
+import org.apache.juneau.marshall.*;
+
 public class ABean {
 	public int a;
 	public String b;
@@ -21,4 +23,9 @@
 		this.b = "foo";
 		return this;
 	}
+
+	@Override
+	public String toString() {
+		return SimpleJson.DEFAULT.toString(this);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java b/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
index 10232b0..445204d 100755
--- a/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
+++ b/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
@@ -61,7 +61,7 @@
 	public static Swagger getSwagger(Class<?> c) {

 		try {

 			RestContext rc = RestContext.create(c.newInstance()).build();

-			RestRequest req = rc.getCallHandler().createRequest(new MockServletRequest());

+			RestRequest req = rc.getCallHandler().createRequest(new RestCall(new MockServletRequest(), null));

 			RestInfoProvider ip = rc.getInfoProvider();

 			return ip.getSwagger(req);

 		} catch (Exception e) {

diff --git a/juneau-rest/juneau-rest-mock/pom.xml b/juneau-rest/juneau-rest-mock/pom.xml
index 2a1d45a..93d1586 100644
--- a/juneau-rest/juneau-rest-mock/pom.xml
+++ b/juneau-rest/juneau-rest-mock/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-mock</artifactId>
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
index b778d75..3860b1b 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
@@ -82,7 +82,7 @@
 
 	@Override /* HttpSession */
 	public Enumeration<String> getAttributeNames() {
-		return null;
+		return Collections.enumeration(Collections.emptyList());
 	}
 
 	@Override /* HttpSession */
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRemoteResource.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRemoteResource.java
index 6479659..18b27eb 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRemoteResource.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRemoteResource.java
@@ -19,7 +19,7 @@
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.client.remote.*;
+import org.apache.juneau.http.remote.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -243,7 +243,7 @@
 	/**
 	 * Adds an <c>Accept</c> header to every request.
 	 *
-	 * @param value The <code>Accept/code> header value.
+	 * @param value The <c>Accept</c> header value.
 	 * @return This object (for method chaining).
 	 */
 	public MockRemoteResource<T> accept(String value) {
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRest.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRest.java
index 276c1ea..ac6a309 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRest.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRest.java
@@ -271,7 +271,7 @@
 		/**
 		 * Specifies the <c>Accept</c> header to every request.
 		 *
-		 * @param value The <code>Accept/code> header value.
+		 * @param value The <c>Accept</c> header value.
 		 * @return This object (for method chaining).
 		 */
 		public Builder accept(String value) {
diff --git a/juneau-rest/juneau-rest-server-jaxrs/pom.xml b/juneau-rest/juneau-rest-server-jaxrs/pom.xml
index 1cc57e1..0a0f086 100644
--- a/juneau-rest/juneau-rest-server-jaxrs/pom.xml
+++ b/juneau-rest/juneau-rest-server-jaxrs/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-server-jaxrs</artifactId>
diff --git a/juneau-rest/juneau-rest-server-rdf/pom.xml b/juneau-rest/juneau-rest-server-rdf/pom.xml
index df9f343..06a5a48 100644
--- a/juneau-rest/juneau-rest-server-rdf/pom.xml
+++ b/juneau-rest/juneau-rest-server-rdf/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-server-rdf</artifactId>
diff --git a/juneau-rest/juneau-rest-server-springboot/pom.xml b/juneau-rest/juneau-rest-server-springboot/pom.xml
index a146b9b..1d68f68 100644
--- a/juneau-rest/juneau-rest-server-springboot/pom.xml
+++ b/juneau-rest/juneau-rest-server-springboot/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-server-springboot</artifactId>
diff --git a/juneau-rest/juneau-rest-server-utest/pom.xml b/juneau-rest/juneau-rest-server-utest/pom.xml
index 7726cb7..0b0e72d 100644
--- a/juneau-rest/juneau-rest-server-utest/pom.xml
+++ b/juneau-rest/juneau-rest-server-utest/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-server-utest</artifactId>
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
index 8699220..d3cdec8 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
@@ -52,14 +52,14 @@
 
 	private Swagger getSwaggerWithFile(Object resource) throws Exception {
 		RestContext rc = RestContext.create(resource).classpathResourceFinder(TestClasspathResourceFinder.class).build();
-		RestRequest req = rc.getCallHandler().createRequest(new MockServletRequest());
+		RestRequest req = rc.getCallHandler().createRequest(new RestCall(new MockServletRequest(), null));
 		RestInfoProvider ip = rc.getInfoProvider();
 		return ip.getSwagger(req);
 	}
 
 	private static Swagger getSwagger(Object resource) throws Exception {
 		RestContext rc = RestContext.create(resource).build();
-		RestRequest req = rc.getCallHandler().createRequest(new MockServletRequest());
+		RestRequest req = rc.getCallHandler().createRequest(new RestCall(new MockServletRequest(), null));
 		RestInfoProvider ip = rc.getInfoProvider();
 		return ip.getSwagger(req);
 	}
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StaticFilesMappingTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StaticFilesMappingTest.java
new file mode 100644
index 0000000..d7b8489
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StaticFilesMappingTest.java
@@ -0,0 +1,246 @@
+// ***************************************************************************************************************************
+// * 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.rest;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.parser.*;
+import org.junit.*;
+import org.junit.runners.*;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class StaticFilesMappingTest {
+
+	private static Collection<StaticFileMapping> parse(String input) throws ParseException {
+		return StaticFileMapping.parse(null, input);
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Empty input.
+	//------------------------------------------------------------------------------------------------------------------
+
+	@Test
+	public void a01_null() throws Exception {
+		assertObjectEquals("[]", parse(null));
+	}
+
+	@Test
+	public void a02_emptySpaces() throws Exception {
+		assertObjectEquals("[]", parse("    "));
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Basic tests.
+	//------------------------------------------------------------------------------------------------------------------
+
+	@Test
+	public void b01_basic2Part() throws Exception {
+		assertObjectEquals("[{path:'foo',location:'bar'}]", parse("foo:bar"));
+	}
+
+	@Test
+	public void b02_basic2Part_withSpaces() throws Exception {
+		assertObjectEquals("[{path:'foo',location:'bar'}]", parse("  foo  :  bar  "));
+	}
+
+	@Test
+	public void b03_basic3Part() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{baz:'qux'}}]",
+			parse("foo:bar:{baz:'qux'}")
+		);
+	}
+
+	@Test
+	public void b04_basic3Part_withSpaces() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{baz:'qux'}}]",
+			parse("  foo  :  bar  :  {  baz  :  'qux'  }  ")
+		);
+	}
+
+	@Test
+	public void b05_multipleHeaders() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{baz:'qux',qux:'quux'}}]",
+			parse("foo:bar:{baz:'qux',qux:'quux'}")
+		);
+	}
+
+	@Test
+	public void b06_multipleHeaders_withSpaces() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{baz:'qux',qux:'quux'}}]",
+			parse("  foo  :  bar  :  {  baz  :  'qux'  ,  qux:  'quux'  }  ")
+		);
+	}
+
+	@Test
+	public void b07_nestedHeaders() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{a:{b:'c'}}}]",
+			parse("foo:bar:{a:{b:'c'}}")
+		);
+	}
+
+	@Test
+	public void b08_nestedHeaders_complex() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{a:{b:'c',d:'e'},f:{g:'h',i:'j'}}}]",
+			parse("foo:bar:{a:{b:'c',d:'e'},f:{g:'h',i:'j'}}")
+		);
+	}
+
+	@Test
+	public void b09_nestedHeaders_complex_withSpaces() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{a:{b:'c',d:'e'},f:{g:'h',i:'j'}}}]",
+			parse("  foo  :  bar  :  {  a  :  {  b  :  'c'  ,  d  :  'e'  }  ,  f  :  {  g  :  'h'  ,  i  :  'j'  }  }  ")
+		);
+	}
+
+	@Test
+	public void b10_emptyHeaders() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar'}]",
+			parse("foo:bar:{}")
+		);
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Multiple mappings
+	//------------------------------------------------------------------------------------------------------------------
+
+	@Test
+	public void c01_multipleMappings_basic2Part() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar'},{path:'baz',location:'qux'}]",
+			parse("foo:bar,baz:qux")
+		);
+	}
+
+	@Test
+	public void c02_multipleMappings_basic2Part_withSpaces() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar'},{path:'baz',location:'qux'}]",
+			parse("  foo  :  bar  ,  baz  :  qux  ")
+		);
+	}
+
+	@Test
+	public void c03_multipleMappings_basic3Part() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{a:'b'}},{path:'baz',location:'qux',responseHeaders:{c:'d'}}]",
+			parse("foo:bar:{a:'b'},baz:qux:{c:'d'}")
+		);
+	}
+
+	@Test
+	public void c04_multipleMappings_basic3Part_withSpaces() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{a:'b'}},{path:'baz',location:'qux',responseHeaders:{c:'d'}}]",
+			parse("  foo  :  bar  :  {  a  :  'b'  }  ,  baz  :  qux  :  {  c  :  'd'  }  ")
+		);
+	}
+
+	@Test
+	public void c05_multipleMappings_multipleHeaders() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{a:'b',c:'d'}},{path:'baz',location:'qux',responseHeaders:{e:'f',g:'h'}}]",
+			parse("foo:bar:{a:'b',c:'d'},baz:qux:{e:'f',g:'h'}")
+		);
+	}
+
+	@Test
+	public void c06_multipleMappings_multipleHeaders_withSpaces() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{a:'b',c:'d'}},{path:'baz',location:'qux',responseHeaders:{e:'f',g:'h'}}]",
+			parse("  foo  :  bar  :  {  a  :  'b'  ,  c  :  'd'  }  ,  baz  :  qux  :  {  e  :  'f'  ,  g  :  'h'  }  ")
+		);
+	}
+
+	@Test
+	public void c07_multipleMappings_nestedHeaders() throws Exception {
+		assertObjectEquals(
+			"[{path:'foo',location:'bar',responseHeaders:{a:{b:'c'}}},{path:'baz',location:'qux',responseHeaders:{d:{e:'f'}}}]",
+			parse("foo:bar:{a:{b:'c'}},baz:qux:{d:{e:'f'}}")
+		);
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Error conditions
+	//------------------------------------------------------------------------------------------------------------------
+
+	@Test
+	public void d01_error_malformedJson() {
+		try {
+			parse("foo:bar:xxx");
+			fail("Exception expected.");
+		} catch (ParseException e) {
+			assertContains(e, "Expected { at beginning of headers.");
+		}
+	}
+
+	@Test
+	public void d02_error_textFollowingJson() {
+		try {
+			parse("foo:bar:{a:'b'}x");
+			fail("Exception expected.");
+		} catch (ParseException e) {
+			assertContains(e, "Invalid text following headers.");
+		}
+	}
+
+	@Test
+	public void d03_error_missingLocation() {
+		try {
+			parse("foo");
+			fail("Exception expected.");
+		} catch (ParseException e) {
+			assertContains(e, "Couldn't find ':' following path.");
+		}
+	}
+
+	@Test
+	public void d04_error_danglingColonAfterLocation() {
+		try {
+			parse("foo:bar:");
+			fail("Exception expected.");
+		} catch (ParseException e) {
+			assertContains(e, "Found extra ':' following location.");
+		}
+	}
+
+	@Test
+	public void d05_error_malformedHeaders_openEnded() {
+		try {
+			parse("foo:bar:{");
+			fail("Exception expected.");
+		} catch (ParseException e) {
+			assertContains(e, "Malformed headers.");
+		}
+	}
+
+	@Test
+	public void d06_error_malformedHeaders_mismatchedBrackets() {
+		try {
+			parse("foo:bar:{{}");
+			fail("Exception expected.");
+		} catch (ParseException e) {
+			assertContains(e, "Malformed headers.");
+		}
+	}
+}
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
index 2a5b5e3..0e66f65 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
@@ -23,35 +23,55 @@
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)

 public class RestResourceStaticFilesTest {

 

-	//====================================================================================================

+	//------------------------------------------------------------------------------------------------------------------

 	// Basic tests

-	//====================================================================================================

+	//------------------------------------------------------------------------------------------------------------------

 

 	@RestResource(staticFiles={"xdocs:xdocs","xdocs2:xdocs2:{Foo:'Bar'}"})

-	public static class A {

+	public static class A1 {

 		@RestMethod

 		public String a01() {

 			return null;

 		}

 	}

-	static MockRest a = MockRest.build(A.class);

+	static MockRest a1 = MockRest.build(A1.class);

 

 	@Test

-	public void a01() throws Exception {

-		a.get("/xdocs/test.txt").execute().assertBodyContains("OK-1");

-		a.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-2");

+	public void a01a() throws Exception {

+		a1.get("/xdocs/test.txt").execute().assertBodyContains("OK-1");

+		a1.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-2");

 	}

 	@Test

-	public void a02_preventPathTraversals() throws Exception {

-		a.get("/xdocs/xsubdocs/../test.txt?noTrace=true").execute().assertStatus(404);

-		a.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true").execute().assertStatus(404);

+	public void a01b_preventPathTraversals() throws Exception {

+		a1.get("/xdocs/xsubdocs/../test.txt?noTrace=true").execute().assertStatus(404);

+		a1.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true").execute().assertStatus(404);

 	}

 

-	//====================================================================================================

+	@RestResource(staticFiles={"xdocs2:xdocs2:{Foo:'Bar',Baz:'Qux'},xdocs:xdocs"})

+	public static class A2 {

+		@RestMethod

+		public String a02() {

+			return null;

+		}

+	}

+	static MockRest a2 = MockRest.build(A1.class);

+

+	@Test

+	public void a02a() throws Exception {

+		a1.get("/xdocs/test.txt").execute().assertBodyContains("OK-1");

+		a1.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-2");

+	}

+	@Test

+	public void a02b_preventPathTraversals() throws Exception {

+		a1.get("/xdocs/xsubdocs/../test.txt?noTrace=true").execute().assertStatus(404);

+		a1.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true").execute().assertStatus(404);

+	}

+

+	//------------------------------------------------------------------------------------------------------------------

 	// Static files with response headers.

-	//====================================================================================================

+	//------------------------------------------------------------------------------------------------------------------

 

-	@RestResource(staticFiles={"xdocs:xdocs:{Foo:'Bar'}"})

+	@RestResource(staticFiles={"xdocs:xdocs:{Foo:'Bar',Baz:'Qux'}"})

 	public static class B {

 		@RestMethod

 		public String b01() {

@@ -62,6 +82,72 @@
 

 	@Test

 	public void b01() throws Exception {

-		b.get("/xdocs/test.txt").execute().assertHeader("Foo","Bar").assertBodyContains("OK-1");

+		b.get("/xdocs/test.txt").execute().assertHeader("Foo","Bar").assertHeader("Baz","Qux").assertBodyContains("OK-1");

 	}

+

+	//------------------------------------------------------------------------------------------------------------------

+	// Class hierarchy

+	//------------------------------------------------------------------------------------------------------------------

+

+	@RestResource(staticFiles={"xdocs:xdocs"})

+	public static class C1 {

+		@RestMethod

+		public String c01() {

+			return null;

+		}

+	}

+

+	@RestResource(staticFiles={"xdocs:/xdocs"})

+	public static class C2 extends C1 {

+		@RestMethod

+		public String c02() {

+			return null;

+		}

+	}

+

+	static MockRest c1 = MockRest.build(C1.class);

+	static MockRest c2 = MockRest.build(C2.class);

+

+	@Test

+	public void c01() throws Exception {

+		// Should resolve to relative xdocs folder.

+		c1.get("/xdocs/test.txt").execute().assertBodyContains("OK-1");

+		c1.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-2");

+

+		// Should be overridden to absolute xdocs folder.

+		c2.get("/xdocs/test.txt").execute().assertBodyContains("OK-3");

+		c2.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-4");

+

+		// Should pick up from file system.

+		c1.get("/xdocs/test2.txt").execute().assertBodyContains("OK-5");

+		c2.get("/xdocs/test2.txt").execute().assertBodyContains("OK-5");

+		c1.get("/xdocs/xsubdocs/test2.txt").execute().assertBodyContains("OK-6");

+		c2.get("/xdocs/xsubdocs/test2.txt").execute().assertBodyContains("OK-6");

+	}

+

+	//------------------------------------------------------------------------------------------------------------------

+	// Overridden patterns

+	//------------------------------------------------------------------------------------------------------------------

+

+	@RestResource(staticFiles={"xdocs:/xdocs,xdocs:xdocs"})

+	public static class D {

+		@RestMethod

+		public String d01() {

+			return null;

+		}

+	}

+

+	static MockRest d = MockRest.build(D.class);

+

+	@Test

+	public void d01() throws Exception {

+		// Should be overridden to absolute xdocs folder.

+		d.get("/xdocs/test.txt").execute().assertBodyContains("OK-3");

+		d.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-4");

+

+		// Should pick up from file system.

+		d.get("/xdocs/test2.txt").execute().assertBodyContains("OK-5");

+		d.get("/xdocs/xsubdocs/test2.txt").execute().assertBodyContains("OK-6");

+	}

+

 }

diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
index c8c4d19..a7476a9 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
@@ -14,7 +14,7 @@
 
 import static org.apache.juneau.http.HttpMethodName.*;
 import static org.apache.juneau.rest.testutils.TestUtils.*;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import java.io.*;
 import java.util.*;
@@ -26,12 +26,14 @@
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.annotation.*;
+import org.apache.juneau.marshall.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.rest.testutils.DTOs;
 import org.apache.juneau.uon.*;
 import org.apache.juneau.urlencoding.*;
+import org.apache.juneau.utils.*;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -781,6 +783,59 @@
 		i.post("/", "{}").json().execute().assertStatus(200);
 	}
 
+	//=================================================================================================================
+	// Optional body parameter.
+	//=================================================================================================================
+
+	@RestResource(serializers=SimpleJsonSerializer.class,parsers=JsonParser.class)
+	public static class J {
+		@RestMethod(name=POST,path="/a")
+		public Object a(@Body Optional<Integer> body) throws Exception {
+			assertNotNull(body);
+			return body;
+		}
+		@RestMethod(name=POST,path="/b")
+		public Object b(@Body Optional<ABean> body) throws Exception {
+			assertNotNull(body);
+			return body;
+		}
+		@RestMethod(name=POST,path="/c")
+		public Object c(@Body Optional<List<ABean>> body) throws Exception {
+			assertNotNull(body);
+			return body;
+		}
+		@RestMethod(name=POST,path="/d")
+		public Object d(@Body List<Optional<ABean>> body) throws Exception {
+			return body;
+		}
+	}
+	static MockRest j = MockRest.create(J.class).json().build();;
+
+	@Test
+	public void j01_optionalParam_integer() throws Exception {
+		j.post("/a", "123").execute().assertStatus(200).assertBody("123");
+		j.post("/a", "null").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void j02_optionalParam_bean() throws Exception {
+		j.post("/b", new ABean().init()).execute().assertStatus(200).assertBody("{a:1,b:'foo'}");
+		j.post("/b", "null").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void j03_optionalParam_listOfBeans() throws Exception {
+		String body = SimpleJson.DEFAULT.toString(AList.of(new ABean().init()));
+		j.post("/c", body).execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+		j.post("/c", "null").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void j04_optionalParam_listOfOptionals() throws Exception {
+		String body = SimpleJson.DEFAULT.toString(AList.of(Optional.of(new ABean().init())));
+		j.post("/d", body).execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+		j.post("/d", "null").execute().assertStatus(200).assertBody("null");
+	}
 
 	//=================================================================================================================
 	// Swagger - @Body on POJO
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
index 86f7c50..f5231a8 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
@@ -14,16 +14,18 @@
 
 import static org.apache.juneau.http.HttpMethodName.*;
 import static org.apache.juneau.rest.testutils.TestUtils.*;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.dto.swagger.*;
-import org.apache.juneau.http.annotation.FormData;
+import org.apache.juneau.http.annotation.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock2.*;
+import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.urlencoding.*;
 import org.junit.*;
 import org.junit.runners.*;
@@ -156,6 +158,59 @@
 	}
 
 	//=================================================================================================================
+	// Optional form data parameter.
+	//=================================================================================================================
+
+	@RestResource(serializers=SimpleJsonSerializer.class)
+	public static class D {
+		@RestMethod(name=POST,path="/a")
+		public Object a(@FormData("f1") Optional<Integer> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=POST,path="/b")
+		public Object b(@FormData("f1") Optional<ABean> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=POST,path="/c")
+		public Object c(@FormData("f1") Optional<List<ABean>> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=POST,path="/d")
+		public Object d(@FormData("f1") List<Optional<ABean>> f1) throws Exception {
+			return f1;
+		}
+	}
+	static MockRest d = MockRest.create(D.class).accept("application/json").contentType("application/x-www-form-urlencoded").build();
+
+	@Test
+	public void d01_optionalParam_integer() throws Exception {
+		d.post("/a", "f1=123").execute().assertStatus(200).assertBody("123");
+		d.post("/a", "null").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void d02_optionalParam_bean() throws Exception {
+		d.post("/b", "f1=(a=1,b=foo)").execute().assertStatus(200).assertBody("{a:1,b:'foo'}");
+		d.post("/b", "null").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void d03_optionalParam_listOfBeans() throws Exception {
+		d.post("/c", "f1=@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+		d.post("/c", "null").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void d04_optionalParam_listOfOptionals() throws Exception {
+		d.post("/d", "f1=@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+		d.post("/d", "null").execute().assertStatus(200).assertBody("null");
+	}
+
+
+	//=================================================================================================================
 	// @FormData on POJO
 	//=================================================================================================================
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
index 35d44a2..40909ab 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
@@ -12,14 +12,18 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.annotation2;
 
+import static org.apache.juneau.http.HttpMethodName.*;
 import static org.apache.juneau.rest.testutils.TestUtils.*;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import java.util.*;
 
 import org.apache.juneau.dto.swagger.*;
-import org.apache.juneau.http.annotation.Header;
+import org.apache.juneau.http.annotation.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.rest.mock2.*;
+import org.apache.juneau.rest.testutils.*;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -31,6 +35,59 @@
 public class HeaderAnnotationTest {
 
 	//=================================================================================================================
+	// Optional header parameter.
+	//=================================================================================================================
+
+	@RestResource(serializers=SimpleJsonSerializer.class)
+	public static class A {
+		@RestMethod(name=GET,path="/a")
+		public Object a(@Header("f1") Optional<Integer> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/b")
+		public Object b(@Header("f1") Optional<ABean> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/c")
+		public Object c(@Header("f1") Optional<List<ABean>> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/d")
+		public Object d(@Header("f1") List<Optional<ABean>> f1) throws Exception {
+			return f1;
+		}
+	}
+	static MockRest a = MockRest.create(A.class).json().build();
+
+	@Test
+	public void a01_optionalParam_integer() throws Exception {
+		a.get("/a").header("f1", 123).execute().assertStatus(200).assertBody("123");
+		a.get("/a").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void a02_optionalParam_bean() throws Exception {
+		a.get("/b").header("f1", "(a=1,b=foo)").execute().assertStatus(200).assertBody("{a:1,b:'foo'}");
+		a.get("/b").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void a03_optionalParam_listOfBeans() throws Exception {
+		a.get("/c").header("f1", "@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+		a.get("/c").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void a04_optionalParam_listOfOptionals() throws Exception {
+		a.get("/d").header("f1", "@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+		a.get("/d").execute().assertStatus(200).assertBody("null");
+	}
+
+
+	//=================================================================================================================
 	// @Header on POJO
 	//=================================================================================================================
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
index b2c6e1c..a53dd5e 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
@@ -14,17 +14,19 @@
 
 import static org.apache.juneau.http.HttpMethodName.*;
 import static org.apache.juneau.rest.testutils.TestUtils.*;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.dto.swagger.*;
-import org.apache.juneau.http.annotation.Path;
+import org.apache.juneau.http.annotation.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.marshall.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock2.*;
+import org.apache.juneau.rest.testutils.*;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -677,6 +679,55 @@
 	}
 
 	//=================================================================================================================
+	// Optional path parameter.
+	//=================================================================================================================
+
+	@RestResource(serializers=SimpleJsonSerializer.class)
+	public static class J {
+		@RestMethod(name=GET,path="/a/{f1}")
+		public Object a(@Path("f1") Optional<Integer> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/b/{f1}")
+		public Object b(@Path("f1") Optional<ABean> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/c/{f1}")
+		public Object c(@Path("f1") Optional<List<ABean>> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/d/{f1}")
+		public Object d(@Path("f1") List<Optional<ABean>> f1) throws Exception {
+			return f1;
+		}
+	}
+	static MockRest j = MockRest.create(J.class).json().build();
+
+	@Test
+	public void j01_optionalParam_integer() throws Exception {
+		j.get("/a/123").execute().assertStatus(200).assertBody("123");
+	}
+
+	@Test
+	public void j02_optionalParam_bean() throws Exception {
+		j.get("/b/(a=1,b=foo)").execute().assertStatus(200).assertBody("{a:1,b:'foo'}");
+	}
+
+	@Test
+	public void j03_optionalParam_listOfBeans() throws Exception {
+		j.get("/c/@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+	}
+
+	@Test
+	public void j04_optionalParam_listOfOptionals() throws Exception {
+		j.get("/d/@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+	}
+
+
+	//=================================================================================================================
 	// @Path on POJO
 	//=================================================================================================================
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
index e4a5c0b..3d64ea7 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
@@ -13,10 +13,15 @@
 package org.apache.juneau.rest.annotation2;
 
 import static org.apache.juneau.http.HttpMethodName.*;
+import static org.junit.Assert.*;
+
+import java.util.*;
 
 import org.apache.juneau.http.annotation.Path;
+import org.apache.juneau.json.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock2.*;
+import org.apache.juneau.rest.testutils.*;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -52,4 +57,52 @@
 	public void a03_withRemainder2() throws Exception {
 		a.get("/foo/bar").execute().assertBody("foo/bar");
 	}
+
+	//=================================================================================================================
+	// Optional path remainer parameter.
+	//=================================================================================================================
+
+	@RestResource(serializers=SimpleJsonSerializer.class)
+	public static class B {
+		@RestMethod(name=GET,path="/a/*")
+		public Object a(@Path("/*") Optional<Integer> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/b/*")
+		public Object b(@Path("/*") Optional<ABean> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/c/*")
+		public Object c(@Path("/*") Optional<List<ABean>> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/d/*")
+		public Object d(@Path("/*") List<Optional<ABean>> f1) throws Exception {
+			return f1;
+		}
+	}
+	static MockRest b = MockRest.create(B.class).json().build();
+
+	@Test
+	public void b01_optionalParam_integer() throws Exception {
+		b.get("/a/123").execute().assertStatus(200).assertBody("123");
+	}
+
+	@Test
+	public void b02_optionalParam_bean() throws Exception {
+		b.get("/b/(a=1,b=foo)").execute().assertStatus(200).assertBody("{a:1,b:'foo'}");
+	}
+
+	@Test
+	public void b03_optionalParam_listOfBeans() throws Exception {
+		b.get("/c/@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+	}
+
+	@Test
+	public void b04_optionalParam_listOfOptionals() throws Exception {
+		b.get("/d/@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
index b7a48f9..f34b306 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
@@ -14,18 +14,19 @@
 
 import static org.apache.juneau.http.HttpMethodName.*;
 import static org.apache.juneau.rest.testutils.TestUtils.*;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.dto.swagger.*;
-import org.apache.juneau.http.annotation.Query;
+import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.annotation.Items;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock2.*;
+import org.apache.juneau.rest.testutils.*;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -267,6 +268,59 @@
 	}
 
 	//=================================================================================================================
+	// Optional query parameter.
+	//=================================================================================================================
+
+	@RestResource(serializers=SimpleJsonSerializer.class)
+	public static class E {
+		@RestMethod(name=GET,path="/a")
+		public Object a(@Query("f1") Optional<Integer> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/b")
+		public Object b(@Query("f1") Optional<ABean> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/c")
+		public Object c(@Query("f1") Optional<List<ABean>> f1) throws Exception {
+			assertNotNull(f1);
+			return f1;
+		}
+		@RestMethod(name=GET,path="/d")
+		public Object d(@Query("f1") List<Optional<ABean>> f1) throws Exception {
+			return f1;
+		}
+	}
+	static MockRest e = MockRest.create(E.class).json().build();
+
+	@Test
+	public void e01_optionalParam_integer() throws Exception {
+		e.get("/a?f1=123").execute().assertStatus(200).assertBody("123");
+		e.get("/a").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void e02_optionalParam_bean() throws Exception {
+		e.get("/b?f1=(a=1,b=foo)").execute().assertStatus(200).assertBody("{a:1,b:'foo'}");
+		e.get("/b").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void e03_optionalParam_listOfBeans() throws Exception {
+		e.get("/c?f1=@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+		e.get("/c").execute().assertStatus(200).assertBody("null");
+	}
+
+	@Test
+	public void e04_optionalParam_listOfOptionals() throws Exception {
+		e.get("/d?f1=@((a=1,b=foo))").execute().assertStatus(200).assertBody("[{a:1,b:'foo'}]");
+		e.get("/d").execute().assertStatus(200).assertBody("null");
+	}
+
+
+	//=================================================================================================================
 	// @Query on POJO
 	//=================================================================================================================
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exception/BasicTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exceptions/BasicTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exception/BasicTest.java
rename to juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exceptions/BasicTest.java
index 88a9a77..87e5a54 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exception/BasicTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exceptions/BasicTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.exception;
+package org.apache.juneau.rest.exceptions;
 
 import static org.junit.Assert.*;
 import static org.apache.juneau.rest.testutils.TestUtils.*;
@@ -22,6 +22,7 @@
 import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
+import org.apache.juneau.http.exception.*;
 
 @SuppressWarnings({})
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
rename to juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
index 278a0e2..709a3f1 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.jueau.rest.helper;
+package org.apache.juneau.rest.helper;
 
 import static org.junit.Assert.*;
 
@@ -20,7 +20,6 @@
 import org.apache.juneau.http.ReaderResource;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.helper.*;
 import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
rename to juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
index d49348d..a5f7e9b 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.jueau.rest.helper;
+package org.apache.juneau.rest.helper;
 
 import static org.junit.Assert.*;
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/response/BasicTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/responses/BasicTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/response/BasicTest.java
rename to juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/responses/BasicTest.java
index 6795658..04c14f4 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/response/BasicTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/responses/BasicTest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.response;
+package org.apache.juneau.rest.responses;
 
 import static org.junit.Assert.*;
 import static org.apache.juneau.rest.testutils.TestUtils.*;
@@ -22,6 +22,7 @@
 import org.apache.juneau.json.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock2.*;
+import org.apache.juneau.http.response.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/resources/xdocs/test.txt b/juneau-rest/juneau-rest-server-utest/src/test/resources/xdocs/test.txt
new file mode 100644
index 0000000..b734fee
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-utest/src/test/resources/xdocs/test.txt
@@ -0,0 +1,13 @@
+ ***************************************************************************************************************************
+ * 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.                                              *
+ ***************************************************************************************************************************
+ OK-3
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/resources/xdocs/xsubdocs/test.txt b/juneau-rest/juneau-rest-server-utest/src/test/resources/xdocs/xsubdocs/test.txt
new file mode 100644
index 0000000..7376634
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-utest/src/test/resources/xdocs/xsubdocs/test.txt
@@ -0,0 +1,13 @@
+ ***************************************************************************************************************************
+ * 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.                                              *
+ ***************************************************************************************************************************
+ OK-4
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server-utest/xdocs/test2.txt b/juneau-rest/juneau-rest-server-utest/xdocs/test2.txt
new file mode 100644
index 0000000..6c94803
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-utest/xdocs/test2.txt
@@ -0,0 +1,13 @@
+ ***************************************************************************************************************************
+ * 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.                                              *
+ ***************************************************************************************************************************
+ OK-5
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server-utest/xdocs/xsubdocs/test2.txt b/juneau-rest/juneau-rest-server-utest/xdocs/xsubdocs/test2.txt
new file mode 100644
index 0000000..7bcf3d3
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-utest/xdocs/xsubdocs/test2.txt
@@ -0,0 +1,13 @@
+ ***************************************************************************************************************************
+ * 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.                                              *
+ ***************************************************************************************************************************
+ OK-6
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/pom.xml b/juneau-rest/juneau-rest-server/pom.xml
index 3db47fc..2f31227 100644
--- a/juneau-rest/juneau-rest-server/pom.xml
+++ b/juneau-rest/juneau-rest-server/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-rest</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest-server</artifactId>
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRest.java
index 088b327..3e1f98a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRest.java
@@ -12,14 +12,19 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.rest;

 

+import java.text.*;

+import java.util.logging.*;

+

 import javax.servlet.http.*;

 

 import org.apache.juneau.dto.swagger.*;

 import org.apache.juneau.html.annotation.*;

+import org.apache.juneau.internal.*;

 import org.apache.juneau.rest.annotation.*;

+import org.apache.juneau.http.exception.*;

 

 /**

- * Identical to {@link BasicRestServlet} but doesn't extend from {@link HttpServlet}

+ * Identical to {@link BasicRestServlet} but doesn't extend from {@link HttpServlet}.

  *

  * <ul class='seealso'>

  * 	<li class='link'>{@doc juneau-rest-server.Instantiation.BasicRest}

@@ -38,6 +43,19 @@
 )

 public abstract class BasicRest implements BasicRestConfig {

 

+	private JuneauLogger logger = JuneauLogger.getLogger(getClass());

+	private volatile RestContext context;

+

+	/**

+	 * Post-initialization hook to retrieve the {@link RestContext} object for this resource.

+	 *

+	 * @param context The context for this resource.

+	 */

+	@RestHook(HookEvent.POST_INIT)

+	public synchronized void onPostInit(RestContext context) {

+		this.context = context;

+	}

+

 	/**

 	 * [OPTIONS /*] - Show resource options.

 	 *

@@ -49,4 +67,98 @@
 		// Localized Swagger for this resource is available through the RestRequest object.

 		return req.getSwagger();

 	}

+

+	//-----------------------------------------------------------------------------------------------------------------

+	// Context methods.

+	//-----------------------------------------------------------------------------------------------------------------

+

+	/**

+	 * Returns the read-only context object that contains all the configuration information about this resource.

+	 *

+	 * @return The context information on this servlet.

+	 */

+	protected synchronized RestContext getContext() {

+		if (context == null)

+			throw new InternalServerError("RestContext object not set on resource.");

+		return context;

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

+	// Convenience logger methods

+	//-----------------------------------------------------------------------------------------------------------------

+

+	/**

+	 * Log a message.

+	 *

+	 * @param msg The message to log.

+	 */

+	public void log(String msg) {

+		logger.info(msg);

+	}

+

+	/**

+	 * Log a message.

+	 *

+	 * @param msg The message to log.

+	 * @param cause The cause.

+	 */

+	public void log(String msg, Throwable cause) {

+		logger.info(cause, msg);

+	}

+

+	/**

+	 * Log a message.

+	 *

+	 * @param level The log level.

+	 * @param msg The message to log.

+	 * @param args Optional {@link MessageFormat}-style arguments.

+	 */

+	public void log(Level level, String msg, Object...args) {

+		logger.log(level, msg, args);

+	}

+

+	/**

+	 * Log a message.

+	 *

+	 * @param level The log level.

+	 * @param msg The message to log.

+	 * @param args Optional {@link MessageFormat}-style arguments.

+	 */

+	public void logObjects(Level level, String msg, Object...args) {

+		logger.logObjects(level, msg, args);

+	}

+

+	/**

+	 * Log a message.

+	 *

+	 * @param level The log level.

+	 * @param cause The cause.

+	 * @param msg The message to log.

+	 * @param args Optional {@link MessageFormat}-style arguments.

+	 */

+	public void log(Level level, Throwable cause, String msg, Object...args) {

+		logger.log(level, cause, msg, args);

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

+	// Request-time methods.

+	//-----------------------------------------------------------------------------------------------------------------

+

+	/**

+	 * Returns the current HTTP request.

+	 *

+	 * @return The current HTTP request.

+	 */

+	public synchronized RestRequest getRequest() {

+		return getContext().getRequest();

+	}

+

+	/**

+	 * Returns the current HTTP response.

+	 *

+	 * @return The current HTTP response

+	 */

+	public synchronized RestResponse getResponse() {

+		return getContext().getResponse();

+	}

 }

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
index 65c4c2a..4b287e3 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
@@ -24,8 +24,10 @@
 import javax.servlet.http.*;
 
 import org.apache.juneau.http.StreamResource;
+import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.rest.RestContext.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
+import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.util.*;
 
 /**
@@ -54,36 +56,19 @@
 		this.restCallRouters = context.getCallRouters();
 	}
 
-	/**
-	 * Creates a {@link RestRequest} object based on the specified incoming {@link HttpServletRequest} object.
-	 *
-	 * <p>
-	 * Subclasses may choose to override this method to provide a specialized request object.
-	 *
-	 * @param req The request object from the {@link #service(HttpServletRequest, HttpServletResponse)} method.
-	 * @return The wrapped request object.
-	 * @throws ServletException If any errors occur trying to interpret the request.
-	 */
 	@Override /* RestCallHandler */
-	public RestRequest createRequest(HttpServletRequest req) throws ServletException {
-		return new RestRequest(context, req);
+	public RestCall createCall(HttpServletRequest req, HttpServletResponse res) {
+		return new RestCall(req, res).logger(context.getCallLogger()).loggerConfig(context.getCallLoggerConfig());
 	}
 
-	/**
-	 * Creates a {@link RestResponse} object based on the specified incoming {@link HttpServletResponse} object
-	 * and the request returned by {@link #createRequest(HttpServletRequest)}.
-	 *
-	 * <p>
-	 * Subclasses may choose to override this method to provide a specialized response object.
-	 *
-	 * @param req The request object returned by {@link #createRequest(HttpServletRequest)}.
-	 * @param res The response object from the {@link #service(HttpServletRequest, HttpServletResponse)} method.
-	 * @return The wrapped response object.
-	 * @throws ServletException If any errors occur trying to interpret the request or response.
-	 */
 	@Override /* RestCallHandler */
-	public RestResponse createResponse(RestRequest req, HttpServletResponse res) throws ServletException {
-		return new RestResponse(context, req, res);
+	public RestRequest createRequest(RestCall call) throws ServletException {
+		return new RestRequest(context, call.getRequest());
+	}
+
+	@Override /* RestCallHandler */
+	public RestResponse createResponse(RestCall call) throws ServletException {
+		return new RestResponse(context, call.getRestRequest(), call.getResponse());
 	}
 
 	/**
@@ -100,112 +85,94 @@
 	@Override /* RestCallHandler */
 	public void service(HttpServletRequest r1, HttpServletResponse r2) throws ServletException, IOException {
 
-		long startTime = System.currentTimeMillis();
-		RestRequest req = null;
-		RestResponse res = null;
-		RestCallLogger logger = context.getCallLogger();
-		RestCallLoggerConfig loggerConfig = context.getCallLoggerConfig();
+		RestCall call = createCall(r1, r2);
 
 		try {
 			context.checkForInitException();
 
-			String pathInfo = RestUtils.getPathInfoUndecoded(r1);  // Can't use r1.getPathInfo() because we don't want '%2F' resolved.
-			UrlPathInfo upi = new UrlPathInfo(pathInfo);
-
 			// If the resource path contains variables (e.g. @RestResource(path="/f/{a}/{b}"), then we want to resolve
 			// those variables and push the servletPath to include the resolved variables.  The new pathInfo will be
 			// the remainder after the new servletPath.
 			// Only do this for the top-level resource because the logic for child resources are processed next.
 			if (context.pathPattern.hasVars() && context.getParentContext() == null) {
-				String sp = r1.getServletPath();
-				UrlPathInfo upi2 = new UrlPathInfo(pathInfo == null ? sp : sp + pathInfo);
+				String sp = call.getServletPath();
+				String pi = call.getPathInfoUndecoded();
+				UrlPathInfo upi2 = new UrlPathInfo(pi == null ? sp : sp + pi);
 				UrlPathPatternMatch uppm = context.pathPattern.match(upi2);
 				if (uppm != null && ! uppm.hasEmptyVars()) {
-					RequestPath.addPathVars(r1, uppm.getVars());
-					r1 = new OverrideableHttpServletRequest(r1)
-						.pathInfo(nullIfEmpty(urlDecode(uppm.getSuffix())))
-						.servletPath(uppm.getPrefix());
-					pathInfo = RestUtils.getPathInfoUndecoded(r1);  // Can't use r1.getPathInfo() because we don't want '%2F' resolved.
-					upi = new UrlPathInfo(pathInfo);
+					RequestPath.addPathVars(call.getRequest(), uppm.getVars());
+					call.request(
+						new OverrideableHttpServletRequest(call.getRequest())
+							.pathInfo(nullIfEmpty(urlDecode(uppm.getSuffix())))
+							.servletPath(uppm.getPrefix())
+					);
 				} else {
-					if (isDebug(r1)) {
-						r1 = CachingHttpServletRequest.wrap(r1);
-						r1.setAttribute("Debug", true);
-					}
-					r2.setStatus(SC_NOT_FOUND);
+					call.debug(isDebug(call)).status(SC_NOT_FOUND).finish();
 					return;
 				}
 			}
 
 			// If this resource has child resources, try to recursively call them.
-			if (context.hasChildResources() && pathInfo != null && ! pathInfo.equals("/")) {
+			String pi = call.getPathInfoUndecoded();
+			if (context.hasChildResources() && pi != null && ! pi.equals("/")) {
 				for (RestContext rc : context.getChildResources().values()) {
 					UrlPathPattern upp = rc.pathPattern;
-					UrlPathPatternMatch uppm = upp.match(upi);
+					UrlPathPatternMatch uppm = upp.match(call.getUrlPathInfo());
 					if (uppm != null) {
 						if (! uppm.hasEmptyVars()) {
-							RequestPath.addPathVars(r1, uppm.getVars());
-							HttpServletRequest childRequest = new OverrideableHttpServletRequest(r1)
+							RequestPath.addPathVars(call.getRequest(), uppm.getVars());
+							HttpServletRequest childRequest = new OverrideableHttpServletRequest(call.getRequest())
 								.pathInfo(nullIfEmpty(urlDecode(uppm.getSuffix())))
-								.servletPath(r1.getServletPath() + uppm.getPrefix());
-							rc.getCallHandler().service(childRequest, r2);
+								.servletPath(call.getServletPath() + uppm.getPrefix());
+							rc.getCallHandler().service(childRequest, call.getResponse());
 						} else {
-							if (isDebug(r1)) {
-								r1 = CachingHttpServletRequest.wrap(r1);
-								r1.setAttribute("Debug", true);
-							}
-							r2.setStatus(SC_NOT_FOUND);
+							call.debug(isDebug(call)).status(SC_NOT_FOUND).finish();
 						}
 						return;
 					}
 				}
 			}
 
-			if (isDebug(r1)) {
-				r1 = CachingHttpServletRequest.wrap(r1);
-				r2 = CachingHttpServletResponse.wrap(r2);
-				r1.setAttribute("Debug", true);
-			}
+			call.debug(isDebug(call));
 
-			context.startCall(r1, r2);
+			context.startCall(call);
 
-			req = createRequest(r1);
-			res = createResponse(req, r2);
-			req.setResponse(res);
-			context.setRequest(req);
-			context.setResponse(res);
-			String method = req.getMethod();
-			String methodUC = method.toUpperCase(Locale.ENGLISH);
+			call.restRequest(createRequest(call));
+			call.restResponse(createResponse(call));
+
+			context.setRequest(call.getRestRequest());
+			context.setResponse(call.getRestResponse());
 
 			StreamResource r = null;
-			if (pathInfo != null) {
-				String p = pathInfo.substring(1);
+			if (call.getPathInfoUndecoded() != null) {
+				String p = call.getPathInfoUndecoded().substring(1);
 				if (context.isStaticFile(p)) {
 					StaticFile sf = context.resolveStaticFile(p);
 					r = sf.resource;
-					res.setResponseMeta(sf.meta);
+					call.responseMeta(sf.meta);
 				} else if (p.equals("favicon.ico")) {
-					res.setOutput(null);
+					call.output(null);
 				}
 			}
 
 			if (r != null) {
-				res.setStatus(SC_OK);
-				res.setOutput(r);
+				call.status(SC_OK);
+				call.output(r);
 			} else {
 
 				// If the specified method has been defined in a subclass, invoke it.
 				int rc = 0;
-				if (restCallRouters.containsKey(methodUC)) {
-					rc = restCallRouters.get(methodUC).invoke(upi, req, res);
+				String m = call.getMethod();
+				if (restCallRouters.containsKey(m)) {
+					rc = restCallRouters.get(m).invoke(call);
 				} else if (restCallRouters.containsKey("*")) {
-					rc = restCallRouters.get("*").invoke(upi, req, res);
+					rc = restCallRouters.get("*").invoke(call);
 				}
 
 				// Should be 405 if the URL pattern matched but HTTP method did not.
 				if (rc == 0)
 					for (RestCallRouter rcc : restCallRouters.values())
-						if (rcc.matches(upi))
+						if (rcc.matches(call))
 							rc = SC_METHOD_NOT_ALLOWED;
 
 				// Should be 404 if URL pattern didn't match.
@@ -214,54 +181,36 @@
 
 				// If not invoked above, see if it's an OPTIONs request
 				if (rc != SC_OK)
-					handleNotFound(rc, req, res);
+					handleNotFound(call.status(rc));
 
-				if (res.getStatus() == 0)
-					res.setStatus(rc);
+				if (call.getStatus() == 0)
+					call.status(rc);
 			}
 
-			if (res.hasOutput()) {
+			if (call.hasOutput()) {
 				// Now serialize the output if there was any.
 				// Some subclasses may write to the OutputStream or Writer directly.
-				handleResponse(req, res);
+				handleResponse(call);
 			}
 
-			// Make sure our writer in RestResponse gets written.
-			res.flushBuffer();
-			req.close();
-
-			r1 = req.getInner();
-			r2 = res.getInner();
-			loggerConfig = req.getCallLoggerConfig();
-
-			r1.setAttribute("ExecTime", System.currentTimeMillis() - startTime);
 
 		} catch (Throwable e) {
-			e = convertThrowable(e);
-			if (req != null) {
-				r1 = req.getInner();
-				loggerConfig = req.getCallLoggerConfig();
-			}
-			if (res != null)
-				r2 = res.getInner();
-			r1.setAttribute("Exception", e);
-			r1.setAttribute("ExecTime", System.currentTimeMillis() - startTime);
-			handleError(r1, r2, e);
+			handleError(call, convertThrowable(e));
 		} finally {
 			context.clearState();
 		}
 
-		logger.log(loggerConfig, r1, r2);
-		context.finishCall(r1, r2);
+		call.finish();
+		context.finishCall(call);
 	}
 
-	private boolean isDebug(HttpServletRequest req) {
+	private boolean isDebug(RestCall call) {
 		Enablement e = context.getDebug();
 		if (e == TRUE)
 			return true;
 		if (e == FALSE)
 			return false;
-		return "true".equalsIgnoreCase(req.getHeader("X-Debug"));
+		return "true".equalsIgnoreCase(call.getRequest().getHeader("X-Debug"));
 	}
 
 	/**
@@ -274,20 +223,24 @@
 	 *
 	 * <p>
 	 * The default implementation simply iterates through the response handlers on this resource
-	 * looking for the first one whose {@link ResponseHandler#handle(RestRequest, RestResponse)} method returns
+	 * looking for the first one whose {@link ResponseHandler#handle(RestRequest,RestResponse)} method returns
 	 * <jk>true</jk>.
 	 *
-	 * @param req The HTTP request.
-	 * @param res The HTTP response.
+	 * @param call The HTTP call.
 	 * @throws IOException Thrown by underlying stream.
-	 * @throws RestException Non-200 response.
+	 * @throws HttpException Non-200 response.
 	 */
 	@Override /* RestCallHandler */
-	public void handleResponse(RestRequest req, RestResponse res) throws IOException, RestException, NotImplemented {
+	public void handleResponse(RestCall call) throws IOException, HttpException, NotImplemented {
+
+		RestRequest req = call.getRestRequest();
+		RestResponse res = call.getRestResponse();
+
 		// Loop until we find the correct handler for the POJO.
 		for (ResponseHandler h : context.getResponseHandlers())
 			if (h.handle(req, res))
 				return;
+
 		Object output = res.getOutput();
 		throw new NotImplemented("No response handlers found to process output of type '"+(output == null ? null : output.getClass().getName())+"'");
 	}
@@ -306,9 +259,13 @@
 	 * @param t The thrown object.
 	 * @return The converted thrown object.
 	 */
+	@SuppressWarnings("deprecation")
 	@Override
 	public Throwable convertThrowable(Throwable t) {
-		if (t instanceof RestException)
+		ClassInfo ci = ClassInfo.ofc(t);
+		if (ci.is(HttpRuntimeException.class))
+			t = ((HttpRuntimeException)t).getInner();
+		if (ci.isChildOf(RestException.class) || ci.hasAnnotation(Response.class))
 			return t;
 		String n = t.getClass().getName();
 		if (n.contains("AccessDenied"))
@@ -325,14 +282,13 @@
 	 * Subclasses can override this method to provide a 2nd-chance for specifying a response.
 	 * The default implementation will simply throw an exception with an appropriate message.
 	 *
-	 * @param rc The HTTP response code.
-	 * @param req The HTTP request.
-	 * @param res The HTTP response.
+	 * @param call The HTTP call.
 	 */
 	@Override /* RestCallHandler */
-	public void handleNotFound(int rc, RestRequest req, RestResponse res) throws Exception {
-		String pathInfo = req.getPathInfo();
-		String methodUC = req.getMethod();
+	public void handleNotFound(RestCall call) throws Exception {
+		String pathInfo = call.getPathInfo();
+		String methodUC = call.getMethod();
+		int rc = call.getStatus();
 		String onPath = pathInfo == null ? " on no pathInfo"  : String.format(" on path '%s'", pathInfo);
 		if (rc == SC_NOT_FOUND)
 			throw new NotFound("Method ''{0}'' not found on resource with matching pattern{1}.", methodUC, onPath);
@@ -350,19 +306,36 @@
 	 * <p>
 	 * Subclasses can override this method to provide their own custom error response handling.
 	 *
-	 * @param req The servlet request.
-	 * @param res The servlet response.
+	 * @param call The rest call.
 	 * @param e The exception that occurred.
 	 * @throws IOException Can be thrown if a problem occurred trying to write to the output stream.
 	 */
 	@Override /* RestCallHandler */
 	@SuppressWarnings("deprecation")
-	public synchronized void handleError(HttpServletRequest req, HttpServletResponse res, Throwable e) throws IOException {
+	public synchronized void handleError(RestCall call, Throwable e) throws IOException {
+
+		call.exception(e);
 
 		int occurrence = context == null ? 0 : context.getStackTraceOccurrence(e);
-		RestException e2 = (e instanceof RestException ? (RestException)e : new RestException(e, 500)).setOccurrence(occurrence);
 
-		Throwable t = e2.getRootCause();
+		int code = 500;
+
+		ClassInfo ci = ClassInfo.ofc(e);
+		Response r = ci.getAnnotation(Response.class);
+		if (r != null)
+			if (r.code().length > 0)
+				code = r.code()[0];
+
+		RestException e2 = (e instanceof RestException ? (RestException)e : new RestException(e, code)).setOccurrence(occurrence);
+
+		HttpServletRequest req = call.getRequest();
+		HttpServletResponse res = call.getResponse();
+
+		Throwable t = null;
+		if (e instanceof HttpRuntimeException)
+			t = ((HttpRuntimeException)e).getInner();
+		if (t == null)
+			t = e2.getRootCause();
 		if (t != null) {
 			res.setHeader("Exception-Name", t.getClass().getName());
 			res.setHeader("Exception-Message", t.getMessage());
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
index f321774..e24c14f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
@@ -78,7 +78,7 @@
 	// These are static files that are served up by the servlet under the specified sub-paths.
 	// For example, "/servletPath/htdocs/javadoc.css" resolves to the file "[servlet-package]/htdocs/javadoc.css"
 	// By default, we define static files through the external configuration file.
-	staticFiles="$C{REST/staticFiles,htdocs:htdocs}",
+	staticFiles="$C{REST/staticFiles,htdocs:/htdocs,htdocs:htdocs}",
 
 	logging=@Logging(
 		level="INFO",
@@ -156,6 +156,8 @@
 		}
 	)
 	@HtmlDocConfig(
+		// Should override config annotations defined on class.
+		rank=10,
 		// Override the nav links for the swagger page.
 		navlinks={
 			"back: servlet:/",
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestGroup.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestGroup.java
index f2c64e6..d8ac5b2 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestGroup.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestGroup.java
@@ -20,7 +20,7 @@
 import org.apache.juneau.rest.helper.*;

 

 /**

- * Identical to {@link BasicRestServletGroup} but doesn't extend from {@link HttpServlet}

+ * Identical to {@link BasicRestServletGroup} but doesn't extend from {@link HttpServlet}.

  *

  * <ul class='seealso'>

  * 	<li class='link'>{@doc juneau-rest-server.Instantiation.BasicRestGroup}

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
index 0dd93e1..48c8c76 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest;
 
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.rest.util.RestUtils.*;
 
@@ -67,7 +66,7 @@
 			description;
 
 		Builder(RestContext context) {
-			ClassInfo ci = getClassInfo(context.getResource().getClass());
+			ClassInfo ci = ClassInfo.of(context.getResource().getClass());
 			for (RestResource r : ci.getAnnotationsParentFirst(RestResource.class)) {
 				if (! r.siteName().isEmpty())
 					siteName = r.siteName();
@@ -165,7 +164,7 @@
 	public String getMethodSummary(Method method, RestRequest req) throws Exception {
 		VarResolverSession vr = req.getVarResolverSession();
 
-		String s = getMethodInfo(method).getAnnotation(RestMethod.class).summary();
+		String s = MethodInfo.of(method).getAnnotation(RestMethod.class).summary();
 		if (s.isEmpty()) {
 			Operation o = getSwaggerOperation(method, req);
 			if (o != null)
@@ -221,7 +220,7 @@
 	public String getMethodDescription(Method method, RestRequest req) throws Exception {
 		VarResolverSession vr = req.getVarResolverSession();
 
-		String s = joinnl(getMethodInfo(method).getAnnotation(RestMethod.class).description());
+		String s = joinnl(MethodInfo.of(method).getAnnotation(RestMethod.class).description());
 		if (s.isEmpty()) {
 			Operation o = getSwaggerOperation(method, req);
 			if (o != null)
@@ -399,7 +398,7 @@
 		if (s != null) {
 			Map<String,OperationMap> sp = s.getPaths();
 			if (sp != null) {
-				Map<String,Operation> spp = sp.get(fixMethodPath(getMethodInfo(method).getAnnotation(RestMethod.class).path()));
+				Map<String,Operation> spp = sp.get(fixMethodPath(MethodInfo.of(method).getAnnotation(RestMethod.class).path()));
 				if (spp != null)
 					return spp.get(req.getMethod());
 			}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HttpRuntimeException.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HttpRuntimeException.java
new file mode 100644
index 0000000..a2c7c13
--- /dev/null
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HttpRuntimeException.java
@@ -0,0 +1,104 @@
+// ***************************************************************************************************************************
+// * 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.rest;
+
+import java.lang.reflect.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.http.annotation.*;
+import org.apache.juneau.http.exception.*;
+import org.apache.juneau.reflect.*;
+
+/**
+ * A {@link RuntimeException} meant to wrap a non-{@link RuntimeException}.
+ */
+public final class HttpRuntimeException extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+
+	final Throwable t;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param t Wrapped exception.
+	 */
+	public HttpRuntimeException(Throwable t) {
+		this.t = t;
+	}
+
+	/**
+	 * Returns the wrapped throwable.
+	 *
+	 * @return The wrapped throwable.
+	 */
+	public Throwable getInner() {
+		return t;
+	}
+
+	/**
+	 * Takes in an arbitrary {@link Throwable} and converts it to an appropriate runtime exception for producing an
+	 * HTTP response.
+	 *
+	 * @param t The throwable to wrap.
+	 * @param ec The exception class to create if the specified throwable cannot produce a valid HTTP response.
+	 * @return RuntimeException The new exception to throw.
+	 */
+	public static RuntimeException toHttpException(Throwable t, Class<?> ec) {
+		return toHttpException(t, ec, null);
+	}
+
+	/**
+	 * Takes in an arbitrary {@link Throwable} and converts it to an appropriate runtime exception for producing an
+	 * HTTP response.
+	 *
+	 * @param t The throwable to wrap.
+	 * @param ec The exception class to create if the specified throwable cannot produce a valid HTTP response.
+	 * @param msg The message text to pass to the ec class constructor.
+	 * @param args The message arguments to pass to the ec class constructor.
+	 * @return RuntimeException The new exception to throw.
+	 */
+	@SuppressWarnings("deprecation")
+	public static RuntimeException toHttpException(Throwable t, Class<?> ec, String msg, Object...args) {
+		ClassInfo ci = ClassInfo.ofc(t);
+
+		// If it's a RestException or is any RuntimeException annotated with @Response, it can be rethrown.
+		if (ci.isRuntimeException() && (ci.isChildOf(RestException.class) || ci.hasAnnotation(Response.class)))
+			return (RuntimeException)t;
+
+		// If it's a non-RuntimeException but annotated with @Response, it can be wrapped and rethrown.
+		if (ci.hasAnnotation(Response.class))
+			return new HttpRuntimeException(t);
+
+		if (ci.is(InvocationTargetException.class))
+			return new HttpRuntimeException(((InvocationTargetException)t).getCause());
+
+		if (ec == null)
+			ec = InternalServerError.class;
+		ClassInfo eci = ClassInfo.ofc(ec);
+
+		try {
+			ConstructorInfo cci = eci.getPublicConstructor(Throwable.class, String.class, Object[].class);
+			if (cci != null)
+	 			return toHttpException((Throwable)cci.invoke(t, msg, args), InternalServerError.class);
+
+			cci = eci.getPublicConstructor(Throwable.class);
+			if (cci != null)
+				return toHttpException((Throwable)cci.invoke(t), InternalServerError.class);
+
+			System.err.println("WARNING:  Class '"+ec+"' does not have a public constructor that takes in valid arguments.");
+			return new InternalServerError(t);
+		} catch (ExecutableException e) {
+			throw new InternalServerError(e.getCause());
+		}
+	}
+}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestAttributes.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestAttributes.java
index 3f2614c..0b33efc 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestAttributes.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestAttributes.java
@@ -51,6 +51,8 @@
 		String k = key.toString();
 		Object o = req.getAttribute(k);
 		if (o == null)
+			 o = req.getSession().getAttribute(k);
+		if (o == null)
 			o = defaultEntries.get(k);
 		return resolve(o);
 	}
@@ -80,6 +82,8 @@
 					{
 						for (String s : iterable(req.getAttributeNames()))
 							keys.add(s);
+						for (String s : iterable(req.getSession().getAttributeNames()))
+							keys.add(s);
 					}
 					Iterator<String> keyIterator = keys.iterator();
 					Iterator<Map.Entry<String,Object>> defaultsIterator = defaultEntries.entrySet().iterator();
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
index 35f5e1c..51e1af1 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
@@ -27,7 +27,7 @@
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.parser.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.util.*;
 
 /**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestFormData.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestFormData.java
index e65e883..49549e2 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestFormData.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestFormData.java
@@ -27,7 +27,7 @@
 import org.apache.juneau.json.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 
 /**
  * Represents the parsed form-data parameters in an HTTP request.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestHeaders.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestHeaders.java
index 172f69b..fefad8a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestHeaders.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestHeaders.java
@@ -26,7 +26,7 @@
 import org.apache.juneau.json.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 
 /**
  * Represents the headers in an HTTP request.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestPath.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestPath.java
index b225e7c..0899835 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestPath.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestPath.java
@@ -23,7 +23,7 @@
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 
 /**
  * Contains information about the matched path on the HTTP request.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestQuery.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestQuery.java
index c192f8d..44bc24a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestQuery.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestQuery.java
@@ -26,7 +26,7 @@
 import org.apache.juneau.json.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.utils.*;
 
 /**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
index 5fbb997..04e49eb 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
@@ -16,6 +16,7 @@
 

 import javax.servlet.http.*;

 

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.annotation.*;

 import org.apache.juneau.rest.reshandlers.*;

 

@@ -98,9 +99,9 @@
 	 * @throws IOException

 	 * 	If low-level exception occurred on output stream.

 	 * 	Results in a {@link HttpServletResponse#SC_INTERNAL_SERVER_ERROR} error.

-	 * @throws RestException

+	 * @throws HttpException

 	 * 	If some other exception occurred.

 	 * 	Can be used to provide an appropriate HTTP response code and message.

 	 */

-	boolean handle(RestRequest req, RestResponse res) throws IOException, RestException;

+	boolean handle(RestRequest req, RestResponse res) throws IOException, HttpException;

 }

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
new file mode 100644
index 0000000..b43afbf
--- /dev/null
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
@@ -0,0 +1,334 @@
+// ***************************************************************************************************************************
+// * 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.rest;
+
+import java.io.*;
+import java.util.*;
+
+import javax.servlet.http.*;
+
+import org.apache.juneau.httppart.bean.*;
+import org.apache.juneau.rest.util.*;
+
+/**
+ * A wrapper around a single HttpServletRequest/HttpServletResponse pair.
+ */
+public class RestCall {
+
+	private HttpServletRequest req;
+	private HttpServletResponse res;
+	private RestRequest rreq;
+	private RestResponse rres;
+	private UrlPathInfo urlPathInfo;
+	private String pathInfoUndecoded;
+	private long startTime = System.currentTimeMillis();
+	private RestCallLogger logger;
+	private RestCallLoggerConfig loggerConfig;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param req The incoming HTTP servlet request object.
+	 * @param res The incoming HTTP servlet response object.
+	 */
+	public RestCall(HttpServletRequest req, HttpServletResponse res) {
+		request(req).response(res);
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Request/response objects.
+	//------------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Overrides the request object on the REST call.
+	 *
+	 * @param req The new HTTP servlet request.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall request(HttpServletRequest req) {
+		this.req = req;
+		this.urlPathInfo = null;
+		this.pathInfoUndecoded = null;
+		return this;
+	}
+
+	/**
+	 * Overrides the response object on the REST call.
+	 *
+	 * @param res The new HTTP servlet response.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall response(HttpServletResponse res) {
+		this.res = res;
+		return this;
+	}
+
+	/**
+	 * Set the {@link RestRequest} object on this REST call.
+	 *
+	 * @param rreq The {@link RestRequest} object on this REST call.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall restRequest(RestRequest rreq) {
+		request(rreq);
+		this.rreq = rreq;
+		return this;
+	}
+
+	/**
+	 * Set the {@link RestResponse} object on this REST call.
+	 *
+	 * @param rres The {@link RestResponse} object on this REST call.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall restResponse(RestResponse rres) {
+		response(rres);
+		this.rres = rres;
+		this.rreq.setResponse(rres);
+		return this;
+	}
+
+	/**
+	 * Returns the HTTP servlet request of this REST call.
+	 *
+	 * @return the HTTP servlet request of this REST call.
+	 */
+	public HttpServletRequest getRequest() {
+		return req;
+	}
+
+	/**
+	 * Returns the HTTP servlet response of this REST call.
+	 *
+	 * @return the HTTP servlet response of this REST call.
+	 */
+	public HttpServletResponse getResponse() {
+		return res;
+	}
+
+	/**
+	 * Returns the REST request of this REST call.
+	 *
+	 * @return the REST request of this REST call.
+	 */
+	public RestRequest getRestRequest() {
+		return rreq;
+	}
+
+	/**
+	 * Returns the REST response of this REST call.
+	 *
+	 * @return the REST response of this REST call.
+	 */
+	public RestResponse getRestResponse() {
+		return rres;
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Setters.
+	//------------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Sets the logger to use when logging this call.
+	 *
+	 * @param logger The logger to use when logging this call.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall logger(RestCallLogger logger) {
+		this.logger = logger;
+		return this;
+	}
+
+	/**
+	 * Sets the logging configuration to use when logging this call.
+	 *
+	 * @param config The logging configuration to use when logging this call.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall loggerConfig(RestCallLoggerConfig config) {
+		this.loggerConfig = config;
+		return this;
+	}
+
+	/**
+	 * Enables or disabled debug mode on this call.
+	 *
+	 * @param b The debug flag value.
+	 * @return This object (for method chaining).
+	 * @throws IOException Occurs if request body could not be cached into memory.
+	 */
+	public RestCall debug(boolean b) throws IOException {
+		if (b) {
+			req = CachingHttpServletRequest.wrap(req);
+			res = CachingHttpServletResponse.wrap(res);
+		}
+		req.setAttribute("Debug", b);
+		return this;
+	}
+
+	/**
+	 * Sets the HTTP status on this call.
+	 *
+	 * @param code The status code.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall status(int code) {
+		res.setStatus(code);
+		return this;
+	}
+
+	/**
+	 * Identifies that an exception occurred during this call.
+	 *
+	 * @param e The thrown exception.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall exception(Throwable e) {
+		req.setAttribute("Exception", e);
+		return this;
+	}
+
+	/**
+	 * Sets metadata about the response.
+	 *
+	 * @param meta The metadata about the response.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall responseMeta(ResponseBeanMeta meta) {
+		if (rres != null)
+			rres.setResponseMeta(meta);
+		return this;
+	}
+
+	/**
+	 * Sets the output object to serialize as the response of this call.
+	 *
+	 * @param output The response output POJO.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall output(Object output) {
+		if (rres != null)
+			rres.setOutput(output);
+		return this;
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Lifecycle methods.
+	//------------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Called at the end of a call to finish any remaining tasks such as flushing buffers and logging the response.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public RestCall finish() {
+		try {
+			res.flushBuffer();
+			req.setAttribute("ExecTime", System.currentTimeMillis() - startTime);
+			if (rreq != null)
+				rreq.close();
+		} catch (Exception e) {
+			exception(e);
+		}
+		if (logger != null)
+			logger.log(loggerConfig, req, res);
+		return this;
+	}
+
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Pass-through convenience methods.
+	//------------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Shortcut for calling <c>getRequest().getServletPath()</c>.
+	 *
+	 * @return The request servlet path.
+	 */
+	public String getServletPath() {
+		return req.getServletPath();
+	}
+
+	/**
+	 * Returns the request path info as a {@link UrlPathInfo} bean.
+	 *
+	 * @return The request path info as a {@link UrlPathInfo} bean.
+	 */
+	public UrlPathInfo getUrlPathInfo() {
+		if (urlPathInfo == null)
+			urlPathInfo = new UrlPathInfo(getPathInfoUndecoded());
+		return urlPathInfo;
+	}
+
+	/**
+	 * Shortcut for calling <c>getRequest().getPathInfo()</c>.
+	 *
+	 * @return The request servlet path info.
+	 */
+	public String getPathInfo() {
+		return req.getPathInfo();
+	}
+
+	/**
+	 * Same as {@link #getPathInfo()} but doesn't decode encoded characters.
+	 *
+	 * @return The undecoded request servlet path info.
+	 */
+	public String getPathInfoUndecoded() {
+		if (pathInfoUndecoded == null)
+			pathInfoUndecoded = RestUtils.getPathInfoUndecoded(req);
+		return pathInfoUndecoded;
+	}
+
+	/**
+	 * Returns the HTTP method name.
+	 *
+	 * @return The HTTP method name, always uppercased.
+	 */
+	public String getMethod() {
+		if (rreq != null)
+			return rreq.getMethod().toUpperCase(Locale.ENGLISH);
+		return req.getMethod().toUpperCase(Locale.ENGLISH);
+	}
+
+	/**
+	 * Shortcut for calling <c>getRequest().getStatus()</c>.
+	 *
+	 * @return The response status code.
+	 */
+	public int getStatus() {
+		return res.getStatus();
+	}
+
+	/**
+	 * Shortcut for calling <c>getRestResponse().hasOutput()</c>.
+	 *
+	 * @return <jk>true</jk> if response has output.
+	 */
+	public boolean hasOutput() {
+		if (rres != null)
+			return rres.hasOutput();
+		return false;
+	}
+
+	/**
+	 * Shortcut for calling <c>getRestResponse().getOutput()</c>.
+	 *
+	 * @return The response output.
+	 */
+	public Object getOutput() {
+		if (rres != null)
+			return rres.getOutput();
+		return null;
+	}
+}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallHandler.java
index 7587db5..6946f12 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallHandler.java
@@ -38,26 +38,6 @@
 	public interface Null extends RestCallHandler {}
 
 	/**
-	 * Creates a {@link RestRequest} object based on the specified incoming {@link HttpServletRequest} object.
-	 *
-	 * @param req The request object from the {@link #service(HttpServletRequest, HttpServletResponse)} method.
-	 * @return The wrapped request object.
-	 * @throws ServletException If any errors occur trying to interpret the request.
-	 */
-	public RestRequest createRequest(HttpServletRequest req) throws ServletException;
-
-	/**
-	 * Creates a {@link RestResponse} object based on the specified incoming {@link HttpServletResponse} object
-	 * and the request returned by {@link #createRequest(HttpServletRequest)}.
-	 *
-	 * @param req The request object returned by {@link #createRequest(HttpServletRequest)}.
-	 * @param res The response object from the {@link #service(HttpServletRequest, HttpServletResponse)} method.
-	 * @return The wrapped response object.
-	 * @throws ServletException If any errors occur trying to interpret the request or response.
-	 */
-	public RestResponse createResponse(RestRequest req, HttpServletResponse res) throws ServletException;
-
-	/**
 	 * The main service method.
 	 *
 	 * @param r1 The incoming HTTP servlet request object.
@@ -68,34 +48,58 @@
 	public void service(HttpServletRequest r1, HttpServletResponse r2) throws ServletException, IOException;
 
 	/**
+	 * Wraps an incoming servlet request/response pair into a single {@link RestCall} object.
+	 *
+	 * @param req The rest request.
+	 * @param res The rest response.
+	 * @return The wrapped request/response pair.
+	 */
+	public RestCall createCall(HttpServletRequest req, HttpServletResponse res);
+
+	/**
+	 * Creates a {@link RestRequest} object based on the specified incoming {@link HttpServletRequest} object.
+	 *
+	 * @param call The current REST call.
+	 * @return The wrapped request object.
+	 * @throws ServletException If any errors occur trying to interpret the request.
+	 */
+	public RestRequest createRequest(RestCall call) throws ServletException;
+
+	/**
+	 * Creates a {@link RestResponse} object based on the specified incoming {@link HttpServletResponse} object
+	 * and the request returned by {@link #createRequest(RestCall)}.
+	 *
+	 * @param call The current REST call.
+	 * @return The wrapped response object.
+	 * @throws ServletException If any errors occur trying to interpret the request or response.
+	 */
+	public RestResponse createResponse(RestCall call) throws ServletException;
+
+	/**
 	 * The main method for serializing POJOs passed in through the {@link RestResponse#setOutput(Object)} method or
 	 * returned by the Java method.
 	 *
-	 * @param req The HTTP request.
-	 * @param res The HTTP response.
+	 * @param call The current REST call.
 	 * @throws Exception Can be thrown if error occurred while handling response.
 	 */
-	public void handleResponse(RestRequest req, RestResponse res) throws Exception;
+	public void handleResponse(RestCall call) throws Exception;
 
 	/**
 	 * Handle the case where a matching method was not found.
 	 *
-	 * @param rc The HTTP response code.
-	 * @param req The HTTP request.
-	 * @param res The HTTP response.
+	 * @param call The current REST call.
 	 * @throws Exception Can be thrown if error occurred while handling response.
 	 */
-	public void handleNotFound(int rc, RestRequest req, RestResponse res) throws Exception;
+	public void handleNotFound(RestCall call) throws Exception;
 
 	/**
 	 * Method for handling response errors.
 	 *
-	 * @param req The servlet request.
-	 * @param res The servlet response.
+	 * @param call The current REST call.
 	 * @param e The exception that occurred.
 	 * @throws Exception Can be thrown if error occurred while handling response.
 	 */
-	public void handleError(HttpServletRequest req, HttpServletResponse res, Throwable e) throws Exception;
+	public void handleError(RestCall call, Throwable e) throws Exception;
 
 	/**
 	 * Method for converting thrown exceptions into other types before they are handled.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallLoggerConfig.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallLoggerConfig.java
index e695412..cdb9184 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallLoggerConfig.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallLoggerConfig.java
@@ -143,9 +143,9 @@
 		 * <p>
 		 * Possible values (case-insensitive):
 		 * <ul>
-		 * 	<li><{@link Enablement#TRUE TRUE} - No-trace mode enabled for all requests.
-		 * 	<li><{@link Enablement#FALSE FALSE} - No-trace mode disabled for all requests.
-		 * 	<li><{@link Enablement#PER_REQUEST PER_REQUEST} - No-trace mode enabled for requests that have a <js>"X-NoTrace: true"</js> header.
+		 * 	<li>{@link Enablement#TRUE TRUE} - No-trace mode enabled for all requests.
+		 * 	<li>{@link Enablement#FALSE FALSE} - No-trace mode disabled for all requests.
+		 * 	<li>{@link Enablement#PER_REQUEST PER_REQUEST} - No-trace mode enabled for requests that have a <js>"X-NoTrace: true"</js> header.
 		 * </ul>
 		 *
 		 * @param value
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallRouter.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallRouter.java
index 58e0c63..6aa2fe3 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallRouter.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallRouter.java
@@ -68,9 +68,10 @@
 		}
 	}
 
-	boolean matches(UrlPathInfo pathInfo) {
+	boolean matches(RestCall call) {
+		UrlPathInfo pi = call.getUrlPathInfo();
 		for (RestMethodContext m : restJavaMethods)
-			if (m.matches(pathInfo))
+			if (m.matches(pi))
 				return true;
 		return false;
 	}
@@ -84,13 +85,13 @@
 	 * @param pathInfo The value of {@link HttpServletRequest#getPathInfo()} (sorta)
 	 * @return The HTTP response code.
 	 */
-	int invoke(UrlPathInfo pathInfo, RestRequest req, RestResponse res) throws Throwable {
+	int invoke(RestCall call) throws Throwable {
 		if (restJavaMethods.length == 1)
-			return restJavaMethods[0].invoke(pathInfo, req, res);
+			return restJavaMethods[0].invoke(call);
 
 		int maxRc = 0;
 		for (RestMethodContext m : restJavaMethods) {
-			int rc = m.invoke(pathInfo, req, res);
+			int rc = m.invoke(call);
 			if (rc == SC_OK)
 				return SC_OK;
 			maxRc = Math.max(maxRc, rc);
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 6d0a2e3..c44ab14 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -16,8 +16,8 @@
 import static org.apache.juneau.internal.CollectionUtils.*;

 import static org.apache.juneau.internal.IOUtils.*;

 import static org.apache.juneau.internal.StringUtils.*;

-import static org.apache.juneau.internal.ClassUtils.*;

 import static org.apache.juneau.rest.util.RestUtils.*;

+import static org.apache.juneau.rest.HttpRuntimeException.*;

 import static org.apache.juneau.FormattedIllegalArgumentException.*;

 

 import java.io.*;

@@ -50,7 +50,6 @@
 import org.apache.juneau.http.annotation.Response;

 import org.apache.juneau.httppart.*;

 import org.apache.juneau.httppart.bean.*;

-import org.apache.juneau.internal.*;

 import org.apache.juneau.json.*;

 import org.apache.juneau.jsonschema.*;

 import org.apache.juneau.msgpack.*;

@@ -61,7 +60,7 @@
 import org.apache.juneau.remote.*;

 import org.apache.juneau.rest.annotation.*;

 import org.apache.juneau.rest.converters.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.reshandlers.*;

 import org.apache.juneau.rest.util.*;

 import org.apache.juneau.rest.vars.*;

@@ -2297,7 +2296,7 @@
 	 * 		<ul>

 	 * 			<li class='jm'>{@link RestContext#isRenderResponseStackTraces() RestContext.isRenderResponseStackTraces()}

 	 * 		</ul>

-	 * 		That method is used by {@link BasicRestCallHandler#handleError(HttpServletRequest, HttpServletResponse, Throwable)}.

+	 * 		That method is used by {@link BasicRestCallHandler#handleError(RestCall, Throwable)}.

 	 * </ul>

 	 */

 	public static final String REST_renderResponseStackTraces = PREFIX + ".renderResponseStackTraces.b";

@@ -2512,7 +2511,7 @@
 	 * <p class='bcode w800'>

 	 * 	<ja>@RestResource</ja>(

 	 * 		rolesDeclared=<js>"ROLE_ADMIN,ROLE_READ_WRITE,ROLE_READ_ONLY,ROLE_SPECIAL"</js>,

-	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>

+	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>

 	 * 	)

 	 * 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {

 	 * 		...

@@ -2553,7 +2552,7 @@
 	 * <p class='bcode w800'>

 	 * 	<ja>@RestResource</ja>(

 	 * 		path=<js>"/foo"</js>,

-	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>

+	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>

 	 * 	)

 	 * 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {

 	 * 		...

@@ -2569,8 +2568,8 @@
 	 * 			<li><js>"foo | bar | bqz"</js> - Multiple OR'ed arguments, pipe syntax.

 	 * 			<li><js>"foo || bar || bqz"</js> - Multiple OR'ed arguments, Java-OR syntax.

 	 * 			<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.

-	 * 			<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.

-	 * 			<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.

+	 * 			<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.

+	 * 			<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.

 	 * 			<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.

 	 * 		</ul>

 	 * 	<li>

@@ -2755,6 +2754,16 @@
 	 * 	}

 	 * </p>

 	 *

+	 * <p>

+	 * Note that headers can also be specified per path-mapping via the {@link RestResource#staticFiles() @RestResource(staticFiles)} annotation.

+	 * <p class='bcode w800'>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFiles={

+	 * 			<js>"htdocs:docs:{'Cache-Control':'max-age=86400, public'}"</js>

+	 * 		}

+	 * 	)

+	 * </p>

+	 *

 	 * <ul class='seealso'>

 	 * 	<li class='jf'>{@link #REST_staticFiles} for information about statically-served files.

 	 * </ul>

@@ -2790,6 +2799,13 @@
 	 * from the classpath or file system.

 	 *

 	 * <p>

+	 * The format of the value is one of the following:

+	 * <ol class='spaced-list'>

+	 * 	<li><js>"path:location"</js>

+	 * 	<li><js>"path:location:headers"</js>

+	 * </ol>

+	 *

+	 * <p>

 	 * An example where this class is used is in the {@link RestResource#staticFiles} annotation:

 	 * <p class='bcode w800'>

 	 * 	<jk>package</jk> com.foo.mypackage;

@@ -2809,12 +2825,52 @@
 	 * <p class='bcode w800'>

 	 *  	/myresource/htdocs/foobar.html

 	 * </p>

-	 * <br>...the servlet will attempt to find the <c>foobar.html</c> file in the following ordered locations:

+	 * <br>...the servlet will attempt to find the <c>foobar.html</c> file in the following location:

 	 * <ol class='spaced-list'>

 	 * 	<li><c>com.foo.mypackage.docs</c> package.

-	 * 	<li><c>[working-dir]/docs</c> directory.

 	 * </ol>

 	 *

+	 * <p>

+	 * The location is interpreted as an absolute path if it starts with <js>'/'</js>.

+	 * <p class='bcode w800'>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFiles={

+	 * 			<js>"htdocs:/docs"</js>

+	 * 		}

+	 * 	)

+	 * </p>

+	 * <p>

+	 * In the example above, given a GET request to the following URL...

+	 * <p class='bcode w800'>

+	 *  	/myresource/htdocs/foobar.html

+	 * </p>

+	 * <br>...the servlet will attempt to find the <c>foobar.html</c> file in the following location:

+	 * <ol class='spaced-list'>

+	 * 	<li><c>docs</c> package (typically under <c>src/main/resources/docs</c> in your workspace).

+	 * 	<li><c>[working-dir]/docs</c> directory at runtime.

+	 * </ol>

+	 *

+	 * <p>

+	 * Response headers can be specified for served files by adding a 3rd section that consists of a {@doc SimpleJson} object.

+	 * <p class='bcode w800'>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFiles={

+	 * 			<js>"htdocs:docs:{'Cache-Control':'max-age=86400, public'}"</js>

+	 * 		}

+	 * 	)

+	 * </p>

+	 *

+	 * <p>

+	 * The same path can map to multiple locations.  Files are searched in the order

+	 * <p class='bcode w800'>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFiles={

+	 * 			<jc>// Search in absolute location '/htdocs/folder' before location 'htdocs.package' relative to servlet package.</jc>

+	 * 			<js>"htdocs:/htdocs/folder,htdocs:htdocs.package"</js>

+	 * 		}

+	 * 	)

+	 * </p>

+	 *

 	 * <ul class='seealso'>

 	 * 	<li class='jf'>{@link #REST_classpathResourceFinder} for configuring how classpath resources are located and retrieved.

 	 * 	<li class='jf'>{@link #REST_mimeTypes} for configuring the media types based on file extension.

@@ -2828,6 +2884,8 @@
 	 * 		Mappings are cumulative from super classes.

 	 * 	<li>

 	 * 		Child resources can override mappings made on parent class resources.

+	 * 		<br>When both parent and child resources map against the same path, files will be search in the child location

+	 * 		and then the parent location.

 	 * </ul>

 	 */

 	public static final String REST_staticFiles = PREFIX + ".staticFiles.lo";

@@ -3085,7 +3143,7 @@
 	 * Affects the following methods:

 	 * <ul class='javatree'>

 	 * 	<li class='jm'>{@link RestContext#getStackTraceOccurrence(Throwable) RestContext.getStackTraceOccurrance(Throwable)}

-	 * 	<li class='jm'>{@link RestCallHandler#handleError(HttpServletRequest, HttpServletResponse, Throwable)}

+	 * 	<li class='jm'>{@link RestCallHandler#handleError(RestCall, Throwable)}

 	 * 	<li class='jm'>{@link RestException#getOccurrence()} - Returns the number of times this exception occurred.

 	 * </ul>

 	 *

@@ -3485,7 +3543,7 @@
 	private final ObjectMap defaultRequestAttributes;

 	private final ResponseHandler[] responseHandlers;

 	private final MimetypesFileTypeMap mimetypesFileTypeMap;

-	private final StaticFileMapping[] staticFiles;

+	private final StaticFiles[] staticFiles;

 	private final String[] staticFilesPaths;

 	private final MessageBundle msgs;

 	private final Config config;

@@ -3498,7 +3556,7 @@
 	private final RestCallLoggerConfig callLoggerConfig;

 	private final RestCallHandler callHandler;

 	private final RestInfoProvider infoProvider;

-	private final RestException initException;

+	private final HttpException initException;

 	private final RestContext parentContext;

 	private final RestResourceResolver resourceResolver;

 	private final UriResolution uriResolution;

@@ -3566,7 +3624,7 @@
 	RestContext(RestContextBuilder builder) throws Exception {

 		super(builder.getPropertyStore());

 

-		RestException _initException = null;

+		HttpException _initException = null;

 

 		try {

 			ServletContext servletContext = builder.servletContext;

@@ -3600,8 +3658,8 @@
 			VarResolverSession vrs = this.varResolver.createSession();

 			config = builder.config.resolving(vrs);

 

-			Class<?> resourceClass = resource.getClass();

-			ClassInfo rci = getClassInfo(resourceClass);

+			ClassInfo rci = ClassInfo.of(resource);

+

 			PropertyStore ps = getPropertyStore();

 

 			uriContext = nullIfEmpty(getStringProperty(REST_uriContext, null));

@@ -3683,24 +3741,28 @@
 

 			ClasspathResourceFinder rf = getInstanceProperty(REST_classpathResourceFinder, ClasspathResourceFinder.class, ClasspathResourceFinderBasic.class, resourceResolver, this);

 			useClasspathResourceCaching = getProperty(REST_useClasspathResourceCaching, boolean.class, true);

-			staticResourceManager = new ClasspathResourceManager(resourceClass, rf, useClasspathResourceCaching);

+			staticResourceManager = new ClasspathResourceManager(rci.getProxiedClass(), rf, useClasspathResourceCaching);

 

 			consumes = getListProperty(REST_consumes, MediaType.class, parsers.getSupportedMediaTypes());

 			produces = getListProperty(REST_produces, MediaType.class, serializers.getSupportedMediaTypes());

 

-			staticFiles = ArrayUtils.reverse(getArrayProperty(REST_staticFiles, StaticFileMapping.class));

+			StaticFileMapping[] staticFileMappings = getArrayProperty(REST_staticFiles, StaticFileMapping.class, new StaticFileMapping[0]);

+			staticFiles = new StaticFiles[staticFileMappings.length];

+			for (int i = 0; i < staticFiles.length; i++)

+				staticFiles[i] = new StaticFiles(staticFileMappings[i], staticResourceManager, mimetypesFileTypeMap, staticFileResponseHeaders);

+

 			Set<String> s = new TreeSet<>();

-			for (StaticFileMapping sfm : staticFiles)

-				s.add(sfm.path);

+			for (StaticFiles sf : staticFiles)

+				s.add(sf.getPath());

 			staticFilesPaths = s.toArray(new String[s.size()]);

 

 			MessageBundleLocation[] mbl = getInstanceArrayProperty(REST_messages, MessageBundleLocation.class, new MessageBundleLocation[0]);

 			if (mbl.length == 0)

-				msgs = new MessageBundle(resourceClass, "");

+				msgs = new MessageBundle(rci.getProxiedClass(), "");

 			else {

-				msgs = new MessageBundle(mbl[0] != null ? mbl[0].baseClass : resourceClass, mbl[0].bundlePath);

+				msgs = new MessageBundle(mbl[0] != null ? mbl[0].baseClass : rci.getProxiedClass(), mbl[0].bundlePath);

 				for (int i = 1; i < mbl.length; i++)

-					msgs.addSearchPath(mbl[i] != null ? mbl[i].baseClass : resourceClass, mbl[i].bundlePath);

+					msgs.addSearchPath(mbl[i] != null ? mbl[i].baseClass : rci.getProxiedClass(), mbl[i].bundlePath);

 			}

 

 			this.fullPath = (builder.parentContext == null ? "" : (builder.parentContext.fullPath + '/')) + builder.getPath();

@@ -3743,7 +3805,7 @@
 					methodsFound.add(mi.getSimpleName() + "," + emptyIfNull(firstNonEmpty(a.name(), a.method())) + "," + fixMethodPath(a.path()));

 					try {

 						if (mi.isNotPublic())

-							throw new RestServletException("@RestMethod method {0}.{1} must be defined as public.", resourceClass.getName(), mi.getSimpleName());

+							throw new RestServletException("@RestMethod method {0}.{1} must be defined as public.", rci.getProxiedClass().getName(), mi.getSimpleName());

 

 						RestMethodContextBuilder rmcb = new RestMethodContextBuilder(resource, mi.inner(), this);

 						RestMethodContext sm = new RestMethodContext(rmcb);

@@ -3763,20 +3825,20 @@
 							sm = new RestMethodContext(smb) {

 

 								@Override

-								int invoke(UrlPathInfo pathInfo, RestRequest req, RestResponse res) throws Throwable {

+								int invoke(RestCall call) throws Throwable {

 

-									int rc = super.invoke(pathInfo, req, res);

+									int rc = super.invoke(call);

 									if (rc != SC_OK)

 										return rc;

 

-									final Object o = res.getOutput();

+									final Object o = call.getOutput();

 

-									if ("GET".equals(req.getMethod())) {

-										res.setOutput(rim.getMethodsByPath().keySet());

+									if ("GET".equals(call.getMethod())) {

+										call.output(rim.getMethodsByPath().keySet());

 										return SC_OK;

 

-									} else if ("POST".equals(req.getMethod())) {

-										String pip = pathInfo.getPath();

+									} else if ("POST".equals(call.getMethod())) {

+										String pip = call.getUrlPathInfo().getPath();

 										if (pip.indexOf('/') != -1)

 											pip = pip.substring(pip.lastIndexOf('/')+1);

 										pip = urlDecode(pip);

@@ -3784,6 +3846,7 @@
 										if (rmm != null) {

 											Method m = rmm.getJavaMethod();

 											try {

+												RestRequest req = call.getRestRequest();

 												// Parse the args and invoke the method.

 												Parser p = req.getBody().getParser();

 												Object[] args = null;

@@ -3795,10 +3858,10 @@
 													}

 												}

 												Object output = m.invoke(o, args);

-												res.setOutput(output);

+												call.output(output);

 												return SC_OK;

 											} catch (Exception e) {

-												throw new InternalServerError(e);

+												throw toHttpException(e, InternalServerError.class);

 											}

 										}

 									}

@@ -3815,7 +3878,7 @@
 							addToRouter(routers, httpMethod, sm);

 						}

 					} catch (Throwable e) {

-						throw new RestServletException("Problem occurred trying to serialize methods on class {0}, methods={1}", resourceClass.getName(), SimpleJsonSerializer.DEFAULT.serialize(methodsFound)).initCause(e);

+						throw new RestServletException("Problem occurred trying to serialize methods on class {0}, methods={1}", rci.getProxiedClass().getName(), SimpleJsonSerializer.DEFAULT.serialize(methodsFound)).initCause(e);

 					}

 				}

 			}

@@ -3955,11 +4018,11 @@
 			callHandler = getInstanceProperty(REST_callHandler, resource, RestCallHandler.class, BasicRestCallHandler.class, resourceResolver, this);

 			infoProvider = getInstanceProperty(REST_infoProvider, resource, RestInfoProvider.class, BasicRestInfoProvider.class, resourceResolver, this);

 

-		} catch (RestException e) {

+		} catch (HttpException e) {

 			_initException = e;

 			throw e;

 		} catch (Exception e) {

-			_initException = new RestException(e, SC_INTERNAL_SERVER_ERROR);

+			_initException = new InternalServerError(e);

 			throw e;

 		} finally {

 			initException = _initException;

@@ -4084,24 +4147,10 @@
 			if (p.indexOf("..") != -1)

 				throw new NotFound("Invalid path");

 			StreamResource sr = null;

-			for (StaticFileMapping sfm : staticFiles) {

-				String path = sfm.path;

-				if (p.startsWith(path)) {

-					String remainder = (p.equals(path) ? "" : p.substring(path.length()));

-					if (remainder.isEmpty() || remainder.startsWith("/")) {

-						String p2 = sfm.location + remainder;

-						try (InputStream is = getClasspathResource(sfm.resourceClass, p2, null)) {

-							if (is != null) {

-								int i = p2.lastIndexOf('/');

-								String name = (i == -1 ? p2 : p2.substring(i+1));

-								String mediaType = mimetypesFileTypeMap.getContentType(name);

-								Map<String,Object> responseHeaders = sfm.responseHeaders != null ? sfm.responseHeaders : staticFileResponseHeaders;

-								sr = new StreamResource(MediaType.forString(mediaType), responseHeaders, true, is);

-								break;

-							}

-						}

-					}

-				}

+			for (StaticFiles sf : staticFiles) {

+				sr = sf.resolve(p);

+				if (sr != null)

+					break;

 			}

 			StaticFile sf = new StaticFile(sr);

 			if (useClasspathResourceCaching) {

@@ -4512,11 +4561,11 @@
 	}

 

 	/**

-	 * Throws a {@link RestException} if an exception occurred in the constructor of this object.

+	 * Throws a {@link HttpException} if an exception occurred in the constructor of this object.

 	 *

-	 * @throws RestException The initialization exception wrapped in a {@link RestException}.

+	 * @throws HttpException The initialization exception wrapped in a {@link HttpException}.

 	 */

-	protected void checkForInitException() throws RestException {

+	protected void checkForInitException() throws HttpException {

 		if (initException != null)

 			throw initException;

 	}

@@ -5058,7 +5107,7 @@
 	/*

 	 * Calls all @RestHook(PRE) methods.

 	 */

-	void preCall(RestRequest req, RestResponse res) throws RestException {

+	void preCall(RestRequest req, RestResponse res) throws HttpException {

 		for (int i = 0; i < preCallMethods.length; i++)

 			preOrPost(resource, preCallMethods[i], preCallMethodParams[i], req, res);

 	}

@@ -5066,32 +5115,25 @@
 	/*

 	 * Calls all @RestHook(POST) methods.

 	 */

-	void postCall(RestRequest req, RestResponse res) throws RestException {

+	void postCall(RestRequest req, RestResponse res) throws HttpException {

 		for (int i = 0; i < postCallMethods.length; i++)

 			preOrPost(resource, postCallMethods[i], postCallMethodParams[i], req, res);

 	}

 

-	private static void preOrPost(Object resource, Method m, RestMethodParam[] mp, RestRequest req, RestResponse res) throws RestException {

+	private static void preOrPost(Object resource, Method m, RestMethodParam[] mp, RestRequest req, RestResponse res) throws HttpException {

 		if (m != null) {

 			Object[] args = new Object[mp.length];

 			for (int i = 0; i < mp.length; i++) {

 				try {

 					args[i] = mp[i].resolve(req, res);

-				} catch (RestException e) {

-					throw e;

 				} catch (Exception e) {

-					throw new BadRequest(e,

-						"Invalid data conversion.  Could not convert {0} ''{1}'' to type ''{2}'' on method ''{3}.{4}''.",

-						mp[i].getParamType().name(), mp[i].getName(), mp[i].getType(), m.getDeclaringClass().getName(), m.getName()

-					);

+					throw toHttpException(e, BadRequest.class, "Invalid data conversion.  Could not convert {0} ''{1}'' to type ''{2}'' on method ''{3}.{4}''.", mp[i].getParamType().name(), mp[i].getName(), mp[i].getType(), m.getDeclaringClass().getName(), m.getName());

 				}

 			}

 			try {

 				m.invoke(resource, args);

-			} catch (RestException e) {

-				throw e;

 			} catch (Exception e) {

-				throw new InternalServerError(e);

+				throw toHttpException(e, InternalServerError.class);

 			}

 		}

 	}

@@ -5099,20 +5141,20 @@
 	/*

 	 * Calls all @RestHook(START) methods.

 	 */

-	void startCall(HttpServletRequest req, HttpServletResponse res) {

+	void startCall(RestCall call) {

 		for (int i = 0; i < startCallMethods.length; i++)

-			startOrFinish(resource, startCallMethods[i], startCallMethodParams[i], req, res);

+			startOrFinish(resource, startCallMethods[i], startCallMethodParams[i], call.getRequest(), call.getResponse());

 	}

 

 	/*

 	 * Calls all @RestHook(FINISH) methods.

 	 */

-	void finishCall(HttpServletRequest req, HttpServletResponse res) {

+	void finishCall(RestCall call) {

 		for (int i = 0; i < endCallMethods.length; i++)

-			startOrFinish(resource, endCallMethods[i], endCallMethodParams[i], req, res);

+			startOrFinish(resource, endCallMethods[i], endCallMethodParams[i], call.getRequest(), call.getResponse());

 	}

 

-	private static void startOrFinish(Object resource, Method m, Class<?>[] p, HttpServletRequest req, HttpServletResponse res) throws RestException, InternalServerError {

+	private static void startOrFinish(Object resource, Method m, Class<?>[] p, HttpServletRequest req, HttpServletResponse res) throws HttpException, InternalServerError {

 		if (m != null) {

 			Object[] args = new Object[p.length];

 			for (int i = 0; i < p.length; i++) {

@@ -5123,10 +5165,8 @@
 			}

 			try {

 				m.invoke(resource, args);

-			} catch (RestException e) {

-				throw e;

 			} catch (Exception e) {

-				throw new InternalServerError(e);

+				throw toHttpException(e, InternalServerError.class);

 			}

 		}

 	}

@@ -5172,9 +5212,9 @@
 			}

 			try {

 				m.invoke(r, args);

-			} catch (RestException e) {

-				throw e;

 			} catch (Exception e) {

+				if (e instanceof RuntimeException && ClassInfo.of(e).hasAnnotation(Response.class))

+					throw (RuntimeException)e;

 				throw new InternalServerError(e);

 			}

 		}

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index 759984a..21751cf 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -12,11 +12,12 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest;
 
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.parser.Parser.*;
 import static org.apache.juneau.rest.RestContext.*;
+import static org.apache.juneau.rest.HttpRuntimeException.*;
 import static org.apache.juneau.serializer.Serializer.*;
+import static org.apache.juneau.internal.CollectionUtils.*;
 
 import java.nio.charset.*;
 import java.util.*;
@@ -29,6 +30,7 @@
 import org.apache.juneau.encoders.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.http.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.*;
@@ -111,7 +113,7 @@
 		this.parentContext = parentContext;
 		this.properties = new RestContextProperties();
 
-		ClassInfo rci = getClassInfo(resourceClass);
+		ClassInfo rci = ClassInfo.of(resourceClass);
 
 		// Default values.
 		logger(BasicRestLogger.class);
@@ -189,10 +191,8 @@
 	public RestContext build() {
 		try {
 			return new RestContext(this);
-		} catch (RestException e) {
-			throw e;
 		} catch (Exception e) {
-			throw new RuntimeException(e);
+			throw toHttpException(e, InternalServerError.class);
 		}
 	}
 
@@ -201,7 +201,7 @@
 	 */
 	RestContextBuilder init(Object resource) throws ServletException {
 		this.resource = resource;
-		ClassInfo rci = getClassInfo(resourceClass);
+		ClassInfo rci = ClassInfo.of(resourceClass);
 
 		Map<String,MethodInfo> map = new LinkedHashMap<>();
 		for (MethodInfo m : rci.getAllMethodsParentFirst()) {
@@ -1587,7 +1587,7 @@
 	 * <p class='bcode w800'>
 	 * 	<ja>@RestResource</ja>(
 	 * 		rolesDeclared=<js>"ROLE_ADMIN,ROLE_READ_WRITE,ROLE_READ_ONLY,ROLE_SPECIAL"</js>,
-	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>
+	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>
 	 * 	)
 	 * 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {
 	 * 		...
@@ -1614,7 +1614,7 @@
 	 * <p class='bcode w800'>
 	 * 	<ja>@RestResource</ja>(
 	 * 		path=<js>"/foo"</js>,
-	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>
+	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>
 	 * 	)
 	 * 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {
 	 * 		...
@@ -1630,8 +1630,8 @@
 	 * 			<li><js>"foo | bar | bqz"</js> - Multiple OR'ed arguments, pipe syntax.
 	 * 			<li><js>"foo || bar || bqz"</js> - Multiple OR'ed arguments, Java-OR syntax.
 	 * 			<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.
-	 * 			<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
-	 * 			<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
+	 * 			<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
+	 * 			<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
 	 * 			<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.
 	 * 		</ul>
 	 * 	<li>
@@ -1861,10 +1861,13 @@
 	 * </ul>
 	 *
 	 * @param mappingString The static file mapping string.
+	 * @throws ParseException If mapping string is malformed.
 	 * @return This object (for method chaining).
 	 */
-	public RestContextBuilder staticFiles(String mappingString) {
-		return staticFiles(new StaticFileMapping(resourceClass, mappingString));
+	public RestContextBuilder staticFiles(String mappingString) throws ParseException{
+		for (StaticFileMapping sfm : reverseIterable(StaticFileMapping.parse(resourceClass, mappingString)))
+			staticFiles(sfm);
+		return this;
 	}
 
 	/**
@@ -1889,10 +1892,11 @@
 	 * 	<br>If <jk>null<jk>, uses the REST resource class.
 	 * @param mappingString The static file mapping string.
 	 * @return This object (for method chaining).
+	 * @throws ParseException If mapping string is malformed.
 	 */
-	public RestContextBuilder staticFiles(Class<?> baseClass, String mappingString) {
-		if (isNotEmpty(mappingString))
-			staticFiles(new StaticFileMapping(baseClass, mappingString));
+	public RestContextBuilder staticFiles(Class<?> baseClass, String mappingString) throws ParseException {
+		for (StaticFileMapping sfm : reverseIterable(StaticFileMapping.parse(baseClass, mappingString)))
+			staticFiles(sfm);
 		return this;
 	}
 
@@ -1915,7 +1919,7 @@
 	 * @return This object (for method chaining).
 	 */
 	public RestContextBuilder staticFiles(String path, String location) {
-		return staticFiles(new StaticFileMapping(null, path, location, null));
+		return staticFiles(new StaticFileMapping(resourceClass, path, location, null));
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverter.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverter.java
index 192b80d..d308663 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverter.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConverter.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.rest;

 

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.annotation.*;

 import org.apache.juneau.rest.converters.*;

 import org.apache.juneau.serializer.*;

@@ -85,8 +86,8 @@
 	 * @param req The servlet request.

 	 * @param res The response object set by the REST method through the {@link RestResponse#setOutput(Object)} method.

 	 * @return The converted object.

-	 * @throws RestException Thrown if any errors occur during conversion.

+	 * @throws HttpException Thrown if any errors occur during conversion.

 	 * @throws SerializeException Generic serialization error occurred.

 	 */

-	public Object convert(RestRequest req, Object res) throws RestException, SerializeException;

+	public Object convert(RestRequest req, Object res) throws HttpException, SerializeException;

 }

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestException.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestException.java
index bdd6b65..795e19d 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestException.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestException.java
@@ -17,6 +17,7 @@
 import java.lang.reflect.*;

 import java.text.*;

 

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.annotation.*;

 

 /**

@@ -25,7 +26,10 @@
  * <p>

  * REST methods on subclasses of {@link RestServlet} can throw this exception to trigger an HTTP status other than the

  * automatically-generated <c>404</c>, <c>405</c>, and <c>500</c> statuses.

+ *

+ * @deprecated Use {@link HttpException}.

  */

+@Deprecated

 public class RestException extends RuntimeException {

 

 	private static final long serialVersionUID = 1L;

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestGuard.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestGuard.java
index f08c887..cf11cbf 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestGuard.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestGuard.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest;

 

 import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 

 /**

  * REST method guard.

@@ -37,7 +37,7 @@
  * other purposes like pre-call validation of a request.

  *

  * <p>

- * Implementers should simply throw a {@link RestException} from the {@link #guard(RestRequest, RestResponse)}

+ * Implementers should simply throw a {@link HttpException} from the {@link #guard(RestRequest, RestResponse)}

  * method to abort processing on the current request.

  *

  * <p>

@@ -72,7 +72,7 @@
 public abstract class RestGuard {

 

 	/**

-	 * Checks the current HTTP request and throws a {@link RestException} if the guard does not permit the request.

+	 * Checks the current HTTP request and throws a {@link HttpException} if the guard does not permit the request.

 	 *

 	 * <p>

 	 * By default, throws an <jsf>SC_FORBIDDEN</jsf> exception if {@link #isRequestAllowed(RestRequest)} returns

@@ -83,12 +83,12 @@
 	 *

 	 * @param req The servlet request.

 	 * @param res The servlet response.

-	 * @throws RestException Thrown to abort processing on current request.

+	 * @throws HttpException Thrown to abort processing on current request.

 	 * @return

 	 * 	<jk>true</jk> if request can proceed.

 	 * 	Specify <jk>false</jk> if you're doing something like a redirection to a login page.

 	 */

-	public boolean guard(RestRequest req, RestResponse res) throws RestException {

+	public boolean guard(RestRequest req, RestResponse res) throws HttpException {

 		if (! isRequestAllowed(req))

 			throw new Forbidden("Access denied by guard");

 		return true;

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestInfoProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestInfoProvider.java
index 10dde31..8e62b46 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestInfoProvider.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestInfoProvider.java
@@ -15,6 +15,7 @@
 import java.lang.reflect.Method;
 
 import org.apache.juneau.dto.swagger.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.annotation.*;
 
 /**
@@ -53,7 +54,7 @@
 	 * 	A new {@link Swagger} instance.
 	 * 	<br>Never <jk>null</jk>.
 	 * @throws Exception
-	 * 	Throw a {@link RestException} with a specific HTTP error status or any other exception
+	 * 	Throw a {@link HttpException} with a specific HTTP error status or any other exception
 	 * 	to cause a <jsf>SC_INTERNAL_SERVER_ERROR</jsf>.
 	 */
 	public Swagger getSwagger(RestRequest req) throws Exception;
@@ -72,7 +73,7 @@
 	 * @param req The current request.
 	 * @return The localized site name of the REST resource, or <jk>null</jk> if none was found.
 	 * @throws Exception
-	 * 	Throw a {@link RestException} with a specific HTTP error status or any other exception
+	 * 	Throw a {@link HttpException} with a specific HTTP error status or any other exception
 	 * 	to cause a <jsf>SC_INTERNAL_SERVER_ERROR</jsf>.
 	 */
 	public String getSiteName(RestRequest req) throws Exception;
@@ -91,7 +92,7 @@
 	 * @param req The current request.
 	 * @return The localized title of the REST resource, or <jk>null</jk> if none was found.
 	 * @throws Exception
-	 * 	Throw a {@link RestException} with a specific HTTP error status or any other exception
+	 * 	Throw a {@link HttpException} with a specific HTTP error status or any other exception
 	 * 	to cause a <jsf>SC_INTERNAL_SERVER_ERROR</jsf>.
 	 */
 	public String getTitle(RestRequest req) throws Exception;
@@ -110,7 +111,7 @@
 	 * @param req The current request.
 	 * @return The localized description of the REST resource, or <jk>null</jk> if none was found.
 	 * @throws Exception
-	 * 	Throw a {@link RestException} with a specific HTTP error status or any other exception
+	 * 	Throw a {@link HttpException} with a specific HTTP error status or any other exception
 	 * 	to cause a <jsf>SC_INTERNAL_SERVER_ERROR</jsf>.
 	 */
 	public String getDescription(RestRequest req) throws Exception;
@@ -130,7 +131,7 @@
 	 * @param req The current request.
 	 * @return The localized summary of the method, or <jk>null</jk> if none was found.
 	 * @throws Exception
-	 * 	Throw a {@link RestException} with a specific HTTP error status or any other exception
+	 * 	Throw a {@link HttpException} with a specific HTTP error status or any other exception
 	 * 	to cause a <jsf>SC_INTERNAL_SERVER_ERROR</jsf>.
 	 */
 	public String getMethodSummary(Method method, RestRequest req) throws Exception;
@@ -150,7 +151,7 @@
 	 * @param req The current request.
 	 * @return The localized description of the method, or <jk>null</jk> if none was was found.
 	 * @throws Exception
-	 * 	Throw a {@link RestException} with a specific HTTP error status or any other exception
+	 * 	Throw a {@link HttpException} with a specific HTTP error status or any other exception
 	 * 	to cause a <jsf>SC_INTERNAL_SERVER_ERROR</jsf>.
 	 */
 	public String getMethodDescription(Method method, RestRequest req) throws Exception;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContext.java
index 5a8bd06..68fc806 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContext.java
@@ -21,6 +21,7 @@
 import static org.apache.juneau.httppart.HttpPartType.*;
 import static org.apache.juneau.rest.RestContext.*;
 import static org.apache.juneau.rest.util.RestUtils.*;
+import static org.apache.juneau.rest.HttpRuntimeException.*;
 
 import java.lang.annotation.*;
 import java.lang.reflect.*;
@@ -45,7 +46,7 @@
 import org.apache.juneau.remote.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.annotation.Method;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.guards.*;
 import org.apache.juneau.rest.util.*;
 import org.apache.juneau.rest.widget.*;
@@ -465,7 +466,7 @@
 	public static final String RESTMETHOD_path = PREFIX + ".path.s";
 
 	/**
-	 * Configuration property:  Priority
+	 * Configuration property:  Priority.
 	 *
 	 * <h5 class='section'>Property:</h5>
 	 * <ul>
@@ -687,13 +688,17 @@
 
 		this.debug = getInstanceProperty(RESTMETHOD_debug, Enablement.class, context.getDebug());
 
-		Object clc = getProperty(RESTMETHOD_callLoggerConfig);
-		if (clc instanceof RestCallLoggerConfig)
-			this.callLoggerConfig = (RestCallLoggerConfig)clc;
-		else if (clc instanceof ObjectMap)
-			this.callLoggerConfig = RestCallLoggerConfig.create().parent(context.getCallLoggerConfig()).apply((ObjectMap)clc).build();
-		else
-			this.callLoggerConfig = context.getCallLoggerConfig();
+		if (debug == Enablement.TRUE) {
+			this.callLoggerConfig = RestCallLoggerConfig.DEFAULT_DEBUG;
+		} else {
+			Object clc = getProperty(RESTMETHOD_callLoggerConfig);
+			if (clc instanceof RestCallLoggerConfig)
+				this.callLoggerConfig = (RestCallLoggerConfig)clc;
+			else if (clc instanceof ObjectMap)
+				this.callLoggerConfig = RestCallLoggerConfig.create().parent(context.getCallLoggerConfig()).apply((ObjectMap)clc).build();
+			else
+				this.callLoggerConfig = context.getCallLoggerConfig();
+		}
 	}
 
 	ResponseBeanMeta getResponseBeanMeta(Object o) {
@@ -797,12 +802,15 @@
 	 * @param pathInfo The value of {@link HttpServletRequest#getPathInfo()} (sorta)
 	 * @return The HTTP response code.
 	 */
-	int invoke(UrlPathInfo pathInfo, RestRequest req, RestResponse res) throws Throwable {
+	int invoke(RestCall call) throws Throwable {
 
-		UrlPathPatternMatch pm = pathPattern.match(pathInfo);
+		UrlPathPatternMatch pm = pathPattern.match(call.getUrlPathInfo());
 		if (pm == null)
 			return SC_NOT_FOUND;
 
+		RestRequest req = call.getRestRequest();
+		RestResponse res = call.getRestResponse();
+
 		RequestPath rp = req.getPathMatch();
 		for (Map.Entry<String,String> e : pm.getVars().entrySet())
 			rp.put(e.getKey(), e.getValue());
@@ -829,17 +837,14 @@
 
 		context.preCall(req, res);
 
+		call.debug(req.isDebug()).loggerConfig(req.getCallLoggerConfig());
+
 		Object[] args = new Object[methodParams.length];
 		for (int i = 0; i < methodParams.length; i++) {
 			try {
 				args[i] = methodParams[i].resolve(req, res);
-			} catch (RestException e) {
-				throw e;
 			} catch (Exception e) {
-				throw new BadRequest(e,
-					"Invalid data conversion.  Could not convert {0} ''{1}'' to type ''{2}'' on method ''{3}.{4}''.",
-					methodParams[i].getParamType().name(), methodParams[i].getName(), methodParams[i].getType(), mi.getDeclaringClass().getFullName(), mi.getSimpleName()
-				);
+				throw toHttpException(e, BadRequest.class, "Invalid data conversion.  Could not convert {0} ''{1}'' to type ''{2}'' on method ''{3}.{4}''.", methodParams[i].getParamType().name(), methodParams[i].getName(), methodParams[i].getType(), mi.getDeclaringClass().getFullName(), mi.getSimpleName());
 			}
 		}
 
@@ -884,13 +889,9 @@
 			);
 		} catch (InvocationTargetException e) {
 			Throwable e2 = e.getTargetException();		// Get the throwable thrown from the doX() method.
-			if (e2 instanceof RestException)
-				throw (RestException)e2;
-			if (e2 instanceof ParseException)
+			if (e2 instanceof ParseException || e2 instanceof InvalidDataConversionException)
 				throw new BadRequest(e2);
-			if (e2 instanceof InvalidDataConversionException)
-				throw new BadRequest(e2);
-			throw e2;
+			throw toHttpException(e, InternalServerError.class);
 		}
 		return SC_OK;
 	}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContextBuilder.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContextBuilder.java
index 83fb1df..3e4c0d7 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContextBuilder.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContextBuilder.java
@@ -12,8 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest;
 
-import static org.apache.juneau.internal.ClassUtils.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.annotation.*;
@@ -35,7 +33,7 @@
 		this.method = method;
 
 		String sig = method.getDeclaringClass().getName() + '.' + method.getName();
-		MethodInfo mi = getMethodInfo(servlet.getClass(), method);
+		MethodInfo mi = MethodInfo.of(servlet.getClass(), method, method);
 
 		try {
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
index 879756a..8c18aa2 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
@@ -41,7 +41,7 @@
 import org.apache.juneau.parser.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.util.UrlPathPattern;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 0877c02..5f6e3a7 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -19,6 +19,7 @@
 import static org.apache.juneau.internal.IOUtils.*;

 import static org.apache.juneau.serializer.Serializer.*;

 import static org.apache.juneau.rest.Enablement.*;

+import static org.apache.juneau.rest.HttpRuntimeException.*;

 

 import java.io.*;

 import java.lang.reflect.*;

@@ -50,11 +51,13 @@
 import org.apache.juneau.httppart.bean.*;

 import org.apache.juneau.internal.*;

 import org.apache.juneau.jsonschema.*;

+import org.apache.juneau.marshall.*;

 import org.apache.juneau.oapi.*;

 import org.apache.juneau.parser.*;

+import org.apache.juneau.reflect.*;

 import org.apache.juneau.remote.*;

 import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.helper.*;

 import org.apache.juneau.rest.util.*;

 import org.apache.juneau.rest.widget.*;

@@ -176,10 +179,8 @@
 

 			this.pathParams = new RequestPath(this);

 

-		} catch (RestException e) {

-			throw e;

 		} catch (Exception e) {

-			throw new ServletException(e);

+			throw toHttpException(e, InternalServerError.class);

 		}

 	}

 

@@ -213,7 +214,7 @@
 

 		String stylesheet = getQuery().getString("stylesheet");

 		if (stylesheet != null)

-			getSession().setAttribute("stylesheet", stylesheet.replace(' ', '$'));  // Prevent SVL insertion.

+			getSession().setAttribute(HTMLDOC_stylesheet, stylesheet.replace(' ', '$'));  // Prevent SVL insertion.

 		stylesheet = (String)getSession().getAttribute("stylesheet");

 		if (stylesheet != null)

 			properties.put(HTMLDOC_stylesheet, new String[]{stylesheet});

@@ -1014,10 +1015,8 @@
 			if (swagger == null)

 				swagger = context.getInfoProvider().getSwagger(this);

 			return swagger;

-		} catch (RestException e) {

-			throw e;

 		} catch (Exception e) {

-			throw new InternalServerError(e);

+			throw toHttpException(e, InternalServerError.class);

 		}

 	}

 

@@ -1047,10 +1046,8 @@
 	public String getSiteName() {

 		try {

 			return context.getInfoProvider().getSiteName(this);

-		} catch (RestException e) {

-			throw e;

 		} catch (Exception e) {

-			throw new InternalServerError(e);

+			throw toHttpException(e, InternalServerError.class);

 		}

 	}

 

@@ -1065,10 +1062,8 @@
 	public String getResourceTitle() {

 		try {

 			return context.getInfoProvider().getTitle(this);

-		} catch (RestException e) {

-			throw e;

 		} catch (Exception e) {

-			throw new InternalServerError(e);

+			throw toHttpException(e, InternalServerError.class);

 		}

 	}

 

@@ -1083,10 +1078,8 @@
 	public String getResourceDescription() {

 		try {

 			return context.getInfoProvider().getDescription(this);

-		} catch (RestException e) {

-			throw e;

 		} catch (Exception e) {

-			throw new InternalServerError(e);

+			throw toHttpException(e, InternalServerError.class);

 		}

 	}

 

@@ -1101,10 +1094,8 @@
 	public String getMethodSummary() {

 		try {

 			return context.getInfoProvider().getMethodSummary(javaMethod, this);

-		} catch (RestException e) {

-			throw e;

 		} catch (Exception e) {

-			throw new InternalServerError(e);

+			throw toHttpException(e, InternalServerError.class);

 		}

 	}

 

@@ -1119,10 +1110,8 @@
 	public String getMethodDescription() {

 		try {

 			return context.getInfoProvider().getMethodDescription(javaMethod, this);

-		} catch (RestException e) {

-			throw e;

 		} catch (Exception e) {

-			throw new InternalServerError(e);

+			throw toHttpException(e, InternalServerError.class);

 		}

 	}

 

@@ -1321,7 +1310,7 @@
 		Boolean b = ObjectUtils.castOrNull(getAttribute("Debug"), Boolean.class);

 		if (b != null)

 			return b;

-		Enablement e = context.getDebug();

+		Enablement e = restJavaMethod != null ? restJavaMethod.getDebug() : context.getDebug();

 		if (e == TRUE)

 			return true;

 		if (e == FALSE)

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
index 20f7369..f44d3ce 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -28,7 +28,7 @@
 import org.apache.juneau.httppart.*;

 import org.apache.juneau.httppart.bean.*;

 import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.util.*;

 import org.apache.juneau.serializer.*;

 

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
index 4837ed9..6a9443f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
@@ -15,7 +15,7 @@
 import static java.util.logging.Level.*;

 import static javax.servlet.http.HttpServletResponse.*;

 import static org.apache.juneau.internal.StringUtils.*;

-import static org.apache.juneau.internal.ClassUtils.*;

+import static org.apache.juneau.rest.HttpRuntimeException.*;

 

 import java.io.*;

 import java.text.*;

@@ -27,7 +27,7 @@
 import org.apache.juneau.internal.*;

 import org.apache.juneau.reflect.*;

 import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 

 /**

  * Servlet implementation of a REST resource.

@@ -61,22 +61,13 @@
 			builder.servletContext(this.getServletContext());

 			setContext(builder.build());

 			context.postInitChildFirst();

-		} catch (RestException e) {

-			// Thrown RestExceptions are simply caught and re-thrown on subsequent calls to service().

-			initException = e;

-			log(SEVERE, e, "Servlet init error on class ''{0}''", getClass().getName());

 		} catch (ServletException e) {

 			initException = e;

 			log(SEVERE, e, "Servlet init error on class ''{0}''", getClass().getName());

 			throw e;

-		} catch (Exception e) {

-			initException = e;

-			log(SEVERE, e, "Servlet init error on class ''{0}''", getClass().getName());

-			throw new ServletException(e);

 		} catch (Throwable e) {

-			initException = new Exception(e);

+			initException = toHttpException(e, InternalServerError.class);

 			log(SEVERE, e, "Servlet init error on class ''{0}''", getClass().getName());

-			throw new ServletException(e);

 		}

 	}

 

@@ -123,7 +114,7 @@
 	public synchronized String getPath() {

 		if (context != null)

 			return context.getPath();

-		ClassInfo ci = getClassInfo(getClass());

+		ClassInfo ci = ClassInfo.of(getClass());

 		for (RestResource rr : ci.getAnnotations(RestResource.class))

 			if (! rr.path().isEmpty())

 				return trimSlashes(rr.path());

@@ -135,6 +126,10 @@
 		return builder;

 	}

 

+	//-----------------------------------------------------------------------------------------------------------------

+	// Context methods.

+	//-----------------------------------------------------------------------------------------------------------------

+

 	/**

 	 * Returns the read-only context object that contains all the configuration information about this resource.

 	 *

@@ -152,12 +147,72 @@
 	 * @return The context information on this servlet.

 	 */

 	protected synchronized RestContext getContext() {

+		if (context == null)

+			throw new InternalServerError("RestContext object not set on resource.");

 		return context;

 	}

 

+	/**

+	 * Convenience method for calling <c>getContext().getProperties();</c>

+	 *

+	 * @return The resource properties as an {@link RestContextProperties}.

+	 * @see RestContext#getProperties()

+	 */

+	public RestContextProperties getProperties() {

+		return getContext().getProperties();

+	}

+

 

 	//-----------------------------------------------------------------------------------------------------------------

-	// Other methods

+	// Convenience logger methods

+	//-----------------------------------------------------------------------------------------------------------------

+

+	@Override /* GenericServlet */

+	public void log(String msg) {

+		logger.info(msg);

+	}

+

+	@Override /* GenericServlet */

+	public void log(String msg, Throwable cause) {

+		logger.info(cause, msg);

+	}

+

+	/**

+	 * Log a message.

+	 *

+	 * @param level The log level.

+	 * @param msg The message to log.

+	 * @param args Optional {@link MessageFormat}-style arguments.

+	 */

+	public void log(Level level, String msg, Object...args) {

+		logger.log(level, msg, args);

+	}

+

+	/**

+	 * Log a message.

+	 *

+	 * @param level The log level.

+	 * @param msg The message to log.

+	 * @param args Optional {@link MessageFormat}-style arguments.

+	 */

+	public void logObjects(Level level, String msg, Object...args) {

+		logger.logObjects(level, msg, args);

+	}

+

+	/**

+	 * Log a message.

+	 *

+	 * @param level The log level.

+	 * @param cause The cause.

+	 * @param msg The message to log.

+	 * @param args Optional {@link MessageFormat}-style arguments.

+	 */

+	public void log(Level level, Throwable cause, String msg, Object...args) {

+		logger.log(level, cause, msg, args);

+	}

+

+	//-----------------------------------------------------------------------------------------------------------------

+	// Lifecycle methods

 	//-----------------------------------------------------------------------------------------------------------------

 

 	/**

@@ -171,11 +226,8 @@
 		try {

 			// To avoid checking the volatile field context on every call, use the non-volatile isInitialized field as a first-check check.

 			if (! isInitialized) {

-				if (initException != null) {

-					if (initException instanceof RestException)

-						throw (RestException)initException;

-					throw new InternalServerError(initException);

-				}

+				if (initException != null)

+					throw initException;

 				if (context == null)

 					throw new InternalServerError("Servlet {0} not initialized.  init(ServletConfig) was not called.  This can occur if you've overridden this method but didn't call super.init(RestConfig).", getClass().getName());

 				isInitialized = true;

@@ -183,93 +235,37 @@
 

 			context.getCallHandler().service(r1, r2);

 

-		} catch (RestException e) {

-			r2.sendError(SC_INTERNAL_SERVER_ERROR, e.getLocalizedMessage());

 		} catch (Throwable e) {

 			r2.sendError(SC_INTERNAL_SERVER_ERROR, e.getLocalizedMessage());

 		}

 	}

 

 	@Override /* GenericServlet */

-	public void log(String msg) {

-		logger.info(msg);

-	}

-

-	@Override /* GenericServlet */

-	public void log(String msg, Throwable cause) {

-		logger.info(cause, msg);

-	}

-

-	/**

-	 * Convenience method for calling <c>getContext().getLogger().log(level, msg, args);</c>

-	 *

-	 * @param level The log level.

-	 * @param msg The message to log.

-	 * @param args Optional {@link MessageFormat}-style arguments.

-	 */

-	public void log(Level level, String msg, Object...args) {

-		logger.log(level, msg, args);

-	}

-

-	/**

-	 * Convenience method for calling <c>getContext().getLogger().logObjects(level, msg, args);</c>

-	 *

-	 * @param level The log level.

-	 * @param msg The message to log.

-	 * @param args Optional {@link MessageFormat}-style arguments.

-	 */

-	public void logObjects(Level level, String msg, Object...args) {

-		logger.logObjects(level, msg, args);

-	}

-

-	/**

-	 * Convenience method for calling <c>getContext().getLogger().log(level, cause, msg, args);</c>

-	 *

-	 * @param level The log level.

-	 * @param cause The cause.

-	 * @param msg The message to log.

-	 * @param args Optional {@link MessageFormat}-style arguments.

-	 */

-	public void log(Level level, Throwable cause, String msg, Object...args) {

-		logger.log(level, cause, msg, args);

-	}

-

-	/**

-	 * Returns the current HTTP request.

-	 *

-	 * @return The current HTTP request, or <jk>null</jk> if it wasn't created.

-	 */

-	public RestRequest getRequest() {

-		if (context == null)

-			return null;

-		return context.getRequest();

-	}

-

-	/**

-	 * Returns the current HTTP response.

-	 *

-	 * @return The current HTTP response, or <jk>null</jk> if it wasn't created.

-	 */

-	public RestResponse getResponse() {

-		if (context == null)

-			return null;

-		return context.getResponse();

-	}

-

-	@Override /* GenericServlet */

 	public synchronized void destroy() {

 		if (context != null)

 			context.destroy();

 		super.destroy();

 	}

 

+	//-----------------------------------------------------------------------------------------------------------------

+	// Request-time methods.

+	//-----------------------------------------------------------------------------------------------------------------

+

 	/**

-	 * Convenience method for calling <c>getContext().getProperties();</c>

+	 * Returns the current HTTP request.

 	 *

-	 * @return The resource properties as an {@link RestContextProperties}.

-	 * @see RestContext#getProperties()

+	 * @return The current HTTP request, or <jk>null</jk> if it wasn't created.

 	 */

-	public RestContextProperties getProperties() {

-		return getContext().getProperties();

+	public synchronized RestRequest getRequest() {

+		return getContext().getRequest();

+	}

+

+	/**

+	 * Returns the current HTTP response.

+	 *

+	 * @return The current HTTP response, or <jk>null</jk> if it wasn't created.

+	 */

+	public synchronized RestResponse getResponse() {

+		return getContext().getResponse();

 	}

 }

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFileMapping.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFileMapping.java
index 2bdec39..8b5f177 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFileMapping.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFileMapping.java
@@ -13,11 +13,15 @@
 package org.apache.juneau.rest;
 
 import static org.apache.juneau.internal.CollectionUtils.*;
+import static org.apache.juneau.internal.StringUtils.*;
+import static org.apache.juneau.internal.StateMachineState.*;
+import static java.lang.Character.*;
 
 import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.utils.*;
@@ -86,13 +90,13 @@
 	 */
 	public StaticFileMapping(Class<?> resourceClass, String path, String location, Map<String,Object> responseHeaders) {
 		this.resourceClass = resourceClass;
-		this.path = StringUtils.trimSlashes(path);
-		this.location = StringUtils.trimSlashes(location);
+		this.path = trimSlashes(path);
+		this.location = trimTrailingSlashes(location);
 		this.responseHeaders = immutableMap(responseHeaders);
 	}
 
 	/**
-	 * Constructor using a mapping string to represent a path/location pairing.
+	 * Create one or more <c>StaticFileMappings</c> from the specified comma-delimited list of mappings.
 	 *
 	 * <p>
 	 * Mapping string must be one of these formats:
@@ -103,25 +107,123 @@
 	 *
 	 * @param resourceClass
 	 * 	The resource/servlet class which serves as the base location of the location below.
-	 * @param mappingString
+	 * @param mapping
 	 * 	The mapping string that represents the path/location mapping.
 	 * 	<br>Leading and trailing slashes and whitespace are trimmed from path and location.
+	 * @return A list of parsed mappings.  Never <jk>null</jk>.
+	 * @throws ParseException If mapping was malformed.
 	 */
-	public StaticFileMapping(Class<?> resourceClass, String mappingString) {
-		this.resourceClass = resourceClass;
-		String[] parts = StringUtils.split(mappingString, ':', 3);
-		if (parts == null || parts.length <= 1)
-			throw new FormattedRuntimeException("Invalid mapping string format: ''{0}'' on resource class ''{1}''", mappingString, resourceClass.getName());
-		this.path = StringUtils.trimSlashes(parts[0]);
-		this.location = StringUtils.trimSlashes(parts[1]);
-		if (parts.length == 3) {
-			try {
-				responseHeaders = unmodifiableMap(new ObjectMap(parts[2]));
-			} catch (ParseException e) {
-				throw new FormattedRuntimeException(e, "Invalid mapping string format: ''{0}'' on resource class ''{1}''", mappingString, resourceClass.getName());
+	public static List<StaticFileMapping> parse(Class<?> resourceClass, String mapping) throws ParseException {
+
+		mapping = trim(mapping);
+		if (isEmpty(mapping))
+			return Collections.emptyList();
+
+		// States:
+		// S01 = In path, looking for :
+		// S02 = Found path:, looking for : or , or end
+		// S03 = Found path:location:, looking for {
+		// S04 = Found path:location:{, looking for }
+		// S05 = Found path:location:{headers}, looking for , or end
+		// S06 = Found path:location:{headers} , looking for start of path
+
+		StateMachineState state = S01;
+		int mark = 0;
+
+		String path = null, location = null;
+		List<StaticFileMapping> l = new ArrayList<>();
+		String s = mapping;
+		int jsonDepth = 0;
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if (state == S01) {
+				if (c == ':') {
+					path = trim(s.substring(mark, i));
+					mark = i+1;
+					state = S02;
+				}
+			} else if (state == S02) {
+				if (c == ':') {
+					location = trim(s.substring(mark, i));
+					mark = i+1;
+					state = S03;
+				} else if (c == ',') {
+					location = trim(s.substring(mark, i));
+					l.add(new StaticFileMapping(resourceClass, path, location, null));
+					mark = i+1;
+					state = S01;
+					path = null;
+					location = null;
+				}
+			} else if (state == S03) {
+				if (c == '{') {
+					mark = i;
+					state = S04;
+				} else if (! isWhitespace(c)) {
+					throw new ParseException("Invalid staticFiles mapping.  Expected '{' at beginning of headers.  mapping=[{0}]", mapping);
+				}
+			} else if (state == S04) {
+				if (c == '{') {
+					jsonDepth++;
+				} else if (c == '}') {
+					if (jsonDepth > 0) {
+						jsonDepth--;
+					} else {
+						String json = s.substring(mark, i+1);
+						l.add(new StaticFileMapping(resourceClass, path, location, new ObjectMap(json)));
+						state = S05;
+						path = null;
+						location = null;
+					}
+				}
+			} else if (state == S05) {
+				if (c == ',') {
+					state = S06;
+				} else if (! isWhitespace(c)) {
+					throw new ParseException("Invalid staticFiles mapping.  Invalid text following headers.  mapping=[{0}]", mapping);
+				}
+			} else /* state == S06 */ {
+				if (! isWhitespace(c)) {
+					mark = i;
+					state = S01;
+				}
 			}
-		} else {
-			responseHeaders = null;
 		}
+
+		if (state == S01) {
+			throw new ParseException("Invalid staticFiles mapping.  Couldn''t find '':'' following path.  mapping=[{0}]", mapping);
+		} else if (state == S02) {
+			location = trim(s.substring(mark, s.length()));
+			l.add(new StaticFileMapping(resourceClass, path, location, null));
+		} else if (state == S03) {
+			throw new ParseException("Invalid staticFiles mapping.  Found extra '':'' following location.  mapping=[{0}]", mapping);
+		} else if (state == S04) {
+			throw new ParseException("Invalid staticFiles mapping.  Malformed headers.  mapping=[{0}]", mapping);
+		}
+
+		return l;
+	}
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Other methods
+	//-----------------------------------------------------------------------------------------------------------------
+
+	@Override /* Object */
+	public String toString() {
+		return SimpleJsonSerializer.DEFAULT_READABLE.toString(toMap());
+	}
+
+	/**
+	 * Returns the properties defined on this bean as a simple map for debugging purposes.
+	 *
+	 * @return A new map containing the properties defined on this bean.
+	 */
+	public ObjectMap toMap() {
+		return new DefaultFilteringObjectMap()
+			.append("resourceClass", resourceClass)
+			.append("path", path)
+			.append("location", location)
+			.append("responseHeaders", responseHeaders)
+		;
 	}
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFiles.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFiles.java
new file mode 100644
index 0000000..e7d859d
--- /dev/null
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFiles.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.                                              *
+// ***************************************************************************************************************************
+// ***************************************************************************************************************************
+// * 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.rest;
+
+import java.io.*;
+import java.util.*;
+
+import javax.activation.*;
+
+import org.apache.juneau.http.*;
+import org.apache.juneau.utils.*;
+
+/**
+ * The static file resource resolver for a single {@link StaticFileMapping}.
+ */
+class StaticFiles {
+	private final Class<?> resourceClass;
+	private final String path, location;
+	private final Map<String,Object> responseHeaders;
+
+	private final ClasspathResourceManager staticResourceManager;
+	private final MimetypesFileTypeMap mimetypesFileTypeMap;
+
+	StaticFiles(StaticFileMapping sfm, ClasspathResourceManager staticResourceManager, MimetypesFileTypeMap mimetypesFileTypeMap, Map<String,Object> staticFileResponseHeaders) {
+		this.resourceClass = sfm.resourceClass;
+		this.path = sfm.path;
+		this.location = sfm.location;
+		this.responseHeaders = sfm.responseHeaders != null ? sfm.responseHeaders : staticFileResponseHeaders;
+		this.staticResourceManager = staticResourceManager;
+		this.mimetypesFileTypeMap = mimetypesFileTypeMap;
+	}
+
+	String getPath() {
+		return path;
+	}
+
+	StreamResource resolve(String p) throws IOException {
+		if (p.startsWith(path)) {
+			String remainder = (p.equals(path) ? "" : p.substring(path.length()));
+			if (remainder.isEmpty() || remainder.startsWith("/")) {
+				String p2 = location + remainder;
+				try (InputStream is = staticResourceManager.getStream(resourceClass, p2, null)) {
+					if (is != null) {
+						int i = p2.lastIndexOf('/');
+						String name = (i == -1 ? p2 : p2.substring(i+1));
+						String mediaType = mimetypesFileTypeMap.getContentType(name);
+						return new StreamResource(MediaType.forString(mediaType), responseHeaders, true, is);
+					}
+				}
+			}
+		}
+		return null;
+	}
+}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
index 1a36c6f..ca67de5 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerGenerator.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest;
 
-import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.rest.RestParamType.*;
 import static org.apache.juneau.rest.util.AnnotationUtils.*;
@@ -100,7 +99,7 @@
 	 */
 	public Swagger getSwagger() throws Exception {
 
-		ClassInfo rci = getClassInfo(resource.getClass());
+		ClassInfo rci = ClassInfo.of(resource.getClass());
 
 		rci.getSimpleName();
 
@@ -224,7 +223,7 @@
 			BeanSession bs = sm.createBeanSession();
 
 			Method m = sm.method;
-			MethodInfo mi = getMethodInfo(m);
+			MethodInfo mi = MethodInfo.of(m);
 			RestMethod rm = mi.getAnnotation(RestMethod.class);
 			String mn = m.getName();
 
@@ -390,8 +389,10 @@
 						}
 					}
 					for (MethodInfo ecmi : eci.getAllMethodsParentFirst()) {
-						if (ecmi.hasAnnotation(ResponseHeader.class)) {
-							ResponseHeader a = ecmi.getAnnotation(ResponseHeader.class);
+						ResponseHeader a = ecmi.getAnnotation(ResponseHeader.class);
+						if (a == null)
+							a = ecmi.getResolvedReturnType().getAnnotation(ResponseHeader.class);
+						if (a != null) {
 							String ha = a.name();
 							for (Integer code : codes) {
 								ObjectMap header = responses.getObjectMap(String.valueOf(code), true).getObjectMap("headers", true).getObjectMap(ha, true);
@@ -403,7 +404,7 @@
 				}
 			}
 
-			if (mi.hasAnnotation(Response.class)) {
+			if (mi.hasAnnotation(Response.class) || mi.getResolvedReturnType().hasAnnotation(Response.class)) {
 				List<Response> la = mi.getAnnotationsParentFirst(Response.class);
 				Set<Integer> codes = getCodes(la, 200);
 				for (Response a : la) {
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HookEvent.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HookEvent.java
index da3b5ee..5c7eca5 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HookEvent.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HookEvent.java
@@ -23,6 +23,7 @@
 import org.apache.juneau.config.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.http.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.utils.*;
@@ -80,7 +81,7 @@
 	 * 		<br>The order of START_CALL method invocations within a class is alphabetical, then by parameter count, then by parameter types.
 	 * 	<li>
 	 * 		The method can throw any exception.
-	 * 		<br>{@link RestException RestExceptions} can be thrown to cause a particular HTTP error status code.
+	 * 		<br>{@link HttpException HttpExceptions} can be thrown to cause a particular HTTP error status code.
 	 * 		<br>All other exceptions cause an HTTP 500 error status code.
 	 * 	<li>
 	 * 		Note that if you override a parent method, you probably need to call <code><jk>super</jk>.parentMethod(...)</code>.
@@ -196,7 +197,7 @@
 	 * 		<br>The order of PRE_CALL method invocations within a class is alphabetical, then by parameter count, then by parameter types.
 	 * 	<li>
 	 * 		The method can throw any exception.
-	 * 		<br>{@link RestException RestExceptions} can be thrown to cause a particular HTTP error status code.
+	 * 		<br>{@link HttpException HttpExceptions} can be thrown to cause a particular HTTP error status code.
 	 * 		<br>All other exceptions cause an HTTP 500 error status code.
 	 * 	<li>
 	 * 		Note that if you override a parent method, you probably need to call <code><jk>super</jk>.parentMethod(...)</code>.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
index f4da61a..7df1274 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
@@ -81,7 +81,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is either a comma-delimited list of simple strings or a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array.
+	 * 		The format is either a comma-delimited list of simple strings or a {@doc SimpleJson} array.
 	 * 	<li>
 	 * 		Supports {@doc DefaultRestSvlVariables}
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
@@ -125,7 +125,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is either a comma-delimited list of simple strings or a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array.
+	 * 		The format is either a comma-delimited list of simple strings or a {@doc SimpleJson} array.
 	 * 	<li>
 	 * 		Supports {@doc DefaultRestSvlVariables}
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
@@ -143,7 +143,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is either a comma-delimited list of simple strings or a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array.
+	 * 		The format is either a comma-delimited list of simple strings or a {@doc SimpleJson} array.
 	 * 	<li>
 	 * 		Supports {@doc DefaultRestSvlVariables}
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
@@ -200,7 +200,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array consisting of the concatenated individual strings.
+	 * 		The format is a {@doc SimpleJson} array consisting of the concatenated individual strings.
 	 * 		<br>The leading and trailing <js>'['</js> and <js>']'</js> characters are optional.
 	 * 	<li>
 	 * 		Supports {@doc DefaultRestSvlVariables}
@@ -232,7 +232,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} objc consisting of the concatenated individual strings.
+	 * 		The format is a {@doc SimpleJson} objc consisting of the concatenated individual strings.
 	 * 		<br>The leading and trailing <js>'{'</js> and <js>'}'</js> characters are optional.
 	 * 	<li>
 	 * 		Supports {@doc DefaultRestSvlVariables}
@@ -306,7 +306,7 @@
 	 * Free-form value for the swagger of a resource method.
 	 *
 	 * <p>
-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this resource method.
+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this resource method.
 	 *
 	 * <p>
 	 * The following are completely equivalent ways of defining the swagger description of a resource method:
@@ -364,7 +364,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.
+	 * 		The format is a {@doc SimpleJson} object.
 	 * 	<li>
 	 * 		The leading/trailing <c>{ }</c> characters are optional.
 	 * 		<br>The following two example are considered equivalent:
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
index 9e8c234..cc8f084 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
@@ -96,7 +96,7 @@
 	 * Defines the swagger field <c>/info/contact</c>.
 	 *
 	 * <p>
-	 * A {@doc juneau-marshall.JsonDetails.SimplifiedJson} string with the following fields:
+	 * A {@doc SimpleJson} string with the following fields:
 	 * <p class='bcode w800'>
 	 * 	{
 	 * 		name: string,
@@ -138,7 +138,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.
+	 * 		The format is a {@doc SimpleJson} object.
 	 * 		<br>Multiple lines are concatenated with newlines.
 	 * 	<li>
 	 * 		Supports {@doc DefaultRestSvlVariables}
@@ -176,7 +176,7 @@
 	 * It is used to populate the Swagger license field and to display on HTML pages.
 	 *
 	 * <p>
-	 * A {@doc juneau-marshall.JsonDetails.SimplifiedJson} string with the following fields:
+	 * A {@doc SimpleJson} string with the following fields:
 	 * <p class='bcode w800'>
 	 * 	{
 	 * 		name: string,
@@ -200,7 +200,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.
+	 * 		The format is a {@doc SimpleJson} object.
 	 * 		<br>Multiple lines are concatenated with newlines.
 	 * 	<li>
 	 * 		Supports {@doc DefaultRestSvlVariables}
@@ -219,7 +219,7 @@
 	 * It is used to populate the Swagger tags field and to display on HTML pages.
 	 *
 	 * <p>
-	 * A {@doc juneau-marshall.JsonDetails.SimplifiedJson} string with the following fields:
+	 * A {@doc SimpleJson} string with the following fields:
 	 * <p class='bcode w800'>
 	 * 	[
 	 * 		{
@@ -249,7 +249,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} array.
+	 * 		The format is a {@doc SimpleJson} array.
 	 * 		<br>Multiple lines are concatenated with newlines.
 	 * 	<li>
 	 * 		Supports {@doc DefaultRestSvlVariables}
@@ -310,7 +310,7 @@
 	 * Free-form value for the swagger of a resource.
 	 *
 	 * <p>
-	 * This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object that makes up the swagger information for this resource.
+	 * This is a {@doc SimpleJson} object that makes up the swagger information for this resource.
 	 *
 	 * <p>
 	 * The following are completely equivalent ways of defining the swagger description of a resource:
@@ -399,7 +399,7 @@
 	 *
 	 * <ul class='notes'>
 	 * 	<li>
-	 * 		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object.
+	 * 		The format is a {@doc SimpleJson} object.
 	 * 	<li>
 	 * 		The leading/trailing <c>{ }</c> characters are optional.
 	 * 		<br>The following two example are considered equivalent:
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
index 0189b1b..47f76d7 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
@@ -759,7 +759,7 @@
 	 * 			name=<jsf>GET</jsf>,

 	 * 			path=<js>"/foo"</js>,

 	 * 			rolesDeclared=<js>"ROLE_ADMIN,ROLE_READ_WRITE,ROLE_READ_ONLY,ROLE_SPECIAL"</js>,

-	 * 			roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>

+	 * 			roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>

 	 * 		)

 	 * 		<jk>public</jk> Object doGet() {

 	 * 		}

@@ -785,7 +785,7 @@
 	 * 		<ja>@RestMethod</ja>(

 	 * 			name=<jsf>GET</jsf>,

 	 * 			path=<js>"/foo"</js>,

-	 * 			roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>

+	 * 			roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>

 	 * 		)

 	 * 		<jk>public</jk> Object doGet() {

 	 * 		}

@@ -801,8 +801,8 @@
 	 * 			<li><js>"foo | bar | baz"</js> - Multiple OR'ed arguments, pipe syntax.

 	 * 			<li><js>"foo || bar || baz"</js> - Multiple OR'ed arguments, Java-OR syntax.

 	 * 			<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.

-	 * 			<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.

-	 * 			<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.

+	 * 			<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.

+	 * 			<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.

 	 * 			<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.

 	 * 		</ul>

 	 * 	<li>

@@ -952,7 +952,7 @@
 	 *

 	 * <ul class='notes'>

 	 * 	<li>

-	 * 		The format is {@doc juneau-marshall.JsonDetails.SimplifiedJson}.

+	 * 		The format is {@doc SimpleJson}.

 	 * 		<br>Multiple lines are concatenated with newlines.

 	 * 	<li>

 	 * 		The starting and ending <js>'{'</js>/<js>'}'</js> characters around the entire value are optional.

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
index 227e023..09a896a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
@@ -897,7 +897,7 @@
 	 * <p class='bcode w800'>

 	 * 	<ja>@RestResource</ja>(

 	 * 		rolesDeclared=<js>"ROLE_ADMIN,ROLE_READ_WRITE,ROLE_READ_ONLY,ROLE_SPECIAL"</js>,

-	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>

+	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>

 	 * 	)

 	 * 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {

 	 * 		...

@@ -920,7 +920,7 @@
 	 * <p class='bcode w800'>

 	 * 	<ja>@RestResource</ja>(

 	 * 		path=<js>"/foo"</js>,

-	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE && ROLE_SPECIAL)"</js>

+	 * 		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>

 	 * 	)

 	 * 	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {

 	 * 		...

@@ -936,8 +936,8 @@
 	 * 			<li><js>"foo | bar | baz"</js> - Multiple OR'ed arguments, pipe syntax.

 	 * 			<li><js>"foo || bar || baz"</js> - Multiple OR'ed arguments, Java-OR syntax.

 	 * 			<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.

-	 * 			<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.

-	 * 			<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.

+	 * 			<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.

+	 * 			<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.

 	 * 			<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.

 	 * 		</ul>

 	 * 	<li>

@@ -1032,6 +1032,49 @@
 	 * <p>

 	 * Used to customize the headers on responses returned for statically-served files.

 	 *

+	 * <h5 class='section'>Example:</h5>

+	 * <p class='bcode w800'>

+	 * 	<jc>// Option #1 - Defined via annotation resolving to a config file setting with default value.</jc>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFileResponseHeaders={

+	 * 			<js>"Cache-Control: $C{REST/cacheControl,nocache}"</js>,

+	 * 			<js>"My-Header: $C{REST/myHeaderValue}"</js>

+	 * 		}

+	 * 	)

+	 * 	<jk>public class</jk> MyResource {

+	 *

+	 * 		<jc>// Option #2 - Defined via builder passed in through resource constructor.</jc>

+	 * 		<jk>public</jk> MyResource(RestContextBuilder builder) <jk>throws</jk> Exception {

+	 *

+	 * 			<jc>// Using method on builder.</jc>

+	 * 			builder

+	 * 				.staticFileResponseHeader(<js>"Cache-Control"</js>, <js>"nocache"</js>);

+	 * 				.staticFileResponseHeaders(<js>"My-Header: foo"</js>);

+	 *

+	 * 			<jc>// Same, but using property.</jc>

+	 * 			builder

+	 * 				.addTo(<jsf>REST_staticFileResponseHeaders</jsf>, <js>"Cache-Control"</js>, <js>"nocache"</js>);

+	 * 				.addTo(<jsf>REST_staticFileResponseHeaders</jsf>, <js>"My-Header"</js>, <js>"foo"</js>);

+	 * 		}

+	 *

+	 * 		<jc>// Option #3 - Defined via builder passed in through init method.</jc>

+	 * 		<ja>@RestHook</ja>(<jsf>INIT</jsf>)

+	 * 		<jk>public void</jk> init(RestContextBuilder builder) <jk>throws</jk> Exception {

+	 * 			builder.staticFileResponseHeader(<js>"Cache-Control"</js>, <js>"nocache"</js>);

+	 * 		}

+	 * 	}

+	 * </p>

+	 *

+	 * <p>

+	 * Note that headers can also be specified per path-mapping via the {@link RestResource#staticFiles() @RestResource(staticFiles)} annotation.

+	 * <p class='bcode w800'>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFiles={

+	 * 			<js>"htdocs:docs:{'Cache-Control':'max-age=86400, public'}"</js>

+	 * 		}

+	 * 	)

+	 * </p>

+	 *

 	 * <ul class='notes'>

 	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

@@ -1048,10 +1091,90 @@
 	 * Static file mappings.

 	 *

 	 * <p>

-	 * Used to define paths and locations of statically-served files such as images or HTML documents.

+	 * Used to define paths and locations of statically-served files such as images or HTML documents

+	 * from the classpath or file system.

+	 *

+	 * <p>

+	 * The format of the value is one of the following:

+	 * <ol class='spaced-list'>

+	 * 	<li><js>"path:location"</js>

+	 * 	<li><js>"path:location:headers"</js>

+	 * </ol>

+	 *

+	 * <p>

+	 * An example where this class is used is in the {@link RestResource#staticFiles} annotation:

+	 * <p class='bcode w800'>

+	 * 	<jk>package</jk> com.foo.mypackage;

+	 *

+	 * 	<ja>@RestResource</ja>(

+	 * 		path=<js>"/myresource"</js>,

+	 * 		staticFiles={

+	 * 			<js>"htdocs:docs"</js>,

+	 * 			<js>"styles:styles"</js>

+	 * 		}

+	 * 	)

+	 * 	<jk>public class</jk> MyResource <jk>extends</jk> BasicRestServlet {...}

+	 * </p>

+	 *

+	 * <p>

+	 * In the example above, given a GET request to the following URL...

+	 * <p class='bcode w800'>

+	 *  	/myresource/htdocs/foobar.html

+	 * </p>

+	 * <br>...the servlet will attempt to find the <c>foobar.html</c> file in the following location:

+	 * <ol class='spaced-list'>

+	 * 	<li><c>com.foo.mypackage.docs</c> package.

+	 * </ol>

+	 *

+	 * <p>

+	 * The location is interpreted as an absolute path if it starts with <js>'/'</js>.

+	 * <p class='bcode w800'>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFiles={

+	 * 			<js>"htdocs:/docs"</js>

+	 * 		}

+	 * 	)

+	 * </p>

+	 * <p>

+	 * In the example above, given a GET request to the following URL...

+	 * <p class='bcode w800'>

+	 *  	/myresource/htdocs/foobar.html

+	 * </p>

+	 * <br>...the servlet will attempt to find the <c>foobar.html</c> file in the following location:

+	 * <ol class='spaced-list'>

+	 * 	<li><c>docs</c> package (typically under <c>src/main/resources/docs</c> in your workspace).

+	 * 	<li><c>[working-dir]/docs</c> directory at runtime.

+	 * </ol>

+	 *

+	 * <p>

+	 * Response headers can be specified for served files by adding a 3rd section that consists of a {@doc SimpleJson} object.

+	 * <p class='bcode w800'>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFiles={

+	 * 			<js>"htdocs:docs:{'Cache-Control':'max-age=86400, public'}"</js>

+	 * 		}

+	 * 	)

+	 * </p>

+	 *

+	 * <p>

+	 * The same path can map to multiple locations.  Files are searched in the order

+	 * <p class='bcode w800'>

+	 * 	<ja>@RestResource</ja>(

+	 * 		staticFiles={

+	 * 			<jc>// Search in absolute location '/htdocs/folder' before location 'htdocs.package' relative to servlet package.</jc>

+	 * 			<js>"htdocs:/htdocs/folder,htdocs:htdocs.package"</js>

+	 * 		}

+	 * 	)

+	 * </p>

 	 *

 	 * <ul class='notes'>

 	 * 	<li>

+	 * 		Mappings are cumulative from super classes.

+	 * 	<li>

+	 * 		Child resources can override mappings made on parent class resources.

+	 * 		<br>When both parent and child resources map against the same path, files will be search in the child location

+	 * 		and then the parent location.

+	 * 	<li>

 	 * 		Supports {@doc DefaultRestSvlVariables}

 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).

 	 * </ul>

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResourceConfigApply.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResourceConfigApply.java
index 77cfad3..1eadabb 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResourceConfigApply.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResourceConfigApply.java
@@ -14,6 +14,7 @@
 
 import static org.apache.juneau.rest.RestContext.*;
 import static org.apache.juneau.rest.util.RestUtils.*;
+import static org.apache.juneau.internal.CollectionUtils.*;
 
 import java.util.logging.*;
 
@@ -162,9 +163,14 @@
 		if (isNotEmpty(s))
 			psb.set(REST_uriResolution, s);
 
-		for (String mapping : a.staticFiles())
-			if (isNotEmpty(mapping))
-				psb.addTo(REST_staticFiles, new StaticFileMapping(c.inner(), string(mapping)));
+		for (String mapping : a.staticFiles()) {
+			try {
+				for (StaticFileMapping sfm : reverseIterable(StaticFileMapping.parse(c.inner(), string(mapping))))
+					psb.addTo(REST_staticFiles, sfm);
+			} catch (ParseException e) {
+				throw new ConfigException(e, "Invalid @Resource(staticFiles) value on class ''{0}''", c);
+			}
+		}
 
 		if (! a.messages().isEmpty())
 			psb.addTo(REST_messages, new MessageBundleLocation(c.inner(), string(a.messages())));
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Introspectable.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Introspectable.java
index 6032624..65e9978 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Introspectable.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Introspectable.java
@@ -15,7 +15,7 @@
 import org.apache.juneau.*;

 import org.apache.juneau.json.*;

 import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.transform.*;

 import org.apache.juneau.utils.*;

 

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Traversable.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Traversable.java
index d53d381..b87e4fb 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Traversable.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/converters/Traversable.java
@@ -12,9 +12,11 @@
 // ***************************************************************************************************************************

 package org.apache.juneau.rest.converters;

 

+import static org.apache.juneau.rest.HttpRuntimeException.*;

+

 import org.apache.juneau.*;

 import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.transform.*;

 import org.apache.juneau.utils.*;

 

@@ -50,7 +52,7 @@
 

 	@Override /* RestConverter */

 	@SuppressWarnings({"rawtypes", "unchecked"})

-	public Object convert(RestRequest req, Object o) throws RestException, InternalServerError {

+	public Object convert(RestRequest req, Object o) throws HttpException, InternalServerError {

 		if (o == null)

 			return null;

 

@@ -65,9 +67,9 @@
 				PojoRest p = new PojoRest(o, req.getBody().getReaderParser());

 				o = p.get(pathRemainder);

 			} catch (PojoRestException e) {

-				throw new RestException(e, e.getStatus());

-			} catch (Exception e) {

-				throw new InternalServerError(e);

+				throw new HttpException(e, e.getStatus());

+			} catch (Throwable t) {

+				throw toHttpException(t, InternalServerError.class);

 			}

 		}

 

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/BadRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/BadRequest.java
index e602da1..c740fa7 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/BadRequest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/BadRequest.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing).
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.BadRequest}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class BadRequest extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Conflict.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Conflict.java
index c7f89de..36bcbe3 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Conflict.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Conflict.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * Indicates that the request could not be processed because of conflict in the request, such as an edit conflict between multiple simultaneous updates.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.Conflict}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Conflict extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/ExpectationFailed.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/ExpectationFailed.java
index 75ae1fe..087ebfd 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/ExpectationFailed.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/ExpectationFailed.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The server cannot meet the requirements of the Expect request-header field.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.ExpectationFailed}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class ExpectationFailed extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/FailedDependency.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/FailedDependency.java
index 45b1662..e646bfa 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/FailedDependency.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/FailedDependency.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The request failed because it depended on another request and that request failed (e.g., a PROPPATCH).
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.FailedDependency}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class FailedDependency extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Forbidden.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Forbidden.java
index 14f37b3..1e43801 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Forbidden.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Forbidden.java
@@ -25,8 +25,11 @@
  * <p>
  * The request was valid, but the server is refusing action.
  * <br>The user might not have the necessary permissions for a resource, or may need an account of some sort.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.Forbidden}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Forbidden extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Gone.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Gone.java
index 913b841..8224ac1 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Gone.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Gone.java
@@ -28,8 +28,11 @@
  * <br>Upon receiving a 410 status code, the client should not request the resource in the future.
  * <br>Clients such as search engines should remove the resource from their indices.
  * <br>Most use cases do not require clients and search engines to purge the resource, and a <js>"404 Not Found"</js> may be used instead.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.Gone}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Gone extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/HttpVersionNotSupported.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/HttpVersionNotSupported.java
index 6941eef..035647c 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/HttpVersionNotSupported.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/HttpVersionNotSupported.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The server does not support the HTTP protocol version used in the request.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.HttpVersionNotSupported}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class HttpVersionNotSupported extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/InsufficientStorage.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/InsufficientStorage.java
index d7a68a6..ce6b6a5 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/InsufficientStorage.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/InsufficientStorage.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The server is unable to store the representation needed to complete the request.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.InsufficientStorage}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class InsufficientStorage extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/InternalServerError.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/InternalServerError.java
index 611f6b6..2536d01 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/InternalServerError.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/InternalServerError.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.InternalServerError}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class InternalServerError extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/LengthRequired.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/LengthRequired.java
index c9b9423..1fc808a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/LengthRequired.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/LengthRequired.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The request did not specify the length of its content, which is required by the requested resource.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.LengthRequired}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class LengthRequired extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Locked.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Locked.java
index 77e88d9..bc0beb6 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Locked.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Locked.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The resource that is being accessed is locked.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.Locked}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Locked extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/LoopDetected.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/LoopDetected.java
index bab0e28..d6fc64b 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/LoopDetected.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/LoopDetected.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The server detected an infinite loop while processing the request (sent in lieu of 208 Already Reported).
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.LoopDetected}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class LoopDetected extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/MethodNotAllowed.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/MethodNotAllowed.java
index 30e599f..ac2c066 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/MethodNotAllowed.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/MethodNotAllowed.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * A request method is not supported for the requested resource; for example, a GET request on a form that requires data to be presented via POST, or a PUT request on a read-only resource.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.MethodNotAllowed}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class MethodNotAllowed extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/MisdirectedRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/MisdirectedRequest.java
index 9a6f247..eb48ae6 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/MisdirectedRequest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/MisdirectedRequest.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The request was directed at a server that is not able to produce a response (for example because of connection reuse).
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.MisdirectedRequest}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class MisdirectedRequest extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NetworkAuthenticationRequired.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NetworkAuthenticationRequired.java
index 3a86d42..a0c3940 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NetworkAuthenticationRequired.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NetworkAuthenticationRequired.java
@@ -25,8 +25,11 @@
  * <p>
  * The client needs to authenticate to gain network access.
  * <br>Intended for use by intercepting proxies used to control access to the network (e.g., "captive portals" used to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot).
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.NetworkAuthenticationRequired}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class NetworkAuthenticationRequired extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotAcceptable.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotAcceptable.java
index f660260..a7b1f61 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotAcceptable.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotAcceptable.java
@@ -24,8 +24,11 @@
  *
  * <br>
  * The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.NotAcceptable}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class NotAcceptable extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotExtended.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotExtended.java
index 258c44c..4b70dea 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotExtended.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotExtended.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * Further extensions to the request are required for the server to fulfill it.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.NotExtended}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class NotExtended extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotFound.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotFound.java
index ef31fc7..aaece07 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotFound.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotFound.java
@@ -25,8 +25,11 @@
  * <p>
  * The requested resource could not be found but may be available in the future.
  * <br>Subsequent requests by the client are permissible.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.NotFound}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class NotFound extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotImplemented.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotImplemented.java
index f4beee8..b55b9f5 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotImplemented.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/NotImplemented.java
@@ -25,8 +25,11 @@
  * <p>
  * The server either does not recognize the request method, or it lacks the ability to fulfill the request.
  * <br>Usually this implies future availability (e.g., a new feature of a web-service API).
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.NotImplemented}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class NotImplemented extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PayloadTooLarge.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PayloadTooLarge.java
index 1c07102..4a1a077 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PayloadTooLarge.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PayloadTooLarge.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The request is larger than the server is willing or able to process.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.PayloadTooLarge}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class PayloadTooLarge extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PreconditionFailed.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PreconditionFailed.java
index b71e619..b322b46 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PreconditionFailed.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PreconditionFailed.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The server does not meet one of the preconditions that the requester put on the request.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.PreconditionFailed}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class PreconditionFailed extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PreconditionRequired.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PreconditionRequired.java
index 4ff9e67..adec191 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PreconditionRequired.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/PreconditionRequired.java
@@ -25,8 +25,11 @@
  * <p>
  * The origin server requires the request to be conditional.
  * <br>Intended to prevent the 'lost update' problem, where a client GETs a resource's state, modifies it, and PUTs it back to the server, when meanwhile a third party has modified the state on the server, leading to a conflict.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.PreconditionRequired}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class PreconditionRequired extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/RangeNotSatisfiable.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/RangeNotSatisfiable.java
index bd33119..0abccd9 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/RangeNotSatisfiable.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/RangeNotSatisfiable.java
@@ -25,8 +25,11 @@
  * <p>
  * The client has asked for a portion of the file (byte serving), but the server cannot supply that portion.
  * <br>For example, if the client asked for a part of the file that lies beyond the end of the file.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.RangeNotSatisfiable}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class RangeNotSatisfiable extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/RequestHeaderFieldsTooLarge.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/RequestHeaderFieldsTooLarge.java
index 6a7db7b..584dba1 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/RequestHeaderFieldsTooLarge.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/RequestHeaderFieldsTooLarge.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.RequestHeaderFieldsTooLarge}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class RequestHeaderFieldsTooLarge extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/ServiceUnavailable.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/ServiceUnavailable.java
index da6ab5c..2f0def1 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/ServiceUnavailable.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/ServiceUnavailable.java
@@ -25,8 +25,11 @@
  * <p>
  * The server is currently unavailable (because it is overloaded or down for maintenance).
  * <br>Generally, this is a temporary state.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.ServiceUnavailable}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class ServiceUnavailable extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/TooManyRequests.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/TooManyRequests.java
index f9aad6f..bc1ffc4 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/TooManyRequests.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/TooManyRequests.java
@@ -25,8 +25,11 @@
  * <p>
  * The user has sent too many requests in a given amount of time.
  * <br>Intended for use with rate-limiting schemes.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.TooManyRequests}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class TooManyRequests extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Unauthorized.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Unauthorized.java
index e0268c7..4740351 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Unauthorized.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/Unauthorized.java
@@ -27,8 +27,11 @@
  * <br>The response must include a WWW-Authenticate header field containing a challenge applicable to the requested resource.
  * <br>401 semantically means "unauthenticated",i.e. the user does not have the necessary credentials.
  * <br>Note: Some sites issue HTTP 401 when an IP address is banned from the website (usually the website domain) and that specific address is refused permission to access a website.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.Unauthorized}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Unauthorized extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnavailableForLegalReasons.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnavailableForLegalReasons.java
index bab333c..acbe0c2 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnavailableForLegalReasons.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnavailableForLegalReasons.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * A server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.UnavailableForLegalReasons}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class UnavailableForLegalReasons extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnprocessableEntity.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnprocessableEntity.java
index af9873f..ce0c486 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnprocessableEntity.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnprocessableEntity.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The request was well-formed but was unable to be followed due to semantic errors.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.UnprocessableEntity}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class UnprocessableEntity extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnsupportedMediaType.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnsupportedMediaType.java
index ba7619e..e6d459e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnsupportedMediaType.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UnsupportedMediaType.java
@@ -25,8 +25,11 @@
  * <p>
  * The request entity has a media type which the server or resource does not support.
  * <br>For example, the client uploads an image as image/svg+xml, but the server requires that images use a different format.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.UnsupportedMediaType}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class UnsupportedMediaType extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UpgradeRequired.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UpgradeRequired.java
index 9a263fd..6e4bbdb 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UpgradeRequired.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UpgradeRequired.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.UpgradeRequired}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class UpgradeRequired extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UriTooLong.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UriTooLong.java
index 38ae3f8..e0ec91e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UriTooLong.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/UriTooLong.java
@@ -25,8 +25,11 @@
  * <p>
  * The URI provided was too long for the server to process.
  * <br>Often the result of too much data being encoded as a query-string of a GET request, in which case it should be converted to a POST request.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.UriTooLong}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class UriTooLong extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/VariantAlsoNegotiates.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/VariantAlsoNegotiates.java
index cba550a..af609c9 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/VariantAlsoNegotiates.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/exception/VariantAlsoNegotiates.java
@@ -24,8 +24,11 @@
  *
  * <p>
  * Transparent content negotiation for the request results in a circular reference.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.exception.VariantAlsoNegotiates}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class VariantAlsoNegotiates extends RestException {
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guards/RoleBasedRestGuard.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guards/RoleBasedRestGuard.java
index 683ddb4..1c22a80 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guards/RoleBasedRestGuard.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guards/RoleBasedRestGuard.java
@@ -29,8 +29,8 @@
  * 	<li><js>"foo | bar | bqz"</js> - Multiple OR'ed arguments, pipe syntax.
  * 	<li><js>"foo || bar || bqz"</js> - Multiple OR'ed arguments, Java-OR syntax.
  * 	<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.
- * 	<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
- * 	<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
+ * 	<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
+ * 	<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
  * 	<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.
  * </ul>
  *
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guards/RoleMatcher.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guards/RoleMatcher.java
index 943d37a..0f0e704 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guards/RoleMatcher.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guards/RoleMatcher.java
@@ -31,8 +31,8 @@
  * 	<li><js>"foo | bar | bqz"</js> - Multiple OR'ed arguments, pipe syntax.
  * 	<li><js>"foo || bar || bqz"</js> - Multiple OR'ed arguments, Java-OR syntax.
  * 	<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.
- * 	<li><js>"fo* & *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
- * 	<li><js>"fo* && *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
+ * 	<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
+ * 	<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
  * 	<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.
  * </ul>
  *
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/SeeOtherRoot.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/SeeOtherRoot.java
index 897043f..4d9aec2 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/SeeOtherRoot.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/SeeOtherRoot.java
@@ -15,7 +15,7 @@
 import java.net.*;
 
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.response.*;
+import org.apache.juneau.http.response.*;
 
 /**
  * Convenience subclass of {@link SeeOther} for redirecting a response to the servlet root.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remote/RrpcServlet.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remote/RrpcServlet.java
index 4cdbfe5..f8f7122 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remote/RrpcServlet.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remote/RrpcServlet.java
@@ -33,7 +33,7 @@
 import org.apache.juneau.remote.*;

 import org.apache.juneau.rest.*;

 import org.apache.juneau.rest.annotation.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 

 /**

  * Abstract class for defining Remote Interface Services.

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
index cc5ee69..e0f9a71 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
@@ -25,7 +25,7 @@
 import org.apache.juneau.httppart.bean.*;

 import org.apache.juneau.internal.*;

 import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.rest.util.FinishablePrintWriter;

 import org.apache.juneau.rest.util.FinishableServletOutputStream;

 import org.apache.juneau.serializer.*;

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
index aefb0b1..7e835dd 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
@@ -15,7 +15,7 @@
 import java.io.*;

 

 import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.utils.*;

 

 /**

@@ -34,7 +34,7 @@
 public final class InputStreamHandler implements ResponseHandler {

 

 	@Override /* ResponseHandler */

-	public boolean handle(RestRequest req, RestResponse res) throws IOException, NotAcceptable, RestException {

+	public boolean handle(RestRequest req, RestResponse res) throws IOException, NotAcceptable, HttpException {

 		if (res.isOutputType(InputStream.class)) {

 			res.setHeader("Content-Type", res.getContentType());

 			try (OutputStream os = res.getNegotiatedOutputStream()) {

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
index b7f4b3b..703bb0e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
@@ -15,7 +15,7 @@
 import java.io.*;

 

 import org.apache.juneau.rest.*;

-import org.apache.juneau.rest.exception.*;

+import org.apache.juneau.http.exception.*;

 import org.apache.juneau.utils.*;

 

 /**

@@ -31,7 +31,7 @@
 public final class ReaderHandler implements ResponseHandler {

 

 	@Override /* ResponseHandler */

-	public boolean handle(RestRequest req, RestResponse res) throws IOException, NotAcceptable, RestException {

+	public boolean handle(RestRequest req, RestResponse res) throws IOException, NotAcceptable, HttpException {

 		if (res.isOutputType(Reader.class)) {

 			try (Writer w = res.getNegotiatedWriter()) {

 				IOPipe.create(res.getOutput(Reader.class), w).run();

diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Accepted.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Accepted.java
index 1cfb2f5..8faa2a9 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Accepted.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Accepted.java
@@ -22,8 +22,11 @@
  * <p>
  * The request has been accepted for processing, but the processing has not been completed.
  * The request might or might not be eventually acted upon, and may be disallowed when processing occurs.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.Accepted}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Accepted extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/AlreadyReported.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/AlreadyReported.java
index 8ca68e8..ef5da10 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/AlreadyReported.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/AlreadyReported.java
@@ -21,8 +21,11 @@
  *
  * <p>
  * The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, and are not being included again.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.AlreadyReported}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class AlreadyReported extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Continue.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Continue.java
index d551b3c..e734c31 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Continue.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Continue.java
@@ -25,8 +25,11 @@
  * To have a server check the request's headers, a client must send Expect: 100-continue as a header in its initial request and receive a 100 Continue status code in response before sending the body.
  * If the client receives an error code such as 403 (Forbidden) or 405 (Method Not Allowed) then it shouldn't send the request's body.
  * The response 417 Expectation Failed indicates that the request should be repeated without the Expect header as it indicates that the server doesn't support expectations (this is the case, for example, of HTTP/1.0 servers).
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.Continue}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Continue extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Created.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Created.java
index 0fbb45a..8c09e9e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Created.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Created.java
@@ -21,8 +21,11 @@
  *
  * <p>
  * The request has been fulfilled, resulting in the creation of a new resource.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.Created}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Created extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/EarlyHints.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/EarlyHints.java
index 98c36e7..daca7d6 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/EarlyHints.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/EarlyHints.java
@@ -21,8 +21,11 @@
  *
  * <p>
  * Used to return some response headers before final HTTP message.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.EarlyHints}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class EarlyHints extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Found.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Found.java
index c01066f..2691f11 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Found.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Found.java
@@ -28,9 +28,12 @@
  * The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect (the original describing phrase was "Moved Temporarily"), but popular browsers implemented 302 with the functionality of a 303 See Other.
  * Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviours.
  * However, some Web applications and frameworks use the 302 status code as if it were the 303.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.Found}
  */
 @Response(code=CODE, description=MESSAGE)
 @BeanIgnore
+@Deprecated
 public class Found extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/HttpResponse.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/HttpResponse.java
index f276a1b..f36a38f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/HttpResponse.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/HttpResponse.java
@@ -19,8 +19,11 @@
  *
  * <p>
  * Consists simply of a simple string message.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.HttpResponse}
  */
 @Response
+@Deprecated
 public abstract class HttpResponse {
 
 	private final String message;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/IMUsed.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/IMUsed.java
index 0300590..ac12e0f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/IMUsed.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/IMUsed.java
@@ -21,8 +21,11 @@
  *
  * <p>
  * The server has fulfilled a request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.IMUsed}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class IMUsed extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MovedPermanently.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MovedPermanently.java
index 32ec695..cb4816b 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MovedPermanently.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MovedPermanently.java
@@ -24,9 +24,12 @@
  *
  * <p>
  * This and all future requests should be directed to the given URI.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.MovedPermanently}
  */
 @Response(code=CODE, description=MESSAGE)
 @BeanIgnore
+@Deprecated
 public class MovedPermanently extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MultiStatus.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MultiStatus.java
index fdecc73..193aeb6 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MultiStatus.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MultiStatus.java
@@ -21,8 +21,11 @@
  *
  * <p>
  * The message body that follows is by default an XML message and can contain a number of separate response codes, depending on how many sub-requests were made.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.MultiStatus}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class MultiStatus extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MultipleChoices.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MultipleChoices.java
index e7e1a31..e80b956 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MultipleChoices.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/MultipleChoices.java
@@ -22,8 +22,11 @@
  * <p>
  * Indicates multiple options for the resource from which the client may choose (via agent-driven content negotiation).
  * For example, this code could be used to present multiple video format options, to list files with different filename extensions, or to suggest word-sense disambiguation.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.MultipleChoices}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class MultipleChoices extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NoContent.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NoContent.java
index 55dee7e..059fe9e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NoContent.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NoContent.java
@@ -21,8 +21,11 @@
  *
  * <p>
  * The server successfully processed the request and is not returning any content.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.NoContent}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class NoContent extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NonAuthoritiveInformation.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NonAuthoritiveInformation.java
index 1945e40..dc784d2 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NonAuthoritiveInformation.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NonAuthoritiveInformation.java
@@ -21,8 +21,11 @@
  *
  * <p>
  * The server is a transforming proxy (e.g. a Web accelerator) that received a 200 OK from its origin, but is returning a modified version of the origin's response.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.NonAuthoritiveInformation}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class NonAuthoritiveInformation extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NotModified.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NotModified.java
index ec57653..4797941 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NotModified.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/NotModified.java
@@ -22,8 +22,11 @@
  * <p>
  * Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match.
  * In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.NotModified}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class NotModified extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Ok.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Ok.java
index e14df24..054e57f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Ok.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Ok.java
@@ -23,8 +23,11 @@
  * Standard response for successful HTTP requests. The actual response will depend on the request method used.
  * In a GET request, the response will contain an entity corresponding to the requested resource.
  * In a POST request, the response will contain an entity describing or containing the result of the action.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.Ok}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Ok extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/PartialContent.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/PartialContent.java
index eb7020b..d0afd4c 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/PartialContent.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/PartialContent.java
@@ -22,8 +22,11 @@
  * <p>
  * The server is delivering only part of the resource (byte serving) due to a range header sent by the client.
  * The range header is used by HTTP clients to enable resuming of interrupted downloads, or split a download into multiple simultaneous streams.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.PartialContent}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class PartialContent extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/PermanentRedirect.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/PermanentRedirect.java
index b155ffb..8155b2c 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/PermanentRedirect.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/PermanentRedirect.java
@@ -25,9 +25,12 @@
  * <p>
  * The request and all future requests should be repeated using another URI. 307 and 308 parallel the behaviors of 302 and 301, but do not allow the HTTP method to change.
  * So, for example, submitting a form to a permanently redirected resource may continue smoothly.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.PermanentRedirect}
  */
 @Response(code=CODE, description=MESSAGE)
 @BeanIgnore
+@Deprecated
 public class PermanentRedirect extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Processing.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Processing.java
index e26cad3..457790a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Processing.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/Processing.java
@@ -23,8 +23,11 @@
  * A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request.
  * This code indicates that the server has received and is processing the request, but no response is available yet.
  * This prevents the client from timing out and assuming the request was lost.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.Processing}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class Processing extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/ResetContent.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/ResetContent.java
index 76a2cbf..7ff7f25 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/ResetContent.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/ResetContent.java
@@ -22,8 +22,11 @@
  * <p>
  * The server successfully processed the request, but is not returning any content.
  * Unlike a 204 response, this response requires that the requester reset the document view.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.ResetContent}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class ResetContent extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/SeeOther.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/SeeOther.java
index 2c65e02..68828bd 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/SeeOther.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/SeeOther.java
@@ -27,9 +27,12 @@
  * <p>
  * The response to the request can be found under another URI using the GET method.
  * When received in response to a POST (or PUT/DELETE), the client should presume that the server has received the data and should issue a new GET request to the given URI.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.SeeOther}
  */
 @Response(code=CODE, description=MESSAGE)
 @BeanIgnore
+@Deprecated
 public class SeeOther extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/SwitchingProtocols.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/SwitchingProtocols.java
index 611c2ec..ebd4431 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/SwitchingProtocols.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/SwitchingProtocols.java
@@ -21,8 +21,11 @@
  *
  * <p>
  * The requester has asked the server to switch protocols and the server has agreed to do so.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.SwitchingProtocols}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class SwitchingProtocols extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/TemporaryRedirect.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/TemporaryRedirect.java
index 12a4dbe..9fcaba6 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/TemporaryRedirect.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/TemporaryRedirect.java
@@ -26,9 +26,12 @@
  * In this case, the request should be repeated with another URI; however, future requests should still use the original URI.
  * In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request.
  * For example, a POST request should be repeated using another POST request.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.TemporaryRedirect}
  */
 @Response(code=CODE, description=MESSAGE)
 @BeanIgnore
+@Deprecated
 public class TemporaryRedirect extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/UseProxy.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/UseProxy.java
index b89b26c..837a601 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/UseProxy.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/response/UseProxy.java
@@ -22,8 +22,11 @@
  * <p>
  * The requested resource is available only through a proxy, the address for which is provided in the response.
  * Many HTTP clients (such as Mozilla and Internet Explorer) do not correctly handle responses with this status code, primarily for security reasons.
+ *
+ * @deprecated Use {@link org.apache.juneau.http.response.UseProxy}
  */
 @Response(code=CODE, description=MESSAGE)
+@Deprecated
 public class UseProxy extends HttpResponse {
 
 	/** HTTP status code */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RestInfoVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RestInfoVar.java
index 0dcdd50..4820063 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RestInfoVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RestInfoVar.java
@@ -12,6 +12,8 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.vars;
 
+import static org.apache.juneau.rest.HttpRuntimeException.*;
+
 import java.lang.reflect.*;
 import java.util.*;
 
@@ -19,7 +21,7 @@
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.exception.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 
@@ -92,7 +94,7 @@
 	}
 
 	@Override /* Var */
-	public String resolve(VarResolverSession session, String key) throws RestException, InternalServerError {
+	public String resolve(VarResolverSession session, String key) throws HttpException, InternalServerError {
 		try {
 			RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 			Swagger swagger = req.getSwagger();
@@ -139,10 +141,8 @@
 					return swagger.getInfo().getVersion();
 			}
 			return null;
-		} catch (RestException e) {
-			throw e;
 		} catch (Exception e) {
-			throw new InternalServerError(e);
+			throw toHttpException(e, InternalServerError.class);
 		}
 	}
 
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/images/asf.png b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/images/asf.png
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/images/asf.png
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/images/asf.png
Binary files differ
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/images/juneau.png b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/images/juneau.png
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/images/juneau.png
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/images/juneau.png
Binary files differ
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/styles/SwaggerUI.css b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/styles/SwaggerUI.css
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/styles/SwaggerUI.css
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/styles/SwaggerUI.css
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/dark.css b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/dark.css
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/dark.css
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/dark.css
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/light.css b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/light.css
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/light.css
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/light.css
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/original.css b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/original.css
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/original.css
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/original.css
diff --git a/juneau-rest/pom.xml b/juneau-rest/pom.xml
index feabb23..266cee4 100644
--- a/juneau-rest/pom.xml
+++ b/juneau-rest/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-rest</artifactId>
diff --git a/juneau-sc/juneau-sc-client/pom.xml b/juneau-sc/juneau-sc-client/pom.xml
index 5d99ed4..b88271d 100644
--- a/juneau-sc/juneau-sc-client/pom.xml
+++ b/juneau-sc/juneau-sc-client/pom.xml
@@ -24,7 +24,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-sc</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<properties>
diff --git a/juneau-sc/juneau-sc-server/pom.xml b/juneau-sc/juneau-sc-server/pom.xml
index 96d52bb..1d800f4 100644
--- a/juneau-sc/juneau-sc-server/pom.xml
+++ b/juneau-sc/juneau-sc-server/pom.xml
@@ -24,7 +24,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau-sc</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<properties>
diff --git a/juneau-sc/pom.xml b/juneau-sc/pom.xml
index bf10b87..786ea65 100644
--- a/juneau-sc/pom.xml
+++ b/juneau-sc/pom.xml
@@ -20,7 +20,7 @@
 	<parent>
 		<groupId>org.apache.juneau</groupId>
 		<artifactId>juneau</artifactId>
-		<version>8.1.1-SNAPSHOT</version>
+		<version>8.1.2-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>juneau-sc</artifactId>
diff --git a/launches/juneau-env.sh b/launches/juneau-env.sh
index 3887af2..65e1dde 100755
--- a/launches/juneau-env.sh
+++ b/launches/juneau-env.sh
@@ -13,5 +13,5 @@
 
 . ~/.profile
 set -e
-export JUNEAU_VERSION=8.1.0
+export JUNEAU_VERSION=8.1.1
 [ -z "$X_VERSION" ] && export X_VERSION="${JUNEAU_VERSION}-SNAPSHOT"
diff --git a/pom.xml b/pom.xml
index 693b68e..e8963c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,7 +19,7 @@
 
 	<groupId>org.apache.juneau</groupId>
 	<artifactId>juneau</artifactId>
-	<version>8.1.1-SNAPSHOT</version>
+	<version>8.1.2-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>Apache Juneau</name>
 	<description>All the Apache Juneau content in one convenient package.</description>