JUNEAU-169 Dynamic annotations.
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/PropertyStoreTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/PropertyStoreTest.java
index d879947..04f8758 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/PropertyStoreTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/PropertyStoreTest.java
@@ -17,6 +17,7 @@
 

 import java.util.*;

 

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

 import org.apache.juneau.html.annotation.*;

 import org.apache.juneau.json.annotation.*;

 import org.apache.juneau.utils.*;

@@ -1794,6 +1795,23 @@
 	@Json(on="foo")

 	public static class A4 {}

 

+	@Test

+	public void testEqualsWithAnnotations() {

+		HtmlSerializer

+			s1 = HtmlSerializer.create().build(),

+			s2 = HtmlSerializer.create().applyAnnotations(B1.class).build(),

+			s3 = HtmlSerializer.create().applyAnnotations(B1.class).build(),

+			s4 = HtmlSerializer.create().applyAnnotations(B2.class).build();

+		assertFalse(s1.getPropertyStore().equals(s2.getPropertyStore()));

+		assertFalse(s1.getPropertyStore().equals(s4.getPropertyStore()));

+		assertTrue(s2.getPropertyStore().equals(s3.getPropertyStore()));

+	}

+

+	@HtmlConfig(annotateHtml={@Html(on="B1", format=HtmlFormat.XML)})

+	public static class B1 {}

+	@HtmlConfig(annotateHtml={@Html(on="B2", format=HtmlFormat.HTML)})

+	public static class B2 {}

+

 	//-------------------------------------------------------------------------------------------------------------------

 	// Utility methods

 	//-------------------------------------------------------------------------------------------------------------------

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java
index 918c67c..ae9810b 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java
@@ -38,8 +38,10 @@
 @SuppressWarnings({"unchecked","serial"})

 public class RoundTripBeanMapsTest extends RoundTripTest {

 

+	static Class<?>[] ANNOTATED_CLASSES={L2.class, M2.class};

+

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

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

+		super(label, s.applyAnnotations(ANNOTATED_CLASSES), p == null ? null : p.applyAnnotations(ANNOTATED_CLASSES), flags);

 	}

 

 	@Override /* RoundTripTest */

@@ -927,6 +929,27 @@
 		}

 	}

 

+	@Test

+	public void testWrapperAttrAnnotationOnBean_usingConfig() throws Exception {

+		L2 t = L2.create();

+		t = roundTrip(t, L2.class);

+

+		Map<String,L2> m = new LinkedHashMap<>();

+		m.put("bar", L2.create());

+		roundTrip(m, LinkedHashMap.class, String.class, L2.class);

+	}

+

+	@JsonConfig(annotateJson=@Json(on="L2",wrapperAttr="foo"))

+	public static class L2 {

+		public int f1;

+

+		static L2 create() {

+			L2 l = new L2();

+			l.f1 = 1;

+			return l;

+		}

+	}

+

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

 	// testWrapperAttrAnnotationOnNonBean

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

@@ -962,6 +985,38 @@
 		}

 	}

 

+	@Test

+	public void testWrapperAttrAnnotationOnNonBean_usingConfig() throws Exception {

+		M2 t = M2.create();

+		t = roundTrip(t, M2.class);

+

+		Map<String,M2> m = new LinkedHashMap<>();

+		m.put("bar", M2.create());

+		roundTrip(m, LinkedHashMap.class, String.class, M2.class);

+	}

+

+	@JsonConfig(annotateJson=@Json(on="M2",wrapperAttr="foo"))

+	public static class M2 {

+		int f1;

+

+		static M2 create() {

+			M2 m = new M2();

+			m.f1 = 1;

+			return m;

+		}

+

+		@Override /* Object */

+		public String toString() {

+			return String.valueOf(f1);

+		}

+

+		public static M2 valueOf(String s) {

+			M2 m = new M2();

+			m.f1 = Integer.parseInt(s);

+			return m;

+		}

+	}

+

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

 	// testBeanPropertyWithBeanWithAttrsField

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

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/BasicHtmlTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/BasicHtmlTest.java
index e1fbcdc..605e3a2 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/BasicHtmlTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/BasicHtmlTest.java
@@ -31,11 +31,14 @@
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 public class BasicHtmlTest {
 
+	private static final Class<?>[] ANNOTATED_CLASSES = {
+		BeanWithWhitespaceTextFields2.class, BeanWithWhitespaceTextPwsFields2.class, BeanWithWhitespaceMixedFields2.class, BeanWithWhitespaceMixedPwsFields2.class
+	};
 	private static final HtmlSerializer
-		s1 = HtmlSerializer.DEFAULT_SQ.builder().addRootType().build(),
-		s2 = HtmlSerializer.DEFAULT_SQ_READABLE.builder().addRootType().build(),
-		s3 = HtmlSerializer.DEFAULT_SQ.builder().build();
-	private static final HtmlParser parser = HtmlParser.DEFAULT;
+		s1 = HtmlSerializer.DEFAULT_SQ.builder().addRootType().applyAnnotations(ANNOTATED_CLASSES).build(),
+		s2 = HtmlSerializer.DEFAULT_SQ_READABLE.builder().addRootType().applyAnnotations(ANNOTATED_CLASSES).build(),
+		s3 = HtmlSerializer.DEFAULT_SQ.builder().applyAnnotations(ANNOTATED_CLASSES).build();
+	private static final HtmlParser parser = HtmlParser.DEFAULT.builder().applyAnnotations(ANNOTATED_CLASSES).build();
 
 	@Parameterized.Parameters
 	public static Collection<Object[]> getParameters() {
@@ -2521,6 +2524,358 @@
 					}
 				}
 			},
+			{	/* 56 */
+				new Input<BeanWithWhitespaceTextFields2>(
+					"BeanWithWhitespaceTextFields2-1",
+					BeanWithWhitespaceTextFields2.class,
+					new BeanWithWhitespaceTextFields2().init(null),
+					"<object nil='true'></object>",
+					"<object nil='true'>\n</object>\n",
+					"<object nil='true'></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextFields2.class, o);
+					}
+				}
+			},
+			{	/* 57 */
+				new Input<BeanWithWhitespaceTextFields2>(
+					"BeanWithWhitespaceTextFields2-2",
+					BeanWithWhitespaceTextFields2.class,
+					new BeanWithWhitespaceTextFields2().init(""),
+					"<object><sp/></object>",
+					"<object><sp/></object>\n",
+					"<object><sp/></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextFields2.class, o);
+					}
+				}
+			},
+			{	/* 58 */
+				new Input<BeanWithWhitespaceTextFields2>(
+					"BeanWithWhitespaceTextFields2-3",
+					BeanWithWhitespaceTextFields2.class,
+					new BeanWithWhitespaceTextFields2().init(" "),
+					"<object><sp> </sp></object>",
+					"<object><sp> </sp></object>\n",
+					"<object><sp> </sp></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextFields2.class, o);
+					}
+				}
+			},
+			{	/* 59 */
+				new Input<BeanWithWhitespaceTextFields2>(
+					"BeanWithWhitespaceTextFields2-4",
+					BeanWithWhitespaceTextFields2.class,
+					new BeanWithWhitespaceTextFields2().init("  "),
+					"<object><sp> </sp><sp> </sp></object>",
+					"<object><sp> </sp><sp> </sp></object>\n",
+					"<object><sp> </sp><sp> </sp></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextFields2.class, o);
+					}
+				}
+			},
+			{	/* 60 */
+				new Input<BeanWithWhitespaceTextFields2>(
+					"BeanWithWhitespaceTextFields2-5",
+					BeanWithWhitespaceTextFields2.class,
+					new BeanWithWhitespaceTextFields2().init("  foobar  "),
+					"<object><sp> </sp> foobar <sp> </sp></object>",
+					"<object><sp> </sp> foobar <sp> </sp></object>\n",
+					"<object><sp> </sp> foobar <sp> </sp></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextFields2.class, o);
+					}
+				}
+			},
+			{	/* 61 */
+				new Input<BeanWithWhitespaceTextPwsFields2>(
+					"BeanWithWhitespaceTextPwsFields2-1",
+					BeanWithWhitespaceTextPwsFields2.class,
+					new BeanWithWhitespaceTextPwsFields2().init(null),
+					"<object nil='true'></object>",
+					"<object nil='true'>\n</object>\n",
+					"<object nil='true'></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 62 */
+				new Input<BeanWithWhitespaceTextPwsFields2>(
+					"BeanWithWhitespaceTextPwsFields2-2",
+					BeanWithWhitespaceTextPwsFields2.class,
+					new BeanWithWhitespaceTextPwsFields2().init(""),
+					"<object><sp/></object>",
+					"<object><sp/></object>\n",
+					"<object><sp/></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 63 */
+				new Input<BeanWithWhitespaceTextPwsFields2>(
+					"BeanWithWhitespaceTextPwsFields2-3",
+					BeanWithWhitespaceTextPwsFields2.class,
+					new BeanWithWhitespaceTextPwsFields2().init(" "),
+					"<object> </object>",
+					"<object> </object>\n",
+					"<object> </object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 64 */
+				new Input<BeanWithWhitespaceTextPwsFields2>(
+					"BeanWithWhitespaceTextPwsFields2-4",
+					BeanWithWhitespaceTextPwsFields2.class,
+					new BeanWithWhitespaceTextPwsFields2().init("  "),
+					"<object>  </object>",
+					"<object>  </object>\n",
+					"<object>  </object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 65 */
+				new Input<BeanWithWhitespaceTextPwsFields2>(
+					"BeanWithWhitespaceTextPwsFields2-5",
+					BeanWithWhitespaceTextPwsFields2.class,
+					new BeanWithWhitespaceTextPwsFields2().init("  foobar  "),
+					"<object>  foobar  </object>",
+					"<object>  foobar  </object>\n",
+					"<object>  foobar  </object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceTextPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceTextPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 66 */
+				new Input<BeanWithWhitespaceMixedFields2>(
+					"BeanWithWhitespaceMixedFields2-1",
+					BeanWithWhitespaceMixedFields2.class,
+					new BeanWithWhitespaceMixedFields2().init(null),
+					"<object nil='true'></object>",
+					"<object nil='true'>\n</object>\n",
+					"<object nil='true'></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedFields2.class, o);
+					}
+				}
+			},
+			{	/* 67 */
+				new Input<BeanWithWhitespaceMixedFields2>(
+					"BeanWithWhitespaceMixedFields2-2",
+					BeanWithWhitespaceMixedFields2.class,
+					new BeanWithWhitespaceMixedFields2().init(new String[0]),
+					"<object></object>",
+					"<object></object>\n",
+					"<object></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedFields2.class, o);
+					}
+				}
+			},
+			{	/* 68 */
+				new Input<BeanWithWhitespaceMixedFields2>(
+					"BeanWithWhitespaceMixedFields2-3",
+					BeanWithWhitespaceMixedFields2.class,
+					new BeanWithWhitespaceMixedFields2().init(new String[]{""}),
+					"<object><sp/></object>",
+					"<object><sp/></object>\n",
+					"<object><sp/></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedFields2.class, o);
+					}
+				}
+			},
+			{	/* 69 */
+				new Input<BeanWithWhitespaceMixedFields2>(
+					"BeanWithWhitespaceMixedFields2-4",
+					BeanWithWhitespaceMixedFields2.class,
+					new BeanWithWhitespaceMixedFields2().init(new String[]{" "}),
+					"<object><sp> </sp></object>",
+					"<object><sp> </sp></object>\n",
+					"<object><sp> </sp></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedFields2.class, o);
+					}
+				}
+			},
+			{	/* 70 */
+				new Input<BeanWithWhitespaceMixedFields2>(
+					"BeanWithWhitespaceMixedFields2-5",
+					BeanWithWhitespaceMixedFields2.class,
+					new BeanWithWhitespaceMixedFields2().init(new String[]{"  "}),
+					"<object><sp> </sp><sp> </sp></object>",
+					"<object><sp> </sp><sp> </sp></object>\n",
+					"<object><sp> </sp><sp> </sp></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedFields2.class, o);
+					}
+				}
+			},
+			{	/* 71 */
+				new Input<BeanWithWhitespaceMixedFields2>(
+					"BeanWithWhitespaceMixedFields2-6",
+					BeanWithWhitespaceMixedFields2.class,
+					new BeanWithWhitespaceMixedFields2().init(new String[]{"  foobar  "}),
+					"<object><sp> </sp> foobar <sp> </sp></object>",
+					"<object><sp> </sp> foobar <sp> </sp></object>\n",
+					"<object><sp> </sp> foobar <sp> </sp></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedFields2.class, o);
+					}
+				}
+			},
+			{	/* 72 */
+				new Input<BeanWithWhitespaceMixedPwsFields2>(
+					"BeanWithWhitespaceMixedPwsFields2-1",
+					BeanWithWhitespaceMixedPwsFields2.class,
+					new BeanWithWhitespaceMixedPwsFields2().init(null),
+					"<object nil='true'></object>",
+					"<object nil='true'>\n</object>\n",
+					"<object nil='true'></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 73 */
+				new Input<BeanWithWhitespaceMixedPwsFields2>(
+					"BeanWithWhitespaceMixedPwsFields2-2",
+					BeanWithWhitespaceMixedPwsFields2.class,
+					new BeanWithWhitespaceMixedPwsFields2().init(new String[0]),
+					"<object></object>",
+					"<object></object>\n",
+					"<object></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 74 */
+				new Input<BeanWithWhitespaceMixedPwsFields2>(
+					"BeanWithWhitespaceMixedPwsFields2-3",
+					BeanWithWhitespaceMixedPwsFields2.class,
+					new BeanWithWhitespaceMixedPwsFields2().init(new String[]{""}),
+					"<object><sp/></object>",
+					"<object><sp/></object>\n",
+					"<object><sp/></object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 75 */
+				new Input<BeanWithWhitespaceMixedPwsFields2>(
+					"BeanWithWhitespaceMixedPwsFields2-4",
+					BeanWithWhitespaceMixedPwsFields2.class,
+					new BeanWithWhitespaceMixedPwsFields2().init(new String[]{" "}),
+					"<object> </object>",
+					"<object> </object>\n",
+					"<object> </object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 76 */
+				new Input<BeanWithWhitespaceMixedPwsFields2>(
+					"BeanWithWhitespaceMixedPwsFields2-5",
+					BeanWithWhitespaceMixedPwsFields2.class,
+					new BeanWithWhitespaceMixedPwsFields2().init(new String[]{"  "}),
+					"<object>  </object>",
+					"<object>  </object>\n",
+					"<object>  </object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedPwsFields2.class, o);
+					}
+				}
+			},
+			{	/* 77 */
+				new Input<BeanWithWhitespaceMixedPwsFields2>(
+					"BeanWithWhitespaceMixedPwsFields2-6",
+					BeanWithWhitespaceMixedPwsFields2.class,
+					new BeanWithWhitespaceMixedPwsFields2().init(new String[]{"  foobar  "}),
+					"<object>  foobar  </object>",
+					"<object>  foobar  </object>\n",
+					"<object>  foobar  </object>"
+				)
+				{
+					@Override
+					public void verify(BeanWithWhitespaceMixedPwsFields2 o) {
+						assertInstanceOf(BeanWithWhitespaceMixedPwsFields2.class, o);
+					}
+				}
+			},
 		});
 	}
 
@@ -3013,4 +3368,50 @@
 			return this;
 		}
 	}
+
+	@HtmlConfig(annotateHtml={@Html(on="BeanWithWhitespaceTextFields2",format=XML)})
+	@XmlConfig(annotateXml={@Xml(on="BeanWithWhitespaceTextFields2.a",format=XmlFormat.TEXT)})
+	public static class BeanWithWhitespaceTextFields2 {
+		public String a;
+
+		public BeanWithWhitespaceTextFields2 init(String s) {
+			a = s;
+			return this;
+		}
+	}
+
+	@HtmlConfig(annotateHtml={@Html(on="BeanWithWhitespaceTextPwsFields2",format=XML)})
+	@XmlConfig(annotateXml={@Xml(on="BeanWithWhitespaceTextPwsFields2.a",format=XmlFormat.TEXT_PWS)})
+	public static class BeanWithWhitespaceTextPwsFields2 {
+		public String a;
+
+		public BeanWithWhitespaceTextPwsFields2 init(String s) {
+			a = s;
+			return this;
+		}
+	}
+
+	@HtmlConfig(annotateHtml={@Html(on="BeanWithWhitespaceMixedFields2",format=XML)})
+	@XmlConfig(annotateXml={@Xml(on="BeanWithWhitespaceMixedFields2.a",format=XmlFormat.MIXED)})
+	public static class BeanWithWhitespaceMixedFields2 {
+		public String[] a;
+
+		public BeanWithWhitespaceMixedFields2 init(String[] s) {
+			a = s;
+			return this;
+		}
+	}
+
+	@HtmlConfig(annotateHtml={@Html(on="BeanWithWhitespaceMixedPwsFields2",format=XML)})
+	@XmlConfig(annotateXml={@Xml(on="BeanWithWhitespaceMixedPwsFields2.a",format=XmlFormat.MIXED_PWS)})
+	@Html(format=XML)
+	public static class BeanWithWhitespaceMixedPwsFields2 {
+		public String[] a;
+
+		public BeanWithWhitespaceMixedPwsFields2 init(String[] s) {
+			a = s;
+			return this;
+		}
+	}
+
 }
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlTest.java
index 4408c1d..811545d 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/HtmlTest.java
@@ -25,9 +25,9 @@
 @SuppressWarnings({"unchecked","rawtypes","serial"})

 public class HtmlTest {

 

-	//====================================================================================================

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

 	// Verifies that lists of maps/beans are converted to tables correctly.

-	//====================================================================================================

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

 	@Test

 	public void testTables1() throws Exception {

 		HtmlSerializer s = HtmlSerializer.DEFAULT_SQ;

@@ -44,9 +44,9 @@
 		public String f1 = "f1";

 	}

 

-	//====================================================================================================

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

 	// Test URI_ANCHOR_SET options

-	//====================================================================================================

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

 	@Test

 	public void testAnchorTextOptions() throws Exception {

 		HtmlSerializerBuilder s = HtmlSerializer.create().sq().addKeyValueTableHeaders().uriResolution(UriResolution.NONE);

@@ -205,9 +205,9 @@
 			.replace("</td></tr>", "");

 	}

 

-	//====================================================================================================

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

 	// Test @Html.asPlainText annotation on classes and fields

-	//====================================================================================================

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

 	@Test

 	public void testHtmlAnnotationAsPlainText() throws Exception {

 		HtmlSerializer s = HtmlSerializer.create().sq().addKeyValueTableHeaders().build();

@@ -237,9 +237,39 @@
 		public String f1 = "<f1>";

 	}

 

-	//====================================================================================================

+	@Test

+	public void testHtmlAnnotationAsPlainText_usingConfig() throws Exception {

+		HtmlSerializer s = HtmlSerializer.create().sq().addKeyValueTableHeaders().applyAnnotations(B3.class).applyAnnotations(B4.class).build();

+

+		Object o = null;

+		String r;

+

+		o = new B3();

+		r = s.serialize(o);

+		assertEquals("<test>", r);

+

+		o = new B4();

+		r = s.serialize(o);

+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>f1</td><td><f1></td></tr></table>", r);

+	}

+

+	@HtmlConfig(annotateHtml=@Html(on="B3", format=PLAIN_TEXT))

+	public static class B3 {

+		public String f1 = "<f1>";

+		@Override /* Object */

+		public String toString() {

+			return "<test>";

+		}

+	}

+

+	@HtmlConfig(annotateHtml=@Html(on="B4.f1", format=PLAIN_TEXT))

+	public static class B4 {

+		public String f1 = "<f1>";

+	}

+

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

 	// Test @Html.asXml annotation on classes and fields

-	//====================================================================================================

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

 	@Test

 	public void testHtmlAnnotationAsXml() throws Exception {

 		HtmlSerializer s = HtmlSerializer.create().sq().addKeyValueTableHeaders().build();

@@ -265,9 +295,33 @@
 		public String f1 = "<f1>";

 	}

 

-	//====================================================================================================

+	@Test

+	public void testHtmlAnnotationAsXml_usingConfig() throws Exception {

+		HtmlSerializer s = HtmlSerializer.create().sq().addKeyValueTableHeaders().applyAnnotations(C3.class).build();

+		Object o = null;

+		String r;

+

+		o = new C3();

+		r = s.serialize(o);

+		assertEquals("<object><f1>&lt;f1&gt;</f1></object>", r);

+

+		o = new C4();

+		r = s.serialize(o);

+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>f1</td><td>&lt;f1&gt;</td></tr></table>", r);

+	}

+

+	@HtmlConfig(annotateHtml=@Html(on="C3,C4.f1",format=XML))

+	public static class C3 {

+		public String f1 = "<f1>";

+	}

+

+	public static class C4 {

+		public String f1 = "<f1>";

+	}

+

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

 	// Test @Html.noTableHeaders

-	//====================================================================================================

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

 	@Test

 	public void testNoTableHeaders() throws Exception {

 		HtmlSerializer s = HtmlSerializer.DEFAULT_SQ;

@@ -284,4 +338,19 @@
 	@Html(noTables=true, noTableHeaders=true)

 	public static class MyMap extends LinkedHashMap<String,String> {}

 

+	@Test

+	public void testNoTableHeaders_usingConfig() throws Exception {

+		HtmlSerializer s = HtmlSerializer.DEFAULT_SQ.builder().applyAnnotations(MyMap2.class).build();

+		Object o = null;

+		String r;

+

+		Map m = new MyMap2();

+		m.put("foo", "bar");

+		o = new ObjectList().append(m);

+		r = s.serialize(o);

+		assertEquals("<ul><li><table><tr><td>foo</td><td>bar</td></tr></table></li></ul>", r);

+	}

+

+	@HtmlConfig(annotateHtml=@Html(on="org.apache.juneau.html.HtmlTest$MyMap2", noTables=true, noTableHeaders=true))

+	public static class MyMap2 extends LinkedHashMap<String,String> {}

 }
\ No newline at end of file
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/JsonTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/JsonTest.java
index c2347f1..4435545 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/JsonTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/JsonTest.java
@@ -224,6 +224,38 @@
 		}

 	}

 

+	@Test

+	public void testWrapperAttrAnnotationOnBean_usingConfig() throws Exception {

+		JsonSerializer s = SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(A2.class).build();

+		JsonParser p = JsonParser.DEFAULT.builder().applyAnnotations(A2.class).build();

+		String r;

+

+		A2 t = A2.create();

+		r = s.serialize(t);

+		assertEquals("{foo:{f1:1}}", r);

+		t = p.parse(r, A2.class);

+		assertEquals(1, t.f1);

+

+		Map<String,A2> m = new LinkedHashMap<>();

+		m.put("bar", A2.create());

+		r = s.serialize(m);

+		assertEquals("{bar:{foo:{f1:1}}}", r);

+

+		m = p.parse(r, LinkedHashMap.class, String.class, A2.class);

+		assertEquals(1, m.get("bar").f1);

+	}

+

+	@JsonConfig(annotateJson=@Json(on="A2",wrapperAttr="foo"))

+	public static class A2 {

+		public int f1;

+

+		static A2 create() {

+			A2 a = new A2();

+			a.f1 = 1;

+			return a;

+		}

+	}

+

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

 	// testWrapperAttrAnnotationOnNonBean

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

@@ -270,6 +302,49 @@
 		}

 	}

 

+	@Test

+	public void testWrapperAttrAnnotationOnNonBean_usingConfig() throws Exception {

+		JsonSerializer s = SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(B2.class).build();

+		JsonParser p = JsonParser.DEFAULT.builder().applyAnnotations(B2.class).build();;

+		String r;

+

+		B2 t = B2.create();

+		r = s.serialize(t);

+		assertEquals("{foo:'1'}", r);

+		t = p.parse(r, B2.class);

+		assertEquals(1, t.f1);

+

+		Map<String,B2> m = new LinkedHashMap<>();

+		m.put("bar", B2.create());

+		r = s.serialize(m);

+		assertEquals("{bar:{foo:'1'}}", r);

+

+		m = p.parse(r, LinkedHashMap.class, String.class, B2.class);

+		assertEquals(1, m.get("bar").f1);

+	}

+

+	@JsonConfig(annotateJson=@Json(on="B2",wrapperAttr="foo"))

+	public static class B2 {

+		int f1;

+

+		static B2 create() {

+			B2 b = new B2();

+			b.f1 = 1;

+			return b;

+		}

+

+		@Override /* Object */

+		public String toString() {

+			return String.valueOf(f1);

+		}

+

+		public static B2 valueOf(String s) {

+			B2 b = new B2();

+			b.f1 = Integer.parseInt(s);

+			return b;

+		}

+	}

+

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

 	// testSubclassedList

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

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
index 863a6ee..bb054dc 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
@@ -1143,6 +1143,17 @@
 	}

 

 	@Test

+	public void jsonSchema_onclass_usingConfig() throws Exception {

+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().applyAnnotations(A1a.class).build().createSession();

+		assertObjectEquals("{description:'baz',format:'bar',type:'foo','x-example':'{f1:123}',properties:{f1:{type:'integer',format:'int32'}}}", s.getSchema(A1a.class));

+	}

+

+	@JsonSchemaConfig(annotateSchema=@Schema(on="A1a",type="foo",format="bar",description="baz",example="{f1:123}"))

+	public static class A1a {

+		public int f1;

+	}

+

+	@Test

 	public void jsonSchema_onbeanfield() throws Exception {

 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();

 		assertObjectEquals("{type:'object',properties:{f1:{description:'baz',format:'bar',type:'foo','x-example':'123'}}}", s.getSchema(A2.class));

@@ -1154,6 +1165,17 @@
 	}

 

 	@Test

+	public void jsonSchema_onbeanfield_usingConfig() throws Exception {

+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().applyAnnotations(A2a.class).build().createSession();

+		assertObjectEquals("{type:'object',properties:{f1:{description:'baz',format:'bar',type:'foo','x-example':'123'}}}", s.getSchema(A2a.class));

+	}

+

+	@JsonSchemaConfig(annotateSchema=@Schema(on="A2a.f1",type="foo",format="bar",description="baz",example="123"))

+	public static class A2a {

+		public int f1;

+	}

+

+	@Test

 	public void jsonSchema_onbeangetter() throws Exception {

 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();

 		assertObjectEquals("{type:'object',properties:{f1:{description:'baz',format:'bar',type:'foo','x-example':'123'}}}", s.getSchema(A3.class));

@@ -1165,8 +1187,21 @@
 			return 123;

 		}

 	}

-	@Test

 

+	@Test

+	public void jsonSchema_onbeangetter_usingConfig() throws Exception {

+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().applyAnnotations(A3a.class).build().createSession();

+		assertObjectEquals("{type:'object',properties:{f1:{description:'baz',format:'bar',type:'foo','x-example':'123'}}}", s.getSchema(A3a.class));

+	}

+

+	@JsonSchemaConfig(annotateSchema=@Schema(on="A3a.getF1",type="foo",format="bar",description="baz",example="123"))

+	public static class A3a {

+		public int getF1() {

+			return 123;

+		}

+	}

+

+	@Test

 	public void jsonSchema_onbeansetter() throws Exception {

 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().build().createSession();

 		assertObjectEquals("{type:'object',properties:{f1:{description:'baz',format:'bar',type:'foo','x-example':'123'}}}", s.getSchema(A4.class));

@@ -1181,6 +1216,21 @@
 		public void setF1(int f1) {}

 	}

 

+	@Test

+	public void jsonSchema_onbeansetter_usingConfig() throws Exception {

+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().applyAnnotations(A4a.class).build().createSession();

+		assertObjectEquals("{type:'object',properties:{f1:{description:'baz',format:'bar',type:'foo','x-example':'123'}}}", s.getSchema(A4a.class));

+	}

+

+	@JsonSchemaConfig(annotateSchema=@Schema(on="A4a.setF1",type="foo",format="bar",description="baz",example="123"))

+	public static class A4a {

+		public int getF1() {

+			return 123;

+		}

+

+		public void setF1(int f1) {}

+	}

+

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

 	// @JsonSchema on PojoSwap

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

@@ -1197,4 +1247,17 @@
 

 	@Schema(type="foo",format="bar",description="baz",example="123")

 	public static class SwapWithAnnotation extends PojoSwap<SimpleBean,Integer> {}

+

+	@Test

+	public void jsonschema_onpojoswap_usingConfig() throws Exception {

+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().applyAnnotations(SwapWithAnnotation2.class)

+			.pojoSwaps(SwapWithAnnotation2.class)

+			.build().createSession();

+		assertObjectEquals("{description:'baz',format:'bar',type:'foo','x-example':'123'}", s.getSchema(SimpleBean.class));

+		assertObjectEquals("{type:'array',items:{description:'baz',format:'bar',type:'foo','x-example':'123'}}", s.getSchema(BeanList.class));

+		assertObjectEquals("{type:'array',items:{type:'array',items:{description:'baz',format:'bar',type:'foo','x-example':'123'}}}", s.getSchema(SimpleBean[][].class));

+	}

+

+	@JsonSchemaConfig(annotateSchema=@Schema(on="SwapWithAnnotation2", type="foo",format="bar",description="baz",example="123"))

+	public static class SwapWithAnnotation2 extends PojoSwap<SimpleBean,Integer> {}

 }
\ No newline at end of file
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/DTOs2.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/DTOs2.java
new file mode 100644
index 0000000..2ca047c
--- /dev/null
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/DTOs2.java
@@ -0,0 +1,139 @@
+// ***************************************************************************************************************************

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

+

+import java.util.*;

+

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

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

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

+

+public class DTOs2 {

+

+	@BeanConfig(annotateBean={@Bean(on="A,B,C",sort=true)})

+	@UrlEncodingConfig(annotateUrlEncoding={@UrlEncoding(on="C",expandedParams=true)})

+	public static class Annotations {}

+

+	public static class A {

+		public String a;

+		public int b;

+		public boolean c;

+

+		public static A create() {

+			A t = new A();

+			t.a = "a";

+			t.b = 1;

+			t.c = true;

+			return t;

+		}

+

+	}

+

+	public static class B {

+		public String[] f01;

+		public List<String> f02;

+		public int[] f03;

+		public List<Integer> f04;

+		public String[][] f05;

+		public List<String[]> f06;

+		public A[] f07;

+		public List<A> f08;

+		public A[][] f09;

+		public List<List<A>> f10;

+

+		private String[] f11;

+		private List<String> f12;

+		private int[] f13;

+		private List<Integer> f14;

+		private String[][] f15;

+		private List<String[]> f16;

+		private A[] f17;

+		private List<A> f18;

+		private A[][] f19;

+		private List<List<A>> f20;

+

+		public String[] getF11() { return f11; }

+		public List<String> getF12() { return f12; }

+		public int[] getF13() { return f13; }

+		public List<Integer> getF14() { return f14; }

+		public String[][] getF15() { return f15; }

+		public List<String[]> getF16() { return f16; }

+		public A[] getF17() { return f17; }

+		public List<A> getF18() { return f18; }

+		public A[][] getF19() { return f19; }

+		public List<List<A>> getF20() { return f20; }

+

+		public void setF11(String[] f11) { this.f11 = f11; }

+		public void setF12(List<String> f12) { this.f12 = f12; }

+		public void setF13(int[] f13) { this.f13 = f13; }

+		public void setF14(List<Integer> f14) { this.f14 = f14; }

+		public void setF15(String[][] f15) { this.f15 = f15; }

+		public void setF16(List<String[]> f16) { this.f16 = f16; }

+		public void setF17(A[] f17) { this.f17 = f17; }

+		public void setF18(List<A> f18) { this.f18 = f18; }

+		public void setF19(A[][] f19) { this.f19 = f19; }

+		public void setF20(List<List<A>> f20) { this.f20 = f20; }

+

+		static B create() {

+			B t = new B();

+			t.f01 = new String[]{"a","b"};

+			t.f02 = new AList<String>().append("c").append("d");

+			t.f03 = new int[]{1,2};

+			t.f04 = new AList<Integer>().append(3).append(4);

+			t.f05 = new String[][]{{"e","f"},{"g","h"}};

+			t.f06 = new AList<String[]>().append(new String[]{"i","j"}).append(new String[]{"k","l"});

+			t.f07 = new A[]{A.create(),A.create()};

+			t.f08 = new AList<A>().append(A.create()).append(A.create());

+			t.f09 = new A[][]{{A.create()},{A.create()}};

+			t.f10 = new AList<List<A>>().append(Arrays.asList(A.create())).append(Arrays.asList(A.create()));

+			t.setF11(new String[]{"a","b"});

+			t.setF12(new AList<String>().append("c").append("d"));

+			t.setF13(new int[]{1,2});

+			t.setF14(new AList<Integer>().append(3).append(4));

+			t.setF15(new String[][]{{"e","f"},{"g","h"}});

+			t.setF16(new AList<String[]>().append(new String[]{"i","j"}).append(new String[]{"k","l"}));

+			t.setF17(new A[]{A.create(),A.create()});

+			t.setF18(new AList<A>().append(A.create()).append(A.create()));

+			t.setF19(new A[][]{{A.create()},{A.create()}});

+			t.setF20(new AList<List<A>>().append(Arrays.asList(A.create())).append(Arrays.asList(A.create())));

+			return t;

+		}

+	}

+

+	public static class C extends B {

+		static C create() {

+			C t = new C();

+			t.f01 = new String[]{"a","b"};

+			t.f02 = new AList<String>().append("c").append("d");

+			t.f03 = new int[]{1,2};

+			t.f04 = new AList<Integer>().append(3).append(4);

+			t.f05 = new String[][]{{"e","f"},{"g","h"}};

+			t.f06 = new AList<String[]>().append(new String[]{"i","j"}).append(new String[]{"k","l"});

+			t.f07 = new A[]{A.create(),A.create()};

+			t.f08 = new AList<A>().append(A.create()).append(A.create());

+			t.f09 = new A[][]{{A.create()},{A.create()}};

+			t.f10 = new AList<List<A>>().append(Arrays.asList(A.create())).append(Arrays.asList(A.create()));

+			t.setF11(new String[]{"a","b"});

+			t.setF12(new AList<String>().append("c").append("d"));

+			t.setF13(new int[]{1,2});

+			t.setF14(new AList<Integer>().append(3).append(4));

+			t.setF15(new String[][]{{"e","f"},{"g","h"}});

+			t.setF16(new AList<String[]>().append(new String[]{"i","j"}).append(new String[]{"k","l"}));

+			t.setF17(new A[]{A.create(),A.create()});

+			t.setF18(new AList<A>().append(A.create()).append(A.create()));

+			t.setF19(new A[][]{{A.create()},{A.create()}});

+			t.setF20(new AList<List<A>>().append(Arrays.asList(A.create())).append(Arrays.asList(A.create())));

+			return t;

+		}

+	}

+}

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java
index cfd3dc1..65d107a 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java
@@ -692,6 +692,60 @@
 		assertSortedObjectEquals(e, t);

 	}

 

+	@Test

+	public void testMultiPartParametersOnBeansViaProperty_usingConfig() throws Exception {

+		UrlEncodingParser p;

+		String in;

+

+		p = UrlEncodingParser.create().expandedParams(true).applyAnnotations(DTOs2.Annotations.class).build();

+		in = ""

+			+ "f01=a&f01=b"

+			+ "&f02=c&f02=d"

+			+ "&f03=1&f03=2"

+			+ "&f04=3&f04=4"

+			+ "&f05=@(e,f)&f05=@(g,h)"

+			+ "&f06=@(i,j)&f06=@(k,l)"

+			+ "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"

+			+ "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"

+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"

+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"

+			+ "&f11=a&f11=b"

+			+ "&f12=c&f12=d"

+			+ "&f13=1&f13=2"

+			+ "&f14=3&f14=4"

+			+ "&f15=@(e,f)&f15=@(g,h)"

+			+ "&f16=@(i,j)&f16=@(k,l)"

+			+ "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"

+			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"

+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"

+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";

+

+		DTOs2.B t = p.parse(in, DTOs2.B.class);

+		String e = "{"

+			+ "f01:['a','b'],"

+			+ "f02:['c','d'],"

+			+ "f03:[1,2],"

+			+ "f04:[3,4],"

+			+ "f05:[['e','f'],['g','h']],"

+			+ "f06:[['i','j'],['k','l']],"

+			+ "f07:[{a:'a',b:1,c:true},{a:'b',b:2,c:false}],"

+			+ "f08:[{a:'a',b:1,c:true},{a:'b',b:2,c:false}],"

+			+ "f09:[[{a:'a',b:1,c:true}],[{a:'b',b:2,c:false}]],"

+			+ "f10:[[{a:'a',b:1,c:true}],[{a:'b',b:2,c:false}]],"

+			+ "f11:['a','b'],"

+			+ "f12:['c','d'],"

+			+ "f13:[1,2],"

+			+ "f14:[3,4],"

+			+ "f15:[['e','f'],['g','h']],"

+			+ "f16:[['i','j'],['k','l']],"

+			+ "f17:[{a:'a',b:1,c:true},{a:'b',b:2,c:false}],"

+			+ "f18:[{a:'a',b:1,c:true},{a:'b',b:2,c:false}],"

+			+ "f19:[[{a:'a',b:1,c:true}],[{a:'b',b:2,c:false}]],"

+			+ "f20:[[{a:'a',b:1,c:true}],[{a:'b',b:2,c:false}]]"

+		+"}";

+		assertSortedObjectEquals(e, t);

+	}

+

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

 	// Multi-part parameters on beans via @UrlEncoding.expandedParams on class

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

@@ -747,4 +801,57 @@
 		+"}";

 		assertSortedObjectEquals(e, t);

 	}

+

+	@Test

+	public void testMultiPartParametersOnBeansViaAnnotationOnClass_usingConfig() throws Exception {

+		UrlEncodingParser p;

+		String in;

+		p = UrlEncodingParser.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build();

+		in = ""

+			+ "f01=a&f01=b"

+			+ "&f02=c&f02=d"

+			+ "&f03=1&f03=2"

+			+ "&f04=3&f04=4"

+			+ "&f05=@(e,f)&f05=@(g,h)"

+			+ "&f06=@(i,j)&f06=@(k,l)"

+			+ "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"

+			+ "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"

+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"

+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"

+			+ "&f11=a&f11=b"

+			+ "&f12=c&f12=d"

+			+ "&f13=1&f13=2"

+			+ "&f14=3&f14=4"

+			+ "&f15=@(e,f)&f15=@(g,h)"

+			+ "&f16=@(i,j)&f16=@(k,l)"

+			+ "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"

+			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"

+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"

+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";

+

+		DTOs2.C t = p.parse(in, DTOs2.C.class);

+		String e = "{"

+			+ "f01:['a','b'],"

+			+ "f02:['c','d'],"

+			+ "f03:[1,2],"

+			+ "f04:[3,4],"

+			+ "f05:[['e','f'],['g','h']],"

+			+ "f06:[['i','j'],['k','l']],"

+			+ "f07:[{a:'a',b:1,c:true},{a:'b',b:2,c:false}],"

+			+ "f08:[{a:'a',b:1,c:true},{a:'b',b:2,c:false}],"

+			+ "f09:[[{a:'a',b:1,c:true}],[{a:'b',b:2,c:false}]],"

+			+ "f10:[[{a:'a',b:1,c:true}],[{a:'b',b:2,c:false}]],"

+			+ "f11:['a','b'],"

+			+ "f12:['c','d'],"

+			+ "f13:[1,2],"

+			+ "f14:[3,4],"

+			+ "f15:[['e','f'],['g','h']],"

+			+ "f16:[['i','j'],['k','l']],"

+			+ "f17:[{a:'a',b:1,c:true},{a:'b',b:2,c:false}],"

+			+ "f18:[{a:'a',b:1,c:true},{a:'b',b:2,c:false}],"

+			+ "f19:[[{a:'a',b:1,c:true}],[{a:'b',b:2,c:false}]],"

+			+ "f20:[[{a:'a',b:1,c:true}],[{a:'b',b:2,c:false}]]"

+		+"}";

+		assertSortedObjectEquals(e, t);

+	}

 }
\ No newline at end of file
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
index e0ac2ff..c614001 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
@@ -370,6 +370,62 @@
 		assertEquals(e, r);

 	}

 

+	@Test

+	public void testMultiPartParametersOnBeansViaProperty_usingConfig() throws Exception {

+		UrlEncodingSerializer s;

+		DTOs2.B t = DTOs2.B.create();

+		String r;

+

+		s = UrlEncodingSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build();

+		r = s.serialize(t);

+		String e = ""

+			+ "f01=@(a,b)"

+			+ "&f02=@(c,d)"

+			+ "&f03=@(1,2)"

+			+ "&f04=@(3,4)"

+			+ "&f05=@(@(e,f),@(g,h))"

+			+ "&f06=@(@(i,j),@(k,l))"

+			+ "&f07=@((a=a,b=1,c=true),(a=a,b=1,c=true))"

+			+ "&f08=@((a=a,b=1,c=true),(a=a,b=1,c=true))"

+			+ "&f09=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"

+			+ "&f10=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"

+			+ "&f11=@(a,b)"

+			+ "&f12=@(c,d)"

+			+ "&f13=@(1,2)"

+			+ "&f14=@(3,4)"

+			+ "&f15=@(@(e,f),@(g,h))"

+			+ "&f16=@(@(i,j),@(k,l))"

+			+ "&f17=@((a=a,b=1,c=true),(a=a,b=1,c=true))"

+			+ "&f18=@((a=a,b=1,c=true),(a=a,b=1,c=true))"

+			+ "&f19=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"

+			+ "&f20=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))";

+		assertEquals(e, r);

+

+		s = UrlEncodingSerializer.create().expandedParams().applyAnnotations(DTOs2.Annotations.class).build();

+		r = s.serialize(t);

+		e = ""

+			+ "f01=a&f01=b"

+			+ "&f02=c&f02=d"

+			+ "&f03=1&f03=2"

+			+ "&f04=3&f04=4"

+			+ "&f05=@(e,f)&f05=@(g,h)"

+			+ "&f06=@(i,j)&f06=@(k,l)"

+			+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"

+			+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"

+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"

+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"

+			+ "&f11=a&f11=b"

+			+ "&f12=c&f12=d"

+			+ "&f13=1&f13=2"

+			+ "&f14=3&f14=4"

+			+ "&f15=@(e,f)&f15=@(g,h)"

+			+ "&f16=@(i,j)&f16=@(k,l)"

+			+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"

+			+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"

+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"

+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";

+		assertEquals(e, r);

+	}

 

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

 	// Multi-part parameters on beans via @UrlEncoding.expandedParams on class

@@ -432,6 +488,63 @@
 	}

 

 	@Test

+	public void testMultiPartParametersOnBeansViaAnnotationOnClass_usingConfig() throws Exception {

+		UrlEncodingSerializer s;

+		DTOs2.C t = DTOs2.C.create();

+		String r;

+

+		s = UrlEncodingSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build();

+		r = s.serialize(t);

+		String e = ""

+			+ "f01=a&f01=b"

+			+ "&f02=c&f02=d"

+			+ "&f03=1&f03=2"

+			+ "&f04=3&f04=4"

+			+ "&f05=@(e,f)&f05=@(g,h)"

+			+ "&f06=@(i,j)&f06=@(k,l)"

+			+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"

+			+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"

+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"

+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"

+			+ "&f11=a&f11=b"

+			+ "&f12=c&f12=d"

+			+ "&f13=1&f13=2"

+			+ "&f14=3&f14=4"

+			+ "&f15=@(e,f)&f15=@(g,h)"

+			+ "&f16=@(i,j)&f16=@(k,l)"

+			+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"

+			+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"

+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"

+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";

+		assertEquals(e, r);

+

+		s = UrlEncodingSerializer.create().expandedParams().applyAnnotations(DTOs2.Annotations.class).build();

+		r = s.serialize(t);

+		e = ""

+			+ "f01=a&f01=b"

+			+ "&f02=c&f02=d"

+			+ "&f03=1&f03=2"

+			+ "&f04=3&f04=4"

+			+ "&f05=@(e,f)&f05=@(g,h)"

+			+ "&f06=@(i,j)&f06=@(k,l)"

+			+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"

+			+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"

+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"

+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"

+			+ "&f11=a&f11=b"

+			+ "&f12=c&f12=d"

+			+ "&f13=1&f13=2"

+			+ "&f14=3&f14=4"

+			+ "&f15=@(e,f)&f15=@(g,h)"

+			+ "&f16=@(i,j)&f16=@(k,l)"

+			+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"

+			+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"

+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"

+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";

+		assertEquals(e, r);

+	}

+

+	@Test

 	public void testMultiPartParametersOnMapOfStringArrays() throws Exception {

 		UrlEncodingSerializer s;

 		String r;

diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
index 322f563..3d47a8e 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
@@ -36,14 +36,14 @@
 	 */

 	public RdfClassMeta(ClassMeta<?> cm, RdfMetaProvider mp) {

 		super(cm);

-		this.rdf = cm.getAnnotation(Rdf.class, mp);

+		this.rdf = cm.getAnnotation(Rdf.class);

 		if (rdf != null) {

 			collectionFormat = rdf.collectionFormat();

 		} else {

 			collectionFormat = RdfCollectionFormat.DEFAULT;

 		}

-		List<Rdf> rdfs = cm.getAnnotations(Rdf.class, mp);

-		List<RdfSchema> schemas = cm.getAnnotations(RdfSchema.class, mp);

+		List<Rdf> rdfs = cm.getAnnotations(Rdf.class);

+		List<RdfSchema> schemas = cm.getAnnotations(RdfSchema.class);

 		this.namespace = RdfUtils.findNamespace(rdfs, schemas);

 	}

 

diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
index 27d5d0e..9d19440 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
@@ -16,6 +16,7 @@
 import static org.apache.juneau.jena.RdfParser.*;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -1368,9 +1369,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public RdfParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public RdfParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public RdfParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
index 6dd6a4e..ed7d448 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
@@ -1619,14 +1619,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public RdfSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public RdfSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public RdfSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public RdfSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
index 3ebfc17..62e318a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContextBuilder.java
@@ -1932,14 +1932,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public BeanContextBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public BeanContextBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public BeanContextBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public BeanContextBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
index 0795998..b0012c3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseBuilder.java
@@ -740,14 +740,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public BeanTraverseBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public BeanTraverseBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public BeanTraverseBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public BeanTraverseBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 
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 8fcd087..550e82b 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
@@ -2043,18 +2043,7 @@
 	 * @return The specified annotation, or <jk>null</jk> if the class does not have the specified annotation.

 	 */

 	public <A extends Annotation> A getAnnotation(Class<A> a) {

-		return info.getAnnotation(a);

-	}

-

-	/**

-	 * Returns the annotation defined on this class using the specified meta-provider for lookup.

-	 *

-	 * @param a The annotation to retrieve.

-	 * @param mp The meta-provider to use for lookup of annotations.

-	 * @return The specified annotation, or <jk>null</jk> if the class does not have the specified annotation.

-	 */

-	public <A extends Annotation> A getAnnotation(Class<A> a, MetaProvider mp) {

-		return info.getAnnotation(a, mp);

+		return info.getAnnotation(a, beanContext == null ? BeanContext.DEFAULT : beanContext);

 	}

 

 	/**

@@ -2064,18 +2053,7 @@
 	 * @return The specified annotation, or <jk>null</jk> if the class does not have the specified annotation.

 	 */

 	public <A extends Annotation> A getDeclaredAnnotation(Class<A> a) {

-		return info.getDeclaredAnnotation(a);

-	}

-

-	/**

-	 * Returns the declared annotation defined on this class using the specified meta-provider for lookup.

-	 *

-	 * @param a The annotation to retrieve.

-	 * @param mp The meta-provider to use for lookup of annotations.

-	 * @return The specified annotation, or <jk>null</jk> if the class does not have the specified annotation.

-	 */

-	public <A extends Annotation> A getDeclaredAnnotation(Class<A> a, MetaProvider mp) {

-		return info.getDeclaredAnnotation(a);

+		return info.getDeclaredAnnotation(a, beanContext == null ? BeanContext.DEFAULT : beanContext);

 	}

 

 	/**

@@ -2087,19 +2065,7 @@
 	 * 	A list of all matching annotations found in child-to-parent order, or an empty list if none found.

 	 */

 	public <A extends Annotation> List<A> getAnnotations(Class<A> a) {

-		return info.getAnnotations(a);

-	}

-

-	/**

-	 * Returns all annotations of the specified type defined on the specified class or parent classes/interfaces.

-	 *

-	 * @param a The annotation to search for.

-	 * @param mp The metadata provider for finding annotations.

-	 * @return

-	 * 	A list of all matching annotations found in child-to-parent order, or an empty list if none found.

-	 */

-	public <A extends Annotation> List<A> getAnnotations(Class<A> a, MetaProvider mp) {

-		return info.getAnnotations(a, mp);

+		return info.getAnnotations(a, beanContext == null ? BeanContext.DEFAULT : beanContext);

 	}

 

 	/**

@@ -2111,20 +2077,7 @@
 	 * 	A list of all matching annotations found or an empty list if none found.

 	 */

 	public <A extends Annotation> List<A> getAnnotationsParentFirst(Class<A> a) {

-		return info.getAnnotationsParentFirst(a);

-	}

-

-	/**

-	 * Identical to {@link #getAnnotations(Class,MetaProvider)} but optionally returns the list in reverse (parent-to-child) order.

-	 *

-	 * @param a

-	 * 	The annotation to search for.

-	 * @param mp The metadata provider for finding annotations.

-	 * @return

-	 * 	A list of all matching annotations found or an empty list if none found.

-	 */

-	public <A extends Annotation> List<A> getAnnotationsParentFirst(Class<A> a, MetaProvider mp) {

-		return info.getAnnotationsParentFirst(a, mp);

+		return info.getAnnotationsParentFirst(a, beanContext == null ? BeanContext.DEFAULT : beanContext);

 	}

 

 	@Override /* Object */

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
index 42594e9..795f914 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
@@ -42,6 +42,7 @@
  *
  * @see PropertyStore
  */
+@ConfigurableContext
 public abstract class Context implements MetaProvider {
 
 	static final String PREFIX = "Context";
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
index b143d44..a7e2db2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextBuilder.java
@@ -153,11 +153,12 @@
 	 * 	<li>On this class.
 	 * </ol>
 	 *
-	 * @param fromClass The class on which the annotations are defined.
+	 * @param fromClasses The classes on which the annotations are defined.
 	 * @return This object (for method chaining).
 	 */
-	public ContextBuilder applyAnnotations(Class<?> fromClass) {
-		applyAnnotations(ClassInfo.of(fromClass).getAnnotationListParentFirst(ConfigAnnotationFilter.INSTANCE), VarResolver.DEFAULT.createSession());
+	public ContextBuilder applyAnnotations(Class<?>...fromClasses) {
+		for (Class<?> c : fromClasses)
+			applyAnnotations(ClassInfo.of(c).getAnnotationListParentFirst(ConfigAnnotationFilter.INSTANCE), VarResolver.DEFAULT.createSession());
 		return this;
 	}
 
@@ -196,11 +197,12 @@
 	 * 	<li>On this method and matching methods ordered parent-to-child.
 	 * </ol>
 	 *
-	 * @param fromMethod The method on which the annotations are defined.
+	 * @param fromMethods The methods on which the annotations are defined.
 	 * @return This object (for method chaining).
 	 */
-	public ContextBuilder applyAnnotations(Method fromMethod) {
-		applyAnnotations(MethodInfo.of(fromMethod).getAnnotationListParentFirst(ConfigAnnotationFilter.INSTANCE), VarResolver.DEFAULT.createSession());
+	public ContextBuilder applyAnnotations(Method...fromMethods) {
+		for (Method m : fromMethods)
+			applyAnnotations(MethodInfo.of(m).getAnnotationListParentFirst(ConfigAnnotationFilter.INSTANCE), VarResolver.DEFAULT.createSession());
 		return this;
 	}
 
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 d0f31c4..7cca861 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.marshall.*;
 import org.apache.juneau.reflect.*;
 
 
@@ -722,6 +723,11 @@
 		public Map<String,Property> swap() {
 			return properties;
 		}
+
+		@Override /* Object */
+		public String toString() {
+			return "[hash="+hashCode()+"]" + (SimpleJson.DEFAULT == null ? "" : SimpleJson.DEFAULT.toString(properties));
+		}
 	}
 
 	//-------------------------------------------------------------------------------------------------------------------
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 e3d4b30..3300c9a 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
@@ -21,26 +21,11 @@
 import java.util.regex.*;
 
 import org.apache.juneau.PropertyStore.*;
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.csv.annotation.*;
-import org.apache.juneau.html.annotation.*;
 import org.apache.juneau.internal.*;
-import org.apache.juneau.jso.annotation.*;
 import org.apache.juneau.json.*;
-import org.apache.juneau.json.annotation.*;
-import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.marshall.*;
-import org.apache.juneau.msgpack.annotation.*;
-import org.apache.juneau.oapi.annotation.*;
-import org.apache.juneau.parser.annotation.*;
-import org.apache.juneau.plaintext.annotation.*;
 import org.apache.juneau.reflect.*;
-import org.apache.juneau.serializer.annotation.*;
-import org.apache.juneau.soap.annotation.*;
 import org.apache.juneau.svl.*;
-import org.apache.juneau.uon.annotation.*;
-import org.apache.juneau.urlencoding.annotation.*;
-import org.apache.juneau.xml.annotation.*;
 
 /**
  * A builder for {@link PropertyStore} objects.
@@ -137,91 +122,6 @@
 	}
 
 	/**
-	 * Applies any of the various <ja>@XConfig</ja> annotations on the specified class to this property store.
-	 *
-	 * <p>
-	 * Applies any of the following annotations:
-	 * <ul class='javatree'>
-	 * 	<li class ='ja'>{@link BeanConfig}
-	 * 	<li class ='ja'>{@link CsvConfig}
-	 * 	<li class ='ja'>{@link HtmlConfig}
-	 * 	<li class ='ja'>{@link HtmlDocConfig}
-	 * 	<li class ='ja'>{@link JsoConfig}
-	 * 	<li class ='ja'>{@link JsonConfig}
-	 * 	<li class ='ja'>{@link JsonSchemaConfig}
-	 * 	<li class ='ja'>{@link MsgPackConfig}
-	 * 	<li class ='ja'>{@link OpenApiConfig}
-	 * 	<li class ='ja'>{@link ParserConfig}
-	 * 	<li class ='ja'>{@link PlainTextConfig}
-	 * 	<li class ='ja'>{@link SerializerConfig}
-	 * 	<li class ='ja'>{@link SoapXmlConfig}
-	 * 	<li class ='ja'>{@link UonConfig}
-	 * 	<li class ='ja'>{@link UrlEncodingConfig}
-	 * 	<li class ='ja'>{@link XmlConfig}
-	 * 	<li class ='ja'><c>RdfConfig</c>
-	 * </ul>
-	 *
-	 * <p>
-	 * Annotations are appended in the following order:
-	 * <ol>
-	 * 	<li>On the package of this class.
-	 * 	<li>On interfaces ordered parent-to-child.
-	 * 	<li>On parent classes ordered parent-to-child.
-	 * 	<li>On this class.
-	 * </ol>
-	 *
-	 * @param fromClass The class on which the annotations are defined.
-	 * @return This object (for method chaining).
-	 */
-	public PropertyStoreBuilder applyAnnotations(Class<?> fromClass) {
-		applyAnnotations(ClassInfo.of(fromClass).getAnnotationListParentFirst(ConfigAnnotationFilter.INSTANCE), VarResolver.DEFAULT.createSession());
-		return this;
-	}
-
-	/**
-	 * Applies any of the various <ja>@XConfig</ja> annotations on the specified method to this property store.
-	 *
-	 * <p>
-	 * Applies any of the following annotations:
-	 * <ul class='javatree'>
-	 * 	<li class ='ja'>{@link BeanConfig}
-	 * 	<li class ='ja'>{@link CsvConfig}
-	 * 	<li class ='ja'>{@link HtmlConfig}
-	 * 	<li class ='ja'>{@link HtmlDocConfig}
-	 * 	<li class ='ja'>{@link JsoConfig}
-	 * 	<li class ='ja'>{@link JsonConfig}
-	 * 	<li class ='ja'>{@link JsonSchemaConfig}
-	 * 	<li class ='ja'>{@link MsgPackConfig}
-	 * 	<li class ='ja'>{@link OpenApiConfig}
-	 * 	<li class ='ja'>{@link ParserConfig}
-	 * 	<li class ='ja'>{@link PlainTextConfig}
-	 * 	<li class ='ja'>{@link SerializerConfig}
-	 * 	<li class ='ja'>{@link SoapXmlConfig}
-	 * 	<li class ='ja'>{@link UonConfig}
-	 * 	<li class ='ja'>{@link UrlEncodingConfig}
-	 * 	<li class ='ja'>{@link XmlConfig}
-	 * 	<li class ='ja'><c>RdfConfig</c>
-	 * </ul>
-	 *
-	 * <p>
-	 * Annotations are appended in the following orders:
-	 * <ol>
-	 * 	<li>On the package of the method class.
-	 * 	<li>On interfaces ordered parent-to-child.
-	 * 	<li>On parent classes ordered parent-to-child.
-	 * 	<li>On the method class.
-	 * 	<li>On this method and matching methods ordered parent-to-child.
-	 * </ol>
-	 *
-	 * @param fromMethod The method on which the annotations are defined.
-	 * @return This object (for method chaining).
-	 */
-	public PropertyStoreBuilder applyAnnotations(Method fromMethod) {
-		applyAnnotations(MethodInfo.of(fromMethod).getAnnotationListParentFirst(ConfigAnnotationFilter.INSTANCE), VarResolver.DEFAULT.createSession());
-		return this;
-	}
-
-	/**
 	 * Sets a configuration property value on this object.
 	 *
 	 * @param key
@@ -560,6 +460,11 @@
 		public Map<String,MutableProperty> swap(BeanSession bs) {
 			return properties;
 		}
+
+		@Override
+		public String toString() {
+			return (SimpleJson.DEFAULT == null ? "" : SimpleJson.DEFAULT.toString(properties));
+		}
 	}
 
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
index ac61566..8ca7f3a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
@@ -31,7 +31,7 @@
 	 */

 	public CsvClassMeta(ClassMeta<?> cm, CsvMetaProvider mp) {

 		super(cm);

-		this.csv = cm.getAnnotation(Csv.class, mp);

+		this.csv = cm.getAnnotation(Csv.class);

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParserBuilder.java
index 773f123..d99fea0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParserBuilder.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.csv;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -688,9 +689,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public CsvParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public CsvParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public CsvParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
index 15021a5..9edeace 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
@@ -821,14 +821,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public CsvSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public CsvSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public CsvSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public CsvSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
index e9586de..260c3b6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
@@ -36,7 +36,7 @@
 	 */

 	public HtmlClassMeta(ClassMeta<?> cm, HtmlMetaProvider mp) {

 		super(cm);

-		this.html = cm.getAnnotation(Html.class, mp);

+		this.html = cm.getAnnotation(Html.class);

 		if (html != null) {

 			format = html.format();

 			noTables = html.noTables();

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
index a745703..ef76987 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
@@ -1342,14 +1342,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlDocSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public HtmlDocSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlDocSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public HtmlDocSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserBuilder.java
index 52c4d59..8d40df4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserBuilder.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.html;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -710,9 +711,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public HtmlParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public HtmlParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public HtmlParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
index 64e49c3..c6e5143 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
@@ -954,14 +954,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public HtmlSchemaSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSchemaSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public HtmlSchemaSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
index fc60b96..7ba1850 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
@@ -995,14 +995,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public HtmlSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public HtmlSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
index 2533cfb..8099ab8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
@@ -906,14 +906,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlStrippedDocSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public HtmlStrippedDocSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public HtmlStrippedDocSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public HtmlStrippedDocSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
index fafc76d..d43432d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
@@ -31,7 +31,7 @@
 	 */

 	public JsoClassMeta(ClassMeta<?> cm, JsoMetaProvider mp) {

 		super(cm);

-		this.jso = cm.getAnnotation(Jso.class, mp);

+		this.jso = cm.getAnnotation(Jso.class);

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
index 5e7b847..e214c71 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
@@ -778,14 +778,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public JsoSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public JsoSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public JsoSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public JsoSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
index 55dbb35..69dcdeb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
@@ -34,7 +34,7 @@
 	 */

 	public JsonClassMeta(ClassMeta<?> cm, JsonMetaProvider mp) {

 		super(cm);

-		this.json = cm.getAnnotation(Json.class, mp);

+		this.json = cm.getAnnotation(Json.class);

 		if (json != null) {

 			wrapperAttr = nullIfEmpty(json.wrapperAttr());

 		} else {

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserBuilder.java
index bb35719..09992b6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserBuilder.java
@@ -15,6 +15,7 @@
 import static org.apache.juneau.json.JsonParser.*;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -726,9 +727,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public JsonParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public JsonParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public JsonParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
index ef97cb9..01c157b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
@@ -1020,14 +1020,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public JsonSchemaSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public JsonSchemaSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public JsonSchemaSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public JsonSchemaSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
index 8efd3ea..55030b6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
@@ -15,6 +15,7 @@
 import static org.apache.juneau.json.JsonSerializer.*;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -903,9 +904,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public JsonSerializerBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public JsonSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public JsonSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
index 2945099..5016ecb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
@@ -33,7 +33,7 @@
 	public JsonSchemaClassMeta(ClassMeta<?> cm, JsonSchemaMetaProvider mp) {

 		super(cm);

 		try {

-			Schema s = cm.getAnnotation(Schema.class, mp);

+			Schema s = cm.getAnnotation(Schema.class);

 			schema = s == null ? ObjectMap.EMPTY_MAP : SchemaUtils.asMap(s);

 		} catch (ParseException e) {

 			throw new RuntimeException(e);

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
index c63df98..5ce1b12 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorBuilder.java
@@ -882,14 +882,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public JsonSchemaGeneratorBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public JsonSchemaGeneratorBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public JsonSchemaGeneratorBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public JsonSchemaGeneratorBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
index 87780e7..016a427 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
@@ -139,8 +139,9 @@
 		}
 
 		JsonSchemaClassMeta jscm = null;
-		if (pojoSwap != null && pojoSwap.getClass().getAnnotation(Schema.class) != null)
-			jscm = getJsonSchemaClassMeta(getClassMeta(pojoSwap.getClass()));
+		ClassMeta pojoSwapCM = pojoSwap == null ? null : getClassMeta(pojoSwap.getClass());
+		if (pojoSwapCM != null && pojoSwapCM.getAnnotation(Schema.class) != null)
+			jscm = getJsonSchemaClassMeta(pojoSwapCM);
 		if (jscm == null)
 			jscm = getJsonSchemaClassMeta(sType);
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
index 10bca2d..662db82 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
@@ -31,7 +31,7 @@
 	 */

 	public MsgPackClassMeta(ClassMeta<?> cm, MsgPackMetaProvider mp) {

 		super(cm);

-		this.msgPack = cm.getAnnotation(MsgPack.class, mp);

+		this.msgPack = cm.getAnnotation(MsgPack.class);

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
index 532ad0e..0e857b6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
@@ -778,14 +778,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public MsgPackSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public MsgPackSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public MsgPackSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public MsgPackSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
index 7b79561..0cba4ba 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
@@ -31,7 +31,7 @@
 	 */

 	public OpenApiClassMeta(ClassMeta<?> cm, OpenApiMetaProvider mp) {

 		super(cm);

-		this.openApi = cm.getAnnotation(OpenApi.class, mp);

+		this.openApi = cm.getAnnotation(OpenApi.class);

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserBuilder.java
index 61eaa9b..6167d71 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserBuilder.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.oapi;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -663,9 +664,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public OpenApiParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public OpenApiParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public OpenApiParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerBuilder.java
index b2f9749..3380f5b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerBuilder.java
@@ -822,14 +822,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public OpenApiSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public OpenApiSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public OpenApiSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public OpenApiSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/InputStreamParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/InputStreamParserBuilder.java
index 7d46dc9..3166ae7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/InputStreamParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/InputStreamParserBuilder.java
@@ -719,14 +719,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public InputStreamParserBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public InputStreamParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public InputStreamParserBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public InputStreamParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserBuilder.java
index 21b0d99..c76ba04 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserBuilder.java
@@ -798,14 +798,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public ParserBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public ParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public ParserBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public ParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
index 128a67d..8d76fae 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserGroupBuilder.java
@@ -942,14 +942,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public ParserGroupBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public ParserGroupBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public ParserGroupBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public ParserGroupBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ReaderParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ReaderParserBuilder.java
index 860c504..3fa7bde 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ReaderParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ReaderParserBuilder.java
@@ -718,14 +718,14 @@
 	}

 

 	@Override /* ContextBuilder */

-	public ReaderParserBuilder applyAnnotations(Class<?> fromClass) {

-		super.applyAnnotations(fromClass);

+	public ReaderParserBuilder applyAnnotations(Class<?>...fromClasses) {

+		super.applyAnnotations(fromClasses);

 		return this;

 	}

 

 	@Override /* ContextBuilder */

-	public ReaderParserBuilder applyAnnotations(Method fromMethod) {

-		super.applyAnnotations(fromMethod);

+	public ReaderParserBuilder applyAnnotations(Method...fromMethods) {

+		super.applyAnnotations(fromMethods);

 		return this;

 	}

 }

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
index 489fff1..fda5b6d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
@@ -31,7 +31,7 @@
 	 */

 	public PlainTextClassMeta(ClassMeta<?> cm, PlainTextMetaProvider mp) {

 		super(cm);

-		this.plainText = cm.getAnnotation(PlainText.class, mp);

+		this.plainText = cm.getAnnotation(PlainText.class);

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParserBuilder.java
index c54b26f..4535c74 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParserBuilder.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.plaintext;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -688,9 +689,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public PlainTextParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public PlainTextParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public PlainTextParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
index 3af9926..04944d2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
@@ -821,14 +821,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public PlainTextSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public PlainTextSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public PlainTextSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public PlainTextSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
index 1579a66..e31b6da 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
@@ -659,14 +659,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public OutputStreamSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public OutputStreamSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public OutputStreamSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public OutputStreamSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
index e39a1fd..7db406f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
@@ -1073,14 +1073,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public SerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public SerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public SerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public SerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
index f642095..654d91a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
@@ -1247,14 +1247,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public SerializerGroupBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public SerializerGroupBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public SerializerGroupBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public SerializerGroupBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
index f103528..9674c14 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
@@ -768,14 +768,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public WriterSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public WriterSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public WriterSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public WriterSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
index 7d67287..e542343 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
@@ -31,7 +31,7 @@
 	 */

 	public SoapXmlClassMeta(ClassMeta<?> cm, SoapXmlMetaProvider mp) {

 		super(cm);

-		this.soapXml = cm.getAnnotation(SoapXml.class, mp);

+		this.soapXml = cm.getAnnotation(SoapXml.class);

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
index 8ecafba..d7ce4e3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
@@ -840,14 +840,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public SoapXmlSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public SoapXmlSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public SoapXmlSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public SoapXmlSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
index 482b9e9..3da35da 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
@@ -31,7 +31,7 @@
 	 */

 	public UonClassMeta(ClassMeta<?> cm, UonMetaProvider mp) {

 		super(cm);

-		this.uon = cm.getAnnotation(Uon.class, mp);

+		this.uon = cm.getAnnotation(Uon.class);

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserBuilder.java
index aa54741..dd851a2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserBuilder.java
@@ -15,6 +15,7 @@
 import static org.apache.juneau.uon.UonParser.*;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -763,9 +764,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public UonParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public UonParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public UonParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
index 9ae23ed..08de009 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
@@ -912,14 +912,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public UonSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public UonSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public UonSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public UonSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
index 41e5ecf..c50ec0e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
@@ -31,7 +31,7 @@
 	 */

 	public UrlEncodingClassMeta(ClassMeta<?> cm, UrlEncodingMetaProvider mp) {

 		super(cm);

-		this.urlEncoding = cm.getAnnotation(UrlEncoding.class, mp);

+		this.urlEncoding = cm.getAnnotation(UrlEncoding.class);

 		if (urlEncoding != null) {

 			expandedParams = urlEncoding.expandedParams();

 		} else {

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
index 58e0e60..818d993 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserBuilder.java
@@ -15,6 +15,7 @@
 import static org.apache.juneau.urlencoding.UrlEncodingParser.*;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -708,9 +709,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public UrlEncodingParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public UrlEncodingParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public UrlEncodingParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
index aaa06c9..1ca00a2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
@@ -884,14 +884,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public UrlEncodingSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public UrlEncodingSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public UrlEncodingSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public UrlEncodingSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
index 160a9ef..c183e8a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
@@ -39,7 +39,7 @@
 	public XmlClassMeta(ClassMeta<?> cm, XmlMetaProvider mp) {

 		super(cm);

 		this.namespace = findNamespace(cm, mp);

-		this.xml = cm.getAnnotation(Xml.class, mp);

+		this.xml = cm.getAnnotation(Xml.class);

 		if (xml != null) {

 			this.format = xml.format();

 			this.childName = nullIfEmpty(xml.childName());

@@ -101,8 +101,8 @@
 	private static Namespace findNamespace(ClassMeta<?> cm, MetaProvider mp) {

 		if (cm == null)

 			return null;

-		List<Xml> xmls = cm.getAnnotations(Xml.class, mp);

-		List<XmlSchema> schemas = cm.getAnnotations(XmlSchema.class, mp);

+		List<Xml> xmls = cm.getAnnotations(Xml.class);

+		List<XmlSchema> schemas = cm.getAnnotations(XmlSchema.class);

 		return XmlUtils.findNamespace(xmls, schemas);

 	}

 }

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
index a9db043..92fe68a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserBuilder.java
@@ -15,6 +15,7 @@
 import static org.apache.juneau.xml.XmlParser.*;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
 
@@ -866,9 +867,21 @@
 		return this;
 	}
 
-	@Override
+	@Override /* ContextBuilder */
 	public XmlParserBuilder applyAnnotations(AnnotationList al, VarResolverSession vrs) {
 		super.applyAnnotations(al, vrs);
 		return this;
 	}
+
+	@Override /* ContextBuilder */
+	public XmlParserBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
+		return this;
+	}
+
+	@Override /* ContextBuilder */
+	public XmlParserBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
+		return this;
+	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
index 61ccc1f..691a052 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
@@ -1021,14 +1021,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public XmlSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public XmlSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public XmlSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public XmlSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xmlschema/XmlSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xmlschema/XmlSchemaSerializerBuilder.java
index f4d0a80..709b452 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xmlschema/XmlSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xmlschema/XmlSchemaSerializerBuilder.java
@@ -864,14 +864,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public XmlSchemaSerializerBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public XmlSchemaSerializerBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public XmlSchemaSerializerBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public XmlSchemaSerializerBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
index 62fe86c..243b9cc 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
@@ -2852,14 +2852,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public RestClientBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public RestClientBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public RestClientBuilder applyAnnotations(Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public RestClientBuilder applyAnnotations(Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}
 
diff --git a/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/DTOs2.java b/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/DTOs2.java
new file mode 100644
index 0000000..21fcfe0
--- /dev/null
+++ b/juneau-rest/juneau-rest-mock-utest/src/test/java/org/apache/juneau/rest/testutils/DTOs2.java
@@ -0,0 +1,143 @@
+// ***************************************************************************************************************************

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

+

+import java.util.*;

+

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

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

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

+

+public class DTOs2 {

+

+	@BeanConfig(annotateBean={@Bean(on="A,B,C",sort=true)})

+	@UrlEncodingConfig(annotateUrlEncoding={@UrlEncoding(on="C",expandedParams=true)})

+	public static class Annotations {}

+

+	public static class A {

+		public String a;

+		public int b;

+		public boolean c;

+

+		public static A create() {

+			A t = new A();

+			t.a = "a";

+			t.b = 1;

+			t.c = true;

+			return t;

+		}

+

+	}

+

+	public static class B {

+		public String[] f01;

+		public List<String> f02;

+		public int[] f03;

+		public List<Integer> f04;

+		public String[][] f05;

+		public List<String[]> f06;

+		public A[] f07;

+		public List<A> f08;

+		public A[][] f09;

+		public List<List<A>> f10;

+

+		private String[] f11;

+		private List<String> f12;

+		private int[] f13;

+		private List<Integer> f14;

+		private String[][] f15;

+		private List<String[]> f16;

+		private A[] f17;

+		private List<A> f18;

+		private A[][] f19;

+		private List<List<A>> f20;

+

+		public String[] getF11() { return f11; }

+		public List<String> getF12() { return f12; }

+		public int[] getF13() { return f13; }

+		public List<Integer> getF14() { return f14; }

+		public String[][] getF15() { return f15; }

+		public List<String[]> getF16() { return f16; }

+		public A[] getF17() { return f17; }

+		public List<A> getF18() { return f18; }

+		public A[][] getF19() { return f19; }

+		public List<List<A>> getF20() { return f20; }

+

+		public void setF11(String[] f11) { this.f11 = f11; }

+		public void setF12(List<String> f12) { this.f12 = f12; }

+		public void setF13(int[] f13) { this.f13 = f13; }

+		public void setF14(List<Integer> f14) { this.f14 = f14; }

+		public void setF15(String[][] f15) { this.f15 = f15; }

+		public void setF16(List<String[]> f16) { this.f16 = f16; }

+		public void setF17(A[] f17) { this.f17 = f17; }

+		public void setF18(List<A> f18) { this.f18 = f18; }

+		public void setF19(A[][] f19) { this.f19 = f19; }

+		public void setF20(List<List<A>> f20) { this.f20 = f20; }

+

+		public static B create() {

+			B t = new B();

+			t.f01 = new String[]{"a","b"};

+			t.f02 = AList.create("c","d");

+			t.f03 = new int[]{1,2};

+			t.f04 = AList.create(3,4);

+			t.f05 = new String[][]{{"e","f"},{"g","h"}};

+			t.f06 = AList.create(new String[]{"i","j"},new String[]{"k","l"});

+			t.f07 = new A[]{A.create(),A.create()};

+			t.f08 = AList.create(A.create(),A.create());

+			t.f09 = new A[][]{{A.create()},{A.create()}};

+			t.f10 = AList.create(Arrays.asList(A.create()),Arrays.asList(A.create()));

+			t.setF11(new String[]{"a","b"});

+			t.setF12(AList.create("c","d"));

+			t.setF13(new int[]{1,2});

+			t.setF14(AList.create(3,4));

+			t.setF15(new String[][]{{"e","f"},{"g","h"}});

+			t.setF16(AList.create(new String[]{"i","j"},new String[]{"k","l"}));

+			t.setF17(new A[]{A.create(),A.create()});

+			t.setF18(AList.create(A.create(),A.create()));

+			t.setF19(new A[][]{{A.create()},{A.create()}});

+			t.setF20(AList.create(Arrays.asList(A.create()),Arrays.asList(A.create())));

+			return t;

+		}

+

+		public static B INSTANCE = create();

+	}

+

+	public static class C extends B {

+		public static C create() {

+			C t = new C();

+			t.f01 = new String[]{"a","b"};

+			t.f02 = AList.create("c","d");

+			t.f03 = new int[]{1,2};

+			t.f04 = AList.create(3, 4);

+			t.f05 = new String[][]{{"e","f"},{"g","h"}};

+			t.f06 = AList.create(new String[]{"i","j"}, new String[]{"k","l"});

+			t.f07 = new A[]{A.create(),A.create()};

+			t.f08 = AList.create(A.create(), A.create());

+			t.f09 = new A[][]{{A.create()},{A.create()}};

+			t.f10 = AList.create(Arrays.asList(A.create()), Arrays.asList(A.create()));

+			t.setF11(new String[]{"a","b"});

+			t.setF12(AList.create("c","d"));

+			t.setF13(new int[]{1,2});

+			t.setF14(AList.create(3,4));

+			t.setF15(new String[][]{{"e","f"},{"g","h"}});

+			t.setF16(AList.create(new String[]{"i","j"},new String[]{"k","l"}));

+			t.setF17(new A[]{A.create(),A.create()});

+			t.setF18(AList.create(A.create(), A.create()));

+			t.setF19(new A[][]{{A.create()},{A.create()}});

+			t.setF20(AList.create(Arrays.asList(A.create()), Arrays.asList(A.create())));

+			return t;

+		}

+

+		public static C INSTANCE = create();

+	}

+}

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 17dde9a..77f59dd 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
@@ -19,6 +19,7 @@
 import java.io.*;
 import java.util.*;
 
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.http.annotation.Body;
 import org.apache.juneau.http.annotation.HasQuery;
@@ -31,8 +32,11 @@
 import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.rest.testutils.DTOs;
+import org.apache.juneau.rest.testutils.DTOs2;
 import org.apache.juneau.uon.*;
 import org.apache.juneau.urlencoding.*;
+import org.apache.juneau.urlencoding.annotation.*;
+import org.apache.juneau.urlencoding.annotation.UrlEncoding;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 import org.junit.runners.*;
@@ -649,6 +653,42 @@
 		e.put("/C?body=" + UonSerializer.DEFAULT.serialize(DTOs.B.INSTANCE), "a").execute().assertBody(expected);
 	}
 
+	@Rest(serializers=SimpleJsonSerializer.class, parsers=JsonParser.class, defaultAccept="application/json")
+	@BeanConfig(annotateBean={@Bean(on="A,B,C",sort=true)})
+	@UrlEncodingConfig(annotateUrlEncoding={@UrlEncoding(on="C",expandedParams=true)})
+	public static class E2 {
+		@RestMethod(name=PUT, path="/B")
+		public DTOs2.B testPojo1(@Body DTOs2.B b) {
+			return b;
+		}
+		@RestMethod(name=PUT, path="/C")
+		public DTOs2.C testPojo2(@Body DTOs2.C c) {
+			return c;
+		}
+	}
+	private static MockRest e2 = MockRest.build(E2.class);
+
+	@Test
+	public void e05_complexPojos_B_body() throws Exception {
+		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}";
+		e2.put("/B", SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().toString(DTOs2.B.INSTANCE)).json().execute().assertBody(expected);
+	}
+	@Test
+	public void e06_complexPojos_B_bodyParam() throws Exception {
+		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}";
+		e2.put("/B?body=" + UonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().serialize(DTOs2.B.INSTANCE), "a").execute().assertBody(expected);
+	}
+	@Test
+	public void e07_complexPojos_C_body() throws Exception {
+		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}";
+		e2.put("/C", SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().toString(DTOs2.B.INSTANCE)).json().execute().assertBody(expected);
+	}
+	@Test
+	public void e08_complexPojos_C_bodyParam() throws Exception {
+		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}";
+		e2.put("/C?body=" + UonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().serialize(DTOs2.B.INSTANCE), "a").execute().assertBody(expected);
+	}
+
 	//=================================================================================================================
 	// Form POSTS with @Body parameter
 	//=================================================================================================================
@@ -764,6 +804,48 @@
 		h.post("/", in).urlEnc().execute().assertBody(in);
 	}
 
+	@Rest(serializers=UrlEncodingSerializer.class,parsers=UrlEncodingParser.class)
+	@BeanConfig(annotateBean={@Bean(on="A,B,C",sort=true)})
+	@UrlEncodingConfig(annotateUrlEncoding={@UrlEncoding(on="C",expandedParams=true)})
+	public static class H2 {
+		@RestMethod(name=POST,path="/",
+			properties={
+				@Property(name=UrlEncodingSerializer.URLENC_expandedParams, value="true"),
+				@Property(name=UrlEncodingParser.URLENC_expandedParams, value="true")
+			}
+		)
+		public DTOs2.B g(@Body DTOs2.B content) throws Exception {
+			return content;
+		}
+	}
+	static MockRest h2 = MockRest.build(H2.class);
+
+	@Test
+	public void h02() throws Exception {
+		String in = ""
+			+ "f01=a&f01=b"
+			+ "&f02=c&f02=d"
+			+ "&f03=1&f03=2"
+			+ "&f04=3&f04=4"
+			+ "&f05=@(e,f)&f05=@(g,h)"
+			+ "&f06=@(i,j)&f06=@(k,l)"
+			+ "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"
+			+ "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"
+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"
+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"
+			+ "&f11=a&f11=b"
+			+ "&f12=c&f12=d"
+			+ "&f13=1&f13=2"
+			+ "&f14=3&f14=4"
+			+ "&f15=@(e,f)&f15=@(g,h)"
+			+ "&f16=@(i,j)&f16=@(k,l)"
+			+ "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"
+			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
+		h2.post("/", in).urlEnc().execute().assertBody(in);
+	}
+
 	//=================================================================================================================
 	// Test behavior of @Body(required=true).
 	//=================================================================================================================
@@ -783,6 +865,23 @@
 		i.post("/", "{}").json().execute().assertStatus(200);
 	}
 
+	@Rest(serializers=JsonSerializer.class,parsers=JsonParser.class)
+	public static class I2 {
+		@RestMethod(name=POST,path="/")
+		@BeanConfig(annotateBean={@Bean(on="A,B,C",sort=true)})
+		@UrlEncodingConfig(annotateUrlEncoding={@UrlEncoding(on="C",expandedParams=true)})
+		public DTOs2.B g(@Body(required=true) DTOs2.B content) throws Exception {
+			return content;
+		}
+	}
+	static MockRest i2 = MockRest.build(I2.class);
+
+	@Test
+	public void i02() throws Exception {
+		i2.post("/", "").json().execute().assertStatus(400).assertBodyContains("Required value not provided.");
+		i2.post("/", "{}").json().execute().assertStatus(200);
+	}
+
 	//=================================================================================================================
 	// Optional body parameter.
 	//=================================================================================================================
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 fcc7a38..e930018 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
@@ -869,7 +869,7 @@
 
 	/**
 	 * Configuration property:  Default request attributes.
-	 * 
+	 *
 	 * @deprecated Use {@link #reqAttrs(String...)}
 	 */
 	@SuppressWarnings("javadoc")
@@ -880,7 +880,7 @@
 
 	/**
 	 * Configuration property:  Default request headers.
-	 * 
+	 *
 	 * @deprecated Use {@link #reqHeaders(String...)}
 	 */
 	@SuppressWarnings("javadoc")
@@ -930,7 +930,7 @@
 
 	/**
 	 * Configuration property:  Default request headers.
-	 * 
+	 *
 	 * @deprecated Use {@link #reqHeader(String,Object)}
 	 */
 	@SuppressWarnings("javadoc")
@@ -2998,14 +2998,14 @@
 	}
 
 	@Override /* ContextBuilder */
-	public RestContextBuilder applyAnnotations(Class<?> fromClass) {
-		super.applyAnnotations(fromClass);
+	public RestContextBuilder applyAnnotations(Class<?>...fromClasses) {
+		super.applyAnnotations(fromClasses);
 		return this;
 	}
 
 	@Override /* ContextBuilder */
-	public RestContextBuilder applyAnnotations(java.lang.reflect.Method fromMethod) {
-		super.applyAnnotations(fromMethod);
+	public RestContextBuilder applyAnnotations(java.lang.reflect.Method...fromMethods) {
+		super.applyAnnotations(fromMethods);
 		return this;
 	}