You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2018/06/06 12:19:56 UTC

[juneau] branch master updated: Swagger improvements.

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

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


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

commit ecfec3e37dc219049cb687f192f843ec4e205e0d
Author: JamesBognar <ja...@apache.org>
AuthorDate: Wed Jun 6 08:19:29 2018 -0400

    Swagger improvements.
---
 .../apache/juneau/a/rttests/RoundTripDTOsTest.java |    8 +-
 .../juneau/dto/jsonschema/JsonSchemaTest.java      |   46 +-
 .../jsonschema/{Schema.java => JsonSchema.java}    |  292 +-
 .../{SchemaArray.java => JsonSchemaArray.java}     |   16 +-
 .../{SchemaMap.java => JsonSchemaMap.java}         |   20 +-
 ...SchemaProperty.java => JsonSchemaProperty.java} |    8 +-
 ...ray.java => JsonSchemaPropertySimpleArray.java} |    6 +-
 .../{SchemaRef.java => JsonSchemaRef.java}         |    4 +-
 .../src/main/java/org/apache/juneau/ObjectMap.java |    3 +-
 .../juneau/examples/rest/AtomFeedResource.java     |    6 +-
 .../examples/rest/CodeFormatterResource.java       |    6 +-
 .../examples/rest/DockerRegistryResource.java      |    4 +-
 .../juneau/examples/rest/JsonSchemaResource.java   |   20 +-
 .../examples/rest/MethodExampleResource.java       |    6 +-
 .../juneau/examples/rest/PhotosResource.java       |    6 +-
 .../examples/rest/PredefinedLabelsResource.java    |    6 +-
 .../juneau/examples/rest/RequestEchoResource.java  |    6 +-
 .../examples/rest/SampleRemoteableServlet.java     |    6 +-
 .../juneau/examples/rest/SqlQueryResource.java     |    6 +-
 .../examples/rest/SystemPropertiesResource.java    |    6 +-
 .../juneau/examples/rest/TempDirResource.java      |    6 +-
 .../examples/rest/UrlEncodedFormResource.java      |    6 +-
 .../rest/addressbook/AddressBookResource.java      |    6 +-
 .../microservice/resources/DirectoryResource.java  |    4 +-
 .../microservice/resources/LogsResource.java       |    2 +-
 .../apache/juneau/rest/BasicRestCallHandler.java   |    2 +-
 .../apache/juneau/rest/BasicRestInfoProvider.java  |  208 +-
 .../org/apache/juneau/rest/RestContextBuilder.java |    2 +-
 .../org/apache/juneau/rest/RestJavaMethod.java     |    1 -
 .../org/apache/juneau/rest/RestMethodReturn.java   |    9 +-
 .../org/apache/juneau/rest/RestMethodThrown.java   |   10 +-
 .../org/apache/juneau/rest/RestParamDefaults.java  |  177 +-
 .../org/apache/juneau/rest/annotation/Body.java    |  381 +-
 .../org/apache/juneau/rest/annotation/Contact.java |   57 +-
 .../juneau/rest/annotation/ExternalDocs.java       |   74 +-
 .../apache/juneau/rest/annotation/FormData.java    |   14 +-
 .../org/apache/juneau/rest/annotation/Header.java  |   13 +-
 .../org/apache/juneau/rest/annotation/Items.java   |   65 +-
 .../org/apache/juneau/rest/annotation/License.java |   58 +-
 .../juneau/rest/annotation/MethodSwagger.java      |   19 +-
 .../org/apache/juneau/rest/annotation/Path.java    |   11 +-
 .../org/apache/juneau/rest/annotation/Query.java   |   13 +-
 .../juneau/rest/annotation/ResourceSwagger.java    |   31 +-
 .../apache/juneau/rest/annotation/Response.java    |   34 +-
 .../juneau/rest/annotation/ResponseHeader.java     |   47 +-
 .../rest/annotation/{Body.java => Schema.java}     |  438 +--
 .../org/apache/juneau/rest/annotation/Tag.java     |   57 +-
 .../org/apache/juneau/rest/helper/Redirect.java    |    2 +-
 .../juneau/rest/helper/ResourceDescription.java    |    2 +-
 .../juneau/rest/remoteable/RemoteableServlet.java  |   10 +-
 .../org/apache/juneau/rest/util/RestUtils.java     |  633 ++++
 .../java/org/apache/juneau/rest/util/Utils.java    |   65 -
 .../juneau/rest/BasicRestInfoProviderTest.java     | 3937 ++++++--------------
 .../juneau/rest/BeanContextPropertiesTest.java     |    2 +-
 .../juneau/rest/annotation/PathAnnotationTest.java |   34 +-
 .../apache/juneau/rest/headers/HeadersTest.java    |   29 +-
 56 files changed, 2542 insertions(+), 4398 deletions(-)

diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripDTOsTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripDTOsTest.java
index cf7df6e..d6d1aaa 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripDTOsTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripDTOsTest.java
@@ -35,15 +35,15 @@ public class RoundTripDTOsTest extends RoundTripTest {
 	//====================================================================================================
 	@Test
 	public void testJsonSchema1() throws Exception {
-		Schema s = JsonSchemaTest.getTest1();
-		Schema s2 = roundTrip(s, Schema.class);
+		JsonSchema s = JsonSchemaTest.getTest1();
+		JsonSchema s2 = roundTrip(s, JsonSchema.class);
 		assertEqualObjects(s, s2);
 	}
 
 	@Test
 	public void testJsonSchema2() throws Exception {
-		Schema s = JsonSchemaTest.getTest2();
-		Schema s2 = roundTrip(s, Schema.class);
+		JsonSchema s = JsonSchemaTest.getTest2();
+		JsonSchema s2 = roundTrip(s, JsonSchema.class);
 		assertEqualObjects(s, s2);
 	}
 }
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java
index 3b9849b..ee100ed 100644
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java
@@ -26,7 +26,7 @@ public class JsonSchemaTest {
 		JsonSerializer s = JsonSerializer.create().ssq().ws().addBeanTypes(false).build();
 		JsonParser p = JsonParser.DEFAULT;
 		String r;
-		Schema t, t2;
+		JsonSchema t, t2;
 
 		String expected =
 			"{\n"
@@ -110,7 +110,7 @@ public class JsonSchemaTest {
 		t = getTest1();
 		r = s.serialize(t);
 		assertEquals(expected, r);
-		t2 = p.parse(r, Schema.class);
+		t2 = p.parse(r, JsonSchema.class);
 		r = s.serialize(t2);
 		assertEquals(expected, r);
 	}
@@ -120,7 +120,7 @@ public class JsonSchemaTest {
 		JsonSerializer s = JsonSerializer.create().ssq().ws().addBeanTypes(false).build();
 		JsonParser p = JsonParser.DEFAULT;
 		String r;
-		Schema t, t2;
+		JsonSchema t, t2;
 
 		String expected =
 			"{\n"
@@ -147,7 +147,7 @@ public class JsonSchemaTest {
 		t = getTest2();
 		r = s.serialize(t);
 		assertEquals(expected, r);
-		t2 = p.parse(r, Schema.class);
+		t2 = p.parse(r, JsonSchema.class);
 		r = s.serialize(t2);
 		assertEquals(expected, r);
 	}
@@ -157,7 +157,7 @@ public class JsonSchemaTest {
 		JsonSerializer s = JsonSerializer.create().ssq().ws().addBeanTypes(false).build();
 		JsonParser p = JsonParser.DEFAULT;
 		String r;
-		Schema t, t2;
+		JsonSchema t, t2;
 
 		String expected =
 			"{\n"
@@ -240,25 +240,25 @@ public class JsonSchemaTest {
 
 		t = getTest1();
 		r = t.toString();
-		t2 = p.parse(r, Schema.class);
+		t2 = p.parse(r, JsonSchema.class);
 		r = s.serialize(t2);
 		assertEquals(expected, r);
 	}
 
 	
 	/** Bean with simple values for each property */
-	public static Schema getTest1() {
-		return new Schema()
+	public static JsonSchema getTest1() {
+		return new JsonSchema()
 			.setId("http://id")
 			.setSchemaVersionUri("http://schemaVersionUri")
 			.setTitle("title")
 			.setDescription("description")
 			.setType(JsonType.NUMBER)
-			.addDefinition("definition", new SchemaRef("http://definition"))
-			.addProperties(new SchemaProperty("property", JsonType.NUMBER))
-			.addPatternProperties(new SchemaProperty("/pattern/", JsonType.NUMBER))
-			.addDependency("dependency", new SchemaRef("http://dependency"))
-			.addItems(new Schema().setType(JsonType.NUMBER))
+			.addDefinition("definition", new JsonSchemaRef("http://definition"))
+			.addProperties(new JsonSchemaProperty("property", JsonType.NUMBER))
+			.addPatternProperties(new JsonSchemaProperty("/pattern/", JsonType.NUMBER))
+			.addDependency("dependency", new JsonSchemaRef("http://dependency"))
+			.addItems(new JsonSchema().setType(JsonType.NUMBER))
 			.setMultipleOf(1)
 			.setMaximum(2)
 			.setExclusiveMaximum(true)
@@ -267,30 +267,30 @@ public class JsonSchemaTest {
 			.setMaxLength(4)
 			.setMinLength(5)
 			.setPattern("/pattern/")
-			.addAdditionalItems(new SchemaProperty("additionalItem", JsonType.NUMBER))
+			.addAdditionalItems(new JsonSchemaProperty("additionalItem", JsonType.NUMBER))
 			.setMaxItems(6)
 			.setMinItems(7)
 			.setUniqueItems(true)
 			.setMaxProperties(8)
 			.setMinProperties(9)
 			.addRequired("required")
-			.setAdditionalProperties(new SchemaRef("http://additionalProperty"))
+			.setAdditionalProperties(new JsonSchemaRef("http://additionalProperty"))
 			.addEnum("enum")
-			.addAllOf(new SchemaRef("http://allOf"))
-			.addAnyOf(new SchemaRef("http://anyOf"))
-			.addOneOf(new SchemaRef("http://oneOf"))
-			.setNot(new SchemaRef("http://not"))
+			.addAllOf(new JsonSchemaRef("http://allOf"))
+			.addAnyOf(new JsonSchemaRef("http://anyOf"))
+			.addOneOf(new JsonSchemaRef("http://oneOf"))
+			.setNot(new JsonSchemaRef("http://not"))
 		;
 	}
 
 	/** Bean with other possible property value types not covered in test1 */
-	public static Schema getTest2() {
-		return new Schema()
+	public static JsonSchema getTest2() {
+		return new JsonSchema()
 			.setId(URI.create("http://id"))
 			.setSchemaVersionUri(URI.create("http://schemaVersionUri"))
 			.setType(new JsonTypeArray(JsonType.STRING, JsonType.NUMBER))
-			.addDefinition("definition", new Schema().setId("http://definition"))
-			.setItems(new SchemaArray(new SchemaRef("http://items")))
+			.addDefinition("definition", new JsonSchema().setId("http://definition"))
+			.setItems(new JsonSchemaArray(new JsonSchemaRef("http://items")))
 			.setAdditionalItems(Boolean.TRUE)
 			.setAdditionalProperties(Boolean.TRUE);
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/Schema.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchema.java
similarity index 81%
rename from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/Schema.java
rename to juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchema.java
index b98fb83..5ff5921 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/Schema.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchema.java
@@ -40,7 +40,7 @@ import org.apache.juneau.transform.*;
 		+ "maxItems,minItems,uniqueItems,maxProperties,minProperties,required,"
 		+ "additionalProperties,enum,allOf,anyOf,oneOf,not"
 )
-public class Schema {
+public class JsonSchema {
 	private String name;                                   // Property name.  Not serialized.
 	private URI id;
 	private URI schemaVersion;
@@ -48,12 +48,12 @@ public class Schema {
 	private String description;
 	private JsonType typeJsonType;                         // JsonType representation of type
 	private JsonTypeArray typeJsonTypeArray;               // JsonTypeArray representation of type
-	private Map<String,Schema> definitions;
-	private Map<String,Schema> properties;
-	private Map<String,Schema> patternProperties;
-	private Map<String,Schema> dependencies;
-	private Schema itemsSchema;                            // Schema representation of items
-	private SchemaArray itemsSchemaArray;                  // SchemaArray representation of items
+	private Map<String,JsonSchema> definitions;
+	private Map<String,JsonSchema> properties;
+	private Map<String,JsonSchema> patternProperties;
+	private Map<String,JsonSchema> dependencies;
+	private JsonSchema itemsSchema;                            // Schema representation of items
+	private JsonSchemaArray itemsSchemaArray;                  // SchemaArray representation of items
 	private Number multipleOf;
 	private Number maximum;
 	private Boolean exclusiveMaximum;
@@ -63,7 +63,7 @@ public class Schema {
 	private Integer minLength;
 	private String pattern;
 	private Boolean additionalItemsBoolean;                // Boolean representation of additionalItems
-	private SchemaArray additionalItemsSchemaArray;        // SchemaArray representation of additionalItems
+	private JsonSchemaArray additionalItemsSchemaArray;        // SchemaArray representation of additionalItems
 	private Integer maxItems;
 	private Integer minItems;
 	private Boolean uniqueItems;
@@ -71,20 +71,20 @@ public class Schema {
 	private Integer minProperties;
 	private List<String> required;
 	private Boolean additionalPropertiesBoolean;           // Boolean representation of additionalProperties
-	private Schema additionalPropertiesSchema;             // Schema representation of additionalProperties
+	private JsonSchema additionalPropertiesSchema;             // Schema representation of additionalProperties
 	private List<String> _enum;
-	private List<Schema> allOf;
-	private List<Schema> anyOf;
-	private List<Schema> oneOf;
-	private Schema not;
+	private List<JsonSchema> allOf;
+	private List<JsonSchema> anyOf;
+	private List<JsonSchema> oneOf;
+	private JsonSchema not;
 	private URI ref;
-	private SchemaMap schemaMap;
-	private Schema master = this;
+	private JsonSchemaMap schemaMap;
+	private JsonSchema master = this;
 
 	/**
 	 * Default constructor.
 	 */
-	public Schema() {}
+	public JsonSchema() {}
 
 
 	//--------------------------------------------------------------------------------
@@ -108,7 +108,7 @@ public class Schema {
 	 * @return This object (for method chaining).
 	 */
 	@BeanIgnore
-	public Schema setName(String name) {
+	public JsonSchema setName(String name) {
 		this.name = name;
 		return this;
 	}
@@ -135,7 +135,7 @@ public class Schema {
 	 * @param id The new value for the <property>id</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setId(Object id) {
+	public JsonSchema setId(Object id) {
 		this.id = toURI(id);
 		return this;
 	}
@@ -164,7 +164,7 @@ public class Schema {
 	 * @return This object (for method chaining).
 	 */
 	@BeanProperty("$schema")
-	public Schema setSchemaVersionUri(Object schemaVersion) {
+	public JsonSchema setSchemaVersionUri(Object schemaVersion) {
 		this.schemaVersion = toURI(schemaVersion);
 		return this;
 	}
@@ -184,7 +184,7 @@ public class Schema {
 	 * @param title The new value for the <property>title</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setTitle(String title) {
+	public JsonSchema setTitle(String title) {
 		this.title = title;
 		return this;
 	}
@@ -204,7 +204,7 @@ public class Schema {
 	 * @param description The new value for the <property>description</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setDescription(String description) {
+	public JsonSchema setDescription(String description) {
 		this.description = description;
 		return this;
 	}
@@ -259,7 +259,7 @@ public class Schema {
 	 * @return This object (for method chaining).
 	 * @throws BeanRuntimeException If invalid object type passed in.
 	 */
-	public Schema setType(Object type) {
+	public JsonSchema setType(Object type) {
 		this.typeJsonType = null;
 		this.typeJsonTypeArray = null;
 		if (type != null) {
@@ -268,7 +268,7 @@ public class Schema {
 			else if (type instanceof JsonTypeArray)
 				this.typeJsonTypeArray = (JsonTypeArray)type;
 			else
-				throw new BeanRuntimeException(SchemaProperty.class,
+				throw new BeanRuntimeException(JsonSchemaProperty.class,
 					"Invalid attribute type ''{0}'' passed in.  Must be one of the following:  SimpleType, SimpleTypeArray",
 					type.getClass().getName());
 		}
@@ -281,7 +281,7 @@ public class Schema {
 	 * @param types The list of items to append to the <property>type</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addTypes(JsonType...types) {
+	public JsonSchema addTypes(JsonType...types) {
 		if (this.typeJsonTypeArray == null)
 			this.typeJsonTypeArray = new JsonTypeArray();
 		this.typeJsonTypeArray.addAll(types);
@@ -325,7 +325,7 @@ public class Schema {
 	 * @return
 	 * 	The value of the <property>definitions</property> property on this bean, or <jk>null</jk> if it is not set.
 	 */
-	public Map<String,Schema> getDefinitions() {
+	public Map<String,JsonSchema> getDefinitions() {
 		return definitions;
 	}
 
@@ -335,7 +335,7 @@ public class Schema {
 	 * @param definitions The new value for the <property>definitions</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setDefinitions(Map<String,Schema> definitions) {
+	public JsonSchema setDefinitions(Map<String,JsonSchema> definitions) {
 		this.definitions = definitions;
 		if (definitions != null)
 			setMasterOn(definitions.values());
@@ -349,7 +349,7 @@ public class Schema {
 	 * @param definition The value in the definitions map entry.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addDefinition(String name, Schema definition) {
+	public JsonSchema addDefinition(String name, JsonSchema definition) {
 		if (this.definitions == null)
 			this.definitions = new LinkedHashMap<>();
 		this.definitions.put(name, definition);
@@ -362,7 +362,7 @@ public class Schema {
 	 * 
 	 * @return The value of the <property>properties</property> property on this bean, or <jk>null</jk> if it is not set.
 	 */
-	public Map<String,Schema> getProperties() {
+	public Map<String,JsonSchema> getProperties() {
 		return properties;
 	}
 
@@ -375,7 +375,7 @@ public class Schema {
 	 * @param name The property name.
 	 * @return The property with the specified name, or <jk>null</jk> if no property is specified.
 	 */
-	public Schema getProperty(String name) {
+	public JsonSchema getProperty(String name) {
 		return getProperty(name, false);
 	}
 
@@ -393,10 +393,10 @@ public class Schema {
 	 * @param resolve If <jk>true</jk>, calls {@link #resolve()} on object before returning.
 	 * @return The property with the specified name, or <jk>null</jk> if no property is specified.
 	 */
-	public Schema getProperty(String name, boolean resolve) {
+	public JsonSchema getProperty(String name, boolean resolve) {
 		if (properties == null)
 			return null;
-		Schema s = properties.get(name);
+		JsonSchema s = properties.get(name);
 		if (s == null)
 			return null;
 		if (resolve)
@@ -410,11 +410,11 @@ public class Schema {
 	 * @param properties The new value for the <property>properties</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setProperties(Map<String,Schema> properties) {
+	public JsonSchema setProperties(Map<String,JsonSchema> properties) {
 		this.properties = properties;
 		if (properties != null)
-			for (Map.Entry<String,Schema> e : properties.entrySet()) {
-				Schema value = e.getValue();
+			for (Map.Entry<String,JsonSchema> e : properties.entrySet()) {
+				JsonSchema value = e.getValue();
 				setMasterOn(value);
 				value.setName(e.getKey());
 			}
@@ -431,12 +431,12 @@ public class Schema {
 	 * @return This object (for method chaining).
 	 * @throws BeanRuntimeException If property is found without a set <property>name</property> property.
 	 */
-	public Schema addProperties(Schema...properties) {
+	public JsonSchema addProperties(JsonSchema...properties) {
 		if (this.properties == null)
 			this.properties = new LinkedHashMap<>();
-		for (Schema p : properties) {
+		for (JsonSchema p : properties) {
 			if (p.getName() == null)
-				throw new BeanRuntimeException(Schema.class,
+				throw new BeanRuntimeException(JsonSchema.class,
 					"Invalid property passed to Schema.addProperties().  Property name was null.");
 			setMasterOn(p);
 			this.properties.put(p.getName(), p);
@@ -451,7 +451,7 @@ public class Schema {
 	 * 	The value of the <property>patternProperties</property> property on this bean, or <jk>null</jk> if it is
 	 * 	not set.
 	 */
-	public Map<String,Schema> getPatternProperties() {
+	public Map<String,JsonSchema> getPatternProperties() {
 		return patternProperties;
 	}
 
@@ -461,11 +461,11 @@ public class Schema {
 	 * @param patternProperties The new value for the <property>patternProperties</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setPatternProperties(Map<String,Schema> patternProperties) {
+	public JsonSchema setPatternProperties(Map<String,JsonSchema> patternProperties) {
 		this.patternProperties = patternProperties;
 		if (patternProperties != null)
-			for (Map.Entry<String,Schema> e : patternProperties.entrySet()) {
-				Schema s = e.getValue();
+			for (Map.Entry<String,JsonSchema> e : patternProperties.entrySet()) {
+				JsonSchema s = e.getValue();
 				setMasterOn(s);
 				s.setName(e.getKey());
 			}
@@ -482,12 +482,12 @@ public class Schema {
 	 * @return This object (for method chaining).
 	 * @throws BeanRuntimeException If property is found without a set <property>name</property> property.
 	 */
-	public Schema addPatternProperties(SchemaProperty...properties) {
+	public JsonSchema addPatternProperties(JsonSchemaProperty...properties) {
 		if (this.patternProperties == null)
 			this.patternProperties = new LinkedHashMap<>();
-		for (Schema p : properties) {
+		for (JsonSchema p : properties) {
 			if (p.getName() == null)
-				throw new BeanRuntimeException(Schema.class,
+				throw new BeanRuntimeException(JsonSchema.class,
 					"Invalid property passed to Schema.addProperties().  Property name was null.");
 			setMasterOn(p);
 			this.patternProperties.put(p.getName(), p);
@@ -501,7 +501,7 @@ public class Schema {
 	 * @return
 	 * 	The value of the <property>dependencies</property> property on this bean, or <jk>null</jk> if it is not set.
 	 */
-	public Map<String,Schema> getDependencies() {
+	public Map<String,JsonSchema> getDependencies() {
 		return dependencies;
 	}
 
@@ -511,7 +511,7 @@ public class Schema {
 	 * @param dependencies The new value for the <property>dependencies</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setDependencies(Map<String,Schema> dependencies) {
+	public JsonSchema setDependencies(Map<String,JsonSchema> dependencies) {
 		this.dependencies = dependencies;
 		if (dependencies != null)
 			setMasterOn(dependencies.values());
@@ -525,7 +525,7 @@ public class Schema {
 	 * @param dependency The value of the entry in the dependencies map.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addDependency(String name, Schema dependency) {
+	public JsonSchema addDependency(String name, JsonSchema dependency) {
 		if (this.dependencies == null)
 			this.dependencies = new LinkedHashMap<>();
 		this.dependencies.put(name, dependency);
@@ -538,7 +538,7 @@ public class Schema {
 	 * 
 	 * @return
 	 * 	The value of the <property>items</property> property on this bean, or <jk>null</jk> if it is not set.
-	 * 	Can be either a {@link Schema} or {@link SchemaArray} depending on what value was used to set it.
+	 * 	Can be either a {@link JsonSchema} or {@link JsonSchemaArray} depending on what value was used to set it.
 	 */
 	@Swap(SchemaOrSchemaArraySwap.class)
 	public Object getItems() {
@@ -551,12 +551,12 @@ public class Schema {
 	 * Bean property getter:  <property>items</property>.
 	 * 
 	 * <p>
-	 * Convenience method for returning the <property>items</property> property when it is a {@link Schema} value.
+	 * Convenience method for returning the <property>items</property> property when it is a {@link JsonSchema} value.
 	 * 
-	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link SchemaArray}.
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link JsonSchemaArray}.
 	 */
 	@BeanIgnore
-	public Schema getItemsAsSchema() {
+	public JsonSchema getItemsAsSchema() {
 		return itemsSchema;
 	}
 
@@ -564,12 +564,12 @@ public class Schema {
 	 * Bean property getter:  <property>items</property>.
 	 * 
 	 * <p>
-	 * Convenience method for returning the <property>items</property> property when it is a {@link SchemaArray} value.
+	 * Convenience method for returning the <property>items</property> property when it is a {@link JsonSchemaArray} value.
 	 * 
-	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link Schema}.
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link JsonSchema}.
 	 */
 	@BeanIgnore
-	public SchemaArray getItemsAsSchemaArray() {
+	public JsonSchemaArray getItemsAsSchemaArray() {
 		return itemsSchemaArray;
 	}
 
@@ -578,9 +578,9 @@ public class Schema {
 	 * 
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		If parsing a JSON-array, converts to a {@link SchemaArray}.
+	 * 		If parsing a JSON-array, converts to a {@link JsonSchemaArray}.
 	 * 	<li>
-	 * 		If parsing a JSON-object, converts to a {@link Schema}.
+	 * 		If parsing a JSON-object, converts to a {@link JsonSchema}.
 	 * </ul>
 	 * 
 	 * <p>
@@ -597,8 +597,8 @@ public class Schema {
 		public Object unswap(BeanSession session, Object o, ClassMeta<?> hint) throws ParseException {
 			ClassMeta<?> cm = (
 				o instanceof Collection
-				? session.getClassMeta(SchemaArray.class)
-				: session.getClassMeta(Schema.class)
+				? session.getClassMeta(JsonSchemaArray.class)
+				: session.getClassMeta(JsonSchema.class)
 			);
 			return session.convertToType(o, cm);
 		}
@@ -609,22 +609,22 @@ public class Schema {
 	 * 
 	 * @param
 	 * 	items The new value for the <property>items</property> property on this bean.
-	 * 	This object must be of type {@link Schema} or {@link SchemaArray}.
+	 * 	This object must be of type {@link JsonSchema} or {@link JsonSchemaArray}.
 	 * @return This object (for method chaining).
 	 * @throws BeanRuntimeException If invalid object type passed in.
 	 */
-	public Schema setItems(Object items) {
+	public JsonSchema setItems(Object items) {
 		this.itemsSchema = null;
 		this.itemsSchemaArray = null;
 		if (items != null) {
-			if (items instanceof Schema) {
-				this.itemsSchema = (Schema)items;
+			if (items instanceof JsonSchema) {
+				this.itemsSchema = (JsonSchema)items;
 				setMasterOn(this.itemsSchema);
-			} else if (items instanceof SchemaArray) {
-				this.itemsSchemaArray = (SchemaArray)items;
+			} else if (items instanceof JsonSchemaArray) {
+				this.itemsSchemaArray = (JsonSchemaArray)items;
 				setMasterOn(this.itemsSchemaArray);
 			} else
-				throw new BeanRuntimeException(SchemaProperty.class,
+				throw new BeanRuntimeException(JsonSchemaProperty.class,
 					"Invalid attribute type ''{0}'' passed in.  Must be one of the following:  Schema, SchemaArray",
 					items.getClass().getName());
 		}
@@ -637,9 +637,9 @@ public class Schema {
 	 * @param items The list of items to append to the <property>items</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addItems(Schema...items) {
+	public JsonSchema addItems(JsonSchema...items) {
 		if (this.itemsSchemaArray == null)
-			this.itemsSchemaArray = new SchemaArray();
+			this.itemsSchemaArray = new JsonSchemaArray();
 		this.itemsSchemaArray.addAll(items);
 		setMasterOn(items);
 		return this;
@@ -660,7 +660,7 @@ public class Schema {
 	 * @param multipleOf The new value for the <property>multipleOf</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMultipleOf(Number multipleOf) {
+	public JsonSchema setMultipleOf(Number multipleOf) {
 		this.multipleOf = multipleOf;
 		return this;
 	}
@@ -680,7 +680,7 @@ public class Schema {
 	 * @param maximum The new value for the <property>maximum</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMaximum(Number maximum) {
+	public JsonSchema setMaximum(Number maximum) {
 		this.maximum = maximum;
 		return this;
 	}
@@ -702,7 +702,7 @@ public class Schema {
 	 * @param exclusiveMaximum The new value for the <property>exclusiveMaximum</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setExclusiveMaximum(Boolean exclusiveMaximum) {
+	public JsonSchema setExclusiveMaximum(Boolean exclusiveMaximum) {
 		this.exclusiveMaximum = exclusiveMaximum;
 		return this;
 	}
@@ -722,7 +722,7 @@ public class Schema {
 	 * @param minimum The new value for the <property>minimum</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMinimum(Number minimum) {
+	public JsonSchema setMinimum(Number minimum) {
 		this.minimum = minimum;
 		return this;
 	}
@@ -744,7 +744,7 @@ public class Schema {
 	 * @param exclusiveMinimum The new value for the <property>exclusiveMinimum</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setExclusiveMinimum(Boolean exclusiveMinimum) {
+	public JsonSchema setExclusiveMinimum(Boolean exclusiveMinimum) {
 		this.exclusiveMinimum = exclusiveMinimum;
 		return this;
 	}
@@ -764,7 +764,7 @@ public class Schema {
 	 * @param maxLength The new value for the <property>maxLength</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMaxLength(Integer maxLength) {
+	public JsonSchema setMaxLength(Integer maxLength) {
 		this.maxLength = maxLength;
 		return this;
 	}
@@ -784,7 +784,7 @@ public class Schema {
 	 * @param minLength The new value for the <property>minLength</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMinLength(Integer minLength) {
+	public JsonSchema setMinLength(Integer minLength) {
 		this.minLength = minLength;
 		return this;
 	}
@@ -804,7 +804,7 @@ public class Schema {
 	 * @param pattern The new value for the <property>pattern</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setPattern(String pattern) {
+	public JsonSchema setPattern(String pattern) {
 		this.pattern = pattern;
 		return this;
 	}
@@ -815,7 +815,7 @@ public class Schema {
 	 * @return
 	 * 	The value of the <property>additionalItems</property> property on this bean, or <jk>null</jk> if it is
 	 * 	not set.
-	 * 	Can be either a {@link Boolean} or {@link SchemaArray} depending on what value was used to set it.
+	 * 	Can be either a {@link Boolean} or {@link JsonSchemaArray} depending on what value was used to set it.
 	 */
 	@Swap(BooleanOrSchemaArraySwap.class)
 	public Object getAdditionalItems() {
@@ -831,7 +831,7 @@ public class Schema {
 	 * Convenience method for returning the <property>additionalItems</property> property when it is a {@link Boolean}
 	 * value.
 	 * 
-	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link SchemaArray}.
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link JsonSchemaArray}.
 	 */
 	@BeanIgnore
 	public Boolean getAdditionalItemsAsBoolean() {
@@ -843,12 +843,12 @@ public class Schema {
 	 * 
 	 * <p>
 	 * Convenience method for returning the <property>additionalItems</property> property when it is a
-	 * {@link SchemaArray} value.
+	 * {@link JsonSchemaArray} value.
 	 * 
 	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link Boolean}.
 	 */
 	@BeanIgnore
-	public List<Schema> getAdditionalItemsAsSchemaArray() {
+	public List<JsonSchema> getAdditionalItemsAsSchemaArray() {
 		return additionalItemsSchemaArray;
 	}
 
@@ -857,21 +857,21 @@ public class Schema {
 	 * 
 	 * @param additionalItems
 	 * 	The new value for the <property>additionalItems</property> property on this bean.
-	 * 	This object must be of type {@link Boolean} or {@link SchemaArray}.
+	 * 	This object must be of type {@link Boolean} or {@link JsonSchemaArray}.
 	 * @return This object (for method chaining).
 	 * @throws BeanRuntimeException If invalid object type passed in.
 	 */
-	public Schema setAdditionalItems(Object additionalItems) {
+	public JsonSchema setAdditionalItems(Object additionalItems) {
 		this.additionalItemsBoolean = null;
 		this.additionalItemsSchemaArray = null;
 		if (additionalItems != null) {
 			if (additionalItems instanceof Boolean)
 				this.additionalItemsBoolean = (Boolean)additionalItems;
-			else if (additionalItems instanceof SchemaArray) {
-				this.additionalItemsSchemaArray = (SchemaArray)additionalItems;
+			else if (additionalItems instanceof JsonSchemaArray) {
+				this.additionalItemsSchemaArray = (JsonSchemaArray)additionalItems;
 				setMasterOn(this.additionalItemsSchemaArray);
 			} else
-				throw new BeanRuntimeException(SchemaProperty.class,
+				throw new BeanRuntimeException(JsonSchemaProperty.class,
 					"Invalid attribute type ''{0}'' passed in.  Must be one of the following:  Boolean, SchemaArray",
 					additionalItems.getClass().getName());
 		}
@@ -885,9 +885,9 @@ public class Schema {
 	 * 	The list of items to append to the <property>additionalItems</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addAdditionalItems(Schema...additionalItems) {
+	public JsonSchema addAdditionalItems(JsonSchema...additionalItems) {
 		if (this.additionalItemsSchemaArray == null)
-			this.additionalItemsSchemaArray = new SchemaArray();
+			this.additionalItemsSchemaArray = new JsonSchemaArray();
 		this.additionalItemsSchemaArray.addAll(additionalItems);
 		setMasterOn(additionalItems);
 		return this;
@@ -898,7 +898,7 @@ public class Schema {
 	 * 
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		If parsing a JSON-array, converts to a {@link SchemaArray}.
+	 * 		If parsing a JSON-array, converts to a {@link JsonSchemaArray}.
 	 * 	<li>
 	 * 		If parsing a JSON-boolean, converts to a {@link Boolean}.
 	 * </ul>
@@ -917,7 +917,7 @@ public class Schema {
 		public Object unswap(BeanSession session, Object o, ClassMeta<?> hint) throws ParseException {
 			ClassMeta<?> cm = (
 				o instanceof Collection
-				? session.getClassMeta(SchemaArray.class)
+				? session.getClassMeta(JsonSchemaArray.class)
 				: session.getClassMeta(Boolean.class)
 			);
 			return session.convertToType(o, cm);
@@ -939,7 +939,7 @@ public class Schema {
 	 * @param maxItems The new value for the <property>maxItems</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMaxItems(Integer maxItems) {
+	public JsonSchema setMaxItems(Integer maxItems) {
 		this.maxItems = maxItems;
 		return this;
 	}
@@ -959,7 +959,7 @@ public class Schema {
 	 * @param minItems The new value for the <property>minItems</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMinItems(Integer minItems) {
+	public JsonSchema setMinItems(Integer minItems) {
 		this.minItems = minItems;
 		return this;
 	}
@@ -980,7 +980,7 @@ public class Schema {
 	 * @param uniqueItems The new value for the <property>uniqueItems</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setUniqueItems(Boolean uniqueItems) {
+	public JsonSchema setUniqueItems(Boolean uniqueItems) {
 		this.uniqueItems = uniqueItems;
 		return this;
 	}
@@ -1001,7 +1001,7 @@ public class Schema {
 	 * @param maxProperties The new value for the <property>maxProperties</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMaxProperties(Integer maxProperties) {
+	public JsonSchema setMaxProperties(Integer maxProperties) {
 		this.maxProperties = maxProperties;
 		return this;
 	}
@@ -1022,7 +1022,7 @@ public class Schema {
 	 * @param minProperties The new value for the <property>minProperties</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setMinProperties(Integer minProperties) {
+	public JsonSchema setMinProperties(Integer minProperties) {
 		this.minProperties = minProperties;
 		return this;
 	}
@@ -1042,7 +1042,7 @@ public class Schema {
 	 * @param required The new value for the <property>required</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setRequired(List<String> required) {
+	public JsonSchema setRequired(List<String> required) {
 		this.required = required;
 		return this;
 	}
@@ -1053,7 +1053,7 @@ public class Schema {
 	 * @param required The list of items to append to the <property>required</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addRequired(List<String> required) {
+	public JsonSchema addRequired(List<String> required) {
 		if (this.required == null)
 			this.required = new LinkedList<>();
 		for (String r : required)
@@ -1067,7 +1067,7 @@ public class Schema {
 	 * @param required The list of items to append to the <property>required</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addRequired(String...required) {
+	public JsonSchema addRequired(String...required) {
 		if (this.required == null)
 			this.required = new LinkedList<>();
 		for (String r : required)
@@ -1081,10 +1081,10 @@ public class Schema {
 	 * @param properties The list of items to append to the <property>required</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addRequired(SchemaProperty...properties) {
+	public JsonSchema addRequired(JsonSchemaProperty...properties) {
 		if (this.required == null)
 			this.required = new LinkedList<>();
-		for (SchemaProperty p : properties)
+		for (JsonSchemaProperty p : properties)
 			this.required.add(p.getName());
 		return this;
 	}
@@ -1095,7 +1095,7 @@ public class Schema {
 	 * @return
 	 * 	The value of the <property>additionalProperties</property> property on this bean, or <jk>null</jk> if it
 	 * 	is not set.
-	 * 	Can be either a {@link Boolean} or {@link SchemaArray} depending on what value was used to set it.
+	 * 	Can be either a {@link Boolean} or {@link JsonSchemaArray} depending on what value was used to set it.
 	 */
 	@Swap(BooleanOrSchemaSwap.class)
 	public Object getAdditionalProperties() {
@@ -1111,7 +1111,7 @@ public class Schema {
 	 * Convenience method for returning the <property>additionalProperties</property> property when it is a
 	 * {@link Boolean} value.
 	 * 
-	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link Schema}.
+	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link JsonSchema}.
 	 */
 	@BeanIgnore
 	public Boolean getAdditionalPropertiesAsBoolean() {
@@ -1123,12 +1123,12 @@ public class Schema {
 	 * 
 	 * <p>
 	 * Convenience method for returning the <property>additionalProperties</property> property when it is a
-	 * {@link Schema} value.
+	 * {@link JsonSchema} value.
 	 * 
 	 * @return The currently set value, or <jk>null</jk> if the property is not set, or is set as a {@link Boolean}.
 	 */
 	@BeanIgnore
-	public Schema getAdditionalPropertiesAsSchema() {
+	public JsonSchema getAdditionalPropertiesAsSchema() {
 		return additionalPropertiesSchema;
 	}
 
@@ -1137,22 +1137,22 @@ public class Schema {
 	 * 
 	 * @param additionalProperties
 	 * 	The new value for the <property>additionalProperties</property> property on this bean.
-	 * 	This object must be of type {@link Boolean} or {@link Schema}.
+	 * 	This object must be of type {@link Boolean} or {@link JsonSchema}.
 	 * @return This object (for method chaining).
 	 * @throws BeanRuntimeException If invalid object type passed in.
 	 */
-	@BeanProperty(beanDictionary={Schema.class})
-	public Schema setAdditionalProperties(Object additionalProperties) {
+	@BeanProperty(beanDictionary={JsonSchema.class})
+	public JsonSchema setAdditionalProperties(Object additionalProperties) {
 		this.additionalPropertiesBoolean = null;
 		this.additionalPropertiesSchema = null;
 		if (additionalProperties != null) {
 			if (additionalProperties instanceof Boolean)
 				this.additionalPropertiesBoolean = (Boolean)additionalProperties;
-			else if (additionalProperties instanceof Schema) {
-				this.additionalPropertiesSchema = (Schema)additionalProperties;
+			else if (additionalProperties instanceof JsonSchema) {
+				this.additionalPropertiesSchema = (JsonSchema)additionalProperties;
 				setMasterOn(this.additionalPropertiesSchema);
 			} else
-				throw new BeanRuntimeException(SchemaProperty.class,
+				throw new BeanRuntimeException(JsonSchemaProperty.class,
 					"Invalid attribute type ''{0}'' passed in.  Must be one of the following:  Boolean, Schema",
 					additionalProperties.getClass().getName());
 		}
@@ -1164,7 +1164,7 @@ public class Schema {
 	 * 
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		If parsing a JSON-object, converts to a {@link Schema}.
+	 * 		If parsing a JSON-object, converts to a {@link JsonSchema}.
 	 * 	<li>
 	 * 		If parsing a JSON-boolean, converts to a {@link Boolean}.
 	 * </ul>
@@ -1184,7 +1184,7 @@ public class Schema {
 			ClassMeta<?> cm = (
 				o instanceof Boolean
 				? session.getClassMeta(Boolean.class)
-				: session.getClassMeta(Schema.class)
+				: session.getClassMeta(JsonSchema.class)
 			);
 			return session.convertToType(o, cm);
 		}
@@ -1205,7 +1205,7 @@ public class Schema {
 	 * @param _enum The new value for the <property>enum</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setEnum(List<String> _enum) {
+	public JsonSchema setEnum(List<String> _enum) {
 		this._enum = _enum;
 		return this;
 	}
@@ -1216,7 +1216,7 @@ public class Schema {
 	 * @param _enum The list of items to append to the <property>enum</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addEnum(String..._enum) {
+	public JsonSchema addEnum(String..._enum) {
 		if (this._enum == null)
 			this._enum = new LinkedList<>();
 		for (String e : _enum)
@@ -1229,7 +1229,7 @@ public class Schema {
 	 * 
 	 * @return The value of the <property>allOf</property> property on this bean, or <jk>null</jk> if it is not set.
 	 */
-	public List<Schema> getAllOf() {
+	public List<JsonSchema> getAllOf() {
 		return allOf;
 	}
 
@@ -1239,7 +1239,7 @@ public class Schema {
 	 * @param allOf The new value for the <property>allOf</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setAllOf(List<Schema> allOf) {
+	public JsonSchema setAllOf(List<JsonSchema> allOf) {
 		this.allOf = allOf;
 		setMasterOn(allOf);
 		return this;
@@ -1251,11 +1251,11 @@ public class Schema {
 	 * @param allOf The list of items to append to the <property>allOf</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addAllOf(Schema...allOf) {
+	public JsonSchema addAllOf(JsonSchema...allOf) {
 		if (this.allOf == null)
 			this.allOf = new LinkedList<>();
 		setMasterOn(allOf);
-		for (Schema s : allOf)
+		for (JsonSchema s : allOf)
 			this.allOf.add(s);
 		return this;
 	}
@@ -1265,7 +1265,7 @@ public class Schema {
 	 * 
 	 * @return The value of the <property>anyOf</property> property on this bean, or <jk>null</jk> if it is not set.
 	 */
-	public List<Schema> getAnyOf() {
+	public List<JsonSchema> getAnyOf() {
 		return anyOf;
 	}
 
@@ -1275,7 +1275,7 @@ public class Schema {
 	 * @param anyOf The new value of the <property>anyOf</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setAnyOf(List<Schema> anyOf) {
+	public JsonSchema setAnyOf(List<JsonSchema> anyOf) {
 		this.anyOf = anyOf;
 		setMasterOn(anyOf);
 		return this;
@@ -1287,11 +1287,11 @@ public class Schema {
 	 * @param anyOf The list of items to append to the <property>anyOf</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addAnyOf(Schema...anyOf) {
+	public JsonSchema addAnyOf(JsonSchema...anyOf) {
 		if (this.anyOf == null)
 			this.anyOf = new LinkedList<>();
 		setMasterOn(anyOf);
-		for (Schema s : anyOf)
+		for (JsonSchema s : anyOf)
 			this.anyOf.add(s);
 		return this;
 	}
@@ -1301,7 +1301,7 @@ public class Schema {
 	 * 
 	 * @return The value of the <property>oneOf</property> property on this bean, or <jk>null</jk> if it is not set.
 	 */
-	public List<Schema> getOneOf() {
+	public List<JsonSchema> getOneOf() {
 		return oneOf;
 	}
 
@@ -1311,7 +1311,7 @@ public class Schema {
 	 * @param oneOf The new value for the <property>oneOf</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setOneOf(List<Schema> oneOf) {
+	public JsonSchema setOneOf(List<JsonSchema> oneOf) {
 		this.oneOf = oneOf;
 		setMasterOn(oneOf);
 		return this;
@@ -1323,11 +1323,11 @@ public class Schema {
 	 * @param oneOf The list of items to append to the <property>oneOf</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema addOneOf(Schema...oneOf) {
+	public JsonSchema addOneOf(JsonSchema...oneOf) {
 		if (this.oneOf == null)
 			this.oneOf = new LinkedList<>();
 		setMasterOn(oneOf);
-		for (Schema s : oneOf)
+		for (JsonSchema s : oneOf)
 			this.oneOf.add(s);
 		return this;
 	}
@@ -1337,7 +1337,7 @@ public class Schema {
 	 * 
 	 * @return The value of the <property>not</property> property on this bean, or <jk>null</jk> if it is not set.
 	 */
-	public Schema getNot() {
+	public JsonSchema getNot() {
 		return not;
 	}
 
@@ -1347,7 +1347,7 @@ public class Schema {
 	 * @param not The new value for the <property>not</property> property on this bean.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setNot(Schema not) {
+	public JsonSchema setNot(JsonSchema not) {
 		this.not = not;
 		setMasterOn(not);
 		return this;
@@ -1377,31 +1377,31 @@ public class Schema {
 	 * @return This object (for method chaining).
 	 */
 	@BeanProperty("$ref")
-	public Schema setRef(Object ref) {
+	public JsonSchema setRef(Object ref) {
 		this.ref = toURI(ref);
 		return this;
 	}
 
-	private void setMasterOn(Schema s) {
+	private void setMasterOn(JsonSchema s) {
 		if (s != null)
 			s.setMaster(this);
 	}
 
-	private void setMasterOn(Schema[] ss) {
+	private void setMasterOn(JsonSchema[] ss) {
 		if (ss != null)
-			for (Schema s : ss)
+			for (JsonSchema s : ss)
 				setMasterOn(s);
 	}
 
-	private void setMasterOn(Collection<Schema> ss) {
+	private void setMasterOn(Collection<JsonSchema> ss) {
 		if (ss != null)
-			for (Schema s : ss)
+			for (JsonSchema s : ss)
 				setMasterOn(s);
 	}
 
-	private void setMasterOn(SchemaArray ss) {
+	private void setMasterOn(JsonSchemaArray ss) {
 		if (ss != null)
-			for (Schema s : ss)
+			for (JsonSchema s : ss)
 				setMasterOn(s);
 	}
 
@@ -1414,38 +1414,38 @@ public class Schema {
 	 * 
 	 * @param master The master schema to associate on this and all children.  Can be <jk>null</jk>.
 	 */
-	protected void setMaster(Schema master) {
+	protected void setMaster(JsonSchema master) {
 		this.master = master;
 		if (definitions != null)
-			for (Schema s : definitions.values())
+			for (JsonSchema s : definitions.values())
 				s.setMaster(master);
 		if (properties != null)
-			for (Schema s : properties.values())
+			for (JsonSchema s : properties.values())
 				s.setMaster(master);
 		if (patternProperties != null)
-			for (Schema s : patternProperties.values())
+			for (JsonSchema s : patternProperties.values())
 				s.setMaster(master);
 		if (dependencies != null)
-			for (Schema s : dependencies.values())
+			for (JsonSchema s : dependencies.values())
 				s.setMaster(master);
 		if (itemsSchema != null)
 			itemsSchema.setMaster(master);
 		if (itemsSchemaArray != null)
-			for (Schema s : itemsSchemaArray)
+			for (JsonSchema s : itemsSchemaArray)
 				s.setMaster(master);
 		if (additionalItemsSchemaArray != null)
-			for (Schema s : additionalItemsSchemaArray)
+			for (JsonSchema s : additionalItemsSchemaArray)
 				s.setMaster(master);
 		if (additionalPropertiesSchema != null)
 			additionalPropertiesSchema.setMaster(master);
 		if (allOf != null)
-			for (Schema s : allOf)
+			for (JsonSchema s : allOf)
 				s.setMaster(master);
 		if (anyOf != null)
-			for (Schema s : anyOf)
+			for (JsonSchema s : anyOf)
 				s.setMaster(master);
 		if (oneOf != null)
-			for (Schema s : oneOf)
+			for (JsonSchema s : oneOf)
 				s.setMaster(master);
 		if (not != null)
 			not.setMaster(master);
@@ -1460,7 +1460,7 @@ public class Schema {
 	 * 
 	 * @return The referenced schema, or <jk>null</jk>.
 	 */
-	public Schema resolve() {
+	public JsonSchema resolve() {
 		if (ref == null || master.schemaMap == null)
 			return this;
 		return master.schemaMap.get(ref);
@@ -1473,7 +1473,7 @@ public class Schema {
 	 * @param schemaMap The schema map to associate with this schema.  Can be <jk>null</jk>.
 	 * @return This object (for method chaining).
 	 */
-	public Schema setSchemaMap(SchemaMap schemaMap) {
+	public JsonSchema setSchemaMap(JsonSchemaMap schemaMap) {
 		this.schemaMap = schemaMap;
 		return this;
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaArray.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaArray.java
similarity index 81%
rename from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaArray.java
rename to juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaArray.java
index c724bca..cd36abc 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaArray.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaArray.java
@@ -15,39 +15,39 @@ package org.apache.juneau.dto.jsonschema;
 import java.util.*;
 
 /**
- * Represents a list of {@link Schema} objects.
+ * Represents a list of {@link JsonSchema} objects.
  * 
  * <h5 class='section'>See Also:</h5>
  * <ul class='doctree'>
  * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
  * </ul>
  */
-public class SchemaArray extends LinkedList<Schema> {
+public class JsonSchemaArray extends LinkedList<JsonSchema> {
 
 	private static final long serialVersionUID = 1L;
 
 	/**
 	 * Default constructor.
 	 */
-	public SchemaArray() {}
+	public JsonSchemaArray() {}
 
 	/**
 	 * Constructor with predefined types to add to this list.
 	 * 
 	 * @param schemas The list of schemas in this array.
 	 */
-	public SchemaArray(Schema...schemas) {
+	public JsonSchemaArray(JsonSchema...schemas) {
 		addAll(schemas);
 	}
 
 	/**
-	 * Convenience method for adding one or more {@link Schema} objects to this array.
+	 * Convenience method for adding one or more {@link JsonSchema} objects to this array.
 	 * 
-	 * @param schemas The {@link Schema} objects to add to this array.
+	 * @param schemas The {@link JsonSchema} objects to add to this array.
 	 * @return This object (for method chaining).
 	 */
-	public SchemaArray addAll(Schema...schemas) {
-		for (Schema s : schemas)
+	public JsonSchemaArray addAll(JsonSchema...schemas) {
+		for (JsonSchema s : schemas)
 			add(s);
 		return this;
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaMap.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaMap.java
similarity index 88%
rename from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaMap.java
rename to juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaMap.java
index 4212fde..6c0073c 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaMap.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaMap.java
@@ -21,7 +21,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.json.*;
 
 /**
- * A container for retrieving JSON {@link Schema} objects by URI.
+ * A container for retrieving JSON {@link JsonSchema} objects by URI.
  * 
  * <p>
  * Subclasses must implement one of the following methods to load schemas from external sources:
@@ -29,7 +29,7 @@ import org.apache.juneau.json.*;
  * 	<li>
  * 		{@link #getReader(URI)} - If schemas should be loaded from readers and automatically parsed.
  * 	<li>
- * 		{@link #load(URI)} - If you want control over construction of {@link Schema} objects.
+ * 		{@link #load(URI)} - If you want control over construction of {@link JsonSchema} objects.
  * </ul>
  * 
  * <h5 class='section'>See Also:</h5>
@@ -37,12 +37,12 @@ import org.apache.juneau.json.*;
  * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
  * </ul>
  */
-public abstract class SchemaMap extends ConcurrentHashMap<URI,Schema> {
+public abstract class JsonSchemaMap extends ConcurrentHashMap<URI,JsonSchema> {
 
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * Return the {@link Schema} object at the specified URI.
+	 * Return the {@link JsonSchema} object at the specified URI.
 	 * 
 	 * <p>
 	 * If this schema object has not been loaded yet, calls {@link #load(URI)}.
@@ -58,9 +58,9 @@ public abstract class SchemaMap extends ConcurrentHashMap<URI,Schema> {
 	 * @return The Schema, or <jk>null</jk> if schema was not located and could not be loaded.
 	 */
 	@Override /* Map */
-	public Schema get(Object uri) {
+	public JsonSchema get(Object uri) {
 		URI u = toURI(uri);
-		Schema s = super.get(u);
+		JsonSchema s = super.get(u);
 		if (s != null)
 			return s;
 		synchronized(this) {
@@ -84,8 +84,8 @@ public abstract class SchemaMap extends ConcurrentHashMap<URI,Schema> {
 	 * @return This object (for method chaining).
 	 * @throws RuntimeException If one or more schema objects did not have their ID property set.
 	 */
-	public SchemaMap add(Schema...schemas) {
-		for (Schema schema : schemas) {
+	public JsonSchemaMap add(JsonSchema...schemas) {
+		for (JsonSchema schema : schemas) {
 			if (schema.getId() == null)
 				throw new RuntimeException("Schema with no ID passed to SchemaMap.add(Schema...)");
 			put(schema.getId(), schema);
@@ -108,11 +108,11 @@ public abstract class SchemaMap extends ConcurrentHashMap<URI,Schema> {
 	 * @param uri The URI to load the schema from.
 	 * @return The parsed schema.
 	 */
-	public Schema load(URI uri) {
+	public JsonSchema load(URI uri) {
 		try (Reader r = getReader(uri)) {
 			if (r == null)
 				return null;
-			return JsonParser.DEFAULT.parse(r, Schema.class);
+			return JsonParser.DEFAULT.parse(r, JsonSchema.class);
 		} catch (Exception e) {
 			throw new RuntimeException(e);
 		}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaProperty.java
similarity index 90%
copy from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
copy to juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaProperty.java
index ff43b5d..4383bf8 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaProperty.java
@@ -20,19 +20,19 @@ package org.apache.juneau.dto.jsonschema;
  * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
  * </ul>
  */
-public class SchemaProperty extends Schema {
+public class JsonSchemaProperty extends JsonSchema {
 
 	/**
 	 * Default constructor.
 	 */
-	public SchemaProperty() {}
+	public JsonSchemaProperty() {}
 
 	/**
 	 * Convenience constructor.
 	 * 
 	 * @param name The name of this property.
 	 */
-	public SchemaProperty(String name) {
+	public JsonSchemaProperty(String name) {
 		setName(name);
 	}
 
@@ -42,7 +42,7 @@ public class SchemaProperty extends Schema {
 	 * @param name The name of this property.
 	 * @param type The JSON type of this property.
 	 */
-	public SchemaProperty(String name, JsonType type) {
+	public JsonSchemaProperty(String name, JsonType type) {
 		setName(name);
 		setType(type);
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaPropertySimpleArray.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaPropertySimpleArray.java
similarity index 90%
rename from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaPropertySimpleArray.java
rename to juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaPropertySimpleArray.java
index aeedc2e..82073f5 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaPropertySimpleArray.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaPropertySimpleArray.java
@@ -31,7 +31,7 @@ package org.apache.juneau.dto.jsonschema;
  * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
  * </ul>
  */
-public class SchemaPropertySimpleArray extends SchemaProperty {
+public class JsonSchemaPropertySimpleArray extends JsonSchemaProperty {
 
 	/**
 	 * Constructor.
@@ -39,11 +39,11 @@ public class SchemaPropertySimpleArray extends SchemaProperty {
 	 * @param name The name of the schema property.
 	 * @param elementType The JSON type of the elements in the array.
 	 */
-	public SchemaPropertySimpleArray(String name, JsonType elementType) {
+	public JsonSchemaPropertySimpleArray(String name, JsonType elementType) {
 		setName(name);
 		setType(JsonType.ARRAY);
 		setItems(
-			new Schema().setType(elementType)
+			new JsonSchema().setType(elementType)
 		);
 	}
 }
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaRef.java
similarity index 94%
copy from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java
copy to juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaRef.java
index 2f3eea5..8f2e19b 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/JsonSchemaRef.java
@@ -31,7 +31,7 @@ import org.apache.juneau.*;
  * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
  * </ul>
  */
-public class SchemaRef extends Schema {
+public class JsonSchemaRef extends JsonSchema {
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class SchemaRef extends Schema {
 	 * 
 	 * @param uri The URI of the target reference.  Can be <jk>null</jk>.
 	 */
-	public SchemaRef(Object uri) {
+	public JsonSchemaRef(Object uri) {
 		this.setRef(uri);
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java
index 8670176..4329992 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ObjectMap.java
@@ -376,7 +376,8 @@ public class ObjectMap extends LinkedHashMap<String,Object> {
 	 * @return This object (for method chaining).
 	 */
 	public ObjectMap appendAll(Map<String,Object> m) {
-		putAll(m);
+		if (m != null)
+			putAll(m);
 		return this;
 	}
 
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java
index 424991c..a5d1f09 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java
@@ -53,11 +53,11 @@ import org.apache.juneau.rest.widget.*;
 	},
 	encoders=GzipEncoder.class,
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class AtomFeedResource extends BasicRestServletJena {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/CodeFormatterResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/CodeFormatterResource.java
index 82fe991..e1ce6ca 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/CodeFormatterResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/CodeFormatterResource.java
@@ -43,11 +43,11 @@ import org.apache.juneau.rest.annotation.*;
 		style="aside {display:table-caption;}"
 	),
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 @SuppressWarnings({"serial"})
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
index bd0a13b..4133be8 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
@@ -40,10 +40,10 @@ import org.apache.juneau.rest.helper.*;
 		aside="$F{resources/DockerRegistryResourceAside.html}"
 	),
 	swagger=@ResourceSwagger(
-		contact="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class DockerRegistryResource extends BasicRestServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java
index 0dc53a2..462aa68 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java
@@ -50,31 +50,31 @@ import org.apache.juneau.rest.widget.*;
 		}
 	),
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'}"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class JsonSchemaResource extends BasicRestServletJena {
 	private static final long serialVersionUID = 1L;
 
-	private Schema schema;     // The schema document
+	private JsonSchema schema;     // The schema document
 
 	@Override /* Servlet */
 	public void init() {
 
 		try {
-			schema = new Schema()
+			schema = new JsonSchema()
 				.setId("http://example.com/sample-schema#")
 				.setSchemaVersionUri("http://json-schema.org/draft-04/schema#")
 				.setTitle("Example Schema")
 				.setType(JsonType.OBJECT)
 				.addProperties(
-					new SchemaProperty("firstName", JsonType.STRING),
-					new SchemaProperty("lastName", JsonType.STRING),
-					new SchemaProperty("age", JsonType.INTEGER)
+					new JsonSchemaProperty("firstName", JsonType.STRING),
+					new JsonSchemaProperty("lastName", JsonType.STRING),
+					new JsonSchemaProperty("age", JsonType.INTEGER)
 						.setDescription("Age in years")
 						.setMinimum(0)
 				)
@@ -89,7 +89,7 @@ public class JsonSchemaResource extends BasicRestServletJena {
 		path="/", 
 		summary="Get the JSON-Schema document"
 	)
-	public Schema getSchema() throws Exception {
+	public JsonSchema getSchema() throws Exception {
 		return schema;
 	}
 
@@ -99,7 +99,7 @@ public class JsonSchemaResource extends BasicRestServletJena {
 		summary="Overwrite the JSON-Schema document",
 		description="Replaces the schema document with the specified content, and then mirrors it as the response."
 	)
-	public Schema setSchema(@Body Schema schema) throws Exception {
+	public JsonSchema setSchema(@Body JsonSchema schema) throws Exception {
 		this.schema = schema;
 		return schema;
 	}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/MethodExampleResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/MethodExampleResource.java
index 25aefd8..8648655 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/MethodExampleResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/MethodExampleResource.java
@@ -42,11 +42,11 @@ import org.apache.juneau.utils.*;
 		}
 	),
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class MethodExampleResource extends BasicRestServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
index f8511b8..95f7b3b 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
@@ -55,11 +55,11 @@ import org.apache.juneau.serializer.*;
 		@Property(name=HTML_uriAnchorText, value="SERVLET_RELATIVE")
 	},
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class PhotosResource extends BasicRestServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java
index 829777c..6478993 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java
@@ -42,11 +42,11 @@ import org.apache.juneau.rest.widget.*;
 		}
 	),
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class PredefinedLabelsResource extends BasicRestServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
index f94cb96..a6bbd4a 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
@@ -64,11 +64,11 @@ import org.apache.juneau.transforms.*;
 		EnumerationSwap.class
 	},
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class RequestEchoResource extends BasicRestServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java
index 6bcf1ea..2956778 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SampleRemoteableServlet.java
@@ -38,11 +38,11 @@ import org.apache.juneau.rest.remoteable.*;
 	// Allow us to use method=POST from a browser.
 	allowedMethodParams="*",
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class SampleRemoteableServlet extends RemoteableServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
index 8216770..b373a62 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
@@ -55,11 +55,11 @@ import org.apache.juneau.rest.widget.*;
 		}
 	),
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class SqlQueryResource extends BasicRestServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java
index 83ab40f..b932c86 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java
@@ -82,11 +82,11 @@ import org.apache.juneau.rest.widget.*;
 	encoders=GzipEncoder.class,
 
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class SystemPropertiesResource extends BasicRestServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java
index 58d28c6..7bae8d4 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java
@@ -64,11 +64,11 @@ import org.apache.juneau.utils.*;
 		@Property(name=DIRECTORY_RESOURCE_allowUploads, value="false")
 	},
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class TempDirResource extends DirectoryResource {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java
index 4c7edbc..a59f9a5 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java
@@ -49,11 +49,11 @@ import org.apache.juneau.transforms.*;
 		}
 	),
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class UrlEncodedFormResource extends BasicRestServlet {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
index ed11413..d83c8de 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
@@ -116,11 +116,11 @@ import org.apache.juneau.utils.*;
 
 	// Swagger info.
 	swagger=@ResourceSwagger(
-		contact="name:'Juneau Developer',email:'dev@juneau.apache.org'",
-		license="name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'",
+		contact=@Contact(name="Juneau Developer",email="dev@juneau.apache.org"),
+		license=@License(name="Apache 2.0",url="http://www.apache.org/licenses/LICENSE-2.0.html"),
 		version="2.0",
 		termsOfService="You are on your own.",
-		externalDocs="description:'Apache Juneau',url:'http://juneau.apache.org'"
+		externalDocs=@ExternalDocs(description="Apache Juneau",url="http://juneau.apache.org")
 	)
 )
 public class AddressBookResource extends BasicRestServletJena {
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
index 870e0af..28b3e0c 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
@@ -187,7 +187,7 @@ public class DirectoryResource extends BasicRestServlet {
 		description="Add or overwrite a file on the file system."
 	)
 	public RedirectToRoot updateFile(
-		@Body(schema="{type:'string',format:'binary'}") InputStream is, 
+		@Body(schema=@Schema(type="string",format="binary")) InputStream is, 
 		@PathRemainder String path
 	) throws InternalServerError {
 		
@@ -209,7 +209,7 @@ public class DirectoryResource extends BasicRestServlet {
 	// Helper beans
 	//-----------------------------------------------------------------------------------------------------------------
 
-	@Response(schema="{schema:{type:'string',format:'binary'}}", description="Contents of file")
+	@Response(schema=@Schema(type="string",format="binary"), description="Contents of file")
 	static class FileContents extends FileInputStream {
 		public FileContents(File file) throws FileNotFoundException {
 			super(file);
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
index fe1cf8e..c75c5eb 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
@@ -249,7 +249,7 @@ public class LogsResource extends BasicRestServlet {
 	// Helper beans
 	//-----------------------------------------------------------------------------------------------------------------
 
-	@Response(schema="{schema:{type:'string',format:'binary'}}", description="Contents of file")
+	@Response(schema=@Schema(type="string",format="binary"), description="Contents of file")
 	static class FileContents extends FileInputStream {
 		public FileContents(File file) throws FileNotFoundException {
 			super(file);
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
index 6ff40d7..e304b9b 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
@@ -198,7 +198,7 @@ public class BasicRestCallHandler implements RestCallHandler {
 			handleError(r1, r2, e);
 		} catch (Throwable e) {
 			Response ri = e.getClass().getAnnotation(Response.class);
-			int code = ri == null ? SC_INTERNAL_SERVER_ERROR : ObjectUtils.firstNonZero(ri.code(), ri.value(), SC_INTERNAL_SERVER_ERROR);
+			int code = ri == null ? SC_INTERNAL_SERVER_ERROR : ObjectUtils.firstNonZero(ri.code(), SC_INTERNAL_SERVER_ERROR);
 			RestException e2 = new RestException(e, code);
 			r1.setAttribute("Exception", e);
 			r1.setAttribute("ExecTime", System.currentTimeMillis() - startTime);
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
index 0bb7549..3e32294 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
@@ -34,6 +34,9 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.rest.annotation.Contact;
+import org.apache.juneau.rest.annotation.License;
+import org.apache.juneau.rest.annotation.Tag;
 import org.apache.juneau.rest.util.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
@@ -197,21 +200,18 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 			
 			omSwagger.putAll(parseMap(joinnl(r.value()), vr, true, false, "@ResourceSwagger(value) on class {0}", c));
 			
-			if (r.title().length + r.description().length + r.version().length() + r.contact().length + r.license().length + r.termsOfService().length > 0) {
+			if (! empty(r)) {
 				ObjectMap info = omSwagger.getObjectMap("info", true);
 				info.appendIf(true, true, true, "title", vr.resolve(joinnl(r.title())));
 				info.appendIf(true, true, true, "description", vr.resolve(joinnl(r.description())));
 				info.appendIf(true, true, true, "version", vr.resolve(r.version()));
 				info.appendIf(true, true, true, "termsOfService", vr.resolve(joinnl(r.termsOfService())));
-				info.appendIf(true, true, true, "contact", parseMap(joinnl(r.contact()), vr, false, true, "@ResourceSwagger(contact) on class {0}", c));
-				info.appendIf(true, true, true, "license", parseMap(joinnl(r.license()), vr, false, true, "@ResourceSwagger(license) on class {0}", c));
+				info.appendIf(true, true, true, "contact", merge(info.getObjectMap("contact"), r.contact(), vr, "@ResourceSwagger(contact) on class {0}", c));
+				info.appendIf(true, true, true, "license", merge(info.getObjectMap("license"), r.license(), vr, "@ResourceSwagger(license) on class {0}", c));
 			}
 
-			omSwagger.appendIf(true, true, true, "externalDocs", parseMap(joinnl(r.externalDocs()), vr, false, true, "@ResourceSwagger(externalDocs) on class {0}", c));
-			
-			ObjectList tags = parseList(joinnl(r.tags()), vr, false, true, "@ResourceSwagger(tags) on class {0}", c);
-			if (tags != null)
-				omSwagger.getObjectList("tags", true).addAll(tags);
+			omSwagger.appendIf(true, true, true, "externalDocs", merge(omSwagger.getObjectMap("externalDocs"), r.externalDocs(), vr, "@ResourceSwagger(externalDocs) on class {0}", c));
+			omSwagger.appendIf(true, true, true, "tags", merge(omSwagger.getObjectList("tags"), r.tags(), vr, "@ResourceSwagger(tags) on class {0}", c));
 		}
 
 		omSwagger.appendIf(true, true, true, "externalDocs", parseMap(mb.findFirstString(locale, "externalDocs"), vr, false, true, "Messages/externalDocs on class {0}", c));
@@ -284,13 +284,13 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 			op.appendIf(false, true, true, "description", vr.resolve(joinnl(rm.description())));
 			op.appendIf(true, true, true, "description", vr.resolve(joinnl(ms.description())));
 			op.appendIf(true, true, true, "deprecated", vr.resolve(ms.deprecated()));
-			op.appendIf(true, true, true, "externalDocs", parseMap(joinnl(ms.externalDocs()), vr, false, true, "@MethodSwagger(externalDocs) on class {0} method {1}", c, m));
 			op.appendIf(true, true, true, "tags", parseListOrCdl(joinnl(ms.tags()), vr, false, true, "@MethodSwagger(tags) on class {0} method {1}", c, m));
 			op.appendIf(true, true, true, "schemes", parseListOrCdl(joinnl(ms.schemes()), vr, false, true, "@MethodSwagger(schemes) on class {0} method {1}", c, m));
 			op.appendIf(true, true, true, "consumes", parseListOrCdl(joinnl(ms.consumes()), vr, false, true, "@MethodSwagger(consumes) on class {0} method {1}", c, m));
 			op.appendIf(true, true, true, "produces", parseListOrCdl(joinnl(ms.produces()), vr, false, true, "@MethodSwagger(produces) on class {0} method {1}", c, m));
 			op.appendIf(true, true, true, "parameters", parseList(joinnl(ms.parameters()), vr, false, true, "@MethodSwagger(parameters) on class {0} method {1}", c, m));
 			op.appendIf(true, true, true, "responses", parseMap(joinnl(ms.responses()), vr, false, true, "@MethodSwagger(responses) on class {0} method {1}", c, m));
+			op.appendIf(true, true, true, "externalDocs", merge(op.getObjectMap("externalDocs"), ms.externalDocs(), vr, "@MethodSwagger(externalDocs) on class {0} method {1}", c, m));
 			
 			op.putIfNotExists("operationId", mn);
 			
@@ -335,34 +335,48 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 					param.append("name", mp.name);
 				
 				ObjectMap pi = mp.getMetaData();
-				param.appendIf(true, true, true, "required", vr.resolve(pi.getString("required")));
+				if (pi.containsKey("_api"))
+					param.putAll(parseMap(pi.getString("_api"), vr, true, false, "@Body(api) on class {0} method {1}"));
+
+				// Common to all
 				param.appendIf(true, true, true, "description", vr.resolve(pi.getString("description")));
-				param.appendIf(true, true, true, "type", vr.resolve(pi.getString("type")));
-				param.appendIf(true, true, true, "format", vr.resolve(pi.getString("format")));
-				param.appendIf(true, true, true, "pattern", vr.resolve(pi.getString("pattern")));
-				param.appendIf(true, true, true, "collectionFormat", vr.resolve(pi.getString("collectionFormat")));
-				param.appendIf(true, true, true, "maximum", vr.resolve(pi.getString("maximum")));
-				param.appendIf(true, true, true, "minimum", vr.resolve(pi.getString("minimum")));
-				param.appendIf(true, true, true, "multipleOf", vr.resolve(pi.getString("multipleOf")));
-				param.appendIf(true, true, true, "maxLength", vr.resolve(pi.getString("maxLength")));
-				param.appendIf(true, true, true, "minLength", vr.resolve(pi.getString("minLength")));
-				param.appendIf(true, true, true, "maxItems", vr.resolve(pi.getString("maxItems")));
-				param.appendIf(true, true, true, "minItems", vr.resolve(pi.getString("minItems")));
-				param.appendIf(true, true, true, "allowEmptyValue", vr.resolve(pi.getString("allowEmptyValue")));
-				param.appendIf(true, true, true, "exclusiveMaximum", vr.resolve(pi.getString("exclusiveMaximum")));
-				param.appendIf(true, true, true, "exclusiveMinimum", vr.resolve(pi.getString("exclusiveMinimum")));
-				param.appendIf(true, true, true, "uniqueItems", vr.resolve(pi.getString("uniqueItems")));
-				param.appendIf(true, true, true, "schema", parseMap(pi.getString("schema"), vr, false, true, "ParameterInfo/schema on class {0} method {1}", c, m));
-				param.appendIf(true, true, true, "default", parseAnything(vr.resolve(pi.getString("default"))));
-				param.appendIf(true, true, true, "enum", parseListOrCdl(pi.getString("enum"), vr, false, true, "ParameterInfo/enum on class {0} method {1}", c, m));
-				param.appendIf(true, true, true, "x-example", parseAnything(vr.resolve(pi.getString("example"))));
-				param.appendIf(true, true, true, "x-examples", parseMap(pi.getString("examples"), vr, false, true, "ParameterInfo/examples on class {0} method {1}", c, m));
-				param.appendIf(true, true, true, "items", parseMap(pi.getString("items"), vr, false, true, "ParameterInfo/items on class {0} method {1}", c, m));
+				param.appendIf(true, true, true, "required", vr.resolve(pi.getString("required")));
+				
+				if (in == BODY) {
+					param.put("schema", getSchema(req, param.getObjectMap("schema", true), js, mp.getType()));
+					param.appendIf(true, true, true, "schema", parseMap(pi.get("schema"), vr, false, true, "ParameterInfo/schema on class {0} method {1}", c, m));					
+					param.appendIf(true, true, true, "x-example", parseAnything(vr.resolve(pi.getString("example"))));
+					param.appendIf(true, true, true, "x-examples", parseMap(pi.get("examples"), vr, false, true, "ParameterInfo/examples on class {0} method {1}", c, m));
+				} else {
+					param.appendIf(true, true, true, "type", vr.resolve(pi.getString("type")));
+					param.appendIf(true, true, true, "format", vr.resolve(pi.getString("format")));
+					param.appendIf(true, true, true, "pattern", vr.resolve(pi.getString("pattern")));
+					param.appendIf(true, true, true, "collectionFormat", vr.resolve(pi.getString("collectionFormat")));
+					param.appendIf(true, true, true, "maximum", vr.resolve(pi.getString("maximum")));
+					param.appendIf(true, true, true, "minimum", vr.resolve(pi.getString("minimum")));
+					param.appendIf(true, true, true, "multipleOf", vr.resolve(pi.getString("multipleOf")));
+					param.appendIf(true, true, true, "maxLength", vr.resolve(pi.getString("maxLength")));
+					param.appendIf(true, true, true, "minLength", vr.resolve(pi.getString("minLength")));
+					param.appendIf(true, true, true, "maxItems", vr.resolve(pi.getString("maxItems")));
+					param.appendIf(true, true, true, "minItems", vr.resolve(pi.getString("minItems")));
+					param.appendIf(true, true, true, "allowEmptyValue", vr.resolve(pi.getString("allowEmptyValue")));
+					param.appendIf(true, true, true, "exclusiveMaximum", vr.resolve(pi.getString("exclusiveMaximum")));
+					param.appendIf(true, true, true, "exclusiveMinimum", vr.resolve(pi.getString("exclusiveMinimum")));
+					param.appendIf(true, true, true, "uniqueItems", vr.resolve(pi.getString("uniqueItems")));
+					param.appendIf(true, true, true, "schema", parseMap(pi.get("schema"), vr, false, true, "ParameterInfo/schema on class {0} method {1}", c, m));
+					param.appendIf(true, true, true, "default", parseAnything(vr.resolve(pi.getString("default"))));
+					param.appendIf(true, true, true, "enum", parseListOrCdl(pi.getString("enum"), vr, false, true, "ParameterInfo/enum on class {0} method {1}", c, m));
+					param.appendIf(true, true, true, "x-example", parseAnything(vr.resolve(pi.getString("example"))));
+					param.appendIf(true, true, true, "x-examples", parseMap(pi.get("examples"), vr, false, true, "ParameterInfo/examples on class {0} method {1}", c, m));
+					param.appendIf(true, true, true, "items", parseMap(pi.get("items"), vr, false, true, "ParameterInfo/items on class {0} method {1}", c, m));
+					
+					// Technically Swagger doesn't support schema on non-body parameters, but we do.
+					param.appendIf(true, true, true, "schema", getSchema(req, param.getObjectMap("schema", true), js, mp.getType()));
+				}
 				
 				if ((in == BODY || in == PATH) && ! param.containsKeyNotEmpty("required"))
 					param.put("required", true);
 				
-				param.put("schema", getSchema(req, param.getObjectMap("schema", true), js, mp.getType()));
 				addXExamples(req, sm, param, in.toString(), js, mp.getType());
 			}
 			
@@ -379,9 +393,9 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 					ObjectMap om = responses.getObjectMap(String.valueOf(code), true);
 					om.appendIf(true, true, true, "description", vr.resolve(md.getString("description")));
 					om.appendIf(true, true, true, "x-example", parseAnything(vr.resolve(md.getString("example"))));
-					om.appendIf(true, true, true, "examples", parseMap(md.getString("examples"), vr, false, true, "RestMethodThrown/examples on class {0} method {1}", c, m));
-					om.appendIf(true, true, true, "schema", parseMap(md.getString("schema"), vr, false, true, "RestMethodThrown/schema on class {0} method {1}", c, m));
-					om.appendIf(true, true, true, "headers", parseMap(md.getString("headers"), vr, false, true, "RestMethodThrown/headers on class {0} method {1}", c, m));
+					om.appendIf(true, true, true, "examples", parseMap(md.get("examples"), vr, false, true, "RestMethodThrown/examples on class {0} method {1}", c, m));
+					om.appendIf(true, true, true, "schema", parseMap(md.get("schema"), vr, false, true, "RestMethodThrown/schema on class {0} method {1}", c, m));
+					om.appendIf(true, true, true, "headers", parseMap(md.get("headers"), vr, false, true, "RestMethodThrown/headers on class {0} method {1}", c, m));
 				}
 			}
 			
@@ -394,11 +408,10 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 				ObjectMap rmd = r.getMetaData();
 				rom.appendIf(true, true, true, "description", vr.resolve(rmd.getString("description")));
 				rom.appendIf(true, true, true, "x-example", parseAnything(vr.resolve(rmd.getString("example"))));
-				rom.appendIf(true, true, true, "examples", parseMap(rmd.getString("examples"), vr, false, true, "RestMethodReturn/examples on class {0} method {1}", c, m));
-				rom.appendIf(true, true, true, "schema", parseMap(rmd.getString("schema"), vr, false, true, "RestMethodReturn/schema on class {0} method {1}", c, m));
-				rom.appendIf(true, true, true, "headers", parseMap(rmd.getString("headers"), vr, false, true, "RestMethodReturn/headers on class {0} method {1}", c, m));
-				
-				rom.put("schema", getSchema(req, rom.getObjectMap("schema", true), js, m.getGenericReturnType()));
+				rom.appendIf(true, true, true, "examples", parseMap(rmd.get("examples"), vr, false, true, "RestMethodReturn/examples on class {0} method {1}", c, m));
+				rom.appendIf(true, true, true, "schema", parseMap(rmd.get("schema"), vr, false, true, "RestMethodReturn/schema on class {0} method {1}", c, m));
+				rom.appendIf(true, true, true, "headers", parseMap(rmd.get("headers"), vr, false, true, "RestMethodReturn/headers on class {0} method {1}", c, m));
+				rom.appendIf(true, true, true, "schema", getSchema(req, rom.getObjectMap("schema", true), js, m.getGenericReturnType()));
 				addXExamples(req, sm, rom, "ok", js, m.getGenericReturnType());
 			}
 
@@ -432,8 +445,8 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 						header.appendIf(true, true, true, "default", JsonParser.DEFAULT.parse(vr.resolve(pi2.getString("default")), Object.class));
 						header.appendIf(true, true, true, "enum", parseListOrCdl(pi2.getString("enum"), vr, false, true, "ParameterInfo/enum on class {0} method {1}", c, m));
 						header.appendIf(true, true, true, "x-example", parseAnything(vr.resolve(pi2.getString("example"))));
-						header.appendIf(true, true, true, "examples", parseMap(pi2.getString("examples"), vr, false, true, "ParameterInfo/examples on class {0} method {1}", c, m));
-						header.appendIf(true, true, true, "items", parseMap(pi2.getString("items"), vr, false, true, "ParameterInfo/items on class {0} method {1}", c, m));
+						header.appendIf(true, true, true, "examples", parseMap(pi2.get("examples"), vr, false, true, "ParameterInfo/examples on class {0} method {1}", c, m));
+						header.appendIf(true, true, true, "items", parseMap(pi2.get("items"), vr, false, true, "ParameterInfo/items on class {0} method {1}", c, m));
 					}
 				
 				} else if (in == RESPONSE) {
@@ -444,10 +457,10 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 						ObjectMap response = responses.getObjectMap(code, true);
 						
 						response.appendIf(true, true, true, "description", vr.resolve(pi2.getString("description")));
-						response.appendIf(true, true, true, "schema", parseMap(pi2.getString("schema"), vr, false, true, "@Response/schema on class {0} method {1}", c, m));
-						response.appendIf(true, true, true, "headers", parseMap(pi2.getString("headers"), vr, false, true, "@Response/headers on class {0} method {1}", c, m));
+						response.appendIf(true, true, true, "schema", parseMap(pi2.get("schema"), vr, false, true, "@Response/schema on class {0} method {1}", c, m));
+						response.appendIf(true, true, true, "headers", parseMap(pi2.get("headers"), vr, false, true, "@Response/headers on class {0} method {1}", c, m));
 						response.appendIf(true, true, true, "x-example", parseAnything(vr.resolve(pi2.getString("example"))));
-						response.appendIf(true, true, true, "examples", parseMap(pi2.getString("examples"), vr, false, true, "@Response/examples on class {0} method {1}", c, m));
+						response.appendIf(true, true, true, "examples", parseMap(pi2.get("examples"), vr, false, true, "@Response/examples on class {0} method {1}", c, m));
 
 						Type type = mp.getType();
 						if (type instanceof ParameterizedType) {
@@ -456,10 +469,7 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 								type = pt.getActualTypeArguments()[0];
 						}
 
-						response.put("schema", getSchema(req, response.getObjectMap("schema", true), js, type));
-						
-//						if (response.containsKey("x-example"))
-//							addXExamples(req, sm, response, response.getString("x-example"), js, type);
+						response.appendIf(true, true, true, "schema", getSchema(req, response.getObjectMap("schema", true), js, type));
 					}
 					
 				} else if (in == RESPONSE_STATUS) {
@@ -530,23 +540,46 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 		
 		return swagger;
 	}
+
 	
-	private ObjectMap parseMap(String s, VarResolverSession vs, boolean ignoreCommentsAndWhitespace, boolean nullOnEmpty, String location, Object...locationArgs) throws ParseException {
+	//=================================================================================================================
+	// Utility methods
+	//=================================================================================================================
+	
+	private ObjectMap parseMap(Object o, VarResolverSession vs, boolean ignoreCommentsAndWhitespace, boolean nullOnEmpty, String location, Object...locationArgs) throws ParseException {
 		try {
-			if (s == null)
+			if (o == null)
 				return null;
-			if (s.isEmpty())
-				return nullOnEmpty ? null : ObjectMap.EMPTY_MAP;
-			s = vs.resolve(s.trim());
-			if ("IGNORE".equalsIgnoreCase(s))
-				return new ObjectMap().append("ignore", true);
-			if (! isObjectMap(s, ignoreCommentsAndWhitespace))
-				s = "{" + s + "}";
-			return new ObjectMap(s);
+			if (o instanceof String) {
+				String s = o.toString();
+				if (s.isEmpty())
+					return nullOnEmpty ? null : ObjectMap.EMPTY_MAP;
+				s = vs.resolve(s.trim());
+				if ("IGNORE".equalsIgnoreCase(s))
+					return new ObjectMap().append("ignore", true);
+				if (! isObjectMap(s, ignoreCommentsAndWhitespace))
+					s = "{" + s + "}";
+				return new ObjectMap(s);
+			} 
+			ObjectMap om = (ObjectMap)o;
+			if (om.containsKey("_api")) {
+				ObjectMap om2 = parseMap(om.remove("_api"), vs, true, false, location, locationArgs);
+				for (Map.Entry<String,Object> e : om.entrySet()) {
+					if (! e.getKey().startsWith("_")) 
+						om2.put(e.getKey(), e.getValue());
+				}
+				om = om2;
+			}
+			for (Map.Entry<String,Object> e : om.entrySet()) {
+				Object val = e.getValue();
+				if (val instanceof ObjectMap)
+					e.setValue(parseMap(val, vs, true, false, location, locationArgs));
+			}
+			return vs.resolve(om);
 		} catch (ParseException e) {
 			throw new SwaggerException(e, "Malformed swagger JSON object encountered in " + location + ".", locationArgs);
 		}
-	}	
+	}
 
 	private ObjectList parseList(String s, VarResolverSession vs, boolean ignoreCommentsAndWhitespace, boolean nullOnEmpty, String location, Object...locationArgs) throws ParseException {
 		try {
@@ -578,6 +611,61 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 		}
 	}
 
+	private ObjectMap newMap(ObjectMap om, Object[] value, VarResolverSession vs, String location, Object...locationArgs) throws ParseException {
+		if (value.length == 0)
+			return om == null ? new ObjectMap() : om;
+		ObjectMap om2 = parseMap(joinnl(value), vs, true, false, location, locationArgs);
+		if (om == null)
+			return om2;
+		return om.appendAll(om2);
+	}
+	
+	private ObjectMap merge(ObjectMap om, ExternalDocs a, VarResolverSession vs, String location, Object...locationArgs) throws ParseException {
+		if (empty(a))
+			return om;
+		om = newMap(om, a.value(), vs, location, locationArgs);
+		om.appendSkipEmpty("description", vs.resolve(joinnl(a.description())));
+		om.appendSkipEmpty("url", vs.resolve(a.url()));
+		return om.isEmpty() ? null : om;
+	}
+
+	private ObjectMap merge(ObjectMap om, Contact a, VarResolverSession vs, String location, Object...locationArgs) throws ParseException {
+		if (empty(a))
+			return om;
+		om = newMap(om, a.value(), vs, location, locationArgs);
+		om.appendSkipEmpty("name", vs.resolve(a.name()));
+		om.appendSkipEmpty("url", vs.resolve(a.url()));
+		om.appendSkipEmpty("email", vs.resolve(a.email()));
+		return om.isEmpty() ? null : om;
+	}
+	
+	private ObjectMap merge(ObjectMap om, License a, VarResolverSession vs, String location, Object...locationArgs) throws ParseException {
+		if (empty(a))
+			return om;
+		om = newMap(om, a.value(), vs, location, locationArgs);
+		om.appendSkipEmpty("name", vs.resolve(a.name()));
+		om.appendSkipEmpty("url", vs.resolve(a.url()));
+		return om.isEmpty() ? null : om;
+	}
+
+	private ObjectMap merge(ObjectMap om, Tag a, VarResolverSession vs, String location, Object...locationArgs) throws ParseException {
+		om = newMap(om, a.value(), vs, location, locationArgs);
+		om.appendSkipEmpty("name", vs.resolve(a.name()));
+		om.appendSkipEmpty("description", vs.resolve(joinnl(a.description())));
+		om.appendSkipNull("externalDocs", merge(om.getObjectMap("externalDocs"), a.externalDocs(), vs, location, locationArgs));
+		return om.isEmpty() ? null : om;
+	}
+
+	private ObjectList merge(ObjectList ol, Tag[] aa, VarResolverSession vs, String location, Object...locationArgs) throws ParseException {
+		if (aa.length == 0)
+			return ol;
+		if (ol == null)
+			ol = new ObjectList();
+		for (Tag a : aa) 
+			ol.add(merge(null, a, vs, location, locationArgs));
+		return ol.isEmpty() ? null : ol;
+	}
+
 	private ObjectMap getSchema(RestRequest req, ObjectMap schema, JsonSchemaSerializerSession js, Type type) throws Exception {
 		BeanSession bs = req.getBeanSession();
 		if (bs == null)
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 cf68b1e..4ca2923 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
@@ -18,7 +18,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.parser.Parser.*;
 import static org.apache.juneau.rest.RestContext.*;
-import static org.apache.juneau.rest.util.Utils.*;
+import static org.apache.juneau.rest.util.RestUtils.*;
 import static org.apache.juneau.serializer.Serializer.*;
 
 import java.lang.reflect.Method;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestJavaMethod.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestJavaMethod.java
index a70d892..7fa1b03 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestJavaMethod.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestJavaMethod.java
@@ -20,7 +20,6 @@ import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.internal.Utils.*;
 import static org.apache.juneau.rest.RestContext.*;
 import static org.apache.juneau.rest.util.RestUtils.*;
-import static org.apache.juneau.rest.util.Utils.*;
 
 import java.lang.annotation.*;
 import java.lang.reflect.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodReturn.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodReturn.java
index 55d408e..84e6460 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodReturn.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodReturn.java
@@ -12,7 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest;
 
-import static org.apache.juneau.internal.StringUtils.*;
+import static org.apache.juneau.rest.util.RestUtils.*;
 
 import java.lang.reflect.*;
 
@@ -36,11 +36,8 @@ public class RestMethodReturn {
 		int code = 200;
 		if (type instanceof Class)
 		for (Response ri : ReflectionUtils.findAnnotationsParentFirst(Response.class, (Class<?>)type)) {
-			code = ObjectUtils.firstNonZero(ri.code(), ri.value(), code);
-			metaData.appendSkipEmpty("description", joinnl(ri.description()));
-			metaData.appendSkipEmpty("example", joinnl(ri.example()));
-			metaData.appendSkipEmpty("headers", joinnl(ri.headers()));
-			metaData.appendSkipEmpty("schema", joinnl(ri.schema()));
+			code = ObjectUtils.firstNonZero(ri.code(), code);
+			merge(metaData, ri);
 		}
 		 
 		this.code = code;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodThrown.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodThrown.java
index a7c7dc1..7c2fe7e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodThrown.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodThrown.java
@@ -12,7 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest;
 
-import static org.apache.juneau.internal.StringUtils.*;
+import static org.apache.juneau.rest.util.RestUtils.*;
 
 import java.lang.reflect.*;
 
@@ -35,12 +35,8 @@ public class RestMethodThrown {
 		
 		int code = 500;
 		for (Response ri : ReflectionUtils.findAnnotationsParentFirst(Response.class, type)) {
-			code = ObjectUtils.firstNonZero(ri.code(), ri.value(), code);
-			metaData.appendSkipEmpty("description", joinnl(ri.description()));
-			metaData.appendSkipEmpty("example", joinnl(ri.example()));
-			metaData.appendSkipEmpty("examples", joinnl(ri.examples()));
-			metaData.appendSkipEmpty("headers", joinnl(ri.headers()));
-			metaData.appendSkipEmpty("schema", joinnl(ri.schema()));
+			code = ObjectUtils.firstNonZero(ri.code(), code);
+			merge(metaData, ri);
 		}
 		
 		this.code = code;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
index e55623a..bd196a5 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
@@ -14,6 +14,7 @@ package org.apache.juneau.rest;
 
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.internal.ObjectUtils.*;
+import static org.apache.juneau.rest.util.RestUtils.*;
 import static org.apache.juneau.rest.RestParamType.*;
 
 import java.io.*;
@@ -549,7 +550,7 @@ class RestParamDefaults {
 	static final class PathObject extends RestMethodParam {
 
 		protected PathObject(Method method, Path a, Type type, PropertyStore ps, RestMethodParam existing) {
-			super(PATH, method, firstNonEmpty(a.name(), a.value(), existing == null ? null : existing.name), type, getMetaData(a, castOrNull(existing, PathObject.class)));
+			super(PATH, method, firstNonEmpty(existing == null ? null : existing.name, a.name(), a.value()), type, getMetaData(a, castOrNull(existing, PathObject.class)));
 		}
 
 		@Override /* RestMethodParam */
@@ -567,23 +568,7 @@ class RestParamDefaults {
 			ObjectMap om = existing == null ? new ObjectMap() : existing.metaData;
 			if (a == null)
 				return om;
-			return om
-				.appendSkipEmpty("description", joinnl(a.description()))
-				.appendSkipEmpty("type", a.type())
-				.appendSkipEmpty("format", a.format())
-				.appendSkipEmpty("pattern", a.pattern())
-				.appendSkipEmpty("maximum", a.maximum())
-				.appendSkipEmpty("minimum", a.minimum())
-				.appendSkipEmpty("multipleOf", a.multipleOf())
-				.appendSkipEmpty("maxLength", a.maxLength())
-				.appendSkipEmpty("minLength", a.minLength())
-				.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
-				.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
-				.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
-				.appendSkipEmpty("schema", joinnl(a.schema()))
-				.appendSkipEmpty("enum", joinnl(a._enum()))
-				.appendSkipEmpty("example", joinnl(a.example()))
-			;
+			return merge(om, a);
 		}
 	}
 
@@ -600,41 +585,15 @@ class RestParamDefaults {
 		
 		private static final ObjectMap getMetaData(Body a, BodyObject existing) {
 			ObjectMap om = existing == null ? new ObjectMap() : existing.metaData;
-			if (a == null)
-				return om;
-			return om
-				.appendSkipEmpty("description", joinnl(a.description()))
-				.appendSkipEmpty("required", a.required())
-				.appendSkipEmpty("type", a.type())
-				.appendSkipEmpty("format", a.format())
-				.appendSkipEmpty("pattern", a.pattern())
-				.appendSkipEmpty("collectionFormat", a.collectionFormat())
-				.appendSkipEmpty("maximum", a.maximum())
-				.appendSkipEmpty("minimum", a.minimum())
-				.appendSkipEmpty("multipleOf", a.multipleOf())
-				.appendSkipEmpty("maxLength", a.maxLength())
-				.appendSkipEmpty("minLength", a.minLength())
-				.appendSkipEmpty("maxItems", a.maxItems())
-				.appendSkipEmpty("minItems", a.minItems())
-				.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
-				.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
-				.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
-				.appendSkipEmpty("uniqueItems", a.uniqueItems())
-				.appendSkipEmpty("schema", joinnl(a.schema()))
-				.appendSkipEmpty("default", joinnl(a._default()))
-				.appendSkipEmpty("enum", joinnl(a._enum()))
-				.appendSkipEmpty("items", joinnl(a.items()))
-				.appendSkipEmpty("example", joinnl(a.example()))
-				.appendSkipEmpty("examples", joinnl(a.examples()))
-			;
+			return merge(om, a);
 		}
 	}
-
+	
 	static final class HeaderObject extends RestMethodParam {
 		private final HttpPartParser partParser;
 
 		protected HeaderObject(Method method, Header a, Type type, PropertyStore ps, RestMethodParam existing) {
-			super(HEADER, method, firstNonEmpty(a.name(), a.value(), existing == null ? null : existing.name), type, getMetaData(a, castOrNull(existing, HeaderObject.class)));
+			super(HEADER, method, firstNonEmpty(existing == null ? null : existing.name, a.name(), a.value()), type, getMetaData(a, castOrNull(existing, HeaderObject.class)));
 			this.partParser = a.parser() == HttpPartParser.Null.class ? null : ClassUtils.newInstance(HttpPartParser.class, a.parser(), true, ps);
 		}
 
@@ -651,32 +610,7 @@ class RestParamDefaults {
 		
 		private static ObjectMap getMetaData(Header a, HeaderObject existing) {
 			ObjectMap om = existing == null ? new ObjectMap() : existing.metaData;
-			if (a == null)
-				return om;
-			return om
-				.appendSkipEmpty("description", joinnl(a.description()))
-				.appendSkipEmpty("required", a.required())
-				.appendSkipEmpty("type", a.type())
-				.appendSkipEmpty("format", a.format())
-				.appendSkipEmpty("pattern", a.pattern())
-				.appendSkipEmpty("collectionFormat", a.collectionFormat())
-				.appendSkipEmpty("maximum", a.maximum())
-				.appendSkipEmpty("minimum", a.minimum())
-				.appendSkipEmpty("multipleOf", a.multipleOf())
-				.appendSkipEmpty("maxLength", a.maxLength())
-				.appendSkipEmpty("minLength", a.minLength())
-				.appendSkipEmpty("maxItems", a.maxItems())
-				.appendSkipEmpty("minItems", a.minItems())
-				.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
-				.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
-				.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
-				.appendSkipEmpty("uniqueItems", a.uniqueItems())
-				.appendSkipEmpty("schema", joinnl(a.schema()))
-				.appendSkipEmpty("default", joinnl(a._default()))
-				.appendSkipEmpty("enum", joinnl(a._enum()))
-				.appendSkipEmpty("items", joinnl(a.items()))
-				.appendSkipEmpty("example", joinnl(a.example()))
-			;
+			return merge(om, a);
 		}
 	}
 
@@ -684,7 +618,7 @@ class RestParamDefaults {
 		final HttpPartSerializer partSerializer;
 
 		protected ResponseHeaderObject(Method method, ResponseHeader a, Type type, PropertyStore ps, RestMethodParam existing) {
-			super(RESPONSE_HEADER, method, firstNonEmpty(a.name(), a.value(), existing == null ? null : existing.name), type, getMetaData(a, castOrNull(existing, ResponseHeaderObject.class)));
+			super(RESPONSE_HEADER, method, firstNonEmpty(existing == null ? null : existing.name, a.name(), a.value()), type, getMetaData(a, castOrNull(existing, ResponseHeaderObject.class)));
 			this.partSerializer = a.serializer() == HttpPartSerializer.Null.class ? null : ClassUtils.newInstance(HttpPartSerializer.class, a.serializer(), true, ps);
 		}
 
@@ -732,27 +666,7 @@ class RestParamDefaults {
 			if (codes.isEmpty())
 				codes.add(200);
 			for (int c : codes) {
-				ObjectMap om2 = om.getObjectMap(String.valueOf(c), true);
-				om2
-					.appendSkipEmpty("description", joinnl(a.description()))
-					.appendSkipEmpty("type", a.type())
-					.appendSkipEmpty("format", a.format())
-					.appendSkipEmpty("collectionFormat", a.collectionFormat())
-					.appendSkipEmpty("maximum", a.maximum())
-					.appendSkipEmpty("minimum", a.minimum())
-					.appendSkipEmpty("multipleOf", a.multipleOf())
-					.appendSkipEmpty("maxLength", a.maxLength())
-					.appendSkipEmpty("minLength", a.minLength())
-					.appendSkipEmpty("maxItems", a.maxItems())
-					.appendSkipEmpty("minItems", a.minItems())
-					.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
-					.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
-					.appendSkipEmpty("uniqueItems", a.uniqueItems())
-					.appendSkipEmpty("default", joinnl(a._default()))
-					.appendSkipEmpty("enum", joinnl(a._enum()))
-					.appendSkipEmpty("items", joinnl(a.items()))
-					.appendSkipEmpty("example", joinnl(a.example()))
-				;
+				merge(om.getObjectMap(String.valueOf(c), true), a);
 			}
 			return om;
 		}
@@ -794,15 +708,8 @@ class RestParamDefaults {
 			ObjectMap om = existing == null ? new ObjectMap() : existing.metaData;
 			if (a == null)
 				return om;
-			int status = ObjectUtils.firstNonZero(a.code(), a.value(), 200);
-			ObjectMap om2 = om.getObjectMap(String.valueOf(status), true);
-			om2
-				.appendSkipEmpty("description", joinnl(a.description()))
-				.appendSkipEmpty("schema", joinnl(a.schema()))
-				.appendSkipEmpty("headers", joinnl(a.headers()))
-				.appendSkipEmpty("example", joinnl(a.example()))
-				.appendSkipEmpty("examples", joinnl(a.examples()))
-			;
+			int status = ObjectUtils.firstNonZero(a.code(), 200);
+			merge(om.getObjectMap(String.valueOf(status), true), a);
 			return om;
 		}
 	}
@@ -871,7 +778,7 @@ class RestParamDefaults {
 		private final HttpPartParser partParser;
 
 		protected FormDataObject(Method method, FormData a, Type type, PropertyStore ps, RestMethodParam existing) {
-			super(FORM_DATA, method, firstNonEmpty(a.name(), a.value(), existing == null ? null : existing.name), type, getMetaData(a, castOrNull(existing, FormDataObject.class)));
+			super(FORM_DATA, method, firstNonEmpty(existing == null ? null : existing.name, a.name(), a.value()), type, getMetaData(a, castOrNull(existing, FormDataObject.class)));
 			this.multiPart = a.multipart();
 			this.partParser = a.parser() == HttpPartParser.Null.class ? null : ClassUtils.newInstance(HttpPartParser.class, a.parser(), true, ps);
 		}
@@ -893,32 +800,7 @@ class RestParamDefaults {
 		
 		private static final ObjectMap getMetaData(FormData a, FormDataObject existing) {
 			ObjectMap om = existing == null ? new ObjectMap() : existing.metaData;
-			if (a == null)
-				return om;
-			return om
-				.appendSkipEmpty("description", joinnl(a.description()))
-				.appendSkipEmpty("required", a.required())
-				.appendSkipEmpty("type", a.type())
-				.appendSkipEmpty("format", a.format())
-				.appendSkipEmpty("pattern", a.pattern())
-				.appendSkipEmpty("collectionFormat", a.collectionFormat())
-				.appendSkipEmpty("maximum", a.maximum())
-				.appendSkipEmpty("minimum", a.minimum())
-				.appendSkipEmpty("multipleOf", a.multipleOf())
-				.appendSkipEmpty("maxLength", a.maxLength())
-				.appendSkipEmpty("minLength", a.minLength())
-				.appendSkipEmpty("maxItems", a.maxItems())
-				.appendSkipEmpty("minItems", a.minItems())
-				.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
-				.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
-				.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
-				.appendSkipEmpty("uniqueItems", a.uniqueItems())
-				.appendSkipEmpty("schema", joinnl(a.schema()))
-				.appendSkipEmpty("default", joinnl(a._default()))
-				.appendSkipEmpty("enum", joinnl(a._enum()))
-				.appendSkipEmpty("items", joinnl(a.items()))
-				.appendSkipEmpty("example", joinnl(a.example()))
-			;
+			return merge(om, a);
 		}
 	}
 
@@ -927,7 +809,7 @@ class RestParamDefaults {
 		private final HttpPartParser partParser;
 
 		protected QueryObject(Method method, Query a, Type type, PropertyStore ps, RestMethodParam existing) {
-			super(QUERY, method, firstNonEmpty(a.name(), a.value(), existing == null ? null : existing.name), type, getMetaData(a, castOrNull(existing, QueryObject.class)));
+			super(QUERY, method, firstNonEmpty(existing == null ? null : existing.name, a.name(), a.value()), type, getMetaData(a, castOrNull(existing, QueryObject.class)));
 			this.multiPart = a.multipart();
 			this.partParser = a.parser() == HttpPartParser.Null.class ? null : ClassUtils.newInstance(HttpPartParser.class, a.parser(), true, ps);
 		}
@@ -949,32 +831,7 @@ class RestParamDefaults {
 		
 		private static final ObjectMap getMetaData(Query a, QueryObject existing) {
 			ObjectMap om = existing == null ? new ObjectMap() : existing.metaData;
-			if (a == null)
-				return om;
-			return om
-				.appendSkipEmpty("description", joinnl(a.description()))
-				.appendSkipEmpty("required", a.required())
-				.appendSkipEmpty("type", a.type())
-				.appendSkipEmpty("format", a.format())
-				.appendSkipEmpty("pattern", a.pattern())
-				.appendSkipEmpty("collectionFormat", a.collectionFormat())
-				.appendSkipEmpty("maximum", a.maximum())
-				.appendSkipEmpty("minimum", a.minimum())
-				.appendSkipEmpty("multipleOf", a.multipleOf())
-				.appendSkipEmpty("maxLength", a.maxLength())
-				.appendSkipEmpty("minLength", a.minLength())
-				.appendSkipEmpty("maxItems", a.maxItems())
-				.appendSkipEmpty("minItems", a.minItems())
-				.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
-				.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
-				.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
-				.appendSkipEmpty("uniqueItems", a.uniqueItems())
-				.appendSkipEmpty("schema", joinnl(a.schema()))
-				.appendSkipEmpty("default", joinnl(a._default()))
-				.appendSkipEmpty("enum", joinnl(a._enum()))
-				.appendSkipEmpty("items", joinnl(a.items()))
-				.appendSkipEmpty("example", joinnl(a.example()))
-			;
+			return merge(om, a);
 		}
 	}
 
@@ -1324,6 +1181,10 @@ class RestParamDefaults {
 		}
 	}
 
+	//=================================================================================================================
+	// Utility methods
+	//=================================================================================================================
+
 	static final boolean isCollection(Type t) {
 		return BeanContext.DEFAULT.getClassMeta(t).isCollectionOrArray();
 	}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java
index 2da93c9..a9f3cd9 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java
@@ -20,8 +20,6 @@ import java.lang.annotation.*;
 import java.nio.charset.*;
 import java.util.logging.*;
 
-import org.apache.juneau.rest.*;
-
 /**
  * REST request body annotation.
  * 
@@ -132,6 +130,12 @@ import org.apache.juneau.rest.*;
 @Inherited
 public @interface Body {
 	
+	String[] api() default {};
+	
+	//=================================================================================================================
+	// Attributes common to all ParameterInfos
+	//=================================================================================================================
+	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/description</code>.
 	 * 
@@ -204,6 +208,10 @@ public @interface Body {
 	 */
 	String required() default "";
 	
+	//=================================================================================================================
+	// Attributes specific to in=body
+	//=================================================================================================================
+
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/schema</code>.
 	 * 
@@ -224,374 +232,9 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] schema() default {};
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/schema/$ref</code>.
-	 * 
-	 * <p>
-	 * 	A JSON reference to the schema definition.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is a <a href='https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03'>JSON Reference</a>.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String $ref() default "";
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/schema/format</code>.
-	 * 
-	 * <h5 class='section'>Examples:</h5>
-	 * <p class='bcode'>
-	 * 	<jc>// Used on parameter</jc>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>)
-	 * 	<jk>public void</jk> setAge(
-	 * 		<ja>@Body</ja>(type=<js>"integer"</js>, format=<js>"int32"</js>) String input
-	 * 	) {...}
-	 * </p>
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is plain text.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 * 
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul class='doctree'>
-	 * 	<li class='link'><a class='doclink' href='https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#dataTypeFormat'>Swagger specification &gt; Data Type Formats</a>
-	 * </ul>
-	 */
-	String format() default "";
-	
-	
-	
-	
-	
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/type</code>.
-	 * 
-	 * <h5 class='section'>Examples:</h5>
-	 * <p class='bcode'>
-	 * 	<jc>// Used on parameter</jc>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
-	 * 	<jk>public void</jk> addPet(
-	 * 		<ja>@Body</ja>(type=<js>"object"</js>) Pet input
-	 * 	) {...}
-	 * </p>
-	 * <p class='bcode'>
-	 * 	<jc>// Used on class</jc>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
-	 * 	<jk>public void</jk> addPet(Pet input) {...}
-	 * 
-	 * 	<ja>@Body</ja>(type=<js>"object"</js>)
-	 * 	<jk>public class</jk> Pet {...}
-	 * </p>
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is plain text.
-	 * 	<li>
-	 * 		The possible values are:
-	 * 		<ul>
-	 * 			<li><js>"object"</js>
-	 * 			<li><js>"string"</js>
-	 * 			<li><js>"number"</js>
-	 * 			<li><js>"integer"</js>
-	 * 			<li><js>"boolean"</js>
-	 * 			<li><js>"array"</js>
-	 * 			<li><js>"file"</js>
-	 * 		</ul>
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 * 
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul class='doctree'>
-	 * 	<li class='link'><a class='doclink' href='https://swagger.io/specification/#dataTypes'>Swagger specification &gt; Data Types</a>
-	 * </ul>
-	 * 
-	 */
-	String type() default "";
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/pattern</code>.
-	 * 
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode'>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>)
-	 * 	<jk>public void</jk> doPut(<ja>@Body</ja>(format=<js>"/\\w+\\.\\d+/"</js>) String input) {...}
-	 * </p>
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is plain text.
-	 * 	<li>
-	 * 		This string SHOULD be a valid regular expression.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String pattern() default "";
-
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/collectionFormat</code>.
-	 * 
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode'>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>)
-	 * 	<jk>public void</jk> doPut(<ja>@Body</ja>(type=<js>"array"</js>,collectionFormat=<js>"csv"</js>) String input) {...}
-	 * </p>
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The possible value are:
-	 * 		<ul>
-	 * 			<li><js>"csv"</js>
-	 * 			<li><js>"ssv"</js>
-	 * 			<li><js>"tsv"</js>
-	 * 			<li><js>"pipes"</js>
-	 * 			<li><js>"multi"</js>
-	 * 		</ul>
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String collectionFormat() default "";
-
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/maximum</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String maximum() default "";
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/minimum</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String minimum() default "";
-
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/multipleOf</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String multipleOf() default "";
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/maxLength</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String maxLength() default "";
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/minLength</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String minLength() default "";
+	Schema schema() default @Schema;
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/maxItems</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String maxItems() default "";
-
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/minItems</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String minItems() default "";
-
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/allowEmptyVals</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is boolean.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String allowEmptyValue() default "";
-
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/exclusiveMaximum</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String exclusiveMaximum() default "";
-
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/exclusiveMinimum</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is numeric.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String exclusiveMinimum() default "";
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/uniqueItems</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is boolean.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String uniqueItems() default "";
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/default</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is any JSON.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String[] _default() default {};
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/enum</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is a JSON array or comma-delimited list.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String[] _enum() default {};
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/items</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is a JSON object.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String[] items() default {};	
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/x-example</code>.
-	 * 
-	 * <p>
-	 * This attribute defines a JSON representation of the body value that is used by {@link BasicRestInfoProvider} to construct
-	 * media-type-based examples of the body of the request.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is a JSON object or plain text string.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String[] example() default {};
-
-	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/x-examples</code>.
 	 * 
 	 * <p>
@@ -608,4 +251,6 @@ public @interface Body {
 	 * </ul>
 	 */
 	String[] examples() default {};
+
+	String[] example() default {};
 }
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Contact.java
similarity index 64%
copy from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
copy to juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Contact.java
index ff43b5d..67c3485 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Contact.java
@@ -10,40 +10,31 @@
 // * "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.dto.jsonschema;
+package org.apache.juneau.rest.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
 
 /**
- * Represents a JSON property in the JSON-Schema core specification.
+ * Swagger schema annotation.
  * 
- * <h5 class='section'>See Also:</h5>
- * <ul class='doctree'>
- * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
- * </ul>
+ * <p>
+ * The Schema Object allows the definition of input and output data types. 
+ * These types can be objects, but also primitives and arrays. 
+ * This object is based on the JSON Schema Specification Draft 4 and uses a predefined subset of it. 
+ * On top of this subset, there are extensions provided by this specification to allow for more complete documentation.
  */
-public class SchemaProperty extends Schema {
-
-	/**
-	 * Default constructor.
-	 */
-	public SchemaProperty() {}
-
-	/**
-	 * Convenience constructor.
-	 * 
-	 * @param name The name of this property.
-	 */
-	public SchemaProperty(String name) {
-		setName(name);
-	}
-
-	/**
-	 * Convenience constructor.
-	 * 
-	 * @param name The name of this property.
-	 * @param type The JSON type of this property.
-	 */
-	public SchemaProperty(String name, JsonType type) {
-		setName(name);
-		setType(type);
-	}
-}
\ No newline at end of file
+@Documented
+@Target({PARAMETER,TYPE})
+@Retention(RUNTIME)
+@Inherited
+public @interface Contact {
+	
+	String[] value() default {};
+	
+	String name() default "";
+	String url() default "";
+	String email() default "";
+}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ExternalDocs.java
similarity index 62%
copy from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
copy to juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ExternalDocs.java
index ff43b5d..92808e5 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ExternalDocs.java
@@ -1,49 +1,25 @@
-// ***************************************************************************************************************************
-// * 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.dto.jsonschema;
-
-/**
- * Represents a JSON property in the JSON-Schema core specification.
- * 
- * <h5 class='section'>See Also:</h5>
- * <ul class='doctree'>
- * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
- * </ul>
- */
-public class SchemaProperty extends Schema {
-
-	/**
-	 * Default constructor.
-	 */
-	public SchemaProperty() {}
-
-	/**
-	 * Convenience constructor.
-	 * 
-	 * @param name The name of this property.
-	 */
-	public SchemaProperty(String name) {
-		setName(name);
-	}
-
-	/**
-	 * Convenience constructor.
-	 * 
-	 * @param name The name of this property.
-	 * @param type The JSON type of this property.
-	 */
-	public SchemaProperty(String name, JsonType type) {
-		setName(name);
-		setType(type);
-	}
-}
\ No newline at end of file
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              * 
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.rest.annotation;
+
+/**
+ * TODO
+ * 
+ */
+public @interface ExternalDocs {
+
+	String[] value() default {};
+	
+	String[] description() default {};
+	String url() default "";
+}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/FormData.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/FormData.java
index 9b4da1b..0dc1330 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/FormData.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/FormData.java
@@ -85,6 +85,8 @@ public @interface FormData {
 	 */
 	String name() default "";
 
+	String value() default "";
+
 	/**
 	 * Specifies the {@link HttpPartParser} class used for parsing values from strings.
 	 * 
@@ -94,13 +96,7 @@ public @interface FormData {
 	 */
 	Class<? extends HttpPartParser> parser() default HttpPartParser.Null.class;
 
-	/**
-	 * A synonym for {@link #name()}.
-	 * 
-	 * <p>
-	 * Allows you to use shortened notation if you're only specifying the name.
-	 */
-	String value() default "";
+	String[] api() default {};
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=formData)/#/description</code>.
@@ -388,7 +384,7 @@ public @interface FormData {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] schema() default {};
+	Schema schema() default @Schema;
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=formData)/#/default</code>.
@@ -436,7 +432,7 @@ public @interface FormData {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] items() default {};	
+	Items items() default @Items;	
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=formData)/#/x-example</code>.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Header.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Header.java
index 1838348..b435ae0 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Header.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Header.java
@@ -57,6 +57,7 @@ public @interface Header {
 	 * HTTP header name.
 	 */
 	String name() default "";
+	String value() default "";
 
 	/**
 	 * Specifies the {@link HttpPartParser} class used for parsing values from strings.
@@ -67,13 +68,7 @@ public @interface Header {
 	 */
 	Class<? extends HttpPartParser> parser() default HttpPartParser.Null.class;
 
-	/**
-	 * A synonym for {@link #name()}.
-	 * 
-	 * <p>
-	 * Allows you to use shortened notation if you're only specifying the name.
-	 */
-	String value() default "";
+	String[] api() default {};
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=header)/#/description</code>.
@@ -363,7 +358,7 @@ public @interface Header {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] schema() default {};
+	Schema schema() default @Schema;
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=header)/#/default</code>.
@@ -411,7 +406,7 @@ public @interface Header {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] items() default {};	
+	Items items() default @Items;	
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=header)/#/x-example</code>.
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Items.java
similarity index 54%
rename from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java
rename to juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Items.java
index 2f3eea5..66c0b91 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Items.java
@@ -10,42 +10,45 @@
 // * "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.dto.jsonschema;
+package org.apache.juneau.rest.annotation;
 
-import java.net.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-import org.apache.juneau.*;
+import java.lang.annotation.*;
 
 /**
- * Convenience class for representing a schema reference such as <js>"{'$ref':'/url/to/ref'}"</js>.
+ * Swagger schema annotation.
  * 
  * <p>
- * An instance of this object is equivalent to calling...
- * 
- * <p class='bcode'>
- * 	Schema s = <jk>new</jk> Schema().setRef(uri);
- * </p>
- * 
- * <h5 class='section'>See Also:</h5>
- * <ul class='doctree'>
- * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
- * </ul>
+ * The Schema Object allows the definition of input and output data types. 
+ * These types can be objects, but also primitives and arrays. 
+ * This object is based on the JSON Schema Specification Draft 4 and uses a predefined subset of it. 
+ * On top of this subset, there are extensions provided by this specification to allow for more complete documentation.
  */
-public class SchemaRef extends Schema {
-
-	/**
-	 * Constructor.
-	 * 
-	 * <p>
-	 * The value can be of any of the following types: {@link URI}, {@link URL}, {@link String}.
-	 * Strings must be valid URIs.
-	 * 
-	 * <p>
-	 * URIs defined by {@link UriResolver} can be used for values.
-	 * 
-	 * @param uri The URI of the target reference.  Can be <jk>null</jk>.
-	 */
-	public SchemaRef(Object uri) {
-		this.setRef(uri);
-	}
+@Documented
+@Target({PARAMETER,TYPE})
+@Retention(RUNTIME)
+@Inherited
+public @interface Items {
+	
+	String[] value() default {};
+	
+	String type() default "";
+	String format() default "";
+	String collectionFormat() default "";
+	String pattern() default "";
+	String $ref() default "";
+	String maximum() default "";
+	String minimum() default "";
+	String multipleOf() default "";
+	String maxLength() default "";
+	String minLength() default "";
+	String maxItems() default "";
+	String minItems() default "";
+	String exclusiveMaximum() default "";
+	String exclusiveMinimum() default "";
+	String uniqueItems() default "";
+	String[] _default() default {};
+	String[] _enum() default {};
 }
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/License.java
similarity index 65%
copy from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
copy to juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/License.java
index ff43b5d..1b93d7d 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/License.java
@@ -10,40 +10,32 @@
 // * "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.dto.jsonschema;
+package org.apache.juneau.rest.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
 
 /**
- * Represents a JSON property in the JSON-Schema core specification.
+ * Swagger schema annotation.
  * 
- * <h5 class='section'>See Also:</h5>
- * <ul class='doctree'>
- * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
- * </ul>
+ * <p>
+ * The Schema Object allows the definition of input and output data types. 
+ * These types can be objects, but also primitives and arrays. 
+ * This object is based on the JSON Schema Specification Draft 4 and uses a predefined subset of it. 
+ * On top of this subset, there are extensions provided by this specification to allow for more complete documentation.
  */
-public class SchemaProperty extends Schema {
-
-	/**
-	 * Default constructor.
-	 */
-	public SchemaProperty() {}
-
-	/**
-	 * Convenience constructor.
-	 * 
-	 * @param name The name of this property.
-	 */
-	public SchemaProperty(String name) {
-		setName(name);
-	}
-
-	/**
-	 * Convenience constructor.
-	 * 
-	 * @param name The name of this property.
-	 * @param type The JSON type of this property.
-	 */
-	public SchemaProperty(String name, JsonType type) {
-		setName(name);
-		setType(type);
-	}
-}
\ No newline at end of file
+@Documented
+@Target({PARAMETER,TYPE})
+@Retention(RUNTIME)
+@Inherited
+public @interface License {
+	
+	String[] value() default {};
+	
+	String name() default "";
+	String url() default "";
+	
+	
+}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
index 4488ee2..ceae960 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
@@ -196,31 +196,16 @@ public @interface MethodSwagger {
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/externalDocs</code>.
 	 * 
-	 * <p>
-	 * A simplified JSON string with the following fields:
-	 * <p class='bcode'>
-	 * 	{
-	 * 		description: string,
-	 * 		url: string
-	 * 	}
-	 * </p>
-	 * 
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode'>
 	 * 	<ja>@RestMethod</ja>(
 	 * 		swagger=<ja>@MethodSwagger</ja>(
-	 * 			<js>"{url:'http://juneau.apache.org'}"</js>
+	 * 			externalDocs=<ja>@ExternalDocs</ja>(url=<js>"http://juneau.apache.org"</js>)
 	 * 		)
 	 * 	)
 	 * </p>
 	 * 
 	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is a JSON object.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 		<br>Comments and whitespace are ignored.
-	 * 		<br>The leading and trailing <js>'{'</js>/<js>'}'</js> characters are optional.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
@@ -228,7 +213,7 @@ public @interface MethodSwagger {
 	 * 		Values defined on this annotation override values defined for the method in the class swagger.
 	 * </ul>
 	 */
-	String[] externalDocs() default {};
+	ExternalDocs externalDocs() default @ExternalDocs;
 
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters</code>.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Path.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Path.java
index a70f6c8..9dc047a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Path.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Path.java
@@ -51,6 +51,7 @@ public @interface Path {
 	 * Optional if the attributes are specified in the same order as in the URL path pattern.
 	 */
 	String name() default "";
+	String value() default "";
 	
 	/**
 	 * Specifies the {@link HttpPartParser} class used for parsing values from strings.
@@ -61,13 +62,7 @@ public @interface Path {
 	 */
 	Class<? extends HttpPartParser> parser() default HttpPartParser.Null.class;
 
-	/**
-	 * A synonym for {@link #name()}.
-	 * 
-	 * <p>
-	 * Allows you to use shortened notation if you're only specifying the name.
-	 */
-	String value() default "";
+	String[] api() default {};
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=path)/#/description</code>.
@@ -280,7 +275,7 @@ public @interface Path {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] schema() default {};
+	Schema schema() default @Schema;
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=path)/#/enum</code>.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Query.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Query.java
index acbde1e..a931a9d 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Query.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Query.java
@@ -80,6 +80,7 @@ public @interface Query {
 	 * URL query parameter name.
 	 */
 	String name() default "";
+	String value() default "";
 
 	/**
 	 * Specifies the {@link HttpPartParser} class used for parsing values from strings.
@@ -90,13 +91,7 @@ public @interface Query {
 	 */
 	Class<? extends HttpPartParser> parser() default HttpPartParser.Null.class;
 
-	/**
-	 * A synonym for {@link #name()}.
-	 * 
-	 * <p>
-	 * Allows you to use shortened notation if you're only specifying the name.
-	 */
-	String value() default "";
+	String[] api() default {};
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=query)/#/description</code>.
@@ -388,7 +383,7 @@ public @interface Query {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] schema() default {};
+	Schema schema() default @Schema;
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=query)/#/default</code>.
@@ -435,7 +430,7 @@ public @interface Query {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] items() default {};	
+	Items items() default @Items;	
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=query)/#/x-example</code>.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
index 7577f73..58a8a5c 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
@@ -195,23 +195,14 @@ public @interface ResourceSwagger {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] contact() default {};
+	Contact contact() default @Contact;
 
 	/**
 	 * Defines the swagger field <code>/externalDocs</code>.
 	 * 
 	 * <p>
 	 * It is used to populate the Swagger external documentation field and to display on HTML pages.
-	 * 
-	 * <p>
-	 * A simplified JSON string with the following fields:
-	 * <p class='bcode'>
-	 * 	{
-	 * 		description: string,
-	 * 		url: string
-	 * 	}
-	 * </p>
-	 * 
+	 * 	 * 
 	 * <p>
 	 * The default value pulls the description from the <code>externalDocs</code> entry in the servlet resource bundle.
 	 * (e.g. <js>"externalDocs = {url:'http://juneau.apache.org'}"</js> or
@@ -221,22 +212,12 @@ public @interface ResourceSwagger {
 	 * <p class='bcode'>
 	 * 	<ja>@RestResource</ja>(
 	 * 		swagger=<ja>@MethodSwagger</ja>(
-	 * 			externalDocs=<js>"{url:'http://juneau.apache.org'}"</js>
+	 * 			externalDocs=<ja>@ExternalDocs</ja>(url=<js>"http://juneau.apache.org"</js>)
 	 * 		)
 	 * 	)
 	 * </p>
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is a JSON object.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
 	 */
-	String[] externalDocs() default {};
+	ExternalDocs externalDocs() default @ExternalDocs;
 
 	/**
 	 * Defines the swagger field <code>/info/license</code>.
@@ -277,7 +258,7 @@ public @interface ResourceSwagger {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] license() default {};
+	License license() default @License;
 
 	/**
 	 * Defines the swagger field <code>/tags</code>.
@@ -327,7 +308,7 @@ public @interface ResourceSwagger {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] tags() default {};
+	Tag[] tags() default {};
 	
 	/**
 	 * Defines the swagger field <code>/info/termsOfService</code>.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Response.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Response.java
index 0f6f21a..29e77fa 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Response.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Response.java
@@ -103,18 +103,7 @@ public @interface Response {
 	 */
 	int code() default 0;
 	
-	/**
-	 * A synonym to {@link #code()}.
-	 * 
-	 * <p>
-	 * Useful if you only want to specify a code only.
-	 * 
-	 * <p class='bcode'>
-	 * 	<ja>@Response</ja>(200)
-	 * 	<jk>public class</jk> Ok {...}
-	 * </p>
-	 */
-	int value() default 0;
+	String[] api() default {};
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/responses/{status-code}/description</code>.
@@ -133,25 +122,8 @@ public @interface Response {
 
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/responses/{status-code}/schema</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is a JSON object.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 	<li>
-	 * 		The leading/trailing <code>{ }</code> characters are optional.
-	 * 		<br>The following two example are considered equivalent:
-	 * 		<ul>
-	 * 			<li><code>schema=<js>"{type:'string',format:'binary'}"</js></code>
-	 * 			<li><code>schema=<js>"type:'string',format:'binary'"</js></code>
-	 * 		<ul>
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
 	 */
-	String[] schema() default {};
+	Schema schema() default @Schema;
 	
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/responses/{status-code}/headers</code>.
@@ -173,7 +145,7 @@ public @interface Response {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] headers() default {};
+	ResponseHeader[] headers() default {};
 	
 	/**
 	 * Used for populating the swagger field <code>/paths/{path}/{method}/responses/{status-code}/x-examples</code>.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResponseHeader.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResponseHeader.java
index 8062a0d..cf342c5 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResponseHeader.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/ResponseHeader.java
@@ -66,6 +66,8 @@ import org.apache.juneau.utils.*;
 @Inherited
 public @interface ResponseHeader {
 	
+	String[] api() default {};
+	
 	/**
 	 * The HTTP status (or statuses) of the response.
 	 * 
@@ -102,28 +104,29 @@ public @interface ResponseHeader {
 	 * </ul>
 	 */
 	String name() default "";
-	
-	/**
-	 * A synonym to {@link #name()}.
-	 * 
-	 * <p>
-	 * Useful if you only want to specify a header name.
-	 * 
-	 * <p class='bcode'>
-	 * 	<ja>@RestMethod</ja>(...)
-	 * 	<jk>public void</jk> login(<ja>@ResponseHeader</ja>(<js>"X-Rate-Limit"</js>) Value&lt;Integer&gt; rateLimit) {
-	 *		rateLimit.set(1000);
-	 *		...
-	 * 	}
-	 * </p>
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		At least one of {@link #name()} or {@link #value()} must be specified}.
-	 * </ul>
-	 */
 	String value() default "";
+	
+//	/**
+//	 * A synonym to {@link #name()}.
+//	 * 
+//	 * <p>
+//	 * Useful if you only want to specify a header name.
+//	 * 
+//	 * <p class='bcode'>
+//	 * 	<ja>@RestMethod</ja>(...)
+//	 * 	<jk>public void</jk> login(<ja>@ResponseHeader</ja>(<js>"X-Rate-Limit"</js>) Value&lt;Integer&gt; rateLimit) {
+//	 *		rateLimit.set(1000);
+//	 *		...
+//	 * 	}
+//	 * </p>
+//	 * 
+//	 * <h5 class='section'>Notes:</h5>
+//	 * <ul class='spaced-list'>
+//	 * 	<li>
+//	 * 		At least one of {@link #name()} or {@link #value()} must be specified}.
+//	 * </ul>
+//	 */
+//	String value() default "";
 
 	/**
 	 * Specifies the {@link HttpPartSerializer} class used for serializing values.
@@ -388,7 +391,7 @@ public @interface ResponseHeader {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] items() default {};
+	Items items() default @Items;
 
 	/**
 	 * Defines the swagger field <code>/paths/{path}/{method}/responses/{status-code}/headers/{header-name}/default</code>.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Schema.java
similarity index 59%
copy from juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java
copy to juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Schema.java
index 2da93c9..26f0e40 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Schema.java
@@ -15,219 +15,29 @@ package org.apache.juneau.rest.annotation;
 import static java.lang.annotation.ElementType.*;
 import static java.lang.annotation.RetentionPolicy.*;
 
-import java.io.*;
 import java.lang.annotation.*;
-import java.nio.charset.*;
-import java.util.logging.*;
 
 import org.apache.juneau.rest.*;
 
 /**
- * REST request body annotation.
+ * Swagger schema annotation.
  * 
  * <p>
- * Identifies a POJO to be used as the body of an HTTP request.
- * 
- * <h5 class='section'>Examples:</h5>
- * <p class='bcode w800'>
- * 	<jc>// Used on parameter</jc>
- * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
- * 	<jk>public void</jk> addPet(<ja>@Body</ja> Pet pet) {...}
- * </p>
- * <p class='bcode w800'>
- * 	<jc>// Used on class</jc>
- * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
- * 	<jk>public void</jk> addPet(Pet pet) {...}
- * 
- * 	<ja>@Body</ja>
- * 	<jk>public class</jk> Pet {...}
- * </p>
- * 
- * <p>
- * This is functionally equivalent to the following code...
- * <p class='bcode w800'>
- * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
- * 	<jk>public void</jk> addPet(RestRequest req) {
- * 		Pet pet = req.getBody().asType(Pet.<jk>class</jk>);
- * 		...
- * 	}
- * </p>
- * 
- * <p>
- * This annotation can be applied to the following:
- * <ul class='spaced-list'>
- * 	<li>
- * 		Parameters on a  {@link RestMethod @RestMethod}-annotated method.
- * 	<li>
- * 		POJO classes.
- * </ul>
- * 
- * <p>
- * Any of the following types can be used (matched in the specified order):
- * <ol class='spaced-list'>
- * 	<li>
- * 		{@link Reader}
- * 		<br><ja>@Body</ja> annotation is optional (it's inferred from the class type).
- * 		<br><code>Content-Type</code> is always ignored.
- * 	<li>
- * 		{@link InputStream} 
- * 		<br><ja>@Body</ja> annotation is optional (it's inferred from the class type).
- * 		<br><code>Content-Type</code> is always ignored.
- * 	<li>
- * 		Any <a class='doclink' href='../../../../../overview-summary.html#juneau-marshall.PojoCategories'>parsable</a> POJO type.
- * 		<br><code>Content-Type</code> is required to identify correct parser.
- * 	<li>
- * 		Objects convertible from {@link Reader} by having one of the following non-deprecated methods:
- * 		<ul>
- * 			<li><code><jk>public</jk> T(Reader in) {...}</code>
- * 			<li><code><jk>public static</jk> T <jsm>create</jsm>(Reader in) {...}</code>
- * 			<li><code><jk>public static</jk> T <jsm>fromReader</jsm>(Reader in) {...}</code>
- * 		</ul>
- * 		<br><code>Content-Type</code> must not be present or match an existing parser so that it's not parsed as a POJO.
- * 	<li>
- * 		Objects convertible from {@link InputStream} by having one of the following non-deprecated methods:
- * 		<ul>
- * 			<li><code><jk>public</jk> T(InputStream in) {...}</code>
- * 			<li><code><jk>public static</jk> T <jsm>create</jsm>(InputStream in) {...}</code>
- * 			<li><code><jk>public static</jk> T <jsm>fromInputStream</jsm>(InputStream in) {...}</code>
- * 		</ul>
- * 		<br><code>Content-Type</code> must not be present or match an existing parser so that it's not parsed as a POJO.
- * 	<li>
- * 		Objects convertible from {@link String} (including <code>String</code> itself) by having one of the following non-deprecated methods:
- * 		<ul>
- * 			<li><code><jk>public</jk> T(String in) {...}</code> (e.g. {@link Integer}, {@link Boolean})
- * 			<li><code><jk>public static</jk> T <jsm>create</jsm>(String in) {...}</code> 
- * 			<li><code><jk>public static</jk> T <jsm>fromString</jsm>(String in) {...}</code>
- * 			<li><code><jk>public static</jk> T <jsm>fromValue</jsm>(String in) {...}</code>
- * 			<li><code><jk>public static</jk> T <jsm>valueOf</jsm>(String in) {...}</code> (e.g. enums)
- * 			<li><code><jk>public static</jk> T <jsm>parse</jsm>(String in) {...}</code> (e.g. {@link Level})
- * 			<li><code><jk>public static</jk> T <jsm>parseString</jsm>(String in) {...}</code>
- * 			<li><code><jk>public static</jk> T <jsm>forName</jsm>(String in) {...}</code> (e.g. {@link Class}, {@link Charset})
- * 			<li><code><jk>public static</jk> T <jsm>forString</jsm>(String in) {...}</code>
- * 		</ul>
- * 		<br><code>Content-Type</code> must not be present or match an existing parser so that it's not parsed as a POJO.
- * </ol>
- * 
- * 
- * <h5 class='section'>Notes:</h5>
- * <ul class='spaced-list'>
- * 	<li>
- * 		Annotation values are coalesced from multiple sources in the following order of precedence:
- * 		<ol>
- * 			<li><ja>@Body</ja> annotation on parameter.
- * 			<li><ja>@Body</ja> annotation on class.
- * 			<li><ja>@Body</ja> annotation on parent classes and interfaces.
- * 		</ol>
- * </ul>
- * 
- * 
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * 	<li class='link'><a class="doclink" href="../../../../../overview-summary.html#juneau-rest-server.Body">Overview &gt; juneau-rest-server &gt; @Body</a>
- * </ul>
+ * The Schema Object allows the definition of input and output data types. 
+ * These types can be objects, but also primitives and arrays. 
+ * This object is based on the JSON Schema Specification Draft 4 and uses a predefined subset of it. 
+ * On top of this subset, there are extensions provided by this specification to allow for more complete documentation.
  */
 @Documented
 @Target({PARAMETER,TYPE})
 @Retention(RUNTIME)
 @Inherited
-public @interface Body {
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/description</code>.
-	 * 
-	 * <p>
-	 * A brief description of the body. This could contain examples of use.
-	 * 
-	 * <h5 class='section'>Examples:</h5>
-	 * <p class='bcode'>
-	 * 	<jc>// Used on parameter</jc>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
-	 * 	<jk>public void</jk> addPet(
-	 * 		<ja>@Body</ja>(description=<js>"Pet object to add to the store"</js>) Pet input
-	 * 	) {...}
-	 * </p>
-	 * <p class='bcode'>
-	 * 	<jc>// Used on class</jc>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
-	 * 	<jk>public void</jk> addPet(Pet input) {...}
-	 * 
-	 * 	<ja>@Body</ja>(description=<js>"Pet object to add to the store"</js>)
-	 * 	<jk>public class</jk> Pet {...}
-	 * </p>
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is plain text.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * 	<li>
-	 * 		TODO - Future support for MarkDown.
-	 * </ul>
-	 */
-	String[] description() default {};
-	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/required</code>.
-	 * 
-	 * <p>
-	 * 	Determines whether this parameter is mandatory. 
-	 *  <br>The property MAY be included and its default value is false.
-	 *  
-	 * <h5 class='section'>Examples:</h5>
-	 * <p class='bcode'>
-	 * 	<jc>// Used on parameter</jc>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
-	 * 	<jk>public void</jk> addPet(
-	 * 		<ja>@Body</ja>(required=<js>"true"</js>) Pet input
-	 * 	) {...}
-	 * </p>
-	 * <p class='bcode'>
-	 * 	<jc>// Used on class</jc>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
-	 * 	<jk>public void</jk> addPet(Pet input) {...}
-	 * 
-	 * 	<ja>@Body</ja>(required=<js>"true"</js>)
-	 * 	<jk>public class</jk> Pet {...}
-	 * </p>
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is boolean.
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String required() default "";
+public @interface Schema {
 	
-	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/schema</code>.
-	 * 
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul class='spaced-list'>
-	 * 	<li>
-	 * 		The format is a JSON object.
-	 * 		<br>Multiple lines are concatenated with newlines.
-	 * 	<li>
-	 * 		The leading/trailing <code>{ }</code> characters are optional.
-	 * 		<br>The following two example are considered equivalent:
-	 * 		<ul>
-	 * 			<li><code>schema=<js>"{type:'string',format:'binary'}"</js></code>
-	 * 			<li><code>schema=<js>"type:'string',format:'binary'"</js></code>
-	 * 		<ul>
-	 * 	<li>
-	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
-	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
-	 * </ul>
-	 */
-	String[] schema() default {};
+	String[] value() default {};
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/schema/$ref</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/$ref</code>.
 	 * 
 	 * <p>
 	 * 	A JSON reference to the schema definition.
@@ -244,7 +54,7 @@ public @interface Body {
 	String $ref() default "";
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/schema/format</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/format</code>.
 	 * 
 	 * <h5 class='section'>Examples:</h5>
 	 * <p class='bcode'>
@@ -271,20 +81,20 @@ public @interface Body {
 	 */
 	String format() default "";
 	
-	
-	
-	
-	
+	String title() default "";
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/type</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/description</code>.
+	 * 
+	 * <p>
+	 * A brief description of the body. This could contain examples of use.
 	 * 
 	 * <h5 class='section'>Examples:</h5>
 	 * <p class='bcode'>
 	 * 	<jc>// Used on parameter</jc>
 	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
 	 * 	<jk>public void</jk> addPet(
-	 * 		<ja>@Body</ja>(type=<js>"object"</js>) Pet input
+	 * 		<ja>@Body</ja>(description=<js>"Pet object to add to the store"</js>) Pet input
 	 * 	) {...}
 	 * </p>
 	 * <p class='bcode'>
@@ -292,7 +102,7 @@ public @interface Body {
 	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
 	 * 	<jk>public void</jk> addPet(Pet input) {...}
 	 * 
-	 * 	<ja>@Body</ja>(type=<js>"object"</js>)
+	 * 	<ja>@Body</ja>(description=<js>"Pet object to add to the store"</js>)
 	 * 	<jk>public class</jk> Pet {...}
 	 * </p>
 	 * 
@@ -300,81 +110,47 @@ public @interface Body {
 	 * <ul class='spaced-list'>
 	 * 	<li>
 	 * 		The format is plain text.
-	 * 	<li>
-	 * 		The possible values are:
-	 * 		<ul>
-	 * 			<li><js>"object"</js>
-	 * 			<li><js>"string"</js>
-	 * 			<li><js>"number"</js>
-	 * 			<li><js>"integer"</js>
-	 * 			<li><js>"boolean"</js>
-	 * 			<li><js>"array"</js>
-	 * 			<li><js>"file"</js>
-	 * 		</ul>
+	 * 		<br>Multiple lines are concatenated with newlines.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		TODO - Future support for MarkDown.
 	 * </ul>
-	 * 
-	 * <h5 class='section'>See Also:</h5>
-	 * <ul class='doctree'>
-	 * 	<li class='link'><a class='doclink' href='https://swagger.io/specification/#dataTypes'>Swagger specification &gt; Data Types</a>
-	 * </ul>
-	 * 
 	 */
-	String type() default "";
+	String[] description() default {};
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/pattern</code>.
-	 * 
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode'>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>)
-	 * 	<jk>public void</jk> doPut(<ja>@Body</ja>(format=<js>"/\\w+\\.\\d+/"</js>) String input) {...}
-	 * </p>
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/default</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		The format is plain text.
-	 * 	<li>
-	 * 		This string SHOULD be a valid regular expression.
+	 * 		The format is any JSON.
+	 * 		<br>Multiple lines are concatenated with newlines.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String pattern() default "";
-
+	String[] _default() default {};
+	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/collectionFormat</code>.
-	 * 
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode'>
-	 * 	<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>)
-	 * 	<jk>public void</jk> doPut(<ja>@Body</ja>(type=<js>"array"</js>,collectionFormat=<js>"csv"</js>) String input) {...}
-	 * </p>
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/multipleOf</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		The possible value are:
-	 * 		<ul>
-	 * 			<li><js>"csv"</js>
-	 * 			<li><js>"ssv"</js>
-	 * 			<li><js>"tsv"</js>
-	 * 			<li><js>"pipes"</js>
-	 * 			<li><js>"multi"</js>
-	 * 		</ul>
+	 * 		The format is numeric.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String collectionFormat() default "";
-
+	String multipleOf() default "";
+	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/maximum</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/maximum</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -388,7 +164,7 @@ public @interface Body {
 	String maximum() default "";
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/minimum</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/exclusiveMaximum</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -399,10 +175,10 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String minimum() default "";
+	String exclusiveMaximum() default "";
 
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/multipleOf</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/minimum</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -413,10 +189,10 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String multipleOf() default "";
-	
+	String minimum() default "";
+
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/maxLength</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/exclusiveMinimum</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -427,10 +203,10 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String maxLength() default "";
+	String exclusiveMinimum() default "";
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/minLength</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/maxLength</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -441,10 +217,10 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String minLength() default "";
+	String maxLength() default "";
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/maxItems</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/minLength</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -455,38 +231,46 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String maxItems() default "";
-
+	String minLength() default "";
+	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/minItems</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/pattern</code>.
+	 * 
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode'>
+	 * 	<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>)
+	 * 	<jk>public void</jk> doPut(<ja>@Body</ja>(format=<js>"/\\w+\\.\\d+/"</js>) String input) {...}
+	 * </p>
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		The format is numeric.
+	 * 		The format is plain text.
+	 * 	<li>
+	 * 		This string SHOULD be a valid regular expression.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String minItems() default "";
-
+	String pattern() default "";
+	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/allowEmptyVals</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/maxItems</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		The format is boolean.
+	 * 		The format is numeric.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String allowEmptyValue() default "";
+	String maxItems() default "";
 
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/exclusiveMaximum</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/minItems</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -497,24 +281,49 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String exclusiveMaximum() default "";
+	String minItems() default "";
 
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/exclusiveMinimum</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/uniqueItems</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		The format is numeric.
+	 * 		The format is boolean.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String exclusiveMinimum() default "";
+	String uniqueItems() default "";
+	
+	String maxProperties() default "";
+	
+	String minProperties() default "";
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/uniqueItems</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/required</code>.
+	 * 
+	 * <p>
+	 * 	Determines whether this parameter is mandatory. 
+	 *  <br>The property MAY be included and its default value is false.
+	 *  
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode'>
+	 * 	<jc>// Used on parameter</jc>
+	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
+	 * 	<jk>public void</jk> addPet(
+	 * 		<ja>@Body</ja>(required=<js>"true"</js>) Pet input
+	 * 	) {...}
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jc>// Used on class</jc>
+	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
+	 * 	<jk>public void</jk> addPet(Pet input) {...}
+	 * 
+	 * 	<ja>@Body</ja>(required=<js>"true"</js>)
+	 * 	<jk>public class</jk> Pet {...}
+	 * </p>
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -525,40 +334,73 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String uniqueItems() default "";
+	String required() default "";
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/default</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/enum</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		The format is any JSON.
+	 * 		The format is a JSON array or comma-delimited list.
 	 * 		<br>Multiple lines are concatenated with newlines.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] _default() default {};
+	String[] _enum() default {};
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/enum</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/type</code>.
+	 * 
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode'>
+	 * 	<jc>// Used on parameter</jc>
+	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
+	 * 	<jk>public void</jk> addPet(
+	 * 		<ja>@Body</ja>(type=<js>"object"</js>) Pet input
+	 * 	) {...}
+	 * </p>
+	 * <p class='bcode'>
+	 * 	<jc>// Used on class</jc>
+	 * 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
+	 * 	<jk>public void</jk> addPet(Pet input) {...}
+	 * 
+	 * 	<ja>@Body</ja>(type=<js>"object"</js>)
+	 * 	<jk>public class</jk> Pet {...}
+	 * </p>
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
-	 * 		The format is a JSON array or comma-delimited list.
-	 * 		<br>Multiple lines are concatenated with newlines.
+	 * 		The format is plain text.
+	 * 	<li>
+	 * 		The possible values are:
+	 * 		<ul>
+	 * 			<li><js>"object"</js>
+	 * 			<li><js>"string"</js>
+	 * 			<li><js>"number"</js>
+	 * 			<li><js>"integer"</js>
+	 * 			<li><js>"boolean"</js>
+	 * 			<li><js>"array"</js>
+	 * 			<li><js>"file"</js>
+	 * 		</ul>
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
+	 * 
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul class='doctree'>
+	 * 	<li class='link'><a class='doclink' href='https://swagger.io/specification/#dataTypes'>Swagger specification &gt; Data Types</a>
+	 * </ul>
+	 * 
 	 */
-	String[] _enum() default {};
+	String type() default "";
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/items</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/items</code>.
 	 * 
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
@@ -570,10 +412,22 @@ public @interface Body {
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * </ul>
 	 */
-	String[] items() default {};	
+	Items items() default @Items;	
+	
+	String[] allOf() default {};
+	String[] properties() default {};
+	String[] additionalProperties() default {};
+//	discriminator	string	Adds support for polymorphism. The discriminator is the schema property name that is used to differentiate between other schema that inherit this schema. The property name used MUST be defined at this schema and it MUST be in the required property list. When used, the value MUST be the name of this schema or any schema that inherits it.
+	String discriminator() default "";
+//	readOnly	boolean	Relevant only for Schema "properties" definitions. Declares the property as "read only". This means that it MAY be sent as part of a response but MUST NOT be sent as part of the request. Properties marked as readOnly being true SHOULD NOT be in the required list of the defined schema. Default value is false.
+	String readOnly() default "";
+//	xml	XML Object	This MAY be used only on properties schemas. It has no effect on root schemas. Adds Additional metadata to describe the XML representation format of this property.
+	String[] xml() default {};
+//	externalDocs	External Documentation Object	Additional external documentation for this schema.
+	ExternalDocs externalDocs() default @ExternalDocs;
 	
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/x-example</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/example</code>.
 	 * 
 	 * <p>
 	 * This attribute defines a JSON representation of the body value that is used by {@link BasicRestInfoProvider} to construct
@@ -592,7 +446,7 @@ public @interface Body {
 	String[] example() default {};
 
 	/**
-	 * Defines the swagger field <code>/paths/{path}/{method}/parameters(in=body)/#/x-examples</code>.
+	 * Defines the swagger field <code>/paths/{path}/{method}/[parameters(in=body)|responses]/schema/x-examples</code>.
 	 * 
 	 * <p>
 	 * This is a JSON object whose keys are media types and values are string representations of that value.
@@ -608,4 +462,6 @@ public @interface Body {
 	 * </ul>
 	 */
 	String[] examples() default {};
+
+	boolean ignore() default false;
 }
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Tag.java
similarity index 64%
rename from juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
rename to juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Tag.java
index ff43b5d..4cb9df1 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/jsonschema/SchemaProperty.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Tag.java
@@ -10,40 +10,31 @@
 // * "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.dto.jsonschema;
+package org.apache.juneau.rest.annotation;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.*;
 
 /**
- * Represents a JSON property in the JSON-Schema core specification.
+ * Swagger schema annotation.
  * 
- * <h5 class='section'>See Also:</h5>
- * <ul class='doctree'>
- * 	<li class='jp'><a class='doclink' href='package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a>
- * </ul>
+ * <p>
+ * The Schema Object allows the definition of input and output data types. 
+ * These types can be objects, but also primitives and arrays. 
+ * This object is based on the JSON Schema Specification Draft 4 and uses a predefined subset of it. 
+ * On top of this subset, there are extensions provided by this specification to allow for more complete documentation.
  */
-public class SchemaProperty extends Schema {
-
-	/**
-	 * Default constructor.
-	 */
-	public SchemaProperty() {}
-
-	/**
-	 * Convenience constructor.
-	 * 
-	 * @param name The name of this property.
-	 */
-	public SchemaProperty(String name) {
-		setName(name);
-	}
-
-	/**
-	 * Convenience constructor.
-	 * 
-	 * @param name The name of this property.
-	 * @param type The JSON type of this property.
-	 */
-	public SchemaProperty(String name, JsonType type) {
-		setName(name);
-		setType(type);
-	}
-}
\ No newline at end of file
+@Documented
+@Target({PARAMETER,TYPE})
+@Retention(RUNTIME)
+@Inherited
+public @interface Tag {
+	
+	String[] value() default {};
+	
+	String name() default "";
+	String[] description() default {};
+	ExternalDocs externalDocs() default @ExternalDocs;
+}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/Redirect.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/Redirect.java
index 6495b72..a226178 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/Redirect.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/Redirect.java
@@ -27,7 +27,7 @@ import org.apache.juneau.rest.annotation.*;
  * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-rest-server.Redirect">Overview &gt; juneau-rest-server &gt; Redirect</a>
  * </ul>
  */
-@Response(code=302, description="Redirect", headers={"Location:{description:'Redirect URI', type:'string', format:'uri'}"}, schema="IGNORE")
+@Response(code=302, description="Redirect", headers=@ResponseHeader(name="Location",description="Redirect URI",type="string",format="uri"), schema=@Schema(ignore=true))
 public class Redirect {
 
 	private final int httpResponseCode;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/ResourceDescription.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/ResourceDescription.java
index 732e506..2c8e252 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/ResourceDescription.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/ResourceDescription.java
@@ -30,7 +30,7 @@ import org.apache.juneau.rest.annotation.*;
  * </ul>
  */
 @Bean(properties="name,description", fluentSetters=true)
-@Response(schema="IGNORE")
+@Response(schema=@Schema(ignore=true))
 public final class ResourceDescription implements Comparable<ResourceDescription> {
 
 	private String name, description;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
index 7c86e38..1373633 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
@@ -97,7 +97,7 @@ public abstract class RemoteableServlet extends BasicRestServlet {
 		)
 	)
 	public Collection<LinkString> listMethods(
-			@Path(value="javaInterface", description="Java interface name", example="com.foo.MyInterface") String javaInterface
+			@Path(name="javaInterface", description="Java interface name", example="com.foo.MyInterface") String javaInterface
 		) throws Exception {
 		
 		List<LinkString> l = new ArrayList<>();
@@ -119,8 +119,8 @@ public abstract class RemoteableServlet extends BasicRestServlet {
 		)
 	)
 	public Div showEntryForm(
-			@Path(value="javaInterface", description="Java interface name", example="com.foo.MyInterface") String javaInterface, 
-			@Path(value="javaMethod", description="Java method name", example="myMethod") String javaMethod
+			@Path(name="javaInterface", description="Java interface name", example="com.foo.MyInterface") String javaInterface, 
+			@Path(name="javaMethod", description="Java method name", example="myMethod") String javaMethod
 		) throws NotFound, Exception {
 		
 		// Find the method.
@@ -187,8 +187,8 @@ public abstract class RemoteableServlet extends BasicRestServlet {
 			Reader r,
 			ReaderParser p,
 			@Header("Content-Type") ContentType contentType,
-			@Path(value="javaInterface", description="Java interface name", example="com.foo.MyInterface") String javaInterface, 
-			@Path(value="javaMethod", description="Java method name", example="myMethod") String javaMethod
+			@Path(name="javaInterface", description="Java interface name", example="com.foo.MyInterface") String javaInterface, 
+			@Path(name="javaMethod", description="Java method name", example="myMethod") String javaMethod
 		) throws UnsupportedMediaType, NotFound, Exception {
 
 		// Find the parser.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
index 8c07ade..1df6c1d 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
@@ -24,6 +24,9 @@ import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.rest.*;
+import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.rest.exception.*;
 import org.apache.juneau.uon.*;
 import org.apache.juneau.utils.*;
 
@@ -372,4 +375,634 @@ public final class RestUtils {
 			return JsonParser.DEFAULT.parse(s, Object.class);
 		return s;
 	}
+	
+	/**
+	 * Merges the specified parent and child arrays.
+	 * 
+	 * <p>
+	 * The general concept is to allow child values to override parent values.
+	 * 
+	 * <p>
+	 * The rules are:
+	 * <ul>
+	 * 	<li>If the child array is not empty, then the child array is returned.
+	 * 	<li>If the child array is empty, then the parent array is returned.
+	 * 	<li>If the child array contains {@link None}, then an empty array is always returned.
+	 * 	<li>If the child array contains {@link Inherit}, then the contents of the parent array are inserted into the position of the {@link Inherit} entry.
+	 * </ul>
+	 * 
+	 * @param fromParent The parent array.
+	 * @param fromChild The child array.
+	 * @return A new merged array.
+	 */
+	public static Object[] merge(Object[] fromParent, Object[] fromChild) {
+		
+		if (ArrayUtils.contains(None.class, fromChild)) 
+			return new Object[0];
+		
+		if (fromChild.length == 0)
+			return fromParent;
+		
+		if (! ArrayUtils.contains(Inherit.class, fromChild))
+			return fromChild;
+		
+		List<Object> l = new ArrayList<>(fromParent.length + fromChild.length);
+		for (Object o : fromChild) {
+			if (o == Inherit.class)
+				l.addAll(Arrays.asList(fromParent));
+			else
+				l.add(o);
+		}
+		return l.toArray(new Object[l.size()]);
+	}
+
+	//=================================================================================================================
+	// Methods for merging annotation values.
+	//=================================================================================================================
+	
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, Body a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om
+			.appendSkipEmpty("_api", joinnl(a.api()))
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("required", a.required())
+			.appendSkipEmpty("example", joinnl(a.example()))
+			.appendSkipEmpty("examples", joinnl(a.examples()))
+			.append("schema", merge(om.getObjectMap("schema"), a.schema()));
+	}
+
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, ExternalDocs a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om
+			.appendSkipEmpty("_api", joinnl(a.value()))
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("url", a.url());
+	}
+
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, Schema a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om
+			.appendSkipEmpty("_api", joinnl(a.value()))
+			.appendSkipEmpty("$ref", a.$ref())
+			.appendSkipEmpty("format", a.format())
+			.appendSkipEmpty("title", a.title())
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("default", joinnl(a._default()))
+			.appendSkipEmpty("multipleOf", a.multipleOf())
+			.appendSkipEmpty("maximum", a.maximum())
+			.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
+			.appendSkipEmpty("minimum", a.minimum())
+			.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
+			.appendSkipEmpty("maxLength", a.maxLength())
+			.appendSkipEmpty("minLength", a.minLength())
+			.appendSkipEmpty("pattern", a.pattern())
+			.appendSkipEmpty("maxItems", a.maxItems())
+			.appendSkipEmpty("minItems", a.minItems())
+			.appendSkipEmpty("uniqueItems", a.uniqueItems())
+			.appendSkipEmpty("maxProperties", a.maxProperties())
+			.appendSkipEmpty("minProperties", a.minProperties())
+			.appendSkipEmpty("required", a.required())
+			.appendSkipEmpty("enum", joinnl(a._enum()))
+			.appendSkipEmpty("type", a.type())
+			.append("items", merge(om.getObjectMap("items"), a.items()))
+			.appendSkipEmpty("allOf", joinnl(a.allOf()))
+			.appendSkipEmpty("properties", joinnl(a.properties()))
+			.appendSkipEmpty("additionalProperties", joinnl(a.additionalProperties()))
+			.appendSkipEmpty("discriminator", a.discriminator())
+			.appendSkipEmpty("readOnly", a.readOnly())
+			.appendSkipEmpty("xml", joinnl(a.xml()))
+			.append("externalDocs", merge(om.getObjectMap("externalDocs"), a.externalDocs()))
+			.appendSkipEmpty("example", joinnl(a.example()))
+			.appendSkipEmpty("examples", joinnl(a.examples()))
+			.appendSkipEmpty("ignore", a.ignore() ? "true" : null);
+	}
+
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, Response a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		om
+			.appendSkipEmpty("_api", joinnl(a.api()))
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("example", joinnl(a.example()))
+			.appendSkipEmpty("examples", joinnl(a.examples()))
+			.append("schema", merge(om.getObjectMap("schema"), a.schema()))
+			.append("headers", merge(om.getObjectMap("headers"), a.headers()));
+		return om;
+	}	
+	
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, ResponseHeader[] a) {
+		if (a.length == 0)
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		for (ResponseHeader aa : a) {
+			String name = firstNonEmpty(aa.name(), aa.value());
+			if (isEmpty(name))
+				throw new InternalServerError("@ResponseHeader used without name or value.");
+			om.getObjectMap(name, true).putAll(merge(null, aa));
+		}
+		return om;
+	}
+
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, Items a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om
+			.appendSkipEmpty("_api", joinnl(a.value()))
+			.appendSkipEmpty("type", a.type())
+			.appendSkipEmpty("format", a.format())
+			.appendSkipEmpty("collectionFormat", a.collectionFormat())
+			.appendSkipEmpty("pattern", a.pattern())
+			.appendSkipEmpty("$ref", a.$ref())
+			.appendSkipEmpty("maximum", a.maximum())
+			.appendSkipEmpty("minimum", a.minimum())
+			.appendSkipEmpty("multipleOf", a.multipleOf())
+			.appendSkipEmpty("maxLength", a.maxLength())
+			.appendSkipEmpty("minLength", a.minLength())
+			.appendSkipEmpty("maxItems", a.maxItems())
+			.appendSkipEmpty("minItems", a.minItems())
+			.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
+			.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
+			.appendSkipEmpty("uniqueItems", a.uniqueItems())
+			.appendSkipEmpty("default", joinnl(a._default()))
+			.appendSkipEmpty("enum", joinnl(a._enum()));
+	}	
+
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, ResponseHeader a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om 
+			.appendSkipEmpty("_api", joinnl(a.api()))
+			.appendSkipEmpty("$ref", a.$ref())
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("type", a.type())
+			.appendSkipEmpty("format", a.format())
+			.appendSkipEmpty("collectionFormat", a.collectionFormat())
+			.appendSkipEmpty("maximum", a.maximum())
+			.appendSkipEmpty("minimum", a.minimum())
+			.appendSkipEmpty("multipleOf", a.multipleOf())
+			.appendSkipEmpty("maxLength", a.maxLength())
+			.appendSkipEmpty("minLength", a.minLength())
+			.appendSkipEmpty("maxItems", a.maxItems())
+			.appendSkipEmpty("minItems", a.minItems())
+			.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
+			.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
+			.appendSkipEmpty("uniqueItems", a.uniqueItems())
+			.appendSkipEmpty("default", joinnl(a._default()))
+			.append("items", merge(om.getObjectMap("items"), a.items()))
+			.appendSkipEmpty("default", joinnl(a._default()))
+			.appendSkipEmpty("enum", joinnl(a._enum()))
+			.appendSkipEmpty("example", joinnl(a.example()));
+	}
+	
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, Path a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om
+			.appendSkipEmpty("_api", joinnl(a.api()))
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("type", a.type())
+			.appendSkipEmpty("format", a.format())
+			.appendSkipEmpty("pattern", a.pattern())
+			.appendSkipEmpty("maximum", a.maximum())
+			.appendSkipEmpty("minimum", a.minimum())
+			.appendSkipEmpty("multipleOf", a.multipleOf())
+			.appendSkipEmpty("maxLength", a.maxLength())
+			.appendSkipEmpty("minLength", a.minLength())
+			.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
+			.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
+			.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
+			.append("schema", merge(om.getObjectMap("schema"), a.schema()))
+			.appendSkipEmpty("enum", joinnl(a._enum()))
+			.appendSkipEmpty("example", joinnl(a.example()));
+	}
+	
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, Query a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om
+			.appendSkipEmpty("_api", joinnl(a.api()))
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("required", a.required())
+			.appendSkipEmpty("type", a.type())
+			.appendSkipEmpty("format", a.format())
+			.appendSkipEmpty("pattern", a.pattern())
+			.appendSkipEmpty("collectionFormat", a.collectionFormat())
+			.appendSkipEmpty("maximum", a.maximum())
+			.appendSkipEmpty("minimum", a.minimum())
+			.appendSkipEmpty("multipleOf", a.multipleOf())
+			.appendSkipEmpty("maxLength", a.maxLength())
+			.appendSkipEmpty("minLength", a.minLength())
+			.appendSkipEmpty("maxItems", a.maxItems())
+			.appendSkipEmpty("minItems", a.minItems())
+			.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
+			.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
+			.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
+			.appendSkipEmpty("uniqueItems", a.uniqueItems())
+			.append("schema", merge(om.getObjectMap("schema"), a.schema()))
+			.appendSkipEmpty("default", joinnl(a._default()))
+			.appendSkipEmpty("enum", joinnl(a._enum()))
+			.append("items", merge(om.getObjectMap("items"), a.items()))
+			.appendSkipEmpty("example", joinnl(a.example()));
+	}
+	
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, Header a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om
+			.appendSkipEmpty("_api", joinnl(a.api()))
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("required", a.required())
+			.appendSkipEmpty("type", a.type())
+			.appendSkipEmpty("format", a.format())
+			.appendSkipEmpty("pattern", a.pattern())
+			.appendSkipEmpty("collectionFormat", a.collectionFormat())
+			.appendSkipEmpty("maximum", a.maximum())
+			.appendSkipEmpty("minimum", a.minimum())
+			.appendSkipEmpty("multipleOf", a.multipleOf())
+			.appendSkipEmpty("maxLength", a.maxLength())
+			.appendSkipEmpty("minLength", a.minLength())
+			.appendSkipEmpty("maxItems", a.maxItems())
+			.appendSkipEmpty("minItems", a.minItems())
+			.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
+			.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
+			.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
+			.appendSkipEmpty("uniqueItems", a.uniqueItems())
+			.append("schema", merge(om.getObjectMap("schema"), a.schema()))
+			.appendSkipEmpty("default", joinnl(a._default()))
+			.appendSkipEmpty("enum", joinnl(a._enum()))
+			.append("items", merge(om.getObjectMap("items"), a.items()))
+			.appendSkipEmpty("example", joinnl(a.example()));
+	}
+
+	/**
+	 * Merges the contents of the specified annotation into the specified map.
+	 * 
+	 * @param om The map to add the annotation values to.
+	 * @param a The annotation.
+	 * @return The same map with merged results, or a new map if the map was <jk>null</jk>.
+	 */
+	public static ObjectMap merge(ObjectMap om, FormData a) {
+		if (empty(a))
+			return om;
+		if (om == null)
+			om = new ObjectMap();
+		return om
+			.appendSkipEmpty("_api", joinnl(a.api()))
+			.appendSkipEmpty("description", joinnl(a.description()))
+			.appendSkipEmpty("required", a.required())
+			.appendSkipEmpty("type", a.type())
+			.appendSkipEmpty("format", a.format())
+			.appendSkipEmpty("pattern", a.pattern())
+			.appendSkipEmpty("collectionFormat", a.collectionFormat())
+			.appendSkipEmpty("maximum", a.maximum())
+			.appendSkipEmpty("minimum", a.minimum())
+			.appendSkipEmpty("multipleOf", a.multipleOf())
+			.appendSkipEmpty("maxLength", a.maxLength())
+			.appendSkipEmpty("minLength", a.minLength())
+			.appendSkipEmpty("maxItems", a.maxItems())
+			.appendSkipEmpty("minItems", a.minItems())
+			.appendSkipEmpty("allowEmptyValue", a.allowEmptyValue())
+			.appendSkipEmpty("exclusiveMaximum", a.exclusiveMaximum())
+			.appendSkipEmpty("exclusiveMinimum", a.exclusiveMinimum())
+			.appendSkipEmpty("uniqueItems", a.uniqueItems())
+			.append("schema", merge(om.getObjectMap("schema"), a.schema()))
+			.appendSkipEmpty("default", joinnl(a._default()))
+			.appendSkipEmpty("enum", joinnl(a._enum()))
+			.append("items", merge(om.getObjectMap("items"), a.items()))
+			.appendSkipEmpty("example", joinnl(a.example()));
+	}
+	
+	//=================================================================================================================
+	// Methods for checking if annotations are empty.
+	//=================================================================================================================
+	
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(Query a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.description(), a._default(), a.example(), a.api())
+			&& empty(
+				a.name(), a.value(), a.required(), a.type(), a.format(), a.pattern(), a.collectionFormat(), a.maximum(), a.minimum(), a.multipleOf(), a.maxLength(), a.minLength(),
+				a.maxItems(), a.minItems(), a.allowEmptyValue(), a.exclusiveMaximum(), a.exclusiveMinimum(), a.uniqueItems()
+			)
+			&& empty(a.schema())
+			&& empty(a.items());
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(Header a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.description(), a._default(), a._enum(), a.example(), a.api())
+			&& empty(
+				a.name(), a.value(), a.required(), a.type(), a.format(), a.pattern(), a.collectionFormat(), a.maximum(), a.minimum(), a.multipleOf(), a.maxLength(), 
+				a.minLength(), a.maxItems(), a.minItems(), a.allowEmptyValue(), a.exclusiveMaximum(), a.exclusiveMinimum(), a.uniqueItems()
+			)
+			&& empty(a.schema())
+			&& empty(a.items());
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(FormData a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.description(), a._default(), a._enum(), a.example(), a.api())
+			&& empty(
+				a.name(), a.value(), a.required(), a.type(), a.format(), a.pattern(), a.collectionFormat(), a.maximum(), a.minimum(), a.multipleOf(), a.maxLength(), 
+				a.minLength(), a.maxItems(), a.minItems(), a.allowEmptyValue(), a.exclusiveMaximum(), a.exclusiveMinimum(), a.uniqueItems()
+			)
+			&& empty(a.schema())
+			&& empty(a.items());
+	}
+	
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(Response a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.description(), a.example(), a.examples())
+			&& a.headers().length == 0
+			&& empty(a.schema())
+		;
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(ResponseHeader a) {
+		if (a == null)
+			return true;
+		return
+			empty(a.description(), a._default(), a._enum(), a.example(), a.api())
+			&& empty(
+				a.name(), a.value(), a.type(), a.format(), a.collectionFormat(), a.$ref(), a.maximum(), a.minimum(), a.multipleOf(), 
+				a.maxLength(), a.minLength(), a.exclusiveMaximum(), a.exclusiveMinimum(), a.uniqueItems()
+			)
+			&& empty(a.items());
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(Schema a) {
+		if (a == null)
+			return true;
+		return 
+			empty(
+				a.value(), a.description(), a._default(), a._enum(), a.allOf(), a.properties(), a.additionalProperties(), a.xml(), a.example(), a.examples()
+			)
+			&& empty(
+				a.$ref(), a.format(), a.title(), a.multipleOf(), a.maximum(), a.exclusiveMaximum(), a.minimum(), a.exclusiveMinimum(), a.maxLength(), 
+				a.minLength(), a.pattern(), a.maxItems(), a.minItems(), a.uniqueItems(), a.maxProperties(), a.minProperties(), a.required(),
+				a.type(), a.discriminator(), a.readOnly()
+			)
+			&& ! a.ignore()
+			&& empty(a.items())
+			&& empty(a.externalDocs());
+	}
+	
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(ExternalDocs a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.value(), a.description()) 
+			&& empty(a.url());
+	}
+	
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(Body a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.description(), a.example(), a.examples()) 
+			&& empty(a.required())
+			&& empty(a.schema());
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(Contact a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.value())
+			&& empty(a.name(), a.url(), a.email());
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(License a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.value())
+			&& empty(a.name(), a.url());
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(Items a) {
+		if (a == null)
+			return true;
+		return
+			empty(a.value(), a._default(), a._enum())
+			&& empty(
+				a.type(), a.format(), a.collectionFormat(), a.pattern(), a.$ref(), a.maximum(), a.minimum(), a.multipleOf(), 
+				a.maxLength(), a.minLength(), a.maxItems(), a.minItems(), a.exclusiveMaximum(), a.exclusiveMinimum(), a.uniqueItems()
+			);
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(Path a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.description(), a._enum(), a.example(), a.api())
+			&& empty(
+				a.name(), a.value(), a.type(), a.format(), a.pattern(), a.maximum(), a.minimum(), a.multipleOf(), a.maxLength(), 
+				a.minLength(), a.allowEmptyValue(), a.exclusiveMaximum(), a.exclusiveMinimum()
+			)
+			&& empty(a.schema());
+	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified annotation contains all default values.
+	 * 
+	 * @param a The annotation to check.
+	 * @return <jk>true</jk> if the specified annotation contains all default values.
+	 */
+	public static boolean empty(ResourceSwagger a) {
+		if (a == null)
+			return true;
+		return 
+			empty(a.version())
+			&& empty(a.title(), a.description(), a.value())
+			&& empty(a.contact())
+			&& empty(a.license())
+			&& empty(a.externalDocs())
+			&& a.tags().length == 0;
+	}
+
+	private static boolean empty(String...strings) {
+		for (String s : strings)
+			if (! s.isEmpty())
+				return false;
+		return true;
+	}
+
+	private static boolean empty(String[]...strings) {
+		for (String[] s : strings)
+			if (s.length != 0)
+				return false;
+		return true;
+	}
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/Utils.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/Utils.java
deleted file mode 100644
index 671495a..0000000
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/Utils.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              * 
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.util;
-
-import java.util.*;
-
-import org.apache.juneau.internal.*;
-import org.apache.juneau.rest.*;
-
-/**
- * Various reusable utility methods used by the REST server API.
- */
-public final class Utils {
-	
-	/**
-	 * Merges the specified parent and child arrays.
-	 * 
-	 * <p>
-	 * The general concept is to allow child values to override parent values.
-	 * 
-	 * <p>
-	 * The rules are:
-	 * <ul>
-	 * 	<li>If the child array is not empty, then the child array is returned.
-	 * 	<li>If the child array is empty, then the parent array is returned.
-	 * 	<li>If the child array contains {@link None}, then an empty array is always returned.
-	 * 	<li>If the child array contains {@link Inherit}, then the contents of the parent array are inserted into the position of the {@link Inherit} entry.
-	 * </ul>
-	 * 
-	 * @param fromParent The parent array.
-	 * @param fromChild The child array.
-	 * @return A new merged array.
-	 */
-	public static Object[] merge(Object[] fromParent, Object[] fromChild) {
-		
-		if (ArrayUtils.contains(None.class, fromChild)) 
-			return new Object[0];
-		
-		if (fromChild.length == 0)
-			return fromParent;
-		
-		if (! ArrayUtils.contains(Inherit.class, fromChild))
-			return fromChild;
-		
-		List<Object> l = new ArrayList<>(fromParent.length + fromChild.length);
-		for (Object o : fromChild) {
-			if (o == Inherit.class)
-				l.addAll(Arrays.asList(fromParent));
-			else
-				l.add(o);
-		}
-		return l.toArray(new Object[l.size()]);
-	}
-
-}
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java b/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
index 4741145..a8ae336 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
+++ b/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
@@ -25,6 +25,10 @@ import org.apache.juneau.xml.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.rest.annotation.Contact;
+import org.apache.juneau.rest.annotation.Items;
+import org.apache.juneau.rest.annotation.License;
+import org.apache.juneau.rest.annotation.Tag;
 import org.apache.juneau.rest.mock.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
@@ -348,7 +352,7 @@ public class BasicRestInfoProviderTest {
 	}
 
 	
-	@RestResource(swagger=@ResourceSwagger(value="{info:{contact:{name:'a-name',url:'a-url',email:'a-email'}}}", contact="{name:'b-name',url:'b-url',email:'b-email'}"))
+	@RestResource(swagger=@ResourceSwagger(value="{info:{contact:{name:'a-name',url:'a-url',email:'a-email'}}}", contact=@Contact(name="b-name",url="b-url",email="b-email")))
 	public static class F03 {}
 	
 	@Test
@@ -357,7 +361,7 @@ public class BasicRestInfoProviderTest {
 		assertObjectEquals("{name:'b-name',url:'b-url',email:'b-email'}", getSwaggerWithFile(new F03()).getInfo().getContact());
 	}
 
-	@RestResource(swagger=@ResourceSwagger(value="{info:{contact:{name:'a-name',url:'a-url',email:'a-email'}}}", contact=" name:'b-name', url:'b-url', email:'b-email' "))
+	@RestResource(swagger=@ResourceSwagger(value="{info:{contact:{name:'a-name',url:'a-url',email:'a-email'}}}", contact=@Contact(" name:'b-name', url:'b-url', email:'b-email' ")))
 	public static class F04 {}
 	
 	@Test
@@ -366,7 +370,7 @@ public class BasicRestInfoProviderTest {
 		assertObjectEquals("{name:'b-name',url:'b-url',email:'b-email'}", getSwaggerWithFile(new F04()).getInfo().getContact());
 	}
 
-	@RestResource(swagger=@ResourceSwagger(value="{info:{contact:{name:'a-name',url:'a-url',email:'a-email'}}}", contact="{name:'$L{foo}',url:'$L{bar}',email:'$L{baz}'}"), messages="BasicRestInfoProviderTest")
+	@RestResource(swagger=@ResourceSwagger(value="{info:{contact:{name:'a-name',url:'a-url',email:'a-email'}}}", contact=@Contact("{name:'$L{foo}',url:'$L{bar}',email:'$L{baz}'}")), messages="BasicRestInfoProviderTest")
 	public static class F05 {}
 	
 	@Test
@@ -403,7 +407,7 @@ public class BasicRestInfoProviderTest {
 	}
 
 	
-	@RestResource(swagger=@ResourceSwagger(value="{info:{license:{name:'a-name',url:'a-url'}}}", license="{name:'b-name',url:'b-url'}"))
+	@RestResource(swagger=@ResourceSwagger(value="{info:{license:{name:'a-name',url:'a-url'}}}", license=@License(name="b-name",url="b-url")))
 	public static class G03 {}
 	
 	@Test
@@ -412,7 +416,7 @@ public class BasicRestInfoProviderTest {
 		assertObjectEquals("{name:'b-name',url:'b-url'}", getSwaggerWithFile(new G03()).getInfo().getLicense());
 	}
 
-	@RestResource(swagger=@ResourceSwagger(value="{info:{license:{name:'a-name',url:'a-url'}}}", license=" name:'b-name', url:'b-url' "))
+	@RestResource(swagger=@ResourceSwagger(value="{info:{license:{name:'a-name',url:'a-url'}}}", license=@License(" name:'b-name', url:'b-url' ")))
 	public static class G04 {}
 	
 	@Test
@@ -421,7 +425,7 @@ public class BasicRestInfoProviderTest {
 		assertObjectEquals("{name:'b-name',url:'b-url'}", getSwaggerWithFile(new G04()).getInfo().getLicense());
 	}
 
-	@RestResource(swagger=@ResourceSwagger(value="{info:{license:{name:'a-name',url:'a-url'}}}", license="{name:'$L{foo}',url:'$L{bar}'}"), messages="BasicRestInfoProviderTest")
+	@RestResource(swagger=@ResourceSwagger(value="{info:{license:{name:'a-name',url:'a-url'}}}", license=@License("{name:'$L{foo}',url:'$L{bar}'}")), messages="BasicRestInfoProviderTest")
 	public static class G05 {}
 	
 	@Test
@@ -515,7 +519,7 @@ public class BasicRestInfoProviderTest {
 	}
 
 	// Tags in both @ResourceSwagger(value) and @ResourceSwagger(tags) should accumulate.
-	@RestResource(swagger=@ResourceSwagger(value="{tags:[{name:'a-name',description:'a-description',externalDocs:{description:'a-description',url:'a-url'}}]}", tags="[{name:'b-name',description:'b-description',externalDocs:{description:'b-description',url:'b-url'}}]"))
+	@RestResource(swagger=@ResourceSwagger(value="{tags:[{name:'a-name',description:'a-description',externalDocs:{description:'a-description',url:'a-url'}}]}", tags=@Tag(name="b-name",description="b-description",externalDocs=@ExternalDocs(description="b-description",url="b-url"))))
 	public static class J03 {}
 	
 	@Test
@@ -525,7 +529,7 @@ public class BasicRestInfoProviderTest {
 	}
 
 	// Same as above but without [] outer characters.
-	@RestResource(swagger=@ResourceSwagger(value="{tags:[{name:'a-name',description:'a-description',externalDocs:{description:'a-description',url:'a-url'}}]}", tags=" { name:'b-name', description:'b-description', externalDocs: { description:'b-description', url:'b-url' } } "))
+	@RestResource(swagger=@ResourceSwagger(value="{tags:[{name:'a-name',description:'a-description',externalDocs:{description:'a-description',url:'a-url'}}]}", tags=@Tag(" { name:'b-name', description:'b-description', externalDocs: { description:'b-description', url:'b-url' } } ")))
 	public static class J04 {}
 	
 	@Test
@@ -535,7 +539,7 @@ public class BasicRestInfoProviderTest {
 	}
 	
 	// Tags in both Swagger.json and @ResourceSwagger(tags) should accumulate.
-	@RestResource(swagger=@ResourceSwagger(tags="[{name:'b-name',description:'b-description',externalDocs:{description:'b-description',url:'b-url'}}]"))
+	@RestResource(swagger=@ResourceSwagger(tags=@Tag(name="b-name",description="b-description",externalDocs=@ExternalDocs(description="b-description",url="b-url"))))
 	public static class J05 {}
 	
 	@Test
@@ -545,7 +549,7 @@ public class BasicRestInfoProviderTest {
 	}
 	
 	// Dup tag names should be overwritten
-	@RestResource(swagger=@ResourceSwagger(tags="[{name:'s-name',description:'b-description',externalDocs:{description:'b-description',url:'b-url'}},{name:'s-name',description:'c-description',externalDocs:{description:'c-description',url:'c-url'}}]"))
+	@RestResource(swagger=@ResourceSwagger(tags={@Tag(name="s-name",description="b-description",externalDocs=@ExternalDocs(description="b-description",url="b-url")),@Tag("{name:'s-name',description:'c-description',externalDocs:{description:'c-description',url:'c-url'}}")}))
 	public static class J06 {}
 	
 	@Test
@@ -555,7 +559,7 @@ public class BasicRestInfoProviderTest {
 	}
 
 
-	@RestResource(swagger=@ResourceSwagger(value="{tags:[{name:'$L{foo}',description:'$L{foo}',externalDocs:{description:'$L{foo}',url:'$L{foo}'}}]}", tags="[{name:'$L{foo}',description:'$L{foo}',externalDocs:{description:'$L{foo}',url:'$L{foo}'}}]"), messages="BasicRestInfoProviderTest")
+	@RestResource(swagger=@ResourceSwagger(value="{tags:[{name:'$L{foo}',description:'$L{foo}',externalDocs:{description:'$L{foo}',url:'$L{foo}'}}]}", tags=@Tag(name="$L{foo}",description="$L{foo}",externalDocs=@ExternalDocs(description="$L{foo}",url="$L{foo}"))), messages="BasicRestInfoProviderTest")
 	public static class J07 {}
 	
 	@Test
@@ -690,7 +694,7 @@ public class BasicRestInfoProviderTest {
 	}
 
 	
-	@RestResource(swagger=@ResourceSwagger(value="{externalDocs:{description:'a-description',url:'a-url'}}", externalDocs="{description:'b-description',url:'b-url'}"))
+	@RestResource(swagger=@ResourceSwagger(value="{externalDocs:{description:'a-description',url:'a-url'}}", externalDocs=@ExternalDocs(description="b-description",url="b-url")))
 	public static class L03 {}
 	
 	@Test
@@ -699,7 +703,7 @@ public class BasicRestInfoProviderTest {
 		assertObjectEquals("{description:'b-description',url:'b-url'}", getSwaggerWithFile(new L03()).getExternalDocs());
 	}
 
-	@RestResource(swagger=@ResourceSwagger(value="{info:{externalDocs:{description:'a-description',url:'a-url'}}}", externalDocs=" description:'b-description', url:'b-url' "))
+	@RestResource(swagger=@ResourceSwagger(value="{info:{externalDocs:{description:'a-description',url:'a-url'}}}", externalDocs=@ExternalDocs(" description:'b-description', url:'b-url' ")))
 	public static class L04 {}
 	
 	@Test
@@ -708,7 +712,7 @@ public class BasicRestInfoProviderTest {
 		assertObjectEquals("{description:'b-description',url:'b-url'}", getSwaggerWithFile(new L04()).getExternalDocs());
 	}
 
-	@RestResource(swagger=@ResourceSwagger(value="{externalDocs:{description:'a-description',url:'a-url'}}", externalDocs="{description:'$L{foo}',url:'$L{bar}'}"), messages="BasicRestInfoProviderTest")
+	@RestResource(swagger=@ResourceSwagger(value="{externalDocs:{description:'a-description',url:'a-url'}}", externalDocs=@ExternalDocs("{description:'$L{foo}',url:'$L{bar}'}")), messages="BasicRestInfoProviderTest")
 	public static class L05 {}
 	
 	@Test
@@ -1136,7 +1140,7 @@ public class BasicRestInfoProviderTest {
 
 	@RestResource(swagger=@ResourceSwagger("paths:{'/path/{foo}':{get:{externalDocs:{description:'a-description',url:'a-url'}}}}"))
 	public static class ME04a {		
-		@RestMethod(name=GET,path="/path/{foo}",swagger=@MethodSwagger(externalDocs="description:'c-description',url:'c-url'"))
+		@RestMethod(name=GET,path="/path/{foo}",swagger=@MethodSwagger(externalDocs=@ExternalDocs(description="c-description",url="c-url")))
 		public Foo doFoo() {
 			return null;
 		}
@@ -1150,7 +1154,7 @@ public class BasicRestInfoProviderTest {
 
 	@RestResource(swagger=@ResourceSwagger("paths:{'/path/{foo}':{get:{externalDocs:{description:'a-description',url:'a-url'}}}}"))
 	public static class ME04b {		
-		@RestMethod(name=GET,path="/path/{foo}",swagger=@MethodSwagger(externalDocs="{description:'d-description',url:'d-url'}"))
+		@RestMethod(name=GET,path="/path/{foo}",swagger=@MethodSwagger(externalDocs=@ExternalDocs("{description:'d-description',url:'d-url'}")))
 		public Foo doFoo() {
 			return null;
 		}
@@ -1164,7 +1168,7 @@ public class BasicRestInfoProviderTest {
 	
 	@RestResource(messages="BasicRestInfoProviderTest", swagger=@ResourceSwagger("paths:{'/path/{foo}':{get:{externalDocs:{description:'a-description',url:'a-url'}}}}"))
 	public static class ME05 {		
-		@RestMethod(name=GET,path="/path/{foo}",swagger=@MethodSwagger(externalDocs="{description:'$L{foo}',url:'$L{foo}'}"))
+		@RestMethod(name=GET,path="/path/{foo}",swagger=@MethodSwagger(externalDocs=@ExternalDocs("{description:'$L{foo}',url:'$L{foo}'}")))
 		public Foo doFoo() {
 			return null;
 		}
@@ -3114,7 +3118,7 @@ public class BasicRestInfoProviderTest {
 	@RestResource(swagger=@ResourceSwagger("paths:{'/path/{foo}/query':{get:{parameters:[{'in':'query',name:'foo',schema:{$ref:'c'}}]}}}"))
 	public static class NT04 {		
 		@RestMethod(name=GET,path="/path/{foo}/query")
-		public Foo doFoo(@Query(name="foo",schema="{$ref:'d'}") Foo foo) {
+		public Foo doFoo(@Query(name="foo",schema=@Schema($ref="d")) Foo foo) {
 			return null;
 		}
 	}
@@ -3128,7 +3132,7 @@ public class BasicRestInfoProviderTest {
 	@RestResource(messages="BasicRestInfoProviderTest", swagger=@ResourceSwagger("paths:{'/path/{foo}/query':{get:{parameters:[{'in':'query',name:'foo',schema:{$ref:'c'}}]}}}"))
 	public static class NT05 {		
 		@RestMethod(name=GET,path="/path/{foo}/query")
-		public Foo doFoo(@Query(name="foo",schema="{$ref:'$L{foo}'}") Foo foo) {
+		public Foo doFoo(@Query(name="foo",schema=@Schema("{$ref:'$L{foo}'}")) Foo foo) {
 			return null;
 		}
 	}
@@ -3262,7 +3266,7 @@ public class BasicRestInfoProviderTest {
 	@RestResource(swagger=@ResourceSwagger("paths:{'/path/{foo}/responses/100':{get:{responses:{100:{headers:{'X-Foo':{description:'b-description',type:'integer',format:'int32'}}}}}}}"))
 	public static class OB04 {		
 		@RestMethod(name=GET,path="/path/{foo}/responses/100")
-		public Foo doFoo(@Response(code=100,headers="'X-Foo':{description:'d-description',type:'integer',format:'int32'}") Value<Foo> foo) {
+		public Foo doFoo(@Response(code=100,headers=@ResponseHeader(name="X-Foo",description="d-description",type="integer",format="int32")) Value<Foo> foo) {
 			return null;
 		}
 	}
@@ -3276,7 +3280,7 @@ public class BasicRestInfoProviderTest {
 	@RestResource(messages="BasicRestInfoProviderTest", swagger=@ResourceSwagger("paths:{'/path/{foo}/responses/100':{get:{responses:{100:{headers:{'X-Foo':{description:'b-description',type:'integer',format:'int32'}}}}}}}"))
 	public static class OB05 {		
 		@RestMethod(name=GET,path="/path/{foo}/responses/100")
-		public Foo doFoo(@Response(code=100,headers="'X-Foo':{description:'$L{foo}',type:'integer',format:'int32'}") Value<Foo> foo) {
+		public Foo doFoo(@Response(code=100,headers=@ResponseHeader(name="X-Foo",description="$L{foo}",type="integer",format="int32")) Value<Foo> foo) {
 			return null;
 		}
 	}
@@ -3484,7 +3488,7 @@ public class BasicRestInfoProviderTest {
 	@RestResource(swagger=@ResourceSwagger("paths:{'/path/{foo}/responses/100':{get:{responses:{100:{schema:{$ref:'b'}}}}}}"))
 	public static class OE04 {		
 		@RestMethod(name=GET,path="/path/{foo}/responses/100")
-		public Foo doFoo(@Response(code=100,schema="{$ref:'d'}") Value<Foo> foo) {
+		public Foo doFoo(@Response(code=100,schema=@Schema($ref="d")) Value<Foo> foo) {
 			return null;
 		}
 	}
@@ -3498,7 +3502,7 @@ public class BasicRestInfoProviderTest {
 	@RestResource(messages="BasicRestInfoProviderTest", swagger=@ResourceSwagger("paths:{'/path/{foo}/responses/100':{get:{responses:{100:{schema:{$ref:'b'}}}}}}"))
 	public static class OE05 {		
 		@RestMethod(name=GET,path="/path/{foo}/responses/100")
-		public Foo doFoo(@Response(code=100,schema="{$ref:'$L{foo}'}") Value<Foo> foo) {
+		public Foo doFoo(@Response(code=100,schema=@Schema("{$ref:'$L{foo}'}")) Value<Foo> foo) {
 			return null;
 		}
 	}
@@ -3516,17 +3520,37 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class PA {
 
-		@Header(name="H", _default="123")
-		public static class PA01 {}
-		
-		@RestMethod(name=GET,path="/_default")
-		public void pa01(PA01 h) {}
-
-		@Header(name="H", _enum="A,B,C")
-		public static class PA02 {}
-		
-		@RestMethod(name=GET,path="/_enum1")
-		public void pa02(PA02 h) {}
+		@Header(
+			name="H", 
+			_default="a",
+			allowEmptyValue="true",
+			collectionFormat="A",
+			description={"a","b"},
+			exclusiveMaximum="true",
+			exclusiveMinimum="true",
+			format="a",
+			maximum="1",
+			maxItems="1",
+			maxLength="1",
+			minimum="1",
+			minItems="1",
+			minLength="1",
+			multipleOf="1",
+			pattern="a",
+			required="true",
+			type="a",
+			uniqueItems="true",
+			_enum="A,B,C",
+			example="a",
+			items=@Items(type="a"),
+			schema=@Schema(type="a")
+		)
+		public static class PA00 {
+			public PA00(String x) {}
+		}
+
+		@RestMethod(name=GET,path="/basic")
+		public void pa00(PA00 h) {}
 		
 		@Header(name="H", _enum="['A','B','C']")
 		public static class PA03 {}
@@ -3534,38 +3558,6 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/_enum2")
 		public void pa03(PA03 h) {}
 		
-		@Header(name="H", allowEmptyValue="true")
-		public static class PA04 {}
-		
-		@RestMethod(name=GET,path="/allowEmptyValue")
-		public void pa04(PA04 h) {}
-
-		@Header(name="H", collectionFormat="A")
-		public static class PA05 {}
-		
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void pa05(PA05 h) {}
-
-		@Header(name="H", description="a")
-		public static class PA06 {}
-		
-		@RestMethod(name=GET,path="/description1")
-		public void pa06(PA06 h) {}
-
-		@Header(name="H", description={"a","b"})
-		public static class PA07 {}
-		
-		@RestMethod(name=GET,path="/description2")
-		public void pa07(PA07 h) {}
-		
-		@Header(name="H", example="a")
-		public static class PA08a {
-			public PA08a(String value) {}
-		}
-		
-		@RestMethod(name=GET,path="/example1")
-		public void pa08a(PA08a h) {}
-		
 		@Header(name="H", example="{f1:'a'}")
 		public static class PA08b {
 			public String f1;
@@ -3574,97 +3566,13 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/example2")
 		public void pa08b(PA08b h) {}
 		
-		@Header(name="H", exclusiveMaximum="true")
-		public static class PA09 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void pa09(PA09 h) {}
-		
-		@Header(name="H", exclusiveMinimum="true")
-		public static class PA10 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void pa10(PA10 h) {}
-
-		@Header(name="H", format="a")
-		public static class PA11 {}
-		
-		@RestMethod(name=GET,path="/format")
-		public void pa11(PA11 h) {}
-
-		@Header(name="H", items="{type:'a'}")
-		public static class PA12 {}
-		
-		@RestMethod(name=GET,path="/items1")
-		public void pa12(PA12 h) {}
-
-		@Header(name="H", items=" type:'a' ")
+		@Header(name="H", items=@Items(" type:'a' "))
 		public static class PA13 {}
 		
 		@RestMethod(name=GET,path="/items2")
 		public void pa13(PA13 h) {}
 		
-		@Header(name="H", maximum="1")
-		public static class PA14 {}
-		
-		@RestMethod(name=GET,path="/maximum")
-		public void pa14(PA14 h) {}
-
-		@Header(name="H", maxItems="1")
-		public static class PA15 {}
-		
-		@RestMethod(name=GET,path="/maxItems")
-		public void pa15(PA15 h) {}
-
-		@Header(name="H", maxLength="1")
-		public static class PA16 {}
-		
-		@RestMethod(name=GET,path="/maxLength")
-		public void pa16(PA16 h) {}
-
-		@Header(name="H", minimum="1")
-		public static class PA17 {}
-		
-		@RestMethod(name=GET,path="/minimum")
-		public void pa17(PA17 h) {}
-
-		@Header(name="H", minItems="1")
-		public static class PA18 {}
-		
-		@RestMethod(name=GET,path="/minItems")
-		public void pa18(PA18 h) {}
-
-		@Header(name="H", minLength="1")
-		public static class PA19 {}
-		
-		@RestMethod(name=GET,path="/minLength")
-		public void pa19(PA19 h) {}
-
-		@Header(name="H", multipleOf="1")
-		public static class PA20 {}
-		
-		@RestMethod(name=GET,path="/multipleOf")
-		public void pa20(PA20 h) {}
-
-		@Header(name="H", pattern="a")
-		public static class PA21 {}
-		
-		@RestMethod(name=GET,path="/pattern")
-		public void pa21(PA21 h) {}
-
-		@Header(name="H", required="true")
-		public static class PA22 {}
-		
-		@RestMethod(name=GET,path="/required")
-		public void pa22(PA22 h) {}
-
-		@Header(name="H", schema="{type:'a'}")
-		public static class PA23a {}
-		
-		@RestMethod(name=GET,path="/schema1")
-		public void pa23a(PA23a h) {}
-
-		@Header(name="H", schema=" type:'a' ")
+		@Header(name="H", schema=@Schema(" type:'a' "))
 		public static class PA23b {}
 		
 		@RestMethod(name=GET,path="/schema2")
@@ -3691,139 +3599,68 @@ public class BasicRestInfoProviderTest {
 
 		@RestMethod(name=GET,path="/schema5")
 		public void pa23e(PA23e b) {}
-
-		@Header(name="H", type="a")
-		public static class PA25 {}
-		
-		@RestMethod(name=GET,path="/type")
-		public void pa25(PA25 h) {}
-
-		@Header(name="H", uniqueItems="true")
-		public static class PA26 {}
-		
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void pa26(PA26 h) {}
 	}
 	
 	@Test
-	public void pa01_Header_onPojo_default() throws Exception {
-		assertObjectEquals("'123'", getSwagger(new PA()).getPaths().get("/_default").get("get").getParameter("header", "H").getDefault());
-	}
-	@Test
-	public void pa02_Header_onPojo_enum() throws Exception {
-		assertObjectEquals("['A','B','C']", getSwagger(new PA()).getPaths().get("/_enum1").get("get").getParameter("header", "H").getEnum());
-	}
-	@Test
-	public void pa03_Header_onPojo_enum() throws Exception {
-		assertObjectEquals("['A','B','C']", getSwagger(new PA()).getPaths().get("/_enum2").get("get").getParameter("header", "H").getEnum());
-	}
-	@Test
-	public void pa04_Header_onPojo_allowEmptyValue() throws Exception {
-		assertEquals(true, getSwagger(new PA()).getPaths().get("/allowEmptyValue").get("get").getParameter("header", "H").getAllowEmptyValue());
-	}
-	@Test
-	public void pa05_Header_onPojo_collectionFormat() throws Exception {
-		assertEquals("A", getSwagger(new PA()).getPaths().get("/collectionFormat").get("get").getParameter("header", "H").getCollectionFormat());
-	}
-	@Test
-	public void pa06_Header_onPojo_description1() throws Exception {
-		assertEquals("a", getSwagger(new PA()).getPaths().get("/description1").get("get").getParameter("header", "H").getDescription());
-	}
-	@Test
-	public void pa07_Header_onPojo_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new PA()).getPaths().get("/description2").get("get").getParameter("header", "H").getDescription());
-	}
-	@Test
-	public void pa08a_Header_onPojo_example1() throws Exception {
-		assertEquals("a", getSwagger(new PA()).getPaths().get("/example1").get("get").getParameter("header", "H").getExample());
+	public void pa00_Header_onPojo_basic() throws Exception {
+		ParameterInfo x = getSwagger(new PA()).getPaths().get("/basic").get("get").getParameter("header", "H");
+		assertObjectEquals("'a'", x.getDefault());
+		assertEquals(true, x.getAllowEmptyValue());
+		assertEquals("A", x.getCollectionFormat());
+		assertEquals("a\nb", x.getDescription());
+		assertEquals(true, x.getExclusiveMaximum());
+		assertEquals(true, x.getExclusiveMinimum());
+		assertEquals("a", x.getFormat());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMaxItems());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMinItems());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("'a'", x.getPattern());
+		assertObjectEquals("true", x.getRequired());
+		assertObjectEquals("'a'", x.getType());
+		assertObjectEquals("true", x.getUniqueItems());
+		assertObjectEquals("['A','B','C']", x.getEnum());
+		assertEquals("a", x.getExample());
+		assertObjectEquals("{type:'a'}", x.getItems());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+	}
+	@Test
+	public void pa03_Header_onPojo_enum2() throws Exception {
+		ParameterInfo x = getSwagger(new PA()).getPaths().get("/_enum2").get("get").getParameter("header", "H");
+		assertObjectEquals("['A','B','C']", x.getEnum());
 	}
 	@Test
 	public void pa08b_Header_onPojo_example2() throws Exception {
-		assertObjectEquals("{f1:'a'}", getSwagger(new PA()).getPaths().get("/example2").get("get").getParameter("header", "H").getExample());
-	}
-	@Test
-	public void pa09_Header_onPojo_exclusiveMaximum() throws Exception {
-		assertEquals(true, getSwagger(new PA()).getPaths().get("/exclusiveMaximum").get("get").getParameter("header", "H").getExclusiveMaximum());
-	}
-	@Test
-	public void pa10_Header_onPojo_exclusiveMinimum() throws Exception {
-		assertEquals(true, getSwagger(new PA()).getPaths().get("/exclusiveMinimum").get("get").getParameter("header", "H").getExclusiveMinimum());
-	}
-	@Test
-	public void pa11_Header_onPojo_format() throws Exception {
-		assertEquals("a", getSwagger(new PA()).getPaths().get("/format").get("get").getParameter("header", "H").getFormat());
-	}
-	@Test
-	public void pa12_Header_onPojo_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new PA()).getPaths().get("/items1").get("get").getParameter("header", "H").getItems());
+		ParameterInfo x = getSwagger(new PA()).getPaths().get("/example2").get("get").getParameter("header", "H");
+		assertObjectEquals("{f1:'a'}", x.getExample());
 	}
 	@Test
 	public void pa13_Header_onPojo_items2() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new PA()).getPaths().get("/items2").get("get").getParameter("header", "H").getItems());
-	}
-	@Test
-	public void pa14_Header_onPojo_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new PA()).getPaths().get("/maximum").get("get").getParameter("header", "H").getMaximum());
-	}
-	@Test
-	public void pa15_Header_onPojo_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new PA()).getPaths().get("/maxItems").get("get").getParameter("header", "H").getMaxItems());
-	}
-	@Test
-	public void pa16_Header_onPojo_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new PA()).getPaths().get("/maxLength").get("get").getParameter("header", "H").getMaxLength());
-	}
-	@Test
-	public void pa17_Header_onPojo_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new PA()).getPaths().get("/minimum").get("get").getParameter("header", "H").getMinimum());
-	}
-	@Test
-	public void pa18_Header_onPojo_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new PA()).getPaths().get("/minItems").get("get").getParameter("header", "H").getMinItems());
-	}
-	@Test
-	public void pa19_Header_onPojo_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new PA()).getPaths().get("/minLength").get("get").getParameter("header", "H").getMinLength());
-	}
-	@Test
-	public void pa20_Header_onPojo_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new PA()).getPaths().get("/multipleOf").get("get").getParameter("header", "H").getMultipleOf());
-	}
-	@Test
-	public void pa21_Header_onPojo_pattern() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new PA()).getPaths().get("/pattern").get("get").getParameter("header", "H").getPattern());
-	}
-	@Test
-	public void pa22_Header_onPojo_required() throws Exception {
-		assertObjectEquals("true", getSwagger(new PA()).getPaths().get("/required").get("get").getParameter("header", "H").getRequired());
-	}
-	@Test
-	public void pa23a_Header_onPojo_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new PA()).getPaths().get("/schema1").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PA()).getPaths().get("/items2").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'a'}", x.getItems());
 	}
 	@Test
 	public void pa23b_Header_onPojo_schema2() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new PA()).getPaths().get("/schema2").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PA()).getPaths().get("/schema2").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'a'}", x.getSchema());
 	}
 	@Test
 	public void pa23c_Header_onPojo_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new PA()).getPaths().get("/schema3").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PA()).getPaths().get("/schema3").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void pa23d_Header_onPojo_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new PA()).getPaths().get("/schema4").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PA()).getPaths().get("/schema4").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void pa23e_Header_onPojo_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new PA()).getPaths().get("/schema5").get("get").getParameter("header", "H").getSchema());
-	}
-	@Test
-	public void pa25_Header_onPojo_type() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new PA()).getPaths().get("/type").get("get").getParameter("header", "H").getType());
-	}
-	@Test
-	public void pa26_Header_onPojo_uniqueItems() throws Exception {
-		assertObjectEquals("true", getSwagger(new PA()).getPaths().get("/uniqueItems").get("get").getParameter("header", "H").getUniqueItems());
+		ParameterInfo x = getSwagger(new PA()).getPaths().get("/schema5").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 
 	//=================================================================================================================
@@ -3833,68 +3670,38 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class PB {
 
-		@RestMethod(name=GET,path="/name")
-		public void pb01(@Header(name="H") String h) {}
+		@RestMethod(name=GET,path="/basic")
+		public void pb00(
+			@Header(
+				name="H",
+				description={"a","b"},
+				type="a",
+				format="a",
+				pattern="a",
+				collectionFormat="a",
+				maximum="1",
+				minimum="1",
+				multipleOf="1",
+				maxLength="1",
+				minLength="1",
+				maxItems="1",
+				minItems="1",
+				allowEmptyValue="true",
+				exclusiveMaximum="true",
+				exclusiveMinimum="true",
+				uniqueItems="true",
+				schema=@Schema(type="a"),
+				_default="a",
+				_enum="a,b",
+				items=@Items(type="a"),
+				example="a,b"
+			) String h) {}
 		
 		@RestMethod(name=GET,path="/value")
 		public void pb02(@Header("H") String h) {}
 		
-		@RestMethod(name=GET,path="/description1")
-		public void pb03a(@Header(name="H", description="a") String h) {}
-		
-		@RestMethod(name=GET,path="/description2")
-		public void pb03b(@Header(name="H", description={"a","b"}) String h) {}
-		
-		@RestMethod(name=GET,path="/type")
-		public void pb04(@Header(name="H", type="a") String h) {}
-
-		@RestMethod(name=GET,path="/format")
-		public void pb05(@Header(name="H", format="a") String h) {}
-
-		@RestMethod(name=GET,path="/pattern")
-		public void pb06(@Header(name="H", pattern="a") String h) {}
-
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void pb07(@Header(name="H", collectionFormat="a") String h) {}
-
-		@RestMethod(name=GET,path="/maximum")
-		public void pb08(@Header(name="H", maximum="1") String h) {}
-
-		@RestMethod(name=GET,path="/minimum")
-		public void pb09(@Header(name="H", minimum="1") String h) {}
-
-		@RestMethod(name=GET,path="/multipleOf")
-		public void pb010(@Header(name="H", multipleOf="1") String h) {}
-
-		@RestMethod(name=GET,path="/maxLength")
-		public void pb11(@Header(name="H", maxLength="1") String h) {}
-
-		@RestMethod(name=GET,path="/minLength")
-		public void pb12(@Header(name="H", minLength="1") String h) {}
-
-		@RestMethod(name=GET,path="/maxItems")
-		public void pb13(@Header(name="H", maxItems="1") String h) {}
-
-		@RestMethod(name=GET,path="/minItems")
-		public void pb14(@Header(name="H", minItems="1") String h) {}
-
-		@RestMethod(name=GET,path="/allowEmptyValue")
-		public void pb15(@Header(name="H", allowEmptyValue="true") String h) {}
-
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void pb16(@Header(name="H", exclusiveMaximum="true") String h) {}
-
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void pb17(@Header(name="H", exclusiveMinimum="true") String h) {}
-
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void pb18a(@Header(name="H", uniqueItems="true") String h) {}
-
-		@RestMethod(name=GET,path="/schema1")
-		public void pb19a(@Header(name="H", schema=" {type:'a'} ") String h) {}
-
 		@RestMethod(name=GET,path="/schema2")
-		public void pb19b(@Header(name="H", schema={" type:'b' "}) String h) {}
+		public void pb19b(@Header(name="H", schema=@Schema(" type:'b' ")) String h) {}
 
 		public static class PB19c {
 			public String f1;
@@ -3921,166 +3728,99 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema7")
 		public void pb19g(@Header("H") Boolean b) {}
 
-		@RestMethod(name=GET,path="/_default1")
-		public void pb20a(@Header(name="H", _default="a") String h) {}
-
 		@RestMethod(name=GET,path="/_default2")
 		public void pb20b(@Header(name="H", _default={"a","b"}) String h) {}
 
-		@RestMethod(name=GET,path="/_enum1")
-		public void pb21a(@Header(name="H", _enum="a,b") String h) {}
-
 		@RestMethod(name=GET,path="/_enum2")
 		public void pb21b(@Header(name="H", _enum={"['a','b']"}) String h) {}
 
-		@RestMethod(name=GET,path="/items1")
-		public void pb22a(@Header(name="H", items=" {type:'a'} ") String h) {}
-
 		@RestMethod(name=GET,path="/items2")
-		public void pb22b(@Header(name="H", items={" type:'b' "}) String h) {}
-
-		@RestMethod(name=GET,path="/example1")
-		public void pb23a(@Header(name="H", example="a,b") String h) {}
+		public void pb22b(@Header(name="H", items=@Items(" type:'b' ")) String h) {}
 
 		@RestMethod(name=GET,path="/example2")
 		public void pb23b(@Header(name="H", example={"a","b"}) String h) {}
 	}
 
 	@Test
-	public void pb01_Header_onParameter_name() throws Exception {
-		assertEquals("H", getSwagger(new PB()).getPaths().get("/name").get("get").getParameter("header", "H").getName());
+	public void pb00_Header_onParameter_basic() throws Exception {
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/basic").get("get").getParameter("header", "H");
+		assertEquals("H", x.getName());
+		assertEquals("a\nb", x.getDescription());
+		assertEquals("a", x.getType());
+		assertEquals("a", x.getFormat());
+		assertEquals("a", x.getPattern());
+		assertEquals("a", x.getCollectionFormat());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("1", x.getMaxItems());
+		assertObjectEquals("1", x.getMinItems());
+		assertObjectEquals("true", x.getAllowEmptyValue());
+		assertObjectEquals("true", x.getExclusiveMaximum());
+		assertObjectEquals("true", x.getExclusiveMinimum());
+		assertObjectEquals("true", x.getUniqueItems());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertObjectEquals("'a'", x.getDefault());
+		assertObjectEquals("['a','b']", x.getEnum());
+		assertObjectEquals("{type:'a'}", x.getItems());
+		assertEquals("a,b", x.getExample());
 	}
 	@Test
 	public void pb02_Header_onParameter_value() throws Exception {
-		assertEquals("H", getSwagger(new PB()).getPaths().get("/value").get("get").getParameter("header", "H").getName());
-	}
-	@Test
-	public void pb03a_Header_onParameter_description1() throws Exception {
-		assertEquals("a", getSwagger(new PB()).getPaths().get("/description1").get("get").getParameter("header", "H").getDescription());
-	}
-	@Test
-	public void pb03b_Header_onParameter_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new PB()).getPaths().get("/description2").get("get").getParameter("header", "H").getDescription());
-	}
-	@Test
-	public void pb04_Header_onParameter_type() throws Exception {
-		assertEquals("a", getSwagger(new PB()).getPaths().get("/type").get("get").getParameter("header", "H").getType());
-	}
-	@Test
-	public void pb05_Header_onParameter_format() throws Exception {
-		assertEquals("a", getSwagger(new PB()).getPaths().get("/format").get("get").getParameter("header", "H").getFormat());
-	}
-	@Test
-	public void pb06_Header_onParameter_pattern() throws Exception {
-		assertEquals("a", getSwagger(new PB()).getPaths().get("/pattern").get("get").getParameter("header", "H").getPattern());
-	}
-	@Test
-	public void pb07_Header_onParameter_collectionFormat() throws Exception {
-		assertEquals("a", getSwagger(new PB()).getPaths().get("/collectionFormat").get("get").getParameter("header", "H").getCollectionFormat());
-	}
-	@Test
-	public void pb08_Header_onParameter_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new PB()).getPaths().get("/maximum").get("get").getParameter("header", "H").getMaximum());
-	}
-	@Test
-	public void pb09_Header_onParameter_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new PB()).getPaths().get("/minimum").get("get").getParameter("header", "H").getMinimum());
-	}
-	@Test
-	public void pb10_Header_onParameter_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new PB()).getPaths().get("/multipleOf").get("get").getParameter("header", "H").getMultipleOf());
-	}
-	@Test
-	public void pb11_Header_onParameter_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new PB()).getPaths().get("/maxLength").get("get").getParameter("header", "H").getMaxLength());
-	}
-	@Test
-	public void pb12_Header_onParameter_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new PB()).getPaths().get("/minLength").get("get").getParameter("header", "H").getMinLength());
-	}
-	@Test
-	public void pb13_Header_onParameter_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new PB()).getPaths().get("/maxItems").get("get").getParameter("header", "H").getMaxItems());
-	}
-	@Test
-	public void pb14_Header_onParameter_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new PB()).getPaths().get("/minItems").get("get").getParameter("header", "H").getMinItems());
-	}
-	@Test
-	public void pb15_Header_onParameter_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new PB()).getPaths().get("/allowEmptyValue").get("get").getParameter("header", "H").getAllowEmptyValue());
-	}
-	@Test
-	public void pb16_Header_onParameter_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new PB()).getPaths().get("/exclusiveMaximum").get("get").getParameter("header", "H").getExclusiveMaximum());
-	}
-	@Test
-	public void pb17_Header_onParameter_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new PB()).getPaths().get("/exclusiveMinimum").get("get").getParameter("header", "H").getExclusiveMinimum());
-	}
-	@Test
-	public void pb18_Header_onParameter_uniqueItems1() throws Exception {
-		assertObjectEquals("true", getSwagger(new PB()).getPaths().get("/uniqueItems").get("get").getParameter("header", "H").getUniqueItems());
-	}
-	@Test
-	public void pb19a_Header_onParameter_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new PB()).getPaths().get("/schema1").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/value").get("get").getParameter("header", "H");
+		assertEquals("H", x.getName());
 	}
 	@Test
 	public void pb19b_Header_onParameter_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new PB()).getPaths().get("/schema2").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/schema2").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void pb19c_Header_onParameter_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new PB()).getPaths().get("/schema3").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/schema3").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void pb19d_Header_onParameter_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new PB()).getPaths().get("/schema4").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/schema4").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void pb19e_Header_onParameter_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new PB()).getPaths().get("/schema5").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/schema5").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void pb19f_Header_onParameter_schema6() throws Exception {
-		assertObjectEquals("{format:'int32',type:'integer'}", getSwagger(new PB()).getPaths().get("/schema6").get("get").getParameter("header", "H").getSchema());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/schema6").get("get").getParameter("header", "H");
+		assertObjectEquals("{format:'int32',type:'integer'}", x.getSchema());
 	}
 	@Test
 	public void pb19g_Header_onParameter_schema7() throws Exception {
-		assertObjectEquals("{type:'boolean'}", getSwagger(new PB()).getPaths().get("/schema7").get("get").getParameter("header", "H").getSchema());
-	}
-	@Test
-	public void pb20a_Header_onParameter__default1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new PB()).getPaths().get("/_default1").get("get").getParameter("header", "H").getDefault());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/schema7").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'boolean'}", x.getSchema());
 	}
 	@Test
 	public void pb20b_Header_onParameter__default2() throws Exception {
-		assertObjectEquals("'a\\nb'", getSwagger(new PB()).getPaths().get("/_default2").get("get").getParameter("header", "H").getDefault());
-	}
-	@Test
-	public void pb21a_Header_onParameter__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new PB()).getPaths().get("/_enum1").get("get").getParameter("header", "H").getEnum());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/_default2").get("get").getParameter("header", "H");
+		assertObjectEquals("'a\\nb'", x.getDefault());
 	}
 	@Test
 	public void pb21b_Header_onParameter__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new PB()).getPaths().get("/_enum2").get("get").getParameter("header", "H").getEnum());
-	}
-	@Test
-	public void pb22a_Header_onParameter_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new PB()).getPaths().get("/items1").get("get").getParameter("header", "H").getItems());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/_enum2").get("get").getParameter("header", "H");
+		assertObjectEquals("['a','b']", x.getEnum());
 	}
 	@Test
 	public void pb22b_Header_onParameter_items2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new PB()).getPaths().get("/items2").get("get").getParameter("header", "H").getItems());
-	}
-	@Test
-	public void pb23a_Header_onParameter_example1() throws Exception {
-		assertEquals("a,b", getSwagger(new PB()).getPaths().get("/example1").get("get").getParameter("header", "H").getExample());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/items2").get("get").getParameter("header", "H");
+		assertObjectEquals("{type:'b'}", x.getItems());
 	}
 	@Test
 	public void pb23b_Header_onParameter_example2() throws Exception {
-		assertEquals("a\nb", getSwagger(new PB()).getPaths().get("/example2").get("get").getParameter("header", "H").getExample());
+		ParameterInfo x = getSwagger(new PB()).getPaths().get("/example2").get("get").getParameter("header", "H");
+		assertEquals("a\nb", x.getExample());
 	}
 
 	
@@ -4091,128 +3831,45 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class QA {
 
+		@Query(
+			name="Q", 
+			description= {"a","b"},
+			required="true",
+			type="a",
+			format="a",
+			pattern="a",
+			collectionFormat="a",
+			maximum="1",
+			minimum="1",
+			multipleOf="1",
+			maxLength="1",
+			minLength="1",
+			maxItems="1",
+			minItems="1",
+			allowEmptyValue="true",
+			exclusiveMaximum="true",
+			exclusiveMinimum="true",
+			uniqueItems="true",
+			schema=@Schema(type="a"),
+			_default="a",
+			_enum="a, b",
+			items=@Items(type="a"),
+			example="'a'"
+		)
+		public static class QA00 {
+			public QA00(String x) {}
+		}
+		
+		@RestMethod(name=GET, path="/basic")
+		public void qa00(QA00 q) {}
+
 		@Query("Q")
 		public static class QA01 {}
 		
 		@RestMethod(name=GET,path="/value")
 		public void qa01(QA01 q) {}
 
-		//	String[] description() default {};
-		@Query(name="Q", description="a")
-		public static class QA02a {}
-		
-		@RestMethod(name=GET,path="/description1")
-		public void qa02a(QA02a q) {}
-
-		@Query(name="Q", description= {"a","b"})
-		public static class QA02b {}
-		
-		@RestMethod(name=GET,path="/description2")
-		public void qa02b(QA02b q) {}
-
-		@Query(name="Q", required="true")
-		public static class QA03 {}
-		
-		@RestMethod(name=GET,path="/required")
-		public void qa03(QA03 q) {}
-
-		@Query(name="Q", type="a")
-		public static class QA04 {}
-		
-		@RestMethod(name=GET,path="/type")
-		public void qa04(QA04 q) {}
-
-		@Query(name="Q", format="a")
-		public static class QA05 {}
-		
-		@RestMethod(name=GET,path="/format")
-		public void qa05(QA05 q) {}
-
-		@Query(name="Q", pattern="a")
-		public static class QA06 {}
-		
-		@RestMethod(name=GET,path="/pattern")
-		public void qa06(QA06 q) {}
-
-		@Query(name="Q", collectionFormat="a")
-		public static class QA07 {}
-		
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void qa07(QA07 q) {}
-
-		@Query(name="Q", maximum="1")
-		public static class QA08 {}
-		
-		@RestMethod(name=GET,path="/maximum")
-		public void qa08(QA08 q) {}
-
-		@Query(name="Q", minimum="1")
-		public static class QA09 {}
-		
-		@RestMethod(name=GET,path="/minimum")
-		public void qa09(QA09 q) {}
-
-		@Query(name="Q", multipleOf="1")
-		public static class QA10 {}
-		
-		@RestMethod(name=GET,path="/multipleOf")
-		public void qa10(QA10 q) {}
-
-		@Query(name="Q", maxLength="1")
-		public static class QA11 {}
-		
-		@RestMethod(name=GET,path="/maxLength")
-		public void qa11(QA11 q) {}
-
-		@Query(name="Q", minLength="1")
-		public static class QA12 {}
-		
-		@RestMethod(name=GET,path="/minLength")
-		public void qa12(QA12 q) {}
-
-		@Query(name="Q", maxItems="1")
-		public static class QA13 {}
-		
-		@RestMethod(name=GET,path="/maxItems")
-		public void qa13(QA13 q) {}
-
-		@Query(name="Q", minItems="1")
-		public static class QA14 {}
-		
-		@RestMethod(name=GET,path="/minItems")
-		public void qa14(QA14 q) {}
-
-		@Query(name="Q", allowEmptyValue="true")
-		public static class QA15 {}
-		
-		@RestMethod(name=GET,path="/allowEmptyValue")
-		public void qa15(QA15 q) {}
-
-		@Query(name="Q", exclusiveMaximum="true")
-		public static class QA16 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void qa16(QA16 q) {}
-
-		@Query(name="Q", exclusiveMinimum="true")
-		public static class QA17 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void qa17(QA17 q) {}
-
-		@Query(name="Q", uniqueItems="true")
-		public static class QA18 {}
-		
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void qa18(QA18 q) {}
-
-		@Query(name="Q", schema=" {type:'a'} ")
-		public static class QA19a {}
-		
-		@RestMethod(name=GET,path="/schema1")
-		public void qa19a(QA19a q) {}
-
-		@Query(name="Q", schema={" type:'b' "})
+		@Query(name="Q", schema=@Schema(" type:'b' "))
 		public static class QA19b {}
 		
 		@RestMethod(name=GET,path="/schema2")
@@ -4240,50 +3897,24 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema5")
 		public void qa19e(QA19e q) {}
 		
-		@Query(name="Q", _default="a")
-		public static class QA21a {}
-		
-		@RestMethod(name=GET,path="/_default1")
-		public void qa21a(QA21a q) {}
-
 		@Query(name="Q", _default={"a","b"})
 		public static class QA21b {}
 		
 		@RestMethod(name=GET,path="/_default2")
 		public void qa21b(QA21b q) {}
 
-		@Query(name="Q", _enum=" a,b ")
-		public static class QA22a {}
-		
-		@RestMethod(name=GET,path="/_enum1")
-		public void qa22a(QA22a q) {}
-
 		@Query(name="Q", _enum={" ['a','b'] "})
 		public static class QA22b {}
 		
 		@RestMethod(name=GET,path="/_enum2")
 		public void qa22b(QA22b q) {}
 
-		@Query(name="Q", items=" {type:'a'} ")
-		public static class QA23a {}
-		
-		@RestMethod(name=GET,path="/items1")
-		public void qa23a(QA23a q) {}
-
-		@Query(name="Q", items={" type: 'b' "})
+		@Query(name="Q", items=@Items(" type: 'b' "))
 		public static class QA23b {}
 		
 		@RestMethod(name=GET,path="/items2")
 		public void qa23b(QA23b q) {}
 
-		@Query(name="Q", example="'a'")
-		public static class QA24a {
-			public QA24a(String value) {}
-		}
-		
-		@RestMethod(name=GET,path="/example1")
-		public void qa24a(QA24a q) {}
-
 		@Query(name="Q", example={"{f1:'a'}"})
 		public static class QA24b {
 			public String f1;
@@ -4294,132 +3925,76 @@ public class BasicRestInfoProviderTest {
 	}
 	
 	@Test
-	public void qa01_Query_onPojo_value() throws Exception {
-		assertEquals("Q", getSwagger(new QA()).getPaths().get("/value").get("get").getParameter("query", "Q").getName());
+	public void qa00a_Query_onPojo_basic() throws Exception {
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/basic").get("get").getParameter("query", "Q");
+		assertEquals("Q", x.getName());
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("true", x.getRequired());
+		assertEquals("a", x.getType());
+		assertEquals("a", x.getFormat());
+		assertEquals("a", x.getPattern());
+		assertEquals("a", x.getCollectionFormat());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("1", x.getMaxItems());
+		assertObjectEquals("1", x.getMinItems());
+		assertObjectEquals("true", x.getAllowEmptyValue());
+		assertObjectEquals("true", x.getExclusiveMaximum());
+		assertObjectEquals("true", x.getExclusiveMinimum());
+		assertObjectEquals("true", x.getUniqueItems());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertEquals("a", x.getDefault());
+		assertObjectEquals("['a','b']", x.getEnum());
+		assertObjectEquals("{type:'a'}", x.getItems());
+		assertObjectEquals("'a'", x.getExample());
 	}
 	@Test
-	public void qa02a_Query_onPojo_description1() throws Exception {
-		assertEquals("a", getSwagger(new QA()).getPaths().get("/description1").get("get").getParameter("query", "Q").getDescription());
-	}
-	@Test
-	public void qa02b_Query_onPojo_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new QA()).getPaths().get("/description2").get("get").getParameter("query", "Q").getDescription());
-	}
-	@Test
-	public void qa03_Query_onPojor_required() throws Exception {
-		assertObjectEquals("true", getSwagger(new QA()).getPaths().get("/required").get("get").getParameter("query", "Q").getRequired());
-	}
-	@Test
-	public void qa04_Query_onPojo_type() throws Exception {
-		assertEquals("a", getSwagger(new QA()).getPaths().get("/type").get("get").getParameter("query", "Q").getType());
-	}
-	@Test
-	public void qa05_Query_onPojo_format() throws Exception {
-		assertEquals("a", getSwagger(new QA()).getPaths().get("/format").get("get").getParameter("query", "Q").getFormat());
-	}
-	@Test
-	public void qa06_Query_onPojo_pattern() throws Exception {
-		assertEquals("a", getSwagger(new QA()).getPaths().get("/pattern").get("get").getParameter("query", "Q").getPattern());
-	}
-	@Test
-	public void qa07_Query_onPojo_collectionFormat() throws Exception {
-		assertEquals("a", getSwagger(new QA()).getPaths().get("/collectionFormat").get("get").getParameter("query", "Q").getCollectionFormat());
-	}
-	@Test
-	public void qa08_Query_onPojo_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new QA()).getPaths().get("/maximum").get("get").getParameter("query", "Q").getMaximum());
-	}
-	@Test
-	public void qa09_Query_onPojo_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new QA()).getPaths().get("/minimum").get("get").getParameter("query", "Q").getMinimum());
-	}
-	@Test
-	public void qa10_Query_onPojo_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new QA()).getPaths().get("/multipleOf").get("get").getParameter("query", "Q").getMultipleOf());
-	}
-	@Test
-	public void qa11_Query_onPojo_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new QA()).getPaths().get("/maxLength").get("get").getParameter("query", "Q").getMaxLength());
-	}
-	@Test
-	public void qa12_Query_onPojo_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new QA()).getPaths().get("/minLength").get("get").getParameter("query", "Q").getMinLength());
-	}
-	@Test
-	public void qa13_Query_onPojo_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new QA()).getPaths().get("/maxItems").get("get").getParameter("query", "Q").getMaxItems());
-	}
-	@Test
-	public void qa14_Query_onPojo_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new QA()).getPaths().get("/minItems").get("get").getParameter("query", "Q").getMinItems());
-	}
-	@Test
-	public void qa15_Query_onPojo_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new QA()).getPaths().get("/allowEmptyValue").get("get").getParameter("query", "Q").getAllowEmptyValue());
-	}
-	@Test
-	public void qa16_Query_onPojo_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new QA()).getPaths().get("/exclusiveMaximum").get("get").getParameter("query", "Q").getExclusiveMaximum());
-	}
-	@Test
-	public void qa17_Query_onPojo_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new QA()).getPaths().get("/exclusiveMinimum").get("get").getParameter("query", "Q").getExclusiveMinimum());
-	}
-	@Test
-	public void qa18_Query_onPojo_uniqueItems() throws Exception {
-		assertObjectEquals("true", getSwagger(new QA()).getPaths().get("/uniqueItems").get("get").getParameter("query", "Q").getUniqueItems());
-	}
-	@Test
-	public void qa19a_Query_onPojo_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new QA()).getPaths().get("/schema1").get("get").getParameter("query", "Q").getSchema());
+	public void qa01_Query_onPojo_value() throws Exception {
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/value").get("get").getParameter("query", "Q");
+		assertEquals("Q", x.getName());
 	}
 	@Test
 	public void qa19b_Query_onPojo_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new QA()).getPaths().get("/schema2").get("get").getParameter("query", "Q").getSchema());
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/schema2").get("get").getParameter("query", "Q");
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void qa19c_Query_onPojo_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new QA()).getPaths().get("/schema3").get("get").getParameter("query", "Q").getSchema());
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/schema3").get("get").getParameter("query", "Q");
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void qa19d_Query_onPojo_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new QA()).getPaths().get("/schema4").get("get").getParameter("query", "Q").getSchema());
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/schema4").get("get").getParameter("query", "Q");
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void qa19e_Query_onPojo_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new QA()).getPaths().get("/schema5").get("get").getParameter("query", "Q").getSchema());
-	}
-	@Test
-	public void qa21a_Query_onPojo_default1() throws Exception {
-		assertEquals("a", getSwagger(new QA()).getPaths().get("/_default1").get("get").getParameter("query", "Q").getDefault());
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/schema5").get("get").getParameter("query", "Q");
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void qa21b_Query_onPojo_default2() throws Exception {
-		assertEquals("a\nb", getSwagger(new QA()).getPaths().get("/_default2").get("get").getParameter("query", "Q").getDefault());
-	}
-	@Test
-	public void qa22a_Query_onPojo_enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new QA()).getPaths().get("/_enum1").get("get").getParameter("query", "Q").getEnum());
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/_default2").get("get").getParameter("query", "Q");
+		assertEquals("a\nb", x.getDefault());
 	}
 	@Test
 	public void qa22b_Query_onPojo_enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new QA()).getPaths().get("/_enum2").get("get").getParameter("query", "Q").getEnum());
-	}
-	@Test
-	public void qa23a_Query_onPojo_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new QA()).getPaths().get("/items1").get("get").getParameter("query", "Q").getItems());
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/_enum2").get("get").getParameter("query", "Q");
+		assertObjectEquals("['a','b']", x.getEnum());
 	}
 	@Test
 	public void qa23b_Query_onPojo_items2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new QA()).getPaths().get("/items2").get("get").getParameter("query", "Q").getItems());
-	}
-	@Test
-	public void qa24a_Query_onPojo_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new QA()).getPaths().get("/example1").get("get").getParameter("query", "Q").getExample());
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/items2").get("get").getParameter("query", "Q");
+		assertObjectEquals("{type:'b'}", x.getItems());
 	}
 	@Test
 	public void qa24b_Query_onPojo_example2() throws Exception {
-		assertObjectEquals("{f1:'a'}", getSwagger(new QA()).getPaths().get("/example2").get("get").getParameter("query", "Q").getExample());
+		ParameterInfo x = getSwagger(new QA()).getPaths().get("/example2").get("get").getParameter("query", "Q");
+		assertObjectEquals("{f1:'a'}", x.getExample());
 	}
 		
 	//=================================================================================================================
@@ -4429,71 +4004,40 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class QB {
 		
-		@RestMethod(name=GET,path="/name")
-		public void qb01(@Query(name="Q") String q) {}
+		@RestMethod(name=GET,path="/basic")
+		public void qb00(
+			@Query(
+				name="Q",
+				description= {"a","b"},
+				required="true",
+				type="a",
+				format="a",
+				pattern="a",
+				collectionFormat="a",
+				maximum="1",
+				minimum="1",
+				multipleOf="1",
+				maxLength="1",
+				minLength="1",
+				maxItems="1",
+				minItems="1",
+				allowEmptyValue="true",
+				exclusiveMaximum="true",
+				exclusiveMinimum="true",
+				uniqueItems="true",
+				schema=@Schema(type="a"),
+				_default="a",
+				_enum="a,b",
+				items=@Items(type="a"),
+				example="a"
+			) 
+			String q) {}
 
 		@RestMethod(name=GET,path="/value")
 		public void qb02(@Query("Q") String q) {}
 
-		@RestMethod(name=GET,path="/description1")
-		public void qb03a(@Query(name="Q", description="a") String q) {}
-
-		@RestMethod(name=GET,path="/description2")
-		public void qb03b(@Query(name="Q", description= {"a","b"}) String q) {}
-
-		@RestMethod(name=GET,path="/required")
-		public void qb04(@Query(name="Q", required="true") String q) {}
-
-		@RestMethod(name=GET,path="/type")
-		public void qb05(@Query(name="Q", type="a") String q) {}
-
-		@RestMethod(name=GET,path="/format")
-		public void qb06(@Query(name="Q", format="a") String q) {}
-
-		@RestMethod(name=GET,path="/pattern")
-		public void qb07(@Query(name="Q", pattern="a") String q) {}
-
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void qb08(@Query(name="Q", collectionFormat="a") String q) {}
-
-		@RestMethod(name=GET,path="/maximum")
-		public void qb09(@Query(name="Q", maximum="1") String q) {}
-
-		@RestMethod(name=GET,path="/minimum")
-		public void qb10(@Query(name="Q", minimum="1") String q) {}
-
-		@RestMethod(name=GET,path="/multipleOf")
-		public void qb11(@Query(name="Q", multipleOf="1") String q) {}
-
-		@RestMethod(name=GET,path="/maxLength")
-		public void qb12(@Query(name="Q", maxLength="1") String q) {}
-
-		@RestMethod(name=GET,path="/minLength")
-		public void qb13(@Query(name="Q", minLength="1") String q) {}
-
-		@RestMethod(name=GET,path="/maxItems")
-		public void qb14(@Query(name="Q", maxItems="1") String q) {}
-
-		@RestMethod(name=GET,path="/minItems")
-		public void qb(@Query(name="Q", minItems="1") String q) {}
-
-		@RestMethod(name=GET,path="/allowEmptyValue")
-		public void qb15(@Query(name="Q", allowEmptyValue="true") String q) {}
-
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void qb16(@Query(name="Q", exclusiveMaximum="true") String q) {}
-
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void qb17(@Query(name="Q", exclusiveMinimum="true") String q) {}
-
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void qb18(@Query(name="Q", uniqueItems="true") String q) {}
-
-		@RestMethod(name=GET,path="/schema1")
-		public void qb19a(@Query(name="Q", schema=" {type:'a'} ") String q) {}
-
 		@RestMethod(name=GET,path="/schema2")
-		public void qb19b(@Query(name="Q", schema={ " type: 'b' "}) String q) {}
+		public void qb19b(@Query(name="Q", schema=@Schema( " type: 'b' ")) String q) {}
 
 		public static class TB18c {
 			public String f1;
@@ -4520,153 +4064,75 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema7")
 		public void tb18g(@Body Boolean b) {}
 
-
-		
-		
-		@RestMethod(name=GET,path="/_default1")
-		public void qb20a(@Query(name="Q", _default="a") String q) {}
-
 		@RestMethod(name=GET,path="/_default2")
 		public void qb20b(@Query(name="Q", _default={"a","b"}) String q) {}
 
-		@RestMethod(name=GET,path="/_enum1")
-		public void qb21a(@Query(name="Q", _enum="a,b") String q) {}
-
 		@RestMethod(name=GET,path="/_enum2")
 		public void qb21b(@Query(name="Q", _enum= {" ['a','b'] "}) String q) {}
 
-		@RestMethod(name=GET,path="/items1")
-		public void qb22a(@Query(name="Q", items=" {type:'a'} ") String q) {}
-
 		@RestMethod(name=GET,path="/items2")
-		public void qb22b(@Query(name="Q", items={" type:'b' "}) String q) {}
-
-		@RestMethod(name=GET,path="/example1")
-		public void qb23a(@Query(name="Q", example="a") String q) {}
+		public void qb22b(@Query(name="Q", items=@Items(" type:'b' ")) String q) {}
 
 		@RestMethod(name=GET,path="/example2")
 		public void qb23b(@Query(name="Q", example={"a","b"}) String q) {}
 	}
 	
 	@Test
-	public void qb01_Query_onParameter_name() throws Exception {
-		assertEquals("Q", getSwagger(new QB()).getPaths().get("/name").get("get").getParameter("query", "Q").getName());
+	public void qb00_Query_onParameter_basic() throws Exception {
+		ParameterInfo x = getSwagger(new QB()).getPaths().get("/basic").get("get").getParameter("query", "Q");
+		assertEquals("Q", x.getName());
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("true", x.getRequired());
+		assertEquals("a", x.getType());
+		assertEquals("a", x.getFormat());
+		assertEquals("a", x.getPattern());
+		assertEquals("a", x.getCollectionFormat());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("1", x.getMaxItems());
+		assertObjectEquals("1", x.getMinItems());
+		assertObjectEquals("true", x.getAllowEmptyValue());
+		assertObjectEquals("true", x.getExclusiveMaximum());
+		assertObjectEquals("true", x.getExclusiveMinimum());
+		assertObjectEquals("true", x.getUniqueItems());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertEquals("a", x.getDefault());
+		assertObjectEquals("['a','b']", x.getEnum());
+		assertObjectEquals("{type:'a'}", x.getItems());
+		assertEquals("a", x.getExample());
 	}
 	@Test
 	public void qb02_Query_onParameter_value() throws Exception {
-		assertEquals("Q", getSwagger(new QB()).getPaths().get("/value").get("get").getParameter("query", "Q").getName());
-	}
-	@Test
-	public void qb03a_Query_onParameter_description1() throws Exception {
-		assertEquals("a", getSwagger(new QB()).getPaths().get("/description1").get("get").getParameter("query", "Q").getDescription());
-	}
-	@Test
-	public void qb03b_Query_onParameter_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new QB()).getPaths().get("/description2").get("get").getParameter("query", "Q").getDescription());
-	}
-	@Test
-	public void qb04_Query_onParameter_required() throws Exception {
-		assertObjectEquals("true", getSwagger(new QB()).getPaths().get("/required").get("get").getParameter("query", "Q").getRequired());
-	}
-	@Test
-	public void qb05_Query_onParameter_type() throws Exception {
-		assertEquals("a", getSwagger(new QB()).getPaths().get("/type").get("get").getParameter("query", "Q").getType());
-	}
-	@Test
-	public void qb06_Query_onParameter_format() throws Exception {
-		assertEquals("a", getSwagger(new QB()).getPaths().get("/format").get("get").getParameter("query", "Q").getFormat());
-	}
-	@Test
-	public void qb07_Query_onParameter_pattern() throws Exception {
-		assertEquals("a", getSwagger(new QB()).getPaths().get("/pattern").get("get").getParameter("query", "Q").getPattern());
-	}
-	@Test
-	public void qb08_Query_onParameter_collectionFormat() throws Exception {
-		assertEquals("a", getSwagger(new QB()).getPaths().get("/collectionFormat").get("get").getParameter("query", "Q").getCollectionFormat());
-	}
-	@Test
-	public void qb09_Query_onParameter_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new QB()).getPaths().get("/maximum").get("get").getParameter("query", "Q").getMaximum());
-	}
-	@Test
-	public void qb10_Query_onParameter_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new QB()).getPaths().get("/minimum").get("get").getParameter("query", "Q").getMinimum());
-	}
-	@Test
-	public void qb11_Query_onParameter_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new QB()).getPaths().get("/multipleOf").get("get").getParameter("query", "Q").getMultipleOf());
-	}
-	@Test
-	public void qb12_Query_onParameter_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new QB()).getPaths().get("/maxLength").get("get").getParameter("query", "Q").getMaxLength());
-	}
-	@Test
-	public void qb13_Query_onParameter_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new QB()).getPaths().get("/minLength").get("get").getParameter("query", "Q").getMinLength());
-	}
-	@Test
-	public void qb14a_Query_onParameter_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new QB()).getPaths().get("/maxItems").get("get").getParameter("query", "Q").getMaxItems());
-	}
-	@Test
-	public void qb14b_Query_onParameter_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new QB()).getPaths().get("/minItems").get("get").getParameter("query", "Q").getMinItems());
-	}
-	@Test
-	public void qb15_Query_onParameter_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new QB()).getPaths().get("/allowEmptyValue").get("get").getParameter("query", "Q").getAllowEmptyValue());
-	}
-	@Test
-	public void qb16_Query_onParameter_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new QB()).getPaths().get("/exclusiveMaximum").get("get").getParameter("query", "Q").getExclusiveMaximum());
-	}
-	@Test
-	public void qb17_Query_onParameter_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new QB()).getPaths().get("/exclusiveMinimum").get("get").getParameter("query", "Q").getExclusiveMinimum());
-	}
-	@Test
-	public void qb18_Query_onParameter_uniqueItems() throws Exception {
-		assertObjectEquals("true", getSwagger(new QB()).getPaths().get("/uniqueItems").get("get").getParameter("query", "Q").getUniqueItems());
-	}
-	@Test
-	public void qb19a_Query_onParameter_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new QB()).getPaths().get("/schema1").get("get").getParameter("query", "Q").getSchema());
+		ParameterInfo x = getSwagger(new QB()).getPaths().get("/value").get("get").getParameter("query", "Q");
+		assertEquals("Q", x.getName());
 	}
 	@Test
 	public void qb19b_Query_onParameter_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new QB()).getPaths().get("/schema2").get("get").getParameter("query", "Q").getSchema());
-	}
-	@Test
-	public void qb20a_Query_onParameter__default1() throws Exception {
-		assertEquals("a", getSwagger(new QB()).getPaths().get("/_default1").get("get").getParameter("query", "Q").getDefault());
+		ParameterInfo x = getSwagger(new QB()).getPaths().get("/schema2").get("get").getParameter("query", "Q");
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void qb20b_Query_onParameter__default2() throws Exception {
-		assertEquals("a\nb", getSwagger(new QB()).getPaths().get("/_default2").get("get").getParameter("query", "Q").getDefault());
-	}
-	@Test
-	public void qb21a_Query_onParameter__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new QB()).getPaths().get("/_enum1").get("get").getParameter("query", "Q").getEnum());
+		ParameterInfo x = getSwagger(new QB()).getPaths().get("/_default2").get("get").getParameter("query", "Q");
+		assertEquals("a\nb", x.getDefault());
 	}
 	@Test
 	public void qb21b_Query_onParameter__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new QB()).getPaths().get("/_enum2").get("get").getParameter("query", "Q").getEnum());
-	}
-	@Test
-	public void qb22a_Query_onParameter_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new QB()).getPaths().get("/items1").get("get").getParameter("query", "Q").getItems());
+		ParameterInfo x = getSwagger(new QB()).getPaths().get("/_enum2").get("get").getParameter("query", "Q");
+		assertObjectEquals("['a','b']", x.getEnum());
 	}
 	@Test
 	public void qb22b_Query_onParameter_items2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new QB()).getPaths().get("/items2").get("get").getParameter("query", "Q").getItems());
-	}
-	@Test
-	public void qb23a_Query_onParameter_example1() throws Exception {
-		assertEquals("a", getSwagger(new QB()).getPaths().get("/example1").get("get").getParameter("query", "Q").getExample());
+		ParameterInfo x = getSwagger(new QB()).getPaths().get("/items2").get("get").getParameter("query", "Q");
+		assertObjectEquals("{type:'b'}", x.getItems());
 	}
 	@Test
 	public void qb23b_Query_onParameter_example2() throws Exception {
-		assertEquals("a\nb", getSwagger(new QB()).getPaths().get("/example2").get("get").getParameter("query", "Q").getExample());
+		ParameterInfo x = getSwagger(new QB()).getPaths().get("/example2").get("get").getParameter("query", "Q");
+		assertEquals("a\nb", x.getExample());
 	}
 
 	//=================================================================================================================
@@ -4676,11 +4142,37 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class RA {
 
-		@FormData(name="F")
-		public static class RA01 {}
-		
-		@RestMethod(name=GET,path="/name")
-		public void ra01(RA01 f) {}
+		@FormData(
+			name="F",
+			description= {"a","b"},
+			required="true",
+			type="a",
+			format="a",
+			pattern="a",
+			collectionFormat="a",
+			maximum="1",
+			minimum="1",
+			multipleOf="1",
+			maxLength="1",
+			minLength="1",
+			maxItems="1",
+			minItems="1",
+			allowEmptyValue="true",
+			exclusiveMaximum="true",
+			exclusiveMinimum="true",
+			uniqueItems="true",
+			schema=@Schema(type="a"),
+			_default="a",
+			_enum=" a,b ",
+			items=@Items(type="a"),
+			example="a"
+		)
+		public static class RA00 {
+			public RA00(String x) {}
+		}
+		
+		@RestMethod(name=GET,path="/basic")
+		public void ra00(RA00 f) {}
 
 		@FormData("F")
 		public static class RA02 {}
@@ -4688,121 +4180,7 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/value")
 		public void ra02(RA02 f) {}
 		
-		@FormData(name="F", description="a")
-		public static class RA03a {}
-		
-		@RestMethod(name=GET,path="/description1")
-		public void ra03a(RA03a f) {}
-
-		@FormData(name="F", description= {"a","b"})
-		public static class RA03b {}
-		
-		@RestMethod(name=GET,path="/description2")
-		public void ra03b(RA03b f) {}
-
-		@FormData(name="F", required="true")
-		public static class RA04 {}
-		
-		@RestMethod(name=GET,path="/required")
-		public void ra04(RA04 f) {}
-
-		@FormData(name="F", type="a")
-		public static class RA05 {}
-		
-		@RestMethod(name=GET,path="/type")
-		public void ra05(RA05 f) {}
-
-		@FormData(name="F", format="a")
-		public static class RA06 {}
-		
-		@RestMethod(name=GET,path="/format")
-		public void ra06(RA06 f) {}
-
-		@FormData(name="F", pattern="a")
-		public static class RA07 {}
-		
-		@RestMethod(name=GET,path="/pattern")
-		public void ra07(RA07 f) {}
-
-		@FormData(name="F", collectionFormat="a")
-		public static class RA08 {}
-		
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void ra08(RA08 f) {}
-
-		@FormData(name="F", maximum="1")
-		public static class RA09 {}
-		
-		@RestMethod(name=GET,path="/maximum")
-		public void ra09(RA09 f) {}
-
-		@FormData(name="F", minimum="1")
-		public static class RA10 {}
-		
-		@RestMethod(name=GET,path="/minimum")
-		public void ra10(RA10 f) {}
-
-		@FormData(name="F", multipleOf="1")
-		public static class RA11 {}
-		
-		@RestMethod(name=GET,path="/multipleOf")
-		public void ra11(RA11 f) {}
-
-		@FormData(name="F", maxLength="1")
-		public static class RA12 {}
-		
-		@RestMethod(name=GET,path="/maxLength")
-		public void ra12(RA12 f) {}
-
-		@FormData(name="F", minLength="1")
-		public static class RA13 {}
-		
-		@RestMethod(name=GET,path="/minLength")
-		public void ra13(RA13 f) {}
-
-		@FormData(name="F", maxItems="1")
-		public static class RA14 {}
-		
-		@RestMethod(name=GET,path="/maxItems")
-		public void ra14(RA14 f) {}
-
-		@FormData(name="F", minItems="1")
-		public static class RA15 {}
-		
-		@RestMethod(name=GET,path="/minItems")
-		public void ra15(RA15 f) {}
-
-		@FormData(name="F", allowEmptyValue="true")
-		public static class RA16 {}
-		
-		@RestMethod(name=GET,path="/allowEmptyValue")
-		public void ra16(RA16 f) {}
-
-		@FormData(name="F", exclusiveMaximum="true")
-		public static class RA17 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void ra17(RA17 f) {}
-
-		@FormData(name="F", exclusiveMinimum="true")
-		public static class RA18 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void ra18(RA18 f) {}
-
-		@FormData(name="F", uniqueItems="true")
-		public static class RA19 {}
-		
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void ra19(RA19 f) {}
-
-		@FormData(name="F", schema=" {type:'a'} ")
-		public static class RA20a {}
-		
-		@RestMethod(name=GET,path="/schema1")
-		public void ra20a(RA20a f) {}
-
-		@FormData(name="F", schema={" type:'b' "})
+		@FormData(name="F", schema=@Schema(" type:'b' "))
 		public static class RA20b {}
 		
 		@RestMethod(name=GET,path="/schema2")
@@ -4830,190 +4208,104 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema5")
 		public void ra20e(RA20e f) {}
 
-		@FormData(name="F", _default="a")
-		public static class RA22 {}
-		
-		@RestMethod(name=GET,path="/_default1")
-		public void ra22(RA22 f) {}
-
 		@FormData(name="F", _default={"a","b"})
 		public static class RA23 {}
 		
 		@RestMethod(name=GET,path="/_default2")
 		public void ra23(RA23 f) {}
 
-		@FormData(name="F", _enum=" a,b ")
-		public static class RA24 {}
-		
-		@RestMethod(name=GET,path="/_enum1")
-		public void ra24(RA24 f) {}
-
-		@FormData(name="F", _enum={ "['a','b']" })
-		public static class RA25 {}
-		
-		@RestMethod(name=GET,path="/_enum2")
-		public void ra25(RA25 f) {}
-
-		@FormData(name="F", items=" {type:'a'} ")
-		public static class RA26 {}
-		
-		@RestMethod(name=GET,path="/items1")
-		public void ra26(RA26 f) {}
-
-		@FormData(name="F", items={" type:'b' "})
-		public static class RA27 {}
-		
-		@RestMethod(name=GET,path="/items2")
-		public void ra27(RA27 f) {}
-
-		@FormData(name="F", example="a")
-		public static class RA28 {
-			public RA28(String value) {}
-		}
-		
-		@RestMethod(name=GET,path="/example1")
-		public void ra28(RA28 f) {}
-
-		@FormData(name="F", example={"{f1:'a'}"})
-		public static class RA29 {
-			public String f1;
-		}
-		
-		@RestMethod(name=GET,path="/example2")
-		public void ra29(RA29 f) {}
-	}
-	
-	@Test
-	public void ra01_FormData_onPojo_name() throws Exception {
-		assertEquals("F", getSwagger(new RA()).getPaths().get("/name").get("get").getParameter("formData", "F").getName());
-	}
-	@Test
-	public void ra02_FormData_onPojo_value() throws Exception {
-		assertEquals("F", getSwagger(new RA()).getPaths().get("/value").get("get").getParameter("formData", "F").getName());
-	}
-	@Test
-	public void ra03a_FormData_onPojo_description1() throws Exception {
-		assertEquals("a", getSwagger(new RA()).getPaths().get("/description1").get("get").getParameter("formData", "F").getDescription());
-	}
-	@Test
-	public void ra03b_FormData_onPojo_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new RA()).getPaths().get("/description2").get("get").getParameter("formData", "F").getDescription());
-	}
-	@Test
-	public void ra04_FormData_onPojo_required() throws Exception {
-		assertObjectEquals("true", getSwagger(new RA()).getPaths().get("/required").get("get").getParameter("formData", "F").getRequired());
-	}
-	@Test
-	public void ra05_FormData_onPojo_type() throws Exception {
-		assertEquals("a", getSwagger(new RA()).getPaths().get("/type").get("get").getParameter("formData", "F").getType());
-	}
-	@Test
-	public void ra06_FormData_onPojo_format() throws Exception {
-		assertEquals("a", getSwagger(new RA()).getPaths().get("/format").get("get").getParameter("formData", "F").getFormat());
-	}
-	@Test
-	public void ra07_FormData_onPojo_pattern() throws Exception {
-		assertEquals("a", getSwagger(new RA()).getPaths().get("/pattern").get("get").getParameter("formData", "F").getPattern());
-	}
-	@Test
-	public void ra08_FormData_onPojo_collectionFormat() throws Exception {
-		assertEquals("a", getSwagger(new RA()).getPaths().get("/collectionFormat").get("get").getParameter("formData", "F").getCollectionFormat());
-	}
-	@Test
-	public void ra09_FormData_onPojo_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new RA()).getPaths().get("/maximum").get("get").getParameter("formData", "F").getMaximum());
-	}
-	@Test
-	public void ra10_FormData_onPojo_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new RA()).getPaths().get("/minimum").get("get").getParameter("formData", "F").getMinimum());
-	}
-	@Test
-	public void ra11_FormData_onPojo_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new RA()).getPaths().get("/multipleOf").get("get").getParameter("formData", "F").getMultipleOf());
-	}
-	@Test
-	public void ra12_FormData_onPojo_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new RA()).getPaths().get("/maxLength").get("get").getParameter("formData", "F").getMaxLength());
-	}
-	@Test
-	public void ra13_FormData_onPojo_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new RA()).getPaths().get("/minLength").get("get").getParameter("formData", "F").getMinLength());
-	}
-	@Test
-	public void ra14_FormData_onPojo_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new RA()).getPaths().get("/maxItems").get("get").getParameter("formData", "F").getMaxItems());
-	}
-	@Test
-	public void ra15_FormData_onPojo_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new RA()).getPaths().get("/minItems").get("get").getParameter("formData", "F").getMinItems());
-	}
-	@Test
-	public void ra16_FormData_onPojo_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new RA()).getPaths().get("/allowEmptyValue").get("get").getParameter("formData", "F").getAllowEmptyValue());
-	}
-	@Test
-	public void ra17_FormData_onPojo_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new RA()).getPaths().get("/exclusiveMaximum").get("get").getParameter("formData", "F").getExclusiveMaximum());
-	}
-	@Test
-	public void ra18_FormData_onPojo_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new RA()).getPaths().get("/exclusiveMinimum").get("get").getParameter("formData", "F").getExclusiveMinimum());
+		@FormData(name="F", _enum={ "['a','b']" })
+		public static class RA25 {}
+		
+		@RestMethod(name=GET,path="/_enum2")
+		public void ra25(RA25 f) {}
+
+		@FormData(name="F", items=@Items(" type:'b' "))
+		public static class RA27 {}
+		
+		@RestMethod(name=GET,path="/items2")
+		public void ra27(RA27 f) {}
+
+		@FormData(name="F", example={"{f1:'a'}"})
+		public static class RA29 {
+			public String f1;
+		}
+		
+		@RestMethod(name=GET,path="/example2")
+		public void ra29(RA29 f) {}
 	}
+	
 	@Test
-	public void ra19_FormData_onPojo_uniqueItems() throws Exception {
-		assertObjectEquals("true", getSwagger(new RA()).getPaths().get("/uniqueItems").get("get").getParameter("formData", "F").getUniqueItems());
+	public void ra00_FormData_onPojo_basic() throws Exception {
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/basic").get("get").getParameter("formData", "F");
+		assertEquals("F", x.getName());
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("true", x.getRequired());
+		assertEquals("a", x.getType());
+		assertEquals("a", x.getFormat());
+		assertEquals("a", x.getPattern());
+		assertEquals("a", x.getCollectionFormat());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("1", x.getMaxItems());
+		assertObjectEquals("1", x.getMinItems());
+		assertObjectEquals("true", x.getAllowEmptyValue());
+		assertObjectEquals("true", x.getExclusiveMaximum());
+		assertObjectEquals("true", x.getExclusiveMinimum());
+		assertObjectEquals("true", x.getUniqueItems());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertEquals("a", x.getDefault());
+		assertObjectEquals("['a','b']", x.getEnum());
+		assertObjectEquals("{type:'a'}", x.getItems());
+		assertEquals("a", x.getExample());
 	}
 	@Test
-	public void ra20a_FormData_onPojo_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new RA()).getPaths().get("/schema1").get("get").getParameter("formData", "F").getSchema());
+	public void ra02_FormData_onPojo_value() throws Exception {
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/value").get("get").getParameter("formData", "F");
+		assertEquals("F", x.getName());
 	}
 	@Test
 	public void ra20b_FormData_onPojo_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new RA()).getPaths().get("/schema2").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/schema2").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void ra20c_FormData_onPojo_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new RA()).getPaths().get("/schema3").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/schema3").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void ra20d_FormData_onPojo_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new RA()).getPaths().get("/schema4").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/schema4").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void ra20e_FormData_onPojo_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new RA()).getPaths().get("/schema5").get("get").getParameter("formData", "F").getSchema());
-	}
-	@Test
-	public void ra22_FormData_onPojo__default1() throws Exception {
-		assertEquals("a", getSwagger(new RA()).getPaths().get("/_default1").get("get").getParameter("formData", "F").getDefault());
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/schema5").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void ra23_FormData_onPojo__default2() throws Exception {
-		assertEquals("a\nb", getSwagger(new RA()).getPaths().get("/_default2").get("get").getParameter("formData", "F").getDefault());
-	}
-	@Test
-	public void ra24_FormData_onPojo__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new RA()).getPaths().get("/_enum1").get("get").getParameter("formData", "F").getEnum());
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/_default2").get("get").getParameter("formData", "F");
+		assertEquals("a\nb", x.getDefault());
 	}
 	@Test
 	public void ra25_FormData_onPojo__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new RA()).getPaths().get("/_enum2").get("get").getParameter("formData", "F").getEnum());
-	}
-	@Test
-	public void ra26_FormData_onPojo_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new RA()).getPaths().get("/items1").get("get").getParameter("formData", "F").getItems());
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/_enum2").get("get").getParameter("formData", "F");
+		assertObjectEquals("['a','b']", x.getEnum());
 	}
 	@Test
 	public void ra27_FormData_onPojo_items2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new RA()).getPaths().get("/items2").get("get").getParameter("formData", "F").getItems());
-	}
-	@Test
-	public void ra28_FormData_onPojo_example1() throws Exception {
-		assertEquals("a", getSwagger(new RA()).getPaths().get("/example1").get("get").getParameter("formData", "F").getExample());
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/items2").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'b'}", x.getItems());
 	}
 	@Test
 	public void ra29_FormData_onPojo_example2() throws Exception {
-		assertObjectEquals("{f1:'a'}", getSwagger(new RA()).getPaths().get("/example2").get("get").getParameter("formData", "F").getExample());
+		ParameterInfo x = getSwagger(new RA()).getPaths().get("/example2").get("get").getParameter("formData", "F");
+		assertObjectEquals("{f1:'a'}", x.getExample());
 	}
 	
 	//=================================================================================================================
@@ -5023,71 +4315,39 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class RB {
 
-		@RestMethod(name=GET,path="/name")
-		public void rb01(@FormData(name="F") String f) {}
+		@RestMethod(name=GET,path="/basic")
+		public void rb00(
+			@FormData(
+				name="F",
+				description={"a","b"},
+				required="true",
+				type="a",
+				format="a",
+				pattern="a",
+				collectionFormat="a",
+				maximum="1",
+				minimum="1",
+				multipleOf="1",
+				maxLength="1",
+				minLength="1",
+				maxItems="1",
+				minItems="1",
+				allowEmptyValue="true",
+				exclusiveMaximum="true",
+				exclusiveMinimum="true",
+				uniqueItems="true",
+				schema=@Schema(type="a"),
+				_default="a",
+				_enum="a,b",
+				items=@Items(type="a"),
+				example="'a'"
+			) String f) {}
 
 		@RestMethod(name=GET,path="/value")
 		public void rb02(@FormData("F") String f) {}
 
-		@RestMethod(name=GET,path="/description1")
-		public void rb03(@FormData(name="F", description="a") String f) {}
-
-		@RestMethod(name=GET,path="/description2")
-		public void rb04(@FormData(name="F", description={"a","b"}) String f) {}
-
-		@RestMethod(name=GET,path="/required")
-		public void rb05(@FormData(name="F", required="true") String f) {}
-
-		@RestMethod(name=GET,path="/type")
-		public void rb06(@FormData(name="F", type="a") String f) {}
-
-		@RestMethod(name=GET,path="/format")
-		public void rb07(@FormData(name="F", format="a") String f) {}
-
-		@RestMethod(name=GET,path="/pattern")
-		public void rb08(@FormData(name="F", pattern="a") String f) {}
-
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void rb09(@FormData(name="F", collectionFormat="a") String f) {}
-
-		@RestMethod(name=GET,path="/maximum")
-		public void rb10(@FormData(name="F", maximum="1") String f) {}
-
-		@RestMethod(name=GET,path="/minimum")
-		public void rb11(@FormData(name="F", minimum="1") String f) {}
-
-		@RestMethod(name=GET,path="/multipleOf")
-		public void rb12(@FormData(name="F", multipleOf="1") String f) {}
-
-		@RestMethod(name=GET,path="/maxLength")
-		public void rb13(@FormData(name="F", maxLength="1") String f) {}
-
-		@RestMethod(name=GET,path="/minLength")
-		public void rb14(@FormData(name="F", minLength="1") String f) {}
-
-		@RestMethod(name=GET,path="/maxItems")
-		public void rb15(@FormData(name="F", maxItems="1") String f) {}
-
-		@RestMethod(name=GET,path="/minItems")
-		public void rb16(@FormData(name="F", minItems="1") String f) {}
-
-		@RestMethod(name=GET,path="/allowEmptyValue")
-		public void rb17(@FormData(name="F", allowEmptyValue="true") String f) {}
-
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void rb18(@FormData(name="F", exclusiveMaximum="true") String f) {}
-
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void rb19(@FormData(name="F", exclusiveMinimum="true") String f) {}
-
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void rb20(@FormData(name="F", uniqueItems="true") String f) {}
-
-		@RestMethod(name=GET,path="/schema1")
-		public void rb21a(@FormData(name="F", schema=" {type:'a'} ") String f) {}
-
 		@RestMethod(name=GET,path="/schema2")
-		public void rb21b(@FormData(name="F", schema= {" type:'b' "}) String f) {}
+		public void rb21b(@FormData(name="F", schema=@Schema(" type:'b' ")) String f) {}
 
 		public static class RB21c {
 			public String f1;
@@ -5114,170 +4374,100 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema7")
 		public void rb21g(@FormData("F") Boolean b) {}
 		
-		@RestMethod(name=GET,path="/_default1")
-		public void rb23(@FormData(name="F", _default="a") String f) {}
-
 		@RestMethod(name=GET,path="/_default2")
 		public void rb24(@FormData(name="F", _default={"a","b"}) String f) {}
 
-		@RestMethod(name=GET,path="/_enum1")
-		public void rb25(@FormData(name="F", _enum="a,b") String f) {}
-
 		@RestMethod(name=GET,path="/_enum2")
 		public void rb26(@FormData(name="F", _enum={" ['a','b'] "}) String f) {}
 
-		@RestMethod(name=GET,path="/items1")
-		public void rb27(@FormData(name="F", items=" {type:'a'} ") String f) {}
-
 		@RestMethod(name=GET,path="/items2")
-		public void rb28(@FormData(name="F", items={" type:'b' "}) String f) {}
-
-		@RestMethod(name=GET,path="/example1")
-		public void rb29(@FormData(name="F", example="'a'") String f) {}
+		public void rb28(@FormData(name="F", items=@Items(" type:'b' ")) String f) {}
 
 		@RestMethod(name=GET,path="/example2")
 		public void rb30(@FormData(name="F", example="{f1:'a'}") String f) {}
 	}
 
 	@Test
-	public void rb01_FormData_onParameter_name() throws Exception {
-		assertEquals("F", getSwagger(new RB()).getPaths().get("/name").get("get").getParameter("formData", "F").getName());
+	public void rb00_FormData_onParameter_basic() throws Exception {
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/basic").get("get").getParameter("formData", "F");
+		assertEquals("F", x.getName());
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("true", x.getRequired());
+		assertEquals("a", x.getType());
+		assertEquals("a", x.getFormat());
+		assertEquals("a", x.getPattern());
+		assertEquals("a", x.getCollectionFormat());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("1", x.getMaxItems());
+		assertObjectEquals("1", x.getMinItems());
+		assertObjectEquals("true", x.getAllowEmptyValue());
+		assertObjectEquals("true", x.getExclusiveMaximum());
+		assertObjectEquals("true", x.getExclusiveMinimum());
+		assertObjectEquals("true", x.getUniqueItems());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertEquals("a", x.getDefault());
+		assertObjectEquals("['a','b']", x.getEnum());
+		assertObjectEquals("{type:'a'}", x.getItems());
+		assertObjectEquals("'a'", x.getExample());
 	}
 	@Test
 	public void rb02_FormData_onParameter_value() throws Exception {
-		assertEquals("F", getSwagger(new RB()).getPaths().get("/value").get("get").getParameter("formData", "F").getName());
-	}
-	@Test
-	public void rb03_FormData_onParameter_description1() throws Exception {
-		assertEquals("a", getSwagger(new RB()).getPaths().get("/description1").get("get").getParameter("formData", "F").getDescription());
-	}
-	@Test
-	public void rb04_FormData_onParameter_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new RB()).getPaths().get("/description2").get("get").getParameter("formData", "F").getDescription());
-	}
-	@Test
-	public void rb05_FormData_onParameter_required() throws Exception {
-		assertObjectEquals("true", getSwagger(new RB()).getPaths().get("/required").get("get").getParameter("formData", "F").getRequired());
-	}
-	@Test
-	public void rb06_FormData_onParameter_type() throws Exception {
-		assertEquals("a", getSwagger(new RB()).getPaths().get("/type").get("get").getParameter("formData", "F").getType());
-	}
-	@Test
-	public void rb07_FormData_onParameter_format() throws Exception {
-		assertEquals("a", getSwagger(new RB()).getPaths().get("/format").get("get").getParameter("formData", "F").getFormat());
-	}
-	@Test
-	public void rb08_FormData_onParameter_pattern() throws Exception {
-		assertEquals("a", getSwagger(new RB()).getPaths().get("/pattern").get("get").getParameter("formData", "F").getPattern());
-	}
-	@Test
-	public void rb09_FormData_onParameter_collectionFormat() throws Exception {
-		assertEquals("a", getSwagger(new RB()).getPaths().get("/collectionFormat").get("get").getParameter("formData", "F").getCollectionFormat());
-	}
-	@Test
-	public void rb10_FormData_onParameter_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new RB()).getPaths().get("/maximum").get("get").getParameter("formData", "F").getMaximum());
-	}
-	@Test
-	public void rb11_FormData_onParameter_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new RB()).getPaths().get("/minimum").get("get").getParameter("formData", "F").getMinimum());
-	}
-	@Test
-	public void rb12_FormData_onParameter_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new RB()).getPaths().get("/multipleOf").get("get").getParameter("formData", "F").getMultipleOf());
-	}
-	@Test
-	public void rb13_FormData_onParameter_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new RB()).getPaths().get("/maxLength").get("get").getParameter("formData", "F").getMaxLength());
-	}
-	@Test
-	public void rb14_FormData_onParameter_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new RB()).getPaths().get("/minLength").get("get").getParameter("formData", "F").getMinLength());
-	}
-	@Test
-	public void rb15_FormData_onParameter_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new RB()).getPaths().get("/maxItems").get("get").getParameter("formData", "F").getMaxItems());
-	}
-	@Test
-	public void rb16_FormData_onParameter_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new RB()).getPaths().get("/minItems").get("get").getParameter("formData", "F").getMinItems());
-	}
-	@Test
-	public void rb17_FormData_onParameter_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new RB()).getPaths().get("/allowEmptyValue").get("get").getParameter("formData", "F").getAllowEmptyValue());
-	}
-	@Test
-	public void rb18_FormData_onParameter_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new RB()).getPaths().get("/exclusiveMaximum").get("get").getParameter("formData", "F").getExclusiveMaximum());
-	}
-	@Test
-	public void rb19_FormData_onParameter_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new RB()).getPaths().get("/exclusiveMinimum").get("get").getParameter("formData", "F").getExclusiveMinimum());
-	}
-	@Test
-	public void rb20_FormData_onParameter_uniqueItems() throws Exception {
-		assertObjectEquals("true", getSwagger(new RB()).getPaths().get("/uniqueItems").get("get").getParameter("formData", "F").getUniqueItems());
-	}
-	@Test
-	public void rb21a_FormData_onParameter_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new RB()).getPaths().get("/schema1").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/value").get("get").getParameter("formData", "F");
+		assertEquals("F", x.getName());
 	}
 	@Test
 	public void rb21b_FormData_onParameter_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new RB()).getPaths().get("/schema2").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/schema2").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void rb21c_FormData_onParameter_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new RB()).getPaths().get("/schema3").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/schema3").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void rb21d_FormData_onParameter_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new RB()).getPaths().get("/schema4").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/schema4").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void rb21e_FormData_onParameter_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new RB()).getPaths().get("/schema5").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/schema5").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void rb21f_FormData_onParameter_schema6() throws Exception {
-		assertObjectEquals("{format:'int32',type:'integer'}", getSwagger(new RB()).getPaths().get("/schema6").get("get").getParameter("formData", "F").getSchema());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/schema6").get("get").getParameter("formData", "F");
+		assertObjectEquals("{format:'int32',type:'integer'}", x.getSchema());
 	}
 	@Test
 	public void rb21g_FormData_onParameter_schema7() throws Exception {
-		assertObjectEquals("{type:'boolean'}", getSwagger(new RB()).getPaths().get("/schema7").get("get").getParameter("formData", "F").getSchema());
-	}
-	@Test
-	public void rb23_FormData_onParameter__default1() throws Exception {
-		assertEquals("a", getSwagger(new RB()).getPaths().get("/_default1").get("get").getParameter("formData", "F").getDefault());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/schema7").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'boolean'}", x.getSchema());
 	}
 	@Test
 	public void rb24_FormData_onParameter__default2() throws Exception {
-		assertEquals("a\nb", getSwagger(new RB()).getPaths().get("/_default2").get("get").getParameter("formData", "F").getDefault());
-	}
-	@Test
-	public void rb25_FormData_onParameter__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new RB()).getPaths().get("/_enum1").get("get").getParameter("formData", "F").getEnum());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/_default2").get("get").getParameter("formData", "F");
+		assertEquals("a\nb", x.getDefault());
 	}
 	@Test
 	public void rb26_FormData_onParameter__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new RB()).getPaths().get("/_enum2").get("get").getParameter("formData", "F").getEnum());
-	}
-	@Test
-	public void rb27_FormData_onParameter_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new RB()).getPaths().get("/items1").get("get").getParameter("formData", "F").getItems());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/_enum2").get("get").getParameter("formData", "F");
+		assertObjectEquals("['a','b']", x.getEnum());
 	}
 	@Test
 	public void rb28_FormData_onParameter_items2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new RB()).getPaths().get("/items2").get("get").getParameter("formData", "F").getItems());
-	}
-	@Test
-	public void rb29_FormData_onParameter_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new RB()).getPaths().get("/example1").get("get").getParameter("formData", "F").getExample());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/items2").get("get").getParameter("formData", "F");
+		assertObjectEquals("{type:'b'}", x.getItems());
 	}
 	@Test
 	public void rb30_FormData_onParameter_example2() throws Exception {
-		assertObjectEquals("{f1:'a'}", getSwagger(new RB()).getPaths().get("/example2").get("get").getParameter("formData", "F").getExample());
+		ParameterInfo x = getSwagger(new RB()).getPaths().get("/example2").get("get").getParameter("formData", "F");
+		assertObjectEquals("{f1:'a'}", x.getExample());
 	}
 	
 	//=================================================================================================================
@@ -5287,11 +4477,30 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class SA {
 
-		@Path(name="P")
-		public static class SA01 {}
-		
-		@RestMethod(name=GET,path="/name/{P}")
-		public void sa01(SA01 f) {}
+		@Path(
+			name="P",
+			description={"a","b"},
+			type="a",
+			format="a",
+			pattern="a",
+			maximum="1",
+			minimum="1",
+			multipleOf="1",
+			maxLength="1",
+			minLength="1",
+			allowEmptyValue="true",
+			exclusiveMaximum="true",
+			exclusiveMinimum="true",
+			schema=@Schema(type="a"),
+			_enum="a,b",
+			example="'a'"
+		)
+		public static class SA00 {
+			public SA00(String x) {}
+		}
+		
+		@RestMethod(name=GET,path="/basic/{P}")
+		public void sa00(SA00 f) {}
 
 		@Path("P")
 		public static class SA02 {}
@@ -5302,88 +4511,7 @@ public class BasicRestInfoProviderTest {
 		@Path(name="P", description="a")
 		public static class SA03 {}
 		
-		@RestMethod(name=GET,path="/description1/{P}")
-		public void sa03(SA03 f) {}
-
-		@Path(name="P", description={"a","b"})
-		public static class SA04 {}
-		
-		@RestMethod(name=GET,path="/description2/{P}")
-		public void sa04(SA04 f) {}
-
-		@Path(name="P", type="a")
-		public static class SA05 {}
-		
-		@RestMethod(name=GET,path="/type/{P}")
-		public void sa05(SA05 f) {}
-
-		@Path(name="P", format="a")
-		public static class SA06 {}
-		
-		@RestMethod(name=GET,path="/format/{P}")
-		public void sa06(SA06 f) {}
-
-		@Path(name="P", pattern="a")
-		public static class SA07 {}
-		
-		@RestMethod(name=GET,path="/pattern/{P}")
-		public void sa07(SA07 f) {}
-
-		@Path(name="P", maximum="1")
-		public static class SA08 {}
-		
-		@RestMethod(name=GET,path="/maximum/{P}")
-		public void sa08(SA08 f) {}
-
-		@Path(name="P", minimum="1")
-		public static class SA09 {}
-		
-		@RestMethod(name=GET,path="/minimum/{P}")
-		public void sa09(SA09 f) {}
-
-		@Path(name="P", multipleOf="1")
-		public static class SA10 {}
-		
-		@RestMethod(name=GET,path="/multipleOf/{P}")
-		public void sa10(SA10 f) {}
-
-		@Path(name="P", maxLength="1")
-		public static class SA11 {}
-		
-		@RestMethod(name=GET,path="/maxLength/{P}")
-		public void sa11(SA11 f) {}
-
-		@Path(name="P", minLength="1")
-		public static class SA12 {}
-		
-		@RestMethod(name=GET,path="/minLength/{P}")
-		public void sa12(SA12 f) {}
-
-		@Path(name="P", allowEmptyValue="true")
-		public static class SA13 {}
-		
-		@RestMethod(name=GET,path="/allowEmptyValue/{P}")
-		public void sa13(SA13 f) {}
-
-		@Path(name="P", exclusiveMaximum="true")
-		public static class SA14 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMaximum/{P}")
-		public void sa14(SA14 f) {}
-
-		@Path(name="P", exclusiveMinimum="true")
-		public static class SA15 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMinimum/{P}")
-		public void sa15(SA15 f) {}
-
-		@Path(name="P", schema=" {type:'a'} ")
-		public static class SA16a {}
-		
-		@RestMethod(name=GET,path="/schema1/{P}")
-		public void sa16a(SA16a f) {}
-
-		@Path(name="P", schema= {" type:'b' "})
+		@Path(name="P", schema=@Schema(" type:'b' "))
 		public static class SA16b {}
 		
 		@RestMethod(name=GET,path="/schema2/{P}")
@@ -5411,26 +4539,12 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema5/{P}")
 		public void sa16e(SA16e b) {}
 
-		@Path(name="P", _enum="a,b")
-		public static class SA18 {}
-		
-		@RestMethod(name=GET,path="/_enum1/{P}")
-		public void sa18(SA18 f) {}
-
 		@Path(name="P", _enum={" ['a','b'] "})
 		public static class SA19 {}
 		
 		@RestMethod(name=GET,path="/_enum2/{P}")
 		public void sa19(SA19 f) {}
 
-		@Path(name="P", example="'a'")
-		public static class SA20 {
-			public SA20(String value) {}
-		}
-		
-		@RestMethod(name=GET,path="/example1/{P}")
-		public void sa20(SA20 f) {}
-
 		@Path(name="P", example={" {f1:'a'} "})
 		public static class SA21 {
 			public String f1;
@@ -5441,100 +4555,59 @@ public class BasicRestInfoProviderTest {
 	}
 
 	@Test
-	public void sa01_Path_onPojo_name() throws Exception {
-		assertEquals("P", getSwagger(new SA()).getPaths().get("/name/{P}").get("get").getParameter("path", "P").getName());
+	public void sa00_Path_onPojo_basic() throws Exception {
+		ParameterInfo x = getSwagger(new SA()).getPaths().get("/basic/{P}").get("get").getParameter("path", "P");
+		assertEquals("P", x.getName());
+		assertEquals("a\nb", x.getDescription());
+		assertEquals("a", x.getType());
+		assertEquals("a", x.getFormat());
+		assertEquals("a", x.getPattern());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("true", x.getAllowEmptyValue());
+		assertObjectEquals("true", x.getExclusiveMaximum());
+		assertObjectEquals("true", x.getExclusiveMinimum());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertObjectEquals("['a','b']", x.getEnum());
+		assertObjectEquals("'a'", x.getExample());
 	}
 	@Test
 	public void sa02_Path_onPojo_value() throws Exception {
-		assertEquals("P", getSwagger(new SA()).getPaths().get("/value/{P}").get("get").getParameter("path", "P").getName());
-	}
-	@Test
-	public void sa03_Path_onPojo_description() throws Exception {
-		assertEquals("a", getSwagger(new SA()).getPaths().get("/description1/{P}").get("get").getParameter("path", "P").getDescription());
-	}
-	@Test
-	public void sa04_Path_onPojo_description() throws Exception {
-		assertEquals("a\nb", getSwagger(new SA()).getPaths().get("/description2/{P}").get("get").getParameter("path", "P").getDescription());
-	}
-	@Test
-	public void sa05_Path_onPojo_type() throws Exception {
-		assertEquals("a", getSwagger(new SA()).getPaths().get("/type/{P}").get("get").getParameter("path", "P").getType());
-	}
-	@Test
-	public void sa06_Path_onPojo_format() throws Exception {
-		assertEquals("a", getSwagger(new SA()).getPaths().get("/format/{P}").get("get").getParameter("path", "P").getFormat());
-	}
-	@Test
-	public void sa07_Path_onPojo_pattern() throws Exception {
-		assertEquals("a", getSwagger(new SA()).getPaths().get("/pattern/{P}").get("get").getParameter("path", "P").getPattern());
-	}
-	@Test
-	public void sa08_Path_onPojo_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new SA()).getPaths().get("/maximum/{P}").get("get").getParameter("path", "P").getMaximum());
-	}
-	@Test
-	public void sa09_Path_onPojo_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new SA()).getPaths().get("/minimum/{P}").get("get").getParameter("path", "P").getMinimum());
-	}
-	@Test
-	public void sa10_Path_onPojo_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new SA()).getPaths().get("/multipleOf/{P}").get("get").getParameter("path", "P").getMultipleOf());
-	}
-	@Test
-	public void sa11_Path_onPojo_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new SA()).getPaths().get("/maxLength/{P}").get("get").getParameter("path", "P").getMaxLength());
-	}
-	@Test
-	public void sa12_Path_onPojo_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new SA()).getPaths().get("/minLength/{P}").get("get").getParameter("path", "P").getMinLength());
-	}
-	@Test
-	public void sa13_Path_onPojo_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new SA()).getPaths().get("/allowEmptyValue/{P}").get("get").getParameter("path", "P").getAllowEmptyValue());
-	}
-	@Test
-	public void sa14_Path_onPojo_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new SA()).getPaths().get("/exclusiveMaximum/{P}").get("get").getParameter("path", "P").getExclusiveMaximum());
-	}
-	@Test
-	public void sa15_Path_onPojo_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new SA()).getPaths().get("/exclusiveMinimum/{P}").get("get").getParameter("path", "P").getExclusiveMinimum());
-	}
-	@Test
-	public void sa16a_Path_onPojo_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new SA()).getPaths().get("/schema1/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SA()).getPaths().get("/value/{P}").get("get").getParameter("path", "P");
+		assertEquals("P", x.getName());
 	}
 	@Test
 	public void sa16b_Path_onPojo_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new SA()).getPaths().get("/schema2/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SA()).getPaths().get("/schema2/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void sa16c_Path_onPojo_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new SA()).getPaths().get("/schema3/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SA()).getPaths().get("/schema3/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void sa16d_Path_onPojo_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new SA()).getPaths().get("/schema4/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SA()).getPaths().get("/schema4/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void sa16e_Path_onPojo_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new SA()).getPaths().get("/schema5/{P}").get("get").getParameter("path", "P").getSchema());
-	}
-	@Test
-	public void sa18_Path_onPojo__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new SA()).getPaths().get("/_enum1/{P}").get("get").getParameter("path", "P").getEnum());
+		ParameterInfo x = getSwagger(new SA()).getPaths().get("/schema5/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void sa19_Path_onPojo__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new SA()).getPaths().get("/_enum2/{P}").get("get").getParameter("path", "P").getEnum());
-	}
-	@Test
-	public void sa20_Path_onPojo_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new SA()).getPaths().get("/example1/{P}").get("get").getParameter("path", "P").getExample());
+		ParameterInfo x = getSwagger(new SA()).getPaths().get("/_enum2/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("['a','b']", x.getEnum());
 	}
 	@Test
 	public void sa21_Path_onPojo_example2() throws Exception {
-		assertObjectEquals("{f1:'a'}", getSwagger(new SA()).getPaths().get("/example2/{P}").get("get").getParameter("path", "P").getExample());
+		ParameterInfo x = getSwagger(new SA()).getPaths().get("/example2/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{f1:'a'}", x.getExample());
 	}
 
 	//=================================================================================================================
@@ -5544,56 +4617,31 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class SB {
 
-		@RestMethod(name=GET,path="/name/{P}")
-		public void sb01(@Path(name="P") String h) {}
+		@RestMethod(name=GET,path="/basic/{P}")
+		public void sb00(@Path(
+			name="P",
+			description="a",
+			type="a",
+			format="a",
+			pattern="a",
+			maximum="1",
+			minimum="1",
+			multipleOf="1",
+			maxLength="1",
+			minLength="1",
+			allowEmptyValue="true",
+			exclusiveMaximum="true",
+			exclusiveMinimum="true",
+			schema=@Schema(type="a"),
+			_enum=" a,b ",
+			example="'a'"
+		) String h) {}
 
 		@RestMethod(name=GET,path="/value/{P}")
 		public void sb02(@Path("P") String h) {}
 
-		@RestMethod(name=GET,path="/description1/{P}")
-		public void sb03(@Path(name="P", description="a") String h) {}
-
-		@RestMethod(name=GET,path="/description2/{P}")
-		public void sb04(@Path(name="P", description={"a","b"}) String h) {}
-
-		@RestMethod(name=GET,path="/type/{P}")
-		public void sb05(@Path(name="P", type="a") String h) {}
-
-		@RestMethod(name=GET,path="/format/{P}")
-		public void sb06(@Path(name="P", format="a") String h) {}
-
-		@RestMethod(name=GET,path="/pattern/{P}")
-		public void sb07(@Path(name="P", pattern="a") String h) {}
-
-		@RestMethod(name=GET,path="/maximum/{P}")
-		public void sb08(@Path(name="P", maximum="1") String h) {}
-
-		@RestMethod(name=GET,path="/minimum/{P}")
-		public void sb09(@Path(name="P", minimum="1") String h) {}
-
-		@RestMethod(name=GET,path="/multipleOf/{P}")
-		public void sb10(@Path(name="P", multipleOf="1") String h) {}
-
-		@RestMethod(name=GET,path="/maxLength/{P}")
-		public void sb11(@Path(name="P", maxLength="1") String h) {}
-
-		@RestMethod(name=GET,path="/minLength/{P}")
-		public void sb12(@Path(name="P", minLength="1") String h) {}
-
-		@RestMethod(name=GET,path="/allowEmptyValue/{P}")
-		public void sb13(@Path(name="P", allowEmptyValue="true") String h) {}
-
-		@RestMethod(name=GET,path="/exclusiveMaximum/{P}")
-		public void sb14(@Path(name="P", exclusiveMaximum="true") String h) {}
-
-		@RestMethod(name=GET,path="/exclusiveMinimum/{P}")
-		public void sb15(@Path(name="P", exclusiveMinimum="true") String h) {}
-
-		@RestMethod(name=GET,path="/schema1/{P}")
-		public void sb16a(@Path(name="P", schema=" {type:'a'} ") String h) {}
-
 		@RestMethod(name=GET,path="/schema2/{P}")
-		public void sb16b(@Path(name="P", schema= {" type:'b' "}) String h) {}
+		public void sb16b(@Path(name="P", schema=@Schema(" type:'b' ")) String h) {}
 
 		public static class SB16c {
 			public String f1;
@@ -5620,240 +4668,101 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema7/{P}")
 		public void sb16g(@Path("P") Boolean b) {}
 		
-		@RestMethod(name=GET,path="/_enum1/{P}")
-		public void sb18(@Path(name="P", _enum=" a,b ") String h) {}
-
-		@RestMethod(name=GET,path="/_enum2/{P}")
+		@RestMethod(name=GET,path="/enum2/{P}")
 		public void sb19(@Path(name="P", _enum={" ['a','b'] "}) String h) {}
 
-		@RestMethod(name=GET,path="/example1/{P}")
-		public void sb20(@Path(name="P", example="'a'") String h) {}
-
 		@RestMethod(name=GET,path="/example2/{P}")
 		public void sb21(@Path(name="P", example="{f1:'b'}") String h) {}
 	}
 	
 	@Test
-	public void sb01_Path_onParameter_name() throws Exception {
-		assertEquals("P", getSwagger(new SB()).getPaths().get("/name/{P}").get("get").getParameter("path", "P").getName());
+	public void sb00_Path_onParameter_basic() throws Exception {
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/basic/{P}").get("get").getParameter("path", "P");
+		assertEquals("a", x.getDescription());
+		assertEquals("a", x.getType());
+		assertEquals("a", x.getFormat());
+		assertEquals("a", x.getPattern());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("true", x.getAllowEmptyValue());
+		assertObjectEquals("true", x.getExclusiveMaximum());
+		assertObjectEquals("true", x.getExclusiveMinimum());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertObjectEquals("['a','b']", x.getEnum());
+		assertObjectEquals("'a'", x.getExample());
 	}
 	@Test
 	public void sb02_Path_onParameter_value() throws Exception {
-		assertEquals("P", getSwagger(new SB()).getPaths().get("/value/{P}").get("get").getParameter("path", "P").getName());
-	}
-	@Test
-	public void sb03_Path_onParameter_description1() throws Exception {
-		assertEquals("a", getSwagger(new SB()).getPaths().get("/description1/{P}").get("get").getParameter("path", "P").getDescription());
-	}
-	@Test
-	public void sb04_Path_onParameter_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new SB()).getPaths().get("/description2/{P}").get("get").getParameter("path", "P").getDescription());
-	}
-	@Test
-	public void sb05_Path_onParameter_type() throws Exception {
-		assertEquals("a", getSwagger(new SB()).getPaths().get("/type/{P}").get("get").getParameter("path", "P").getType());
-	}
-	@Test
-	public void sb06_Path_onParameter_format() throws Exception {
-		assertEquals("a", getSwagger(new SB()).getPaths().get("/format/{P}").get("get").getParameter("path", "P").getFormat());
-	}
-	@Test
-	public void sb07_Path_onParameter_pattern() throws Exception {
-		assertEquals("a", getSwagger(new SB()).getPaths().get("/pattern/{P}").get("get").getParameter("path", "P").getPattern());
-	}
-	@Test
-	public void sb08_Path_onParameter_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new SB()).getPaths().get("/maximum/{P}").get("get").getParameter("path", "P").getMaximum());
-	}
-	@Test
-	public void sb09_Path_onParameter_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new SB()).getPaths().get("/minimum/{P}").get("get").getParameter("path", "P").getMinimum());
-	}
-	@Test
-	public void sb10_Path_onParameter_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new SB()).getPaths().get("/multipleOf/{P}").get("get").getParameter("path", "P").getMultipleOf());
-	}
-	@Test
-	public void sb11_Path_onParameter_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new SB()).getPaths().get("/maxLength/{P}").get("get").getParameter("path", "P").getMaxLength());
-	}
-	@Test
-	public void sb12_Path_onParameter_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new SB()).getPaths().get("/minLength/{P}").get("get").getParameter("path", "P").getMinLength());
-	}
-	@Test
-	public void sb13_Path_onParameter_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new SB()).getPaths().get("/allowEmptyValue/{P}").get("get").getParameter("path", "P").getAllowEmptyValue());
-	}
-	@Test
-	public void sb14_Path_onParameter_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new SB()).getPaths().get("/exclusiveMaximum/{P}").get("get").getParameter("path", "P").getExclusiveMaximum());
-	}
-	@Test
-	public void sb15_Path_onParameter_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new SB()).getPaths().get("/exclusiveMinimum/{P}").get("get").getParameter("path", "P").getExclusiveMinimum());
-	}
-	@Test
-	public void sb16a_Path_onParameter_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new SB()).getPaths().get("/schema1/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/value/{P}").get("get").getParameter("path", "P");
+		assertEquals("P", x.getName());
 	}
 	@Test
 	public void sb16b_Path_onParameter_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new SB()).getPaths().get("/schema2/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/schema2/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void sb16c_Path_onParameter_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new SB()).getPaths().get("/schema3/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/schema3/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void sb16d_Path_onParameter_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new SB()).getPaths().get("/schema4/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/schema4/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void sb16e_Path_onParameter_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new SB()).getPaths().get("/schema5/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/schema5/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void sb16f_Path_onParameter_schema6() throws Exception {
-		assertObjectEquals("{format:'int32',type:'integer'}", getSwagger(new SB()).getPaths().get("/schema6/{P}").get("get").getParameter("path", "P").getSchema());
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/schema6/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{format:'int32',type:'integer'}", x.getSchema());
 	}
 	@Test
 	public void sb16g_Path_onParameter_schema7() throws Exception {
-		assertObjectEquals("{type:'boolean'}", getSwagger(new SB()).getPaths().get("/schema7/{P}").get("get").getParameter("path", "P").getSchema());
-	}
-	@Test
-	public void sb18_Path_onParameter__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new SB()).getPaths().get("/_enum1/{P}").get("get").getParameter("path", "P").getEnum());
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/schema7/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{type:'boolean'}", x.getSchema());
 	}
 	@Test
 	public void sb19_Path_onParameter__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new SB()).getPaths().get("/_enum2/{P}").get("get").getParameter("path", "P").getEnum());
-	}
-	@Test
-	public void sb20_Path_onParameter_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new SB()).getPaths().get("/example1/{P}").get("get").getParameter("path", "P").getExample());
-	}
-	@Test
-	public void sb21_Path_onParameter_example2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new SB()).getPaths().get("/example2/{P}").get("get").getParameter("path", "P").getExample());
-	}
-	
-	//=================================================================================================================
-	// @Body on POJO
-	//=================================================================================================================
-
-	@RestResource()
-	public static class TA {
-
-		@Body(description= {"a","b"})
-		public static class TA01 {}
-		
-		@RestMethod(name=GET,path="/description")
-		public void ta01(TA01 h) {}
-
-		@Body(required="true")
-		public static class TA02 {}
-		
-		@RestMethod(name=GET,path="/required")
-		public void ta02(TA02 h) {}
-
-		@Body(type="a")
-		public static class TA03 {}
-		
-		@RestMethod(name=GET,path="/type")
-		public void ta03(TA03 h) {}
-
-		@Body(format="a")
-		public static class TA04 {}
-		
-		@RestMethod(name=GET,path="/format")
-		public void ta04(TA04 h) {}
-
-		@Body(pattern="a")
-		public static class TA05 {}
-		
-		@RestMethod(name=GET,path="/pattern")
-		public void ta05(TA05 h) {}
-
-		@Body(collectionFormat="a")
-		public static class TA06 {}
-		
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void ta06(TA06 h) {}
-
-		@Body(maximum="1")
-		public static class TA07 {}
-		
-		@RestMethod(name=GET,path="/maximum")
-		public void ta07(TA07 h) {}
-
-		@Body(minimum="1")
-		public static class TA08 {}
-		
-		@RestMethod(name=GET,path="/minimum")
-		public void ta08(TA08 h) {}
-
-		@Body(multipleOf="1")
-		public static class TA09 {}
-		
-		@RestMethod(name=GET,path="/multipleOf")
-		public void ta09(TA09 h) {}
-
-		@Body(maxLength="1")
-		public static class TA10 {}
-		
-		@RestMethod(name=GET,path="/maxLength")
-		public void ta10(TA10 h) {}
-
-		@Body(minLength="1")
-		public static class TA11 {}
-		
-		@RestMethod(name=GET,path="/minLength")
-		public void ta11(TA11 h) {}
-
-		@Body(maxItems="1")
-		public static class TA12 {}
-		
-		@RestMethod(name=GET,path="/maxItems")
-		public void ta12(TA12 h) {}
-
-		@Body(minItems="1")
-		public static class TA13 {}
-		
-		@RestMethod(name=GET,path="/minItems")
-		public void ta13(TA13 h) {}
-
-		@Body(allowEmptyValue="true")
-		public static class TA14 {}
-		
-		@RestMethod(name=GET,path="/allowEmptyValue")
-		public void ta14(TA14 h) {}
-
-		@Body(exclusiveMaximum="true")
-		public static class TA15 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void ta15(TA15 h) {}
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/enum2/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("['a','b']", x.getEnum());
+	}
+	@Test
+	public void sb21_Path_onParameter_example2() throws Exception {
+		ParameterInfo x = getSwagger(new SB()).getPaths().get("/example2/{P}").get("get").getParameter("path", "P");
+		assertObjectEquals("{f1:'b'}", x.getExample());
+	}
+	
+	//=================================================================================================================
+	// @Body on POJO
+	//=================================================================================================================
 
-		@Body(exclusiveMinimum="true")
-		public static class TA16 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void ta16(TA16 h) {}
+	@RestResource()
+	public static class TA {
 
-		@Body(uniqueItems="true")
-		public static class TA17 {}
+		@Body(
+			description={"a","b"},
+			required="true",
+			schema=@Schema(type="a"),
+			example=" 'a' ",
+			examples="{foo:'bar'}"
+		)
+		public static class TA00 {
+			public TA00(String x) {}
+		}
 		
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void ta17(TA17 h) {}
+		@RestMethod(name=GET,path="/basic")
+		public void ta00(TA00 h) {}
 
-		@Body(schema="{type:'a'}")
-		public static class TA18a {}
-		
-		@RestMethod(name=GET,path="/schema1")
-		public void ta18a(TA18a h) {}
 
-		@Body(schema={" type:'b' "})
+		@Body(schema=@Schema(" type:'b' "))
 		public static class TA18b {}
 		
 		@RestMethod(name=GET,path="/schema2")
@@ -5881,50 +4790,6 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema5")
 		public void ta18e(TA18e b) {}
 
-		@Body(_default="'a'")
-		public static class TA20 {}
-		
-		@RestMethod(name=GET,path="/_default1")
-		public void ta20(TA20 h) {}
-
-		@Body(_default="{f1:'b'}")
-		public static class TA21 {}
-		
-		@RestMethod(name=GET,path="/_default2")
-		public void ta21(TA21 h) {}
-
-		@Body(_enum=" a,b ")
-		public static class TA22 {}
-		
-		@RestMethod(name=GET,path="/_enum1")
-		public void ta22(TA22 h) {}
-
-		@Body(_enum={" ['a','b'] "})
-		public static class TA23 {}
-		
-		@RestMethod(name=GET,path="/_enum2")
-		public void ta23(TA23 h) {}
-
-		@Body(items=" {type:'a'} ")
-		public static class TA24 {}
-		
-		@RestMethod(name=GET,path="/items1")
-		public void ta24(TA24 h) {}
-
-		@Body(items={" type:'b' "})
-		public static class TA25 {}
-		
-		@RestMethod(name=GET,path="/items2")
-		public void ta25(TA25 h) {}
-
-		@Body(example=" 'a' ")
-		public static class TA26 {
-			public TA26(String value) {}
-		}
-		
-		@RestMethod(name=GET,path="/example1")
-		public void ta26(TA26 h) {}
-
 		@Body(example=" {f1:'b'} ")
 		public static class TA27 {
 			public String f1;
@@ -5933,12 +4798,6 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/example2")
 		public void ta27(TA27 h) {}
 
-		@Body(examples="{foo:'bar'}")
-		public static class TA28 {}
-		
-		@RestMethod(name=GET,path="/examples1")
-		public void ta28(TA28 h) {}
-
 		@Body(examples={" foo:'bar' "})
 		public static class TA29 {}
 		
@@ -5947,132 +4806,43 @@ public class BasicRestInfoProviderTest {
 	}
 	
 	@Test
-	public void ta01_Body_onPojo_description() throws Exception {
-		assertEquals("a\nb", getSwagger(new TA()).getPaths().get("/description").get("get").getParameter("body", null).getDescription());
-	}
-	@Test
-	public void ta02_Body_onPojo_required() throws Exception {
-		assertObjectEquals("true", getSwagger(new TA()).getPaths().get("/required").get("get").getParameter("body", null).getRequired());
-	}
-	@Test
-	public void ta03_Body_onPojo_type() throws Exception {
-		assertEquals("a", getSwagger(new TA()).getPaths().get("/type").get("get").getParameter("body", null).getType());
-	}
-	@Test
-	public void ta04_Body_onPojo_format() throws Exception {
-		assertEquals("a", getSwagger(new TA()).getPaths().get("/format").get("get").getParameter("body", null).getFormat());
-	}
-	@Test
-	public void ta05_Body_onPojo_pattern() throws Exception {
-		assertEquals("a", getSwagger(new TA()).getPaths().get("/pattern").get("get").getParameter("body", null).getPattern());
-	}
-	@Test
-	public void ta06_Body_onPojo_collectionFormat() throws Exception {
-		assertEquals("a", getSwagger(new TA()).getPaths().get("/collectionFormat").get("get").getParameter("body", null).getCollectionFormat());
-	}
-	@Test
-	public void ta07_Body_onPojo_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new TA()).getPaths().get("/maximum").get("get").getParameter("body", null).getMaximum());
-	}
-	@Test
-	public void ta08_Body_onPojo_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new TA()).getPaths().get("/minimum").get("get").getParameter("body", null).getMinimum());
-	}
-	@Test
-	public void ta09_Body_onPojo_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new TA()).getPaths().get("/multipleOf").get("get").getParameter("body", null).getMultipleOf());
-	}
-	@Test
-	public void ta10_Body_onPojo_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new TA()).getPaths().get("/maxLength").get("get").getParameter("body", null).getMaxLength());
-	}
-	@Test
-	public void ta11_Body_onPojo_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new TA()).getPaths().get("/minLength").get("get").getParameter("body", null).getMinLength());
-	}
-	@Test
-	public void ta12_Body_onPojo_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new TA()).getPaths().get("/maxItems").get("get").getParameter("body", null).getMaxItems());
-	}
-	@Test
-	public void ta13_Body_onPojo_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new TA()).getPaths().get("/minItems").get("get").getParameter("body", null).getMinItems());
-	}
-	@Test
-	public void ta14_Body_onPojo_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new TA()).getPaths().get("/allowEmptyValue").get("get").getParameter("body", null).getAllowEmptyValue());
-	}
-	@Test
-	public void ta15_Body_onPojo_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new TA()).getPaths().get("/exclusiveMaximum").get("get").getParameter("body", null).getExclusiveMaximum());
-	}
-	@Test
-	public void ta16_Body_onPojo_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new TA()).getPaths().get("/exclusiveMinimum").get("get").getParameter("body", null).getExclusiveMinimum());
-	}
-	@Test
-	public void ta17_Body_onPojo_uniqueItems() throws Exception {
-		assertObjectEquals("true", getSwagger(new TA()).getPaths().get("/uniqueItems").get("get").getParameter("body", null).getUniqueItems());
-	}
-	@Test
-	public void ta18a_Body_onPojo_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new TA()).getPaths().get("/schema1").get("get").getParameter("body", null).getSchema());
+	public void ta00_Body_onPojo_basic() throws Exception {
+		ParameterInfo x = getSwagger(new TA()).getPaths().get("/basic").get("get").getParameter("body", null);
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("true", x.getRequired());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertObjectEquals("'a'", x.getExample());
+		assertObjectEquals("{foo:'bar'}", x.getExamples());
 	}
 	@Test
 	public void ta18b_Body_onPojo_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new TA()).getPaths().get("/schema2").get("get").getParameter("body", null).getSchema());
+		ParameterInfo x = getSwagger(new TA()).getPaths().get("/schema2").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void ta18c_Body_onPojo_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new TA()).getPaths().get("/schema3").get("get").getParameter("body", null).getSchema());
+		ParameterInfo x = getSwagger(new TA()).getPaths().get("/schema3").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void ta18d_Body_onPojo_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new TA()).getPaths().get("/schema4").get("get").getParameter("body", null).getSchema());
+		ParameterInfo x = getSwagger(new TA()).getPaths().get("/schema4").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void ta18e_Body_onPojo_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new TA()).getPaths().get("/schema5").get("get").getParameter("body", null).getSchema());
-	}
-	@Test
-	public void ta20_Body_onPojo__default() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new TA()).getPaths().get("/_default1").get("get").getParameter("body", null).getDefault());
-	}
-	@Test
-	public void ta21_Body_onPojo__default2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new TA()).getPaths().get("/_default2").get("get").getParameter("body", null).getDefault());
-	}
-	@Test
-	public void ta22_Body_onPojo__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new TA()).getPaths().get("/_enum1").get("get").getParameter("body", null).getEnum());
-	}
-	@Test
-	public void ta23_Body_onPojo__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new TA()).getPaths().get("/_enum2").get("get").getParameter("body", null).getEnum());
-	}
-	@Test
-	public void ta24_Body_onPojo_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new TA()).getPaths().get("/items1").get("get").getParameter("body", null).getItems());
-	}
-	@Test
-	public void ta25_Body_onPojo_items2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new TA()).getPaths().get("/items2").get("get").getParameter("body", null).getItems());
-	}
-	@Test
-	public void ta26_Body_onPojo_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new TA()).getPaths().get("/example1").get("get").getParameter("body", null).getExample());
+		ParameterInfo x = getSwagger(new TA()).getPaths().get("/schema5").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void ta27_Body_onPojo_example2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new TA()).getPaths().get("/example2").get("get").getParameter("body", null).getExample());
-	}
-	@Test
-	public void ta28_Body_onPojo_examples1() throws Exception {
-		assertObjectEquals("{foo:'bar'}", getSwagger(new TA()).getPaths().get("/examples1").get("get").getParameter("body", null).getExamples());
+		ParameterInfo x = getSwagger(new TA()).getPaths().get("/example2").get("get").getParameter("body", null);
+		assertObjectEquals("{f1:'b'}", x.getExample());
 	}
 	@Test
 	public void ta29_Body_onPojo_examples2() throws Exception {
-		assertObjectEquals("{foo:'bar'}", getSwagger(new TA()).getPaths().get("/examples2").get("get").getParameter("body", null).getExamples());
+		ParameterInfo x = getSwagger(new TA()).getPaths().get("/examples2").get("get").getParameter("body", null);
+		assertObjectEquals("{foo:'bar'}", x.getExamples());
 	}
 
 	//=================================================================================================================
@@ -6082,100 +4852,24 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class TB {
 
-		public static class TB01 {}
-
-		@RestMethod(name=GET,path="/description")
-		public void tb01(@Body(description= {"a","b"}) TB01 b) {}
-
-		public static class TB02 {}
-
-		@RestMethod(name=GET,path="/required")
-		public void tb02(@Body(required="true") TB02 b) {}
-
-		public static class TB03 {}
-
-		@RestMethod(name=GET,path="/type")
-		public void tb03(@Body(type="a") TB03 b) {}
-
-		public static class TB04 {}
-
-		@RestMethod(name=GET,path="/format")
-		public void tb04(@Body(format="a") TB04 b) {}
-
-		public static class TB05 {}
-
-		@RestMethod(name=GET,path="/pattern")
-		public void tb05(@Body(pattern="a") TB05 b) {}
-
-		public static class TB06 {}
-
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void tb06(@Body(collectionFormat="a") TB06 b) {}
-
-		public static class TB07 {}
-
-		@RestMethod(name=GET,path="/maximum")
-		public void tb07(@Body(maximum="1") TB07 b) {}
-
-		public static class TB08 {}
-
-		@RestMethod(name=GET,path="/minimum")
-		public void tb08(@Body(minimum="1") TB08 b) {}
-
-		public static class TB09 {}
-
-		@RestMethod(name=GET,path="/multipleOf")
-		public void tb09(@Body(multipleOf="1") TB09 b) {}
-
-		public static class TB10 {}
-
-		@RestMethod(name=GET,path="/maxLength")
-		public void tb10(@Body(maxLength="1") TB10 b) {}
-
-		public static class TB11 {}
-
-		@RestMethod(name=GET,path="/minLength")
-		public void tb11(@Body(minLength="1") TB11 b) {}
-
-		public static class TB12 {}
-
-		@RestMethod(name=GET,path="/maxItems")
-		public void tb12(@Body(maxItems="1") TB12 b) {}
-
-		public static class TB13 {}
-
-		@RestMethod(name=GET,path="/minItems")
-		public void tb13(@Body(minItems="1") TB13 b) {}
-
-		public static class TB14 {}
-
-		@RestMethod(name=GET,path="/allowEmptyValue")
-		public void tb41(@Body(allowEmptyValue="true") TB14 b) {}
-
-		public static class TB15 {}
-
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void tb15(@Body(exclusiveMaximum="true") TB15 b) {}
-
-		public static class TB16 {}
-
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void tb16(@Body(exclusiveMinimum="true") TB16 b) {}
-
-		public static class TB17 {}
-
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void tb17(@Body(uniqueItems="true") TB17 b) {}
-
-		public static class TB18a {}
+		public static class TB01 {
+			public TB01(String x) {}
+		}
 
-		@RestMethod(name=GET,path="/schema1")
-		public void tb18a(@Body(schema=" {type:'a'} ") TB18a b) {}
+		@RestMethod(name=GET, path="/basic")
+		public void tb01(
+			@Body(
+				description= {"a","b"},
+				required="true",
+				schema=@Schema(type="a"),
+				example="'a'",
+				examples=" {foo:'bar'} "
+			) TB01 b) {}
 
 		public static class TB18b {}
 
 		@RestMethod(name=GET,path="/schema2")
-		public void tb18b(@Body(schema={" type:'b' "}) TB18b b) {}
+		public void tb18b(@Body(schema=@Schema(" { type:'b' } ")) TB18b b) {}
 
 		public static class TB18c {
 			public String f1;
@@ -6202,43 +4896,6 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema7")
 		public void tb18g(@Body Boolean b) {}
 
-		public static class TB20 {}
-
-		@RestMethod(name=GET,path="/_default1")
-		public void tb20(@Body(_default="'a'") TB20 b) {}
-
-		public static class TB21 {}
-
-		@RestMethod(name=GET,path="/_default2")
-		public void tb21(@Body(_default={"{f1:'b'}"}) TB21 b) {}
-
-		public static class TB22 {}
-
-		@RestMethod(name=GET,path="/_enum1")
-		public void tb22(@Body(_enum=" a,b ") TB22 b) {}
-
-		public static class TB23 {}
-
-		@RestMethod(name=GET,path="/_enum2")
-		public void tb23(@Body(_enum={" ['a','b'] "}) TB23 b) {}
-
-		public static class TB24 {}
-
-		@RestMethod(name=GET,path="/items1")
-		public void tb24(@Body(items=" {type:'a'} ") TB24 b) {}
-
-		public static class TB25 {}
-
-		@RestMethod(name=GET,path="/items2")
-		public void tb25(@Body(items={" type:'b' "}) TB25 b) {}
-
-		public static class TB26 {
-			public TB26(String value) {}
-		}
-
-		@RestMethod(name=GET,path="/example1")
-		public void tb26(@Body(example="'a'") TB26 b) {}
-
 		public static class TB27 {
 			public String f1;
 		}
@@ -6246,11 +4903,6 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/example2")
 		public void tb27(@Body(example="{f1:'b'}") TB27 b) {}
 
-		public static class TB28 {}
-
-		@RestMethod(name=GET,path="/examples1")
-		public void tb28(@Body(examples=" {foo:'bar'} ") TB28 b) {}
-
 		public static class TB29 {}
 
 		@RestMethod(name=GET,path="/examples2")
@@ -6258,140 +4910,53 @@ public class BasicRestInfoProviderTest {
 	}
 	
 	@Test
-	public void tb01_Body_onParameter_description() throws Exception {
-		assertEquals("a\nb", getSwagger(new TB()).getPaths().get("/description").get("get").getParameter("body", null).getDescription());
-	}
-	@Test
-	public void tb02_Body_onParameter_required() throws Exception {
-		assertObjectEquals("true", getSwagger(new TB()).getPaths().get("/required").get("get").getParameter("body", null).getRequired());
-	}
-	@Test
-	public void tb03_Body_onParameter_type() throws Exception {
-		assertEquals("a", getSwagger(new TB()).getPaths().get("/type").get("get").getParameter("body", null).getType());
-	}
-	@Test
-	public void tb04_Body_onParameter_format() throws Exception {
-		assertEquals("a", getSwagger(new TB()).getPaths().get("/format").get("get").getParameter("body", null).getFormat());
-	}
-	@Test
-	public void tb05_Body_onParameter_pattern() throws Exception {
-		assertEquals("a", getSwagger(new TB()).getPaths().get("/pattern").get("get").getParameter("body", null).getPattern());
-	}
-	@Test
-	public void tb06_Body_onParameter_collectionFormat() throws Exception {
-		assertEquals("a", getSwagger(new TB()).getPaths().get("/collectionFormat").get("get").getParameter("body", null).getCollectionFormat());
-	}
-	@Test
-	public void tb07_Body_onParameter_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new TB()).getPaths().get("/maximum").get("get").getParameter("body", null).getMaximum());
-	}
-	@Test
-	public void tb08_Body_onParameter_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new TB()).getPaths().get("/minimum").get("get").getParameter("body", null).getMinimum());
-	}
-	@Test
-	public void tb09_Body_onParameter_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new TB()).getPaths().get("/multipleOf").get("get").getParameter("body", null).getMultipleOf());
-	}
-	@Test
-	public void tb10_Body_onParameter_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new TB()).getPaths().get("/maxLength").get("get").getParameter("body", null).getMaxLength());
-	}
-	@Test
-	public void tb11_Body_onParameter_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new TB()).getPaths().get("/minLength").get("get").getParameter("body", null).getMinLength());
-	}
-	@Test
-	public void tb12_Body_onParameter_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new TB()).getPaths().get("/maxItems").get("get").getParameter("body", null).getMaxItems());
-	}
-	@Test
-	public void tb13_Body_onParameter_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new TB()).getPaths().get("/minItems").get("get").getParameter("body", null).getMinItems());
-	}
-	@Test
-	public void tb14_Body_onParameter_allowEmptyValue() throws Exception {
-		assertObjectEquals("true", getSwagger(new TB()).getPaths().get("/allowEmptyValue").get("get").getParameter("body", null).getAllowEmptyValue());
-	}
-	@Test
-	public void tb15_Body_onParameter_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new TB()).getPaths().get("/exclusiveMaximum").get("get").getParameter("body", null).getExclusiveMaximum());
-	}
-	@Test
-	public void tb16_Body_onParameter_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new TB()).getPaths().get("/exclusiveMinimum").get("get").getParameter("body", null).getExclusiveMinimum());
-	}
-	@Test
-	public void tb17_Body_onParameter_uniqueItems() throws Exception {
-		assertObjectEquals("true", getSwagger(new TB()).getPaths().get("/uniqueItems").get("get").getParameter("body", null).getUniqueItems());
-	}
-	@Test
-	public void tb18a_Body_onParameter_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new TB()).getPaths().get("/schema1").get("get").getParameter("body", null).getSchema());
+	public void tb00_Body_onParameter_basic() throws Exception {
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/basic").get("get").getParameter("body", null);
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("true", x.getRequired());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertObjectEquals("'a'", x.getExample());
+		assertObjectEquals("{foo:'bar'}", x.getExamples());
 	}
 	@Test
 	public void tb18b_Body_onParameter_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new TB()).getPaths().get("/schema2").get("get").getParameter("body", null).getSchema());
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/schema2").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void tb18c_Body_onParameter_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new TB()).getPaths().get("/schema3").get("get").getParameter("body", null).getSchema());
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/schema3").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void tb18d_Body_onParameter_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new TB()).getPaths().get("/schema4").get("get").getParameter("body", null).getSchema());
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/schema4").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void tb18e_Body_onParameter_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new TB()).getPaths().get("/schema5").get("get").getParameter("body", null).getSchema());
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/schema5").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void tb18e_Body_onParameter_schema6() throws Exception {
-		assertObjectEquals("{format:'int32',type:'integer'}", getSwagger(new TB()).getPaths().get("/schema6").get("get").getParameter("body", null).getSchema());
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/schema6").get("get").getParameter("body", null);
+		assertObjectEquals("{format:'int32',type:'integer'}", x.getSchema());
 	}
 	@Test
 	public void tb18e_Body_onParameter_schema7() throws Exception {
-		assertObjectEquals("{type:'boolean'}", getSwagger(new TB()).getPaths().get("/schema7").get("get").getParameter("body", null).getSchema());
-	}
-	@Test
-	public void tb20_Body_onParameter__default1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new TB()).getPaths().get("/_default1").get("get").getParameter("body", null).getDefault());
-	}
-	@Test
-	public void tb21_Body_onParameter__default2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new TB()).getPaths().get("/_default2").get("get").getParameter("body", null).getDefault());
-	}
-	@Test
-	public void tb22_Body_onParameter__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new TB()).getPaths().get("/_enum1").get("get").getParameter("body", null).getEnum());
-	}
-	@Test
-	public void tb23_Body_onParameter__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new TB()).getPaths().get("/_enum2").get("get").getParameter("body", null).getEnum());
-	}
-	@Test
-	public void tb24_Body_onParameter_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new TB()).getPaths().get("/items1").get("get").getParameter("body", null).getItems());
-	}
-	@Test
-	public void tb25_Body_onParameter_items2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new TB()).getPaths().get("/items2").get("get").getParameter("body", null).getItems());
-	}
-	@Test
-	public void tb26_Body_onParameter_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new TB()).getPaths().get("/example1").get("get").getParameter("body", null).getExample());
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/schema7").get("get").getParameter("body", null);
+		assertObjectEquals("{type:'boolean'}", x.getSchema());
 	}
 	@Test
 	public void tb27_Body_onParameter_example2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new TB()).getPaths().get("/example2").get("get").getParameter("body", null).getExample());
-	}
-	@Test
-	public void tb28_Body_onParameter_examples1() throws Exception {
-		assertObjectEquals("{foo:'bar'}", getSwagger(new TB()).getPaths().get("/examples1").get("get").getParameter("body", null).getExamples());
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/example2").get("get").getParameter("body", null);
+		assertObjectEquals("{f1:'b'}", x.getExample());
 	}
 	@Test
 	public void tb29_Body_onParameter_examples2() throws Exception {
-		assertObjectEquals("{foo:'bar'}", getSwagger(new TB()).getPaths().get("/examples2").get("get").getParameter("body", null).getExamples());
+		ParameterInfo x = getSwagger(new TB()).getPaths().get("/examples2").get("get").getParameter("body", null);
+		assertObjectEquals("{foo:'bar'}", x.getExamples());
 	}
 
 	//=================================================================================================================
@@ -6401,37 +4966,31 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class UA {
 
+		@Response(
+			description={"a","b"},
+			schema=@Schema(type="a"),
+			headers=@ResponseHeader(name="foo",type="a"),
+			example="'a'",
+			examples=" {foo:'a'} "
+		)
+		public static class UA00 {}
+		
+		@RestMethod(name=GET,path="/basic")
+		public void ua00(UA00 r) {}
+
 		@Response(code=100)
 		public static class UA01 {}
 		
 		@RestMethod(name=GET,path="/code")
 		public void ua01(UA01 r) {}
 
-		@Response(100)
+		@Response(code=100)
 		public static class UA02 {}
 		
 		@RestMethod(name=GET,path="/value")
 		public void ua02(UA02 r) {}
 
-		@Response(description="a")
-		public static class UA03a {}
-		
-		@RestMethod(name=GET,path="/description1")
-		public void ua03a(UA03a r) {}
-
-		@Response(description={"a","b"})
-		public static class UA03b {}
-		
-		@RestMethod(name=GET,path="/description2")
-		public void ua03b(UA03b r) {}
-
-		@Response(schema=" {type:'a'} ")
-		public static class UA04a {}
-		
-		@RestMethod(name=GET,path="/schema1")
-		public void ua04a(UA04a r) {}
-
-		@Response(schema={" type:'b' "})
+		@Response(schema=@Schema(" type:'b' "))
 		public static class UA04b {}
 		
 		@RestMethod(name=GET,path="/schema2")
@@ -6459,36 +5018,18 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema5")
 		public void ua04e(UA04e b) {}
 
-		@Response(headers=" {foo:{type:'a'}} ")
-		public static class UA05a {}
-		
-		@RestMethod(name=GET,path="/headers1")
-		public void ua05a(UA05a r) {}
-
-		@Response(headers={" foo:{type:'b'} "})
+		@Response(headers=@ResponseHeader(name="foo",api=" type:'b' "))
 		public static class UA05b {}
 		
 		@RestMethod(name=GET,path="/headers2")
 		public void ua05b(UA05b r) {}
 
-		@Response(example="'a'")
-		public static class UA06a {}
-		
-		@RestMethod(name=GET,path="/example1")
-		public void ua06a(UA06a r) {}
-
 		@Response(example="{f1:'a'}")
 		public static class UA06b {}
 		
 		@RestMethod(name=GET,path="/example2")
 		public void ua06b(UA06b r) {}
 
-		@Response(examples=" {foo:'a'} ")
-		public static class UA07a {}
-		
-		@RestMethod(name=GET,path="/examples1")
-		public void ua07a(UA07a r) {}
-
 		@Response(examples={" foo:'b' "})
 		public static class UA07b {}
 		
@@ -6497,64 +5038,58 @@ public class BasicRestInfoProviderTest {
 	}
 	
 	@Test
-	public void ua01_Response_onPojo_code() throws Exception {
-		assertEquals("Continue", getSwagger(new UA()).getPaths().get("/code").get("get").getResponse(100).getDescription());
-	}
-	@Test
-	public void ua02_Response_onPojo_() throws Exception {
-		assertEquals("Continue", getSwagger(new UA()).getPaths().get("/value").get("get").getResponse(100).getDescription());
-	}
-	@Test
-	public void ua03a_Response_onPojo_description1() throws Exception {
-		assertEquals("a", getSwagger(new UA()).getPaths().get("/description1").get("get").getResponse(200).getDescription());
+	public void ua00_Response_onPojo_basic() throws Exception {
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/basic").get("get").getResponse(200);
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertObjectEquals("{foo:{type:'a'}}", x.getHeaders());
+		assertObjectEquals("'a'", x.getExample());
+		assertObjectEquals("{foo:'a'}", x.getExamples());
 	}
 	@Test
-	public void ua03b_Response_onPojo_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new UA()).getPaths().get("/description2").get("get").getResponse(200).getDescription());
+	public void ua01_Response_onPojo_code() throws Exception {
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/code").get("get").getResponse(100);
+		assertEquals("Continue", x.getDescription());
 	}
 	@Test
-	public void ua04a_Response_onPojo_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new UA()).getPaths().get("/schema1").get("get").getResponse(200).getSchema());
+	public void ua02_Response_onPojo_value() throws Exception {
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/value").get("get").getResponse(100);
+		assertEquals("Continue", x.getDescription());
 	}
 	@Test
 	public void ua04b_Response_onPojo_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new UA()).getPaths().get("/schema2").get("get").getResponse(200).getSchema());
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/schema2").get("get").getResponse(200);
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void ua04c_Response_onPojo_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new UA()).getPaths().get("/schema3").get("get").getResponse(200).getSchema());
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/schema3").get("get").getResponse(200);
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void ua04d_Response_onPojo_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new UA()).getPaths().get("/schema4").get("get").getResponse(200).getSchema());
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/schema4").get("get").getResponse(200);
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void ua04e_Response_onPojo_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new UA()).getPaths().get("/schema5").get("get").getResponse(200).getSchema());
-	}
-	@Test
-	public void ua05a_Response_onPojo_headers1() throws Exception {
-		assertObjectEquals("{foo:{type:'a'}}", getSwagger(new UA()).getPaths().get("/headers1").get("get").getResponse(200).getHeaders());
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/schema5").get("get").getResponse(200);
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void ua05b_Response_onPojo_headers2() throws Exception {
-		assertObjectEquals("{foo:{type:'b'}}", getSwagger(new UA()).getPaths().get("/headers2").get("get").getResponse(200).getHeaders());
-	}
-	@Test
-	public void ua06a_Response_onPojo_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new UA()).getPaths().get("/example1").get("get").getResponse(200).getExample());
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/headers2").get("get").getResponse(200);
+		assertObjectEquals("{foo:{type:'b'}}", x.getHeaders());
 	}
 	@Test
 	public void ua06b_Response_onPojo_example2() throws Exception {
-		assertObjectEquals("{f1:'a'}", getSwagger(new UA()).getPaths().get("/example2").get("get").getResponse(200).getExample());
-	}
-	@Test
-	public void ua07a_Response_onPojo_examples1() throws Exception {
-		assertObjectEquals("{foo:'a'}", getSwagger(new UA()).getPaths().get("/examples1").get("get").getResponse(200).getExamples());
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/example2").get("get").getResponse(200);
+		assertObjectEquals("{f1:'a'}", x.getExample());
 	}
 	@Test
 	public void ua07b_Response_onPojo_examples2() throws Exception {
-		assertObjectEquals("{foo:'b'}", getSwagger(new UA()).getPaths().get("/examples2").get("get").getResponse(200).getExamples());
+		ResponseInfo x = getSwagger(new UA()).getPaths().get("/examples2").get("get").getResponse(200);
+		assertObjectEquals("{foo:'b'}", x.getExamples());
 	}
 	
 	//=================================================================================================================
@@ -6564,6 +5099,19 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class UB {
 
+		public static class UB00 {}
+
+		@RestMethod(name=GET,path="/basic")
+		public void ub00(
+			@Response(
+				description={"a","b"},
+				schema=@Schema(type="a"),
+				headers=@ResponseHeader(name="foo",type="a"),
+				example=" 'a' ",
+				examples=" {foo:'a'} "
+			) UB00 r
+		) {}
+
 		public static class UB01 {}
 
 		@RestMethod(name=GET,path="/code")
@@ -6572,27 +5120,12 @@ public class BasicRestInfoProviderTest {
 		public static class UB02 {}
 
 		@RestMethod(name=GET,path="/value")
-		public void ub02(@Response(100) UB02 r) {}
-
-		public static class UB03 {}
-
-		@RestMethod(name=GET,path="/description1")
-		public void ub03(@Response(description="a") UB03 r) {}
-
-		public static class UB04 {}
-
-		@RestMethod(name=GET,path="/description2")
-		public void ub04(@Response(description={"a","b"}) UB04 r) {}
-
-		public static class UB05a {}
-
-		@RestMethod(name=GET,path="/schema1")
-		public void ub05a(@Response(schema=" {type:'a'} ") UB05a r) {}
+		public void ub02(@Response(code=100) UB02 r) {}
 
 		public static class UB05b {}
 
 		@RestMethod(name=GET,path="/schema2")
-		public void ub05b(@Response(schema={" type:'b' "}) UB05b r) {}
+		public void ub05b(@Response(schema=@Schema(" type:'b' ")) UB05b r) {}
 
 		public static class UB05c {
 			public String f1;
@@ -6613,96 +5146,75 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema5")
 		public void ub05e(@Response UB05e b) {}
 
-		public static class UB07 {}
-
-		@RestMethod(name=GET,path="/headers1")
-		public void ub07(@Response(headers=" {foo:{type:'a'}} ") UB07 r) {}
-
 		public static class UB08 {}
 
 		@RestMethod(name=GET,path="/headers2")
-		public void ub08(@Response(headers={" foo:{type:'b'} "}) UB08 r) {}
-
-		public static class UB09 {}
-
-		@RestMethod(name=GET,path="/example1")
-		public void ub09(@Response(example=" 'a' ") UB09 r) {}
+		public void ub08(@Response(headers=@ResponseHeader(name="foo",api=" type:'b' ")) UB08 r) {}
 
 		public static class UB10 {}
 
 		@RestMethod(name=GET,path="/example2")
 		public void ub10(@Response(example=" {f1:'b'} ") UB10 r) {}
 
-		public static class UB11 {}
-
-		@RestMethod(name=GET,path="/examples1")
-		public void ub11(@Response(examples=" {foo:'a'} ") UB11 r) {}
-
 		public static class UB12 {}
-
-		@RestMethod(name=GET,path="/examples2")
-		public void ub12(@Response(examples={" foo:'b' "}) UB12 r) {}
-	}
-	
-	@Test
-	public void ub01_Response_onParameter_code() throws Exception {
-		assertEquals("Continue", getSwagger(new UB()).getPaths().get("/code").get("get").getResponse(100).getDescription());
-	}
-	@Test
-	public void ub02_Response_onParameter_value() throws Exception {
-		assertEquals("Continue", getSwagger(new UB()).getPaths().get("/value").get("get").getResponse(100).getDescription());
+
+		@RestMethod(name=GET,path="/examples2")
+		public void ub12(@Response(examples={" foo:'b' "}) UB12 r) {}
 	}
+	
 	@Test
-	public void ub03_Response_onParameter_description1() throws Exception {
-		assertEquals("a", getSwagger(new UB()).getPaths().get("/description1").get("get").getResponse(200).getDescription());
+	public void ub00_Response_onParameter_basic() throws Exception {
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/basic").get("get").getResponse(200);
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertObjectEquals("{foo:{type:'a'}}", x.getHeaders());
+		assertObjectEquals("'a'", x.getExample());
+		assertObjectEquals("{foo:'a'}", x.getExamples());
 	}
 	@Test
-	public void ub04_Response_onParameter_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new UB()).getPaths().get("/description2").get("get").getResponse(200).getDescription());
+	public void ub01_Response_onParameter_code() throws Exception {
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/code").get("get").getResponse(100);
+		assertEquals("Continue", x.getDescription());
 	}
 	@Test
-	public void ub05a_Response_onParameter_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new UB()).getPaths().get("/schema1").get("get").getResponse(200).getSchema());
+	public void ub02_Response_onParameter_value() throws Exception {
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/value").get("get").getResponse(100);
+		assertEquals("Continue", x.getDescription());
 	}
 	@Test
 	public void ub05b_Response_onParameter_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new UB()).getPaths().get("/schema2").get("get").getResponse(200).getSchema());
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/schema2").get("get").getResponse(200);
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
 	public void ub05c_Response_onParameter_schema3() throws Exception {
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", getSwagger(new UB()).getPaths().get("/schema3").get("get").getResponse(200).getSchema());
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/schema3").get("get").getResponse(200);
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}}}", x.getSchema());
 	}
 	@Test
 	public void ub05d_Response_onParameter_schema4() throws Exception {
-		assertObjectEquals("{type:'array',items:{type:'string'}}", getSwagger(new UB()).getPaths().get("/schema4").get("get").getResponse(200).getSchema());
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/schema4").get("get").getResponse(200);
+		assertObjectEquals("{type:'array',items:{type:'string'}}", x.getSchema());
 	}
 	@Test
 	public void ub05e_Response_onParameter_schema5() throws Exception {
-		assertObjectEquals("{type:'string'}", getSwagger(new UB()).getPaths().get("/schema5").get("get").getResponse(200).getSchema());
-	}
-	@Test
-	public void ub07_Response_onParameter_headers1() throws Exception {
-		assertObjectEquals("{foo:{type:'a'}}", getSwagger(new UB()).getPaths().get("/headers1").get("get").getResponse(200).getHeaders());
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/schema5").get("get").getResponse(200);
+		assertObjectEquals("{type:'string'}", x.getSchema());
 	}
 	@Test
 	public void ub08_Response_onParameter_headers2() throws Exception {
-		assertObjectEquals("{foo:{type:'b'}}", getSwagger(new UB()).getPaths().get("/headers2").get("get").getResponse(200).getHeaders());
-	}
-	@Test
-	public void ub09_Response_onParameter_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new UB()).getPaths().get("/example1").get("get").getResponse(200).getExample());
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/headers2").get("get").getResponse(200);
+		assertObjectEquals("{foo:{type:'b'}}", x.getHeaders());
 	}
 	@Test
 	public void ub10_Response_onParameter_example2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new UB()).getPaths().get("/example2").get("get").getResponse(200).getExample());
-	}
-	@Test
-	public void ub11_Response_onParameter_examples1() throws Exception {
-		assertObjectEquals("{foo:'a'}", getSwagger(new UB()).getPaths().get("/examples1").get("get").getResponse(200).getExamples());
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/example2").get("get").getResponse(200);
+		assertObjectEquals("{f1:'b'}", x.getExample());
 	}
 	@Test
 	public void ub12_Response_onParameter_examples2() throws Exception {
-		assertObjectEquals("{foo:'b'}", getSwagger(new UB()).getPaths().get("/examples2").get("get").getResponse(200).getExamples());
+		ResponseInfo x = getSwagger(new UB()).getPaths().get("/examples2").get("get").getResponse(200);
+		assertObjectEquals("{foo:'b'}", x.getExamples());
 	}
 
 	//=================================================================================================================
@@ -6713,126 +5225,93 @@ public class BasicRestInfoProviderTest {
 	@SuppressWarnings({"unused","serial"})
 	public static class UC {		
 		
+		@Response(
+			description= {"a","b"},
+			schema=@Schema(type="a"),
+			headers=@ResponseHeader(name="foo",type="a"),
+			example=" 'a' ",
+			examples=" {foo:'a'} "
+		)
+		public static class UC00 extends Throwable {}
+
+		@RestMethod(name=GET,path="/basic")
+		public void uc00() throws UC00 {}
+
 		@Response(code=100)
 		public static class UC01 extends Throwable {}
 
 		@RestMethod(name=GET,path="/code")
 		public void uc01() throws UC01 {}
 
-		@Response(100)
+		@Response(code=100)
 		public static class UC02 extends Throwable {}
 
 		@RestMethod(name=GET,path="/value")
 		public void uc02() throws UC02 {}
 
-		@Response(description="a")
+		@Response(schema=@Schema(" type:'b' "))
 		public static class UC03 extends Throwable {}
 
-		@RestMethod(name=GET,path="/description1")
+		@RestMethod(name=GET,path="/schema1")
 		public void uc03() throws UC03 {}
 
-		@Response(description= {"a","b"})
+		@Response(headers=@ResponseHeader(name="foo", api=" {type:'b'} "))
 		public static class UC04 extends Throwable {}
 
-		@RestMethod(name=GET,path="/description2")
-		public void uc04() throws UC04 {}
-
-		@Response(schema=" {type:'a'} ")
-		public static class UC05a extends Throwable {}
-
-		@RestMethod(name=GET,path="/schema1")
-		public void uc05a() throws UC05a {}
-
-		@Response(schema={" type:'b' "})
-		public static class UC05b extends Throwable {}
-
-		@RestMethod(name=GET,path="/schema2")
-		public void uc05b() throws UC05b {}
-
-		@Response(headers=" {foo:{type:'a'}} ")
-		public static class UC07 extends Throwable {}
-
 		@RestMethod(name=GET,path="/headers1")
-		public void uc07() throws UC07 {}
-
-		@Response(headers={" foo:{type:'b'} "})
-		public static class UC08 extends Throwable {}
-
-		@RestMethod(name=GET,path="/headers2")
-		public void uc08() throws UC08 {}
-
-		@Response(example=" 'a' ")
-		public static class UC09 extends Throwable {}
-
-		@RestMethod(name=GET,path="/example1")
-		public void uc09() throws UC09 {}
+		public void uc04() throws UC04 {}
 
 		@Response(example={" {f1:'b'} "})
-		public static class UC10 extends Throwable {}
+		public static class UC05 extends Throwable {}
 
-		@RestMethod(name=GET,path="/example2")
-		public void uc10() throws UC10 {}
-
-		@Response(examples=" {foo:'a'} ")
-		public static class UC11 extends Throwable {}
-
-		@RestMethod(name=GET,path="/examples1")
-		public void uc11() throws UC11 {}
+		@RestMethod(name=GET,path="/example1")
+		public void uc05() throws UC05 {}
 
 		@Response(examples={" foo:'b' "})
-		public static class UC12 extends Throwable {}
+		public static class UC06 extends Throwable {}
 
-		@RestMethod(name=GET,path="/examples2")
-		public void uc12() throws UC12 {}
+		@RestMethod(name=GET,path="/examples1")
+		public void uc06() throws UC06 {}
 	}
 	
 	@Test
-	public void uc01_Response_onThrowable_code() throws Exception {
-		assertEquals("Continue", getSwagger(new UC()).getPaths().get("/code").get("get").getResponse(100).getDescription());
-	}
-	@Test
-	public void uc02_Response_onThrowable_value() throws Exception {
-		assertEquals("Continue", getSwagger(new UC()).getPaths().get("/value").get("get").getResponse(100).getDescription());
-	}
-	@Test
-	public void uc03_Response_onThrowable_description1() throws Exception {
-		assertEquals("a", getSwagger(new UC()).getPaths().get("/description1").get("get").getResponse(500).getDescription());
-	}
-	@Test
-	public void uc04_Response_onThrowable_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new UC()).getPaths().get("/description2").get("get").getResponse(500).getDescription());
-	}
-	@Test
-	public void uc05a_Response_onThrowable_schema1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new UC()).getPaths().get("/schema1").get("get").getResponse(500).getSchema());
-	}
-	@Test
-	public void uc05b_Response_onThrowable_schema2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new UC()).getPaths().get("/schema2").get("get").getResponse(500).getSchema());
+	public void uc00_Response_onThrowable_basic() throws Exception {
+		ResponseInfo x = getSwagger(new UC()).getPaths().get("/basic").get("get").getResponse(500);
+		assertEquals("a\nb", x.getDescription());
+		assertObjectEquals("{type:'a'}", x.getSchema());
+		assertObjectEquals("{foo:{type:'a'}}", x.getHeaders());
+		assertObjectEquals("'a'", x.getExample());
+		assertObjectEquals("{foo:'a'}", x.getExamples());
 	}
 	@Test
-	public void uc07_Response_onThrowable_headers1() throws Exception {
-		assertObjectEquals("{foo:{type:'a'}}", getSwagger(new UC()).getPaths().get("/headers1").get("get").getResponse(500).getHeaders());
+	public void uc01_Response_onThrowable_code() throws Exception {
+		ResponseInfo x = getSwagger(new UC()).getPaths().get("/code").get("get").getResponse(100);
+		assertEquals("Continue", x.getDescription());
 	}
 	@Test
-	public void uc08_Response_onThrowable_headers2() throws Exception {
-		assertObjectEquals("{foo:{type:'b'}}", getSwagger(new UC()).getPaths().get("/headers2").get("get").getResponse(500).getHeaders());
+	public void uc02_Response_onThrowable_value() throws Exception {
+		ResponseInfo x = getSwagger(new UC()).getPaths().get("/value").get("get").getResponse(100);
+		assertEquals("Continue", x.getDescription());
 	}
 	@Test
-	public void uc09_Response_onThrowable_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new UC()).getPaths().get("/example1").get("get").getResponse(500).getExample());
+	public void uc03_Response_onThrowable_schema1() throws Exception {
+		ResponseInfo x = getSwagger(new UC()).getPaths().get("/schema1").get("get").getResponse(500);
+		assertObjectEquals("{type:'b'}", x.getSchema());
 	}
 	@Test
-	public void uc10_Response_onThrowable_example2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new UC()).getPaths().get("/example2").get("get").getResponse(500).getExample());
+	public void uc04_Response_onThrowable_headers1() throws Exception {
+		ResponseInfo x = getSwagger(new UC()).getPaths().get("/headers1").get("get").getResponse(500);
+		assertObjectEquals("{foo:{type:'b'}}", x.getHeaders());
 	}
 	@Test
-	public void uc11_Response_onThrowable_examples1() throws Exception {
-		assertObjectEquals("{foo:'a'}", getSwagger(new UC()).getPaths().get("/examples1").get("get").getResponse(500).getExamples());
+	public void uc05_Response_onThrowable_example1() throws Exception {
+		ResponseInfo x = getSwagger(new UC()).getPaths().get("/example1").get("get").getResponse(500);
+		assertObjectEquals("{f1:'b'}", x.getExample());
 	}
 	@Test
-	public void uc12_Response_onThrowable_examples2() throws Exception {
-		assertObjectEquals("{foo:'b'}", getSwagger(new UC()).getPaths().get("/examples2").get("get").getResponse(500).getExamples());
+	public void uc6_Response_onThrowable_examples1() throws Exception {
+		ResponseInfo x = getSwagger(new UC()).getPaths().get("/examples1").get("get").getResponse(500);
+		assertObjectEquals("{foo:'b'}", x.getExamples());
 	}
 
 	//=================================================================================================================
@@ -6852,8 +5331,8 @@ public class BasicRestInfoProviderTest {
 		public void ud01(UD01 r) {}
 
 		@Responses({
-			@Response(100),
-			@Response(101)
+			@Response(code=100),
+			@Response(code=101)
 		})
 		public static class UD02 {}
 		
@@ -6870,8 +5349,8 @@ public class BasicRestInfoProviderTest {
 		public void ud03(UD03 r) {}
 
 		@Responses({
-			@Response(code=100, schema=" {type:'a'} "),
-			@Response(code=101, schema={" type:'b' "})
+			@Response(code=100, schema=@Schema(type="a")),
+			@Response(code=101, schema=@Schema(" type:'b' "))
 		})
 		public static class UD04 {}
 		
@@ -6879,8 +5358,8 @@ public class BasicRestInfoProviderTest {
 		public void ud04(UD04 r) {}
 
 		@Responses({
-			@Response(code=100, headers=" {foo:{type:'a'}} "),
-			@Response(code=101, headers={" foo:{type:'b'} "})
+			@Response(code=100, headers=@ResponseHeader(name="foo", type="a")),
+			@Response(code=101, headers=@ResponseHeader(name="foo", api=" type:'b' "))
 		})
 		public static class UD05 {}
 		
@@ -6908,38 +5387,45 @@ public class BasicRestInfoProviderTest {
 	
 	@Test
 	public void ud01_Responses_onPojo_code() throws Exception {
-		assertEquals("Continue", getSwagger(new UD()).getPaths().get("/code").get("get").getResponse(100).getDescription());
-		assertEquals("Switching Protocols", getSwagger(new UD()).getPaths().get("/code").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new UD()).getPaths().get("/code").get("get");
+		assertEquals("Continue", x.getResponse(100).getDescription());
+		assertEquals("Switching Protocols", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void ud02_Responses_onPojo_value() throws Exception {
-		assertEquals("Continue", getSwagger(new UD()).getPaths().get("/value").get("get").getResponse(100).getDescription());
-		assertEquals("Switching Protocols", getSwagger(new UD()).getPaths().get("/value").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new UD()).getPaths().get("/value").get("get");
+		assertEquals("Continue", x.getResponse(100).getDescription());
+		assertEquals("Switching Protocols", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void ud03_Responses_onPojo_description() throws Exception {
-		assertEquals("a", getSwagger(new UD()).getPaths().get("/description").get("get").getResponse(100).getDescription());
-		assertEquals("a\nb", getSwagger(new UD()).getPaths().get("/description").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new UD()).getPaths().get("/description").get("get");
+		assertEquals("a", x.getResponse(100).getDescription());
+		assertEquals("a\nb", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void ud04_Responses_onPojo_schema() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new UD()).getPaths().get("/schema").get("get").getResponse(100).getSchema());
-		assertObjectEquals("{type:'b'}", getSwagger(new UD()).getPaths().get("/schema").get("get").getResponse(101).getSchema());
+		Operation x = getSwagger(new UD()).getPaths().get("/schema").get("get");
+		assertObjectEquals("{type:'a'}", x.getResponse(100).getSchema());
+		assertObjectEquals("{type:'b'}", x.getResponse(101).getSchema());
 	}
 	@Test
 	public void ud05_Responses_onPojo_headers() throws Exception {
-		assertObjectEquals("{foo:{type:'a'}}", getSwagger(new UD()).getPaths().get("/headers").get("get").getResponse(100).getHeaders());
-		assertObjectEquals("{foo:{type:'b'}}", getSwagger(new UD()).getPaths().get("/headers").get("get").getResponse(101).getHeaders());
+		Operation x = getSwagger(new UD()).getPaths().get("/headers").get("get");
+		assertObjectEquals("{foo:{type:'a'}}", x.getResponse(100).getHeaders());
+		assertObjectEquals("{foo:{type:'b'}}", x.getResponse(101).getHeaders());
 	}
 	@Test
 	public void ud06_Responses_onPojo_example() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new UD()).getPaths().get("/example").get("get").getResponse(100).getExample());
-		assertObjectEquals("{f1:'a'}", getSwagger(new UD()).getPaths().get("/example").get("get").getResponse(101).getExample());
+		Operation x = getSwagger(new UD()).getPaths().get("/example").get("get");
+		assertObjectEquals("'a'", x.getResponse(100).getExample());
+		assertObjectEquals("{f1:'a'}", x.getResponse(101).getExample());
 	}
 	@Test
 	public void ud07_Responses_onPojo_examples() throws Exception {
-		assertObjectEquals("{foo:'a'}", getSwagger(new UD()).getPaths().get("/examples").get("get").getResponse(100).getExamples());
-		assertObjectEquals("{foo:'b'}", getSwagger(new UD()).getPaths().get("/examples").get("get").getResponse(101).getExamples());
+		Operation x = getSwagger(new UD()).getPaths().get("/examples").get("get");
+		assertObjectEquals("{foo:'a'}", x.getResponse(100).getExamples());
+		assertObjectEquals("{foo:'b'}", x.getResponse(101).getExamples());
 	}
 	
 	//=================================================================================================================
@@ -6964,8 +5450,8 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/value")
 		public void ue02(
 			@Responses({
-				@Response(100),
-				@Response(101)
+				@Response(code=100),
+				@Response(code=101)
 			})
 			UE02 r) {}
 
@@ -6984,8 +5470,8 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/schema")
 		public void ue04(
 			@Responses({
-				@Response(code=100, schema=" {type:'a'} "),
-				@Response(code=101, schema={" type:'b' "})
+				@Response(code=100, schema=@Schema(type="a")),
+				@Response(code=101, schema=@Schema(" type:'b' "))
 			})
 			UE04 r) {}
 
@@ -6994,8 +5480,8 @@ public class BasicRestInfoProviderTest {
 		@RestMethod(name=GET,path="/headers")
 		public void ue05(
 			@Responses({
-				@Response(code=100, headers=" {foo:{type:'a'}} "),
-				@Response(code=101, headers={" foo:{type:'b'} "})
+				@Response(code=100, headers=@ResponseHeader(name="foo",type="a")),
+				@Response(code=101, headers=@ResponseHeader(name="foo", api=" type:'b' "))
 			})
 			UE05 r) {}
 
@@ -7022,38 +5508,45 @@ public class BasicRestInfoProviderTest {
 	
 	@Test
 	public void ue01_Responses_onParameter_code() throws Exception {
-		assertEquals("Continue", getSwagger(new UE()).getPaths().get("/code").get("get").getResponse(100).getDescription());
-		assertEquals("Switching Protocols", getSwagger(new UE()).getPaths().get("/code").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new UE()).getPaths().get("/code").get("get");
+		assertEquals("Continue", x.getResponse(100).getDescription());
+		assertEquals("Switching Protocols", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void ue02_Responses_onParameter_value() throws Exception {
-		assertEquals("Continue", getSwagger(new UE()).getPaths().get("/value").get("get").getResponse(100).getDescription());
-		assertEquals("Switching Protocols", getSwagger(new UE()).getPaths().get("/value").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new UE()).getPaths().get("/value").get("get");
+		assertEquals("Continue", x.getResponse(100).getDescription());
+		assertEquals("Switching Protocols", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void ue03_Responses_onParameter_description() throws Exception {
-		assertEquals("a", getSwagger(new UE()).getPaths().get("/description").get("get").getResponse(100).getDescription());
-		assertEquals("a\nb", getSwagger(new UE()).getPaths().get("/description").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new UE()).getPaths().get("/description").get("get");
+		assertEquals("a", x.getResponse(100).getDescription());
+		assertEquals("a\nb", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void ue04_Responses_onParameter_schema() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new UE()).getPaths().get("/schema").get("get").getResponse(100).getSchema());
-		assertObjectEquals("{type:'b'}", getSwagger(new UE()).getPaths().get("/schema").get("get").getResponse(101).getSchema());
+		Operation x = getSwagger(new UE()).getPaths().get("/schema").get("get");
+		assertObjectEquals("{type:'a'}", x.getResponse(100).getSchema());
+		assertObjectEquals("{type:'b'}", x.getResponse(101).getSchema());
 	}
 	@Test
 	public void ue05_Responses_onParameter_headers() throws Exception {
-		assertObjectEquals("{foo:{type:'a'}}", getSwagger(new UE()).getPaths().get("/headers").get("get").getResponse(100).getHeaders());
-		assertObjectEquals("{foo:{type:'b'}}", getSwagger(new UE()).getPaths().get("/headers").get("get").getResponse(101).getHeaders());
+		Operation x = getSwagger(new UE()).getPaths().get("/headers").get("get");
+		assertObjectEquals("{foo:{type:'a'}}", x.getResponse(100).getHeaders());
+		assertObjectEquals("{foo:{type:'b'}}", x.getResponse(101).getHeaders());
 	}
 	@Test
 	public void ue06_Responses_onParameter_example() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new UE()).getPaths().get("/example").get("get").getResponse(100).getExample());
-		assertObjectEquals("{f1:'b'}", getSwagger(new UE()).getPaths().get("/example").get("get").getResponse(101).getExample());
+		Operation x = getSwagger(new UE()).getPaths().get("/example").get("get");
+		assertObjectEquals("'a'", x.getResponse(100).getExample());
+		assertObjectEquals("{f1:'b'}", x.getResponse(101).getExample());
 	}
 	@Test
 	public void ue07_Responses_onParameter_examples() throws Exception {
-		assertObjectEquals("{foo:'a'}", getSwagger(new UE()).getPaths().get("/examples").get("get").getResponse(100).getExamples());
-		assertObjectEquals("{foo:'b'}", getSwagger(new UE()).getPaths().get("/examples").get("get").getResponse(101).getExamples());
+		Operation x = getSwagger(new UE()).getPaths().get("/examples").get("get");
+		assertObjectEquals("{foo:'a'}", x.getResponse(100).getExamples());
+		assertObjectEquals("{foo:'b'}", x.getResponse(101).getExamples());
 	}
 	
 
@@ -7093,18 +5586,21 @@ public class BasicRestInfoProviderTest {
 
 	@Test
 	public void va01_ResponseStatus_onPojo_code() throws Exception {
-		assertEquals("Continue", getSwagger(new VA()).getPaths().get("/code").get("get").getResponse(100).getDescription());
-		assertEquals("Switching Protocols", getSwagger(new VA()).getPaths().get("/code").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new VA()).getPaths().get("/code").get("get");
+		assertEquals("Continue", x.getResponse(100).getDescription());
+		assertEquals("Switching Protocols", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void va02_ResponseStatus_onPojo_value() throws Exception {
-		assertEquals("Continue", getSwagger(new VA()).getPaths().get("/value").get("get").getResponse(100).getDescription());
-		assertEquals("Switching Protocols", getSwagger(new VA()).getPaths().get("/value").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new VA()).getPaths().get("/value").get("get");
+		assertEquals("Continue", x.getResponse(100).getDescription());
+		assertEquals("Switching Protocols", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void va03_ResponseStatus_onPojo_description() throws Exception {
-		assertEquals("a", getSwagger(new VA()).getPaths().get("/description").get("get").getResponse(100).getDescription());
-		assertEquals("a\nb", getSwagger(new VA()).getPaths().get("/description").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new VA()).getPaths().get("/description").get("get");
+		assertEquals("a", x.getResponse(100).getDescription());
+		assertEquals("a\nb", x.getResponse(101).getDescription());
 	}
 	
 	//=================================================================================================================
@@ -7126,7 +5622,7 @@ public class BasicRestInfoProviderTest {
 
 		public static class VB02 {}
 		
-		@RestMethod(name=GET,path="/vblue")
+		@RestMethod(name=GET,path="/value")
 		public void vb02(
 				@ResponseStatus({
 					@Status(100),
@@ -7149,18 +5645,21 @@ public class BasicRestInfoProviderTest {
 	
 	@Test
 	public void vb01_ResponseStatus_onParameter_code() throws Exception {
-		assertEquals("Continue", getSwagger(new VB()).getPaths().get("/code").get("get").getResponse(100).getDescription());
-		assertEquals("Switching Protocols", getSwagger(new VB()).getPaths().get("/code").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new VB()).getPaths().get("/code").get("get");
+		assertEquals("Continue", x.getResponse(100).getDescription());
+		assertEquals("Switching Protocols", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void vb02_ResponseStatus_onParameter_vblue() throws Exception {
-		assertEquals("Continue", getSwagger(new VB()).getPaths().get("/vblue").get("get").getResponse(100).getDescription());
-		assertEquals("Switching Protocols", getSwagger(new VB()).getPaths().get("/vblue").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new VB()).getPaths().get("/value").get("get");
+		assertEquals("Continue", x.getResponse(100).getDescription());
+		assertEquals("Switching Protocols", x.getResponse(101).getDescription());
 	}
 	@Test
 	public void vb03_ResponseStatus_onParameter_description() throws Exception {
-		assertEquals("a", getSwagger(new VB()).getPaths().get("/description").get("get").getResponse(100).getDescription());
-		assertEquals("a\nb", getSwagger(new VB()).getPaths().get("/description").get("get").getResponse(101).getDescription());
+		Operation x = getSwagger(new VB()).getPaths().get("/description").get("get");
+		assertEquals("a", x.getResponse(100).getDescription());
+		assertEquals("a\nb", x.getResponse(101).getDescription());
 	}
 
 	//=================================================================================================================
@@ -7170,298 +5669,155 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class WA {
 
+		@ResponseHeader(
+			name="H",
+			description="a",
+			type="a",
+			format="a",
+			collectionFormat="a",
+			maximum="1",
+			minimum="1",
+			multipleOf="1",
+			maxLength="1",
+			minLength="1",
+			maxItems="1",
+			minItems="1",
+			exclusiveMaximum="true",
+			exclusiveMinimum="true",
+			uniqueItems="true",
+			items=@Items(type="a"),
+			_default="'a'",
+			_enum=" a,b ",
+			example="'a'"
+		)
+		public static class WA00 {}
+		
+		@RestMethod(name=GET,path="/basic")
+		public void wa00(WA00 h) {}
+
 		@ResponseHeader(name="H", code=100)
-		public static class WA01 {}
+		public static class WA01a {}
 		
 		@RestMethod(name=GET,path="/code")
-		public void wa01(WA01 h) {}
+		public void wa01a(WA01a h) {}
 
 		@ResponseHeader(name="H", codes={100,101})
-		public static class WA02 {}
+		public static class WA01b {}
 		
 		@RestMethod(name=GET,path="/codes")
-		public void wa02(WA02 h) {}
+		public void wa01b(WA01b h) {}
 
 		@ResponseHeader(name="H", code=100,codes={101})
-		public static class WA03 {}
+		public static class WA01c {}
 		
 		@RestMethod(name=GET,path="/codeAndCodes")
-		public void wa03(WA03 h) {}
+		public void wa01c(WA01c h) {}
 
 		@ResponseHeader(name="H", description="a")
-		public static class WA04 {}
+		public static class WA01d {}
 		
 		@RestMethod(name=GET,path="/nocode")
-		public void wa04(WA04 h) {}
-
-		@ResponseHeader(name="H")
-		public static class WA05 {}
-		
-		@RestMethod(name=GET,path="/name")
-		public void wa05(WA05 h) {}
+		public void wa01d(WA01d h) {}
 
 		@ResponseHeader("H")
-		public static class WA06 {}
+		public static class WA02 {}
 		
 		@RestMethod(name=GET,path="/value")
-		public void wa06(WA06 h) {}
-
-		@ResponseHeader(name="H", description="a")
-		public static class WA07 {}
-		
-		@RestMethod(name=GET,path="/description1")
-		public void wa07(WA07 h) {}
-
-		@ResponseHeader(name="H", description={"a","b"})
-		public static class WA08 {}
-		
-		@RestMethod(name=GET,path="/description2")
-		public void wa08(WA08 h) {}
-
-		@ResponseHeader(name="H", type="a")
-		public static class WA09 {}
-		
-		@RestMethod(name=GET,path="/type")
-		public void wa09(WA09 h) {}
-
-		@ResponseHeader(name="H", format="a")
-		public static class WA10 {}
-		
-		@RestMethod(name=GET,path="/format")
-		public void wa10(WA10 h) {}
-
-		@ResponseHeader(name="H", collectionFormat="a")
-		public static class WA11 {}
-		
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void wa11(WA11 h) {}
-
-		@ResponseHeader(name="H", maximum="1")
-		public static class WA12 {}
-		
-		@RestMethod(name=GET,path="/maximum")
-		public void wa12(WA12 h) {}
-
-		@ResponseHeader(name="H", minimum="1")
-		public static class WA13 {}
-		
-		@RestMethod(name=GET,path="/minimum")
-		public void wa13(WA13 h) {}
-
-		@ResponseHeader(name="H", multipleOf="1")
-		public static class WA14 {}
-		
-		@RestMethod(name=GET,path="/multipleOf")
-		public void wa14(WA14 h) {}
-
-		@ResponseHeader(name="H", maxLength="1")
-		public static class WA15 {}
-		
-		@RestMethod(name=GET,path="/maxLength")
-		public void wa15(WA15 h) {}
-
-		@ResponseHeader(name="H", minLength="1")
-		public static class WA16 {}
-		
-		@RestMethod(name=GET,path="/minLength")
-		public void wa16(WA16 h) {}
-
-		@ResponseHeader(name="H", maxItems="1")
-		public static class WA17 {}
-		
-		@RestMethod(name=GET,path="/maxItems")
-		public void wa17(WA17 h) {}
-
-		@ResponseHeader(name="H", minItems="1")
-		public static class WA18 {}
-		
-		@RestMethod(name=GET,path="/minItems")
-		public void wa18(WA18 h) {}
-
-		@ResponseHeader(name="H", exclusiveMaximum="true")
-		public static class WA19 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void wa19(WA19 h) {}
-
-		@ResponseHeader(name="H", exclusiveMinimum="true")
-		public static class WA20 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMinimum")
-		public void wa20(WA20 h) {}
-
-		@ResponseHeader(name="H", uniqueItems="true")
-		public static class WA21 {}
-		
-		@RestMethod(name=GET,path="/uniqueItems")
-		public void wa21(WA21 h) {}
+		public void wa02(WA02 h) {}
 
-		@ResponseHeader(name="H", items=" {type:'a'} ")
-		public static class WA22 {}
+		@ResponseHeader(name="H", items=@Items(" type:'b' "))
+		public static class WA03 {}
 		
 		@RestMethod(name=GET,path="/items1")
-		public void wa22(WA22 h) {}
-
-		@ResponseHeader(name="H", items={" type:'b' "})
-		public static class WA23 {}
-		
-		@RestMethod(name=GET,path="/items2")
-		public void wa23(WA23 h) {}
-
-		@ResponseHeader(name="H", _default="'a'")
-		public static class WA24 {}
-		
-		@RestMethod(name=GET,path="/_default1")
-		public void wa24(WA24 h) {}
+		public void wa03(WA03 h) {}
 
 		@ResponseHeader(name="H", _default={" {f1:'b'} "})
-		public static class WA25 {}
-		
-		@RestMethod(name=GET,path="/_default2")
-		public void wa25(WA25 h) {}
-
-		@ResponseHeader(name="H", _enum=" a,b ")
-		public static class WA26 {}
+		public static class WA04 {}
 		
-		@RestMethod(name=GET,path="/_enum1")
-		public void wa26(WA26 h) {}
+		@RestMethod(name=GET,path="/default1")
+		public void wa04(WA04 h) {}
 
 		@ResponseHeader(name="H", _enum={" ['a','b'] "})
-		public static class WA27 {}
-		
-		@RestMethod(name=GET,path="/_enum2")
-		public void wa27(WA27 h) {}
-
-		@ResponseHeader(name="H", example="'a'")
-		public static class WA28 {}
+		public static class WA05 {}
 		
-		@RestMethod(name=GET,path="/example1")
-		public void wa28(WA28 h) {}
+		@RestMethod(name=GET,path="/enum1")
+		public void wa05(WA05 h) {}
 
 		@ResponseHeader(name="H", example={" {f1:'b'} "})
-		public static class WA29 {}
+		public static class WA06 {}
 		
-		@RestMethod(name=GET,path="/example2")
-		public void wa29(WA29 h) {}
+		@RestMethod(name=GET,path="/example1")
+		public void wa06(WA06 h) {}
 	}
 	
 	@Test
-	public void wa01_ResponseHeader_onPojo_code() throws Exception {
-		assertNotNull(getSwagger(new WA()).getPaths().get("/code").get("get").getResponse(100).getHeader("H"));
-	}
-	@Test
-	public void wa02_ResponseHeader_onPojo_codes() throws Exception {
-		assertNotNull(getSwagger(new WA()).getPaths().get("/codes").get("get").getResponse(100).getHeader("H"));
-		assertNotNull(getSwagger(new WA()).getPaths().get("/codes").get("get").getResponse(101).getHeader("H"));
+	public void wa00_ResponseHeader_onPojo_basic() throws Exception {
+		HeaderInfo x = getSwagger(new WA()).getPaths().get("/basic").get("get").getResponse(200).getHeader("H");
+		assertEquals("a", x.getDescription());
+		assertEquals("a", x.getType());
+		assertEquals("a", x.getFormat());
+		assertEquals("a", x.getCollectionFormat());
+		assertObjectEquals("1", x.getMaximum());
+		assertObjectEquals("1", x.getMinimum());
+		assertObjectEquals("1", x.getMultipleOf());
+		assertObjectEquals("1", x.getMaxLength());
+		assertObjectEquals("1", x.getMinLength());
+		assertObjectEquals("1", x.getMaxItems());
+		assertObjectEquals("1", x.getMinItems());
+		assertObjectEquals("true", x.getExclusiveMaximum());
+		assertObjectEquals("true", x.getExclusiveMinimum());
+		assertObjectEquals("true", x.getUniqueItems());
+		assertObjectEquals("{type:'a'}", x.getItems());
+		assertObjectEquals("'a'", x.getDefault());
+		assertObjectEquals("['a','b']", x.getEnum());
+		assertObjectEquals("'a'", x.getExample());
 	}
 	@Test
-	public void wa03_ResponseHeader_onPojo_codeAndCodes() throws Exception {
-		assertNotNull(getSwagger(new WA()).getPaths().get("/codeAndCodes").get("get").getResponse(100).getHeader("H"));
-		assertNotNull(getSwagger(new WA()).getPaths().get("/codeAndCodes").get("get").getResponse(101).getHeader("H"));
+	public void wa01a_ResponseHeader_onPojo_code() throws Exception {
+		HeaderInfo x = getSwagger(new WA()).getPaths().get("/code").get("get").getResponse(100).getHeader("H");
+		assertNotNull(x);
 	}
 	@Test
-	public void wa04_ResponseHeader_onPojo_nocode() throws Exception {
-		assertEquals("a", getSwagger(new WA()).getPaths().get("/nocode").get("get").getResponse(200).getHeader("H").getDescription());
+	public void wa01b_ResponseHeader_onPojo_codes() throws Exception {
+		Operation x = getSwagger(new WA()).getPaths().get("/codes").get("get");
+		assertNotNull(x.getResponse(100).getHeader("H"));
+		assertNotNull(x.getResponse(101).getHeader("H"));
 	}
 	@Test
-	public void wa05_ResponseHeader_onPojo_name() throws Exception {
-		assertNotNull(getSwagger(new WA()).getPaths().get("/name").get("get").getResponse(200).getHeader("H"));
+	public void wa01c_ResponseHeader_onPojo_codeAndCodes() throws Exception {
+		Operation x = getSwagger(new WA()).getPaths().get("/codeAndCodes").get("get");
+		assertNotNull(x.getResponse(100).getHeader("H"));
+		assertNotNull(x.getResponse(101).getHeader("H"));
 	}
 	@Test
-	public void wa06_ResponseHeader_onPojo_value() throws Exception {
-		assertNotNull(getSwagger(new WA()).getPaths().get("/value").get("get").getResponse(200).getHeader("H"));
+	public void wa01d_ResponseHeader_onPojo_nocode() throws Exception {
+		HeaderInfo x = getSwagger(new WA()).getPaths().get("/nocode").get("get").getResponse(200).getHeader("H");
+		assertEquals("a", x.getDescription());
 	}
 	@Test
-	public void wa07_ResponseHeader_onPojo_description1() throws Exception {
-		assertEquals("a", getSwagger(new WA()).getPaths().get("/description1").get("get").getResponse(200).getHeader("H").getDescription());
+	public void wa02_ResponseHeader_onPojo_value() throws Exception {
+		HeaderInfo x = getSwagger(new WA()).getPaths().get("/value").get("get").getResponse(200).getHeader("H");
+		assertNotNull(x);
 	}
 	@Test
-	public void wa08_ResponseHeader_onPojo_description2() throws Exception {
-		assertEquals("a\nb", getSwagger(new WA()).getPaths().get("/description2").get("get").getResponse(200).getHeader("H").getDescription());
+	public void wa03_ResponseHeader_onPojo_items1() throws Exception {
+		HeaderInfo x = getSwagger(new WA()).getPaths().get("/items1").get("get").getResponse(200).getHeader("H");
+		assertObjectEquals("{type:'b'}", x.getItems());
 	}
 	@Test
-	public void wa09_ResponseHeader_onPojo_type() throws Exception {
-		assertEquals("a", getSwagger(new WA()).getPaths().get("/type").get("get").getResponse(200).getHeader("H").getType());
+	public void wa04_ResponseHeader_onPojo_default1() throws Exception {
+		HeaderInfo x = getSwagger(new WA()).getPaths().get("/default1").get("get").getResponse(200).getHeader("H");
+		assertObjectEquals("{f1:'b'}", x.getDefault());
 	}
 	@Test
-	public void wa10_ResponseHeader_onPojo_format() throws Exception {
-		assertEquals("a", getSwagger(new WA()).getPaths().get("/format").get("get").getResponse(200).getHeader("H").getFormat());
+	public void wa05_ResponseHeader_onPojo_enum1() throws Exception {
+		HeaderInfo x = getSwagger(new WA()).getPaths().get("/enum1").get("get").getResponse(200).getHeader("H");
+		assertObjectEquals("['a','b']", x.getEnum());
 	}
 	@Test
-	public void wa11_ResponseHeader_onPojo_collectionFormat() throws Exception {
-		assertEquals("a", getSwagger(new WA()).getPaths().get("/collectionFormat").get("get").getResponse(200).getHeader("H").getCollectionFormat());
-	}
-	@Test
-	public void wa12_ResponseHeader_onPojo_maximum() throws Exception {
-		assertObjectEquals("1", getSwagger(new WA()).getPaths().get("/maximum").get("get").getResponse(200).getHeader("H").getMaximum());
-	}
-	@Test
-	public void wa13_ResponseHeader_onPojo_minimum() throws Exception {
-		assertObjectEquals("1", getSwagger(new WA()).getPaths().get("/minimum").get("get").getResponse(200).getHeader("H").getMinimum());
-	}
-	@Test
-	public void wa14_ResponseHeader_onPojo_multipleOf() throws Exception {
-		assertObjectEquals("1", getSwagger(new WA()).getPaths().get("/multipleOf").get("get").getResponse(200).getHeader("H").getMultipleOf());
-	}
-	@Test
-	public void wa15_ResponseHeader_onPojo_maxLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new WA()).getPaths().get("/maxLength").get("get").getResponse(200).getHeader("H").getMaxLength());
-	}
-	@Test
-	public void wa16_ResponseHeader_onPojo_minLength() throws Exception {
-		assertObjectEquals("1", getSwagger(new WA()).getPaths().get("/minLength").get("get").getResponse(200).getHeader("H").getMinLength());
-	}
-	@Test
-	public void wa17_ResponseHeader_onPojo_maxItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new WA()).getPaths().get("/maxItems").get("get").getResponse(200).getHeader("H").getMaxItems());
-	}
-	@Test
-	public void wa18_ResponseHeader_onPojo_minItems() throws Exception {
-		assertObjectEquals("1", getSwagger(new WA()).getPaths().get("/minItems").get("get").getResponse(200).getHeader("H").getMinItems());
-	}
-	@Test
-	public void wa19_ResponseHeader_onPojo_exclusiveMaximum() throws Exception {
-		assertObjectEquals("true", getSwagger(new WA()).getPaths().get("/exclusiveMaximum").get("get").getResponse(200).getHeader("H").getExclusiveMaximum());
-	}
-	@Test
-	public void wa20_ResponseHeader_onPojo_exclusiveMinimum() throws Exception {
-		assertObjectEquals("true", getSwagger(new WA()).getPaths().get("/exclusiveMinimum").get("get").getResponse(200).getHeader("H").getExclusiveMinimum());
-	}
-	@Test
-	public void wa21_ResponseHeader_onPojo_uniqueItems() throws Exception {
-		assertObjectEquals("true", getSwagger(new WA()).getPaths().get("/uniqueItems").get("get").getResponse(200).getHeader("H").getUniqueItems());
-	}
-	@Test
-	public void wa22_ResponseHeader_onPojo_items1() throws Exception {
-		assertObjectEquals("{type:'a'}", getSwagger(new WA()).getPaths().get("/items1").get("get").getResponse(200).getHeader("H").getItems());
-	}
-	@Test
-	public void wa23_ResponseHeader_onPojo_items2() throws Exception {
-		assertObjectEquals("{type:'b'}", getSwagger(new WA()).getPaths().get("/items2").get("get").getResponse(200).getHeader("H").getItems());
-	}
-	@Test
-	public void wa24_ResponseHeader_onPojo__default() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new WA()).getPaths().get("/_default1").get("get").getResponse(200).getHeader("H").getDefault());
-	}
-	@Test
-	public void wa25_ResponseHeader_onPojo__default2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new WA()).getPaths().get("/_default2").get("get").getResponse(200).getHeader("H").getDefault());
-	}
-	@Test
-	public void wa26_ResponseHeader_onPojo__enum1() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new WA()).getPaths().get("/_enum1").get("get").getResponse(200).getHeader("H").getEnum());
-	}
-	@Test
-	public void wa27_ResponseHeader_onPojo__enum2() throws Exception {
-		assertObjectEquals("['a','b']", getSwagger(new WA()).getPaths().get("/_enum2").get("get").getResponse(200).getHeader("H").getEnum());
-	}
-	@Test
-	public void wa28_ResponseHeader_onPojo_example1() throws Exception {
-		assertObjectEquals("'a'", getSwagger(new WA()).getPaths().get("/example1").get("get").getResponse(200).getHeader("H").getExample());
-	}
-	@Test
-	public void wa29_ResponseHeader_onPojo_example2() throws Exception {
-		assertObjectEquals("{f1:'b'}", getSwagger(new WA()).getPaths().get("/example2").get("get").getResponse(200).getHeader("H").getExample());
+	public void wa06_ResponseHeader_onPojo_example1() throws Exception {
+		HeaderInfo x = getSwagger(new WA()).getPaths().get("/example1").get("get").getResponse(200).getHeader("H");
+		assertObjectEquals("{f1:'b'}", x.getExample());
 	}
 
 	//=================================================================================================================
@@ -7471,269 +5827,146 @@ public class BasicRestInfoProviderTest {
 	@RestResource()
 	public static class WB {
 
-		public static class WB01 {}
+		public static class WB00 {}
+		
+		@RestMethod(name=GET,path="/basic")
+		public void wb00(
+			@ResponseHeader(
+				name="H",
+				description="a",
+				type="a",
+				format="a",
+				collectionFormat="a",
+				maximum="1",
+				minimum="1",
+				multipleOf="1",
+				maxLength="1",
+				minLength="1",
+				maxItems="1",
+				minItems="1",
+				exclusiveMaximum="true",
+				exclusiveMinimum="true",
+				uniqueItems="true",
+				items=@Items(type="a"),
+				_default="'a'",
+				_enum=" a,b ",
+				example="'a'"
+			) WB00 h) {}
+		
+		public static class WB01a {}
 		
 		@RestMethod(name=GET,path="/code")
-		public void wb01(@ResponseHeader(name="H", code=100) WB01 h) {}
+		public void wb01a(@ResponseHeader(name="H", code=100) WB01a h) {}
 
-		public static class WB02 {}
+		public static class WB01b {}
 		
 		@RestMethod(name=GET,path="/codes")
-		public void wb02(@ResponseHeader(name="H", codes={100,101}) WB02 h) {}
+		public void wb01b(@ResponseHeader(name="H", codes={100,101}) WB01b h) {}
 
-		public static class WB03 {}
+		public static class WB01c {}
 		
 		@RestMethod(name=GET,path="/codeAndCodes")
-		public void wb03(@ResponseHeader(name="H", code=100,codes={101}) WB03 h) {}
+		public void wb01c(@ResponseHeader(name="H", code=100,codes={101}) WB01c h) {}
 
-		public static class WB04 {}
+		public static class WB01d {}
 		
 		@RestMethod(name=GET,path="/nocode")
-		public void wb04(@ResponseHeader(name="H", description="a") WB04 h) {}
+		public void wb01d(@ResponseHeader(name="H", description="a") WB01d h) {}
 
-		public static class WB05 {}
-		
-		@RestMethod(name=GET,path="/name")
-		public void wb05(@ResponseHeader(name="H") WB05 h) {}
-		
-		public static class WB06 {}
+		public static class WB02 {}
 		
 		@RestMethod(name=GET,path="/value")
-		public void wb06(@ResponseHeader("H") WB06 h) {}
-		
-		public static class WB07 {}
-		
-		@RestMethod(name=GET,path="/description1")
-		public void wb07(@ResponseHeader(name="H", description="a") WB07 h) {}
-		
-		public static class WB08 {}
-		
-		@RestMethod(name=GET,path="/description2")
-		public void wb08(@ResponseHeader(name="H", description={"a","b"}) WB08 h) {}
-		
-		public static class WB09 {}
-		
-		@RestMethod(name=GET,path="/type")
-		public void wb09(@ResponseHeader(name="H", type="a") WB09 h) {}
-		
-		public static class WB10 {}
-		
-		@RestMethod(name=GET,path="/format")
-		public void wb10(@ResponseHeader(name="H", format="a") WB10 h) {}
-		
-		public static class WB11 {}
-		
-		@RestMethod(name=GET,path="/collectionFormat")
-		public void wb11(@ResponseHeader(name="H", collectionFormat="a") WB11 h) {}
-		
-		public static class WB12 {}
-		
-		@RestMethod(name=GET,path="/maximum")
-		public void wb12(@ResponseHeader(name="H", maximum="1") WB12 h) {}
-		
-		public static class WB13 {}
-		
-		@RestMethod(name=GET,path="/minimum")
-		public void wb13(@ResponseHeader(name="H", minimum="1") WB13 h) {}
-		
-		public static class WB14 {}
-		
-		@RestMethod(name=GET,path="/multipleOf")
-		public void wb14(@ResponseHeader(name="H", multipleOf="1") WB14 h) {}
-		
-		public static class WB15 {}
-		
-		@RestMethod(name=GET,path="/maxLength")
-		public void wb15(@ResponseHeader(name="H", maxLength="1") WB15 h) {}
-		
-		public static class WB16 {}
-		
-		@RestMethod(name=GET,path="/minLength")
-		public void wb16(@ResponseHeader(name="H", minLength="1") WB16 h) {}
+		public void wb02(@ResponseHeader("H") WB02 h) {}
 		
-		public static class WB17 {}
-		
-		@RestMethod(name=GET,path="/maxItems")
-		public void wb17(@ResponseHeader(name="H", maxItems="1") WB17 h) {}
-		
-		public static class WB18 {}
-		
-		@RestMethod(name=GET,path="/minItems")
-		public void wb18(@ResponseHeader(name="H", minItems="1") WB18 h) {}
-		
-		public static class WB19 {}
-		
-		@RestMethod(name=GET,path="/exclusiveMaximum")
-		public void wb19(@ResponseHeader(name="H", exclusiveMaximum="true") WB19 h) {}
-		
-		public static class WB20 {}
-		
... 396 lines suppressed ...

-- 
To stop receiving notification emails like this one, please contact
jamesbognar@apache.org.