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 2021/02/28 15:41:00 UTC

[juneau] branch master updated: Predefined response beans should extend from apache HttpResponse.

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 4ad5a6d  Predefined response beans should extend from apache HttpResponse.
4ad5a6d is described below

commit 4ad5a6d61ea828e83e6fea37c4cb1c866dccc4aa
Author: JamesBognar <ja...@salesforce.com>
AuthorDate: Sun Feb 28 10:40:42 2021 -0500

    Predefined response beans should extend from apache HttpResponse.
---
 TODO.txt                                           |   1 +
 .../main/ConfigurablePropertyCodeGenerator.java    |   7 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java |  30 +-
 .../java/org/apache/juneau/http/BasicHeader.java   |  12 +-
 .../org/apache/juneau/http/BasicNameValuePair.java |  14 +-
 .../apache/juneau/http/BasicNamedAttribute.java    |  10 +
 .../org/apache/juneau/http/SerializedHeader.java   |  46 ++-
 .../juneau/http/SerializedNameValuePair.java       |  49 ++-
 .../apache/juneau/http/exception/BadRequest.java   |  12 +-
 .../org/apache/juneau/http/exception/Conflict.java |  12 +-
 .../juneau/http/exception/ExpectationFailed.java   |  12 +-
 .../juneau/http/exception/FailedDependency.java    |  12 +-
 .../apache/juneau/http/exception/Forbidden.java    |  12 +-
 .../org/apache/juneau/http/exception/Gone.java     |  12 +-
 .../http/exception/HttpVersionNotSupported.java    |  12 +-
 .../juneau/http/exception/InsufficientStorage.java |  12 +-
 .../juneau/http/exception/InternalServerError.java |  12 +-
 .../juneau/http/exception/LengthRequired.java      |  12 +-
 .../org/apache/juneau/http/exception/Locked.java   |  12 +-
 .../apache/juneau/http/exception/LoopDetected.java |  12 +-
 .../juneau/http/exception/MethodNotAllowed.java    |  12 +-
 .../juneau/http/exception/MisdirectedRequest.java  |  12 +-
 .../exception/NetworkAuthenticationRequired.java   |  12 +-
 .../juneau/http/exception/NotAcceptable.java       |  12 +-
 .../apache/juneau/http/exception/NotExtended.java  |  12 +-
 .../org/apache/juneau/http/exception/NotFound.java |  12 +-
 .../juneau/http/exception/NotImplemented.java      |  12 +-
 .../juneau/http/exception/PayloadTooLarge.java     |  12 +-
 .../juneau/http/exception/PreconditionFailed.java  |  12 +-
 .../http/exception/PreconditionRequired.java       |  12 +-
 .../juneau/http/exception/RangeNotSatisfiable.java |  12 +-
 .../exception/RequestHeaderFieldsTooLarge.java     |  12 +-
 .../juneau/http/exception/ServiceUnavailable.java  |  12 +-
 .../juneau/http/exception/TooManyRequests.java     |  12 +-
 .../apache/juneau/http/exception/Unauthorized.java |  12 +-
 .../http/exception/UnavailableForLegalReasons.java |  12 +-
 .../juneau/http/exception/UnprocessableEntity.java |  12 +-
 .../http/exception/UnsupportedMediaType.java       |  12 +-
 .../juneau/http/exception/UpgradeRequired.java     |  12 +-
 .../apache/juneau/http/exception/UriTooLong.java   |  12 +-
 .../http/exception/VariantAlsoNegotiates.java      |  12 +-
 .../org/apache/juneau/http/response/Accepted.java  |  85 +++++-
 .../juneau/http/response/AlreadyReported.java      |  85 +++++-
 .../juneau/http/response/BasicHttpResponse.java    | 264 ++++++++++++++++
 .../http/response/BasicLocationHttpResponse.java   | 126 ++++++++
 .../org/apache/juneau/http/response/Continue.java  |  85 +++++-
 .../org/apache/juneau/http/response/Created.java   |  85 +++++-
 .../apache/juneau/http/response/EarlyHints.java    |  85 +++++-
 .../org/apache/juneau/http/response/Found.java     | 117 +++++---
 .../apache/juneau/http/response/HttpResponse.java  |  77 -----
 .../org/apache/juneau/http/response/IMUsed.java    |  85 +++++-
 .../juneau/http/response/MovedPermanently.java     | 115 ++++---
 .../apache/juneau/http/response/MultiStatus.java   |  85 +++++-
 .../juneau/http/response/MultipleChoices.java      |  85 +++++-
 .../org/apache/juneau/http/response/NoContent.java |  85 +++++-
 .../http/response/NonAuthoritiveInformation.java   |  85 +++++-
 .../apache/juneau/http/response/NotModified.java   |  85 +++++-
 .../java/org/apache/juneau/http/response/Ok.java   |  87 ++++--
 .../juneau/http/response/PartialContent.java       |  85 +++++-
 .../juneau/http/response/PermanentRedirect.java    | 115 ++++---
 .../apache/juneau/http/response/Processing.java    |  85 +++++-
 .../apache/juneau/http/response/ResetContent.java  |  85 +++++-
 .../org/apache/juneau/http/response/SeeOther.java  | 115 ++++---
 .../juneau/http/response/StandardResponses.java    | 332 +++++++++++++++++++++
 .../juneau/http/response/SwitchingProtocols.java   |  85 +++++-
 .../juneau/http/response/TemporaryRedirect.java    | 115 ++++---
 .../org/apache/juneau/http/response/UseProxy.java  |  85 +++++-
 .../httppart/bean/ResponseBeanPropertyMeta.java    |  15 +-
 .../apache/juneau/rest/client/ResponseBody.java    |  16 +-
 .../org/apache/juneau/rest/client/RestClient.java  |   6 +-
 .../apache/juneau/rest/client/RestResponse.java    |   4 +-
 .../org/apache/juneau/rest/ResponseHandler.java    |   5 +-
 .../java/org/apache/juneau/rest/RestContext.java   |   9 +-
 .../java/org/apache/juneau/rest/RestResponse.java  |  34 +++
 .../apache/juneau/rest/helper/SeeOtherRoot.java    |   5 +-
 .../juneau/rest/reshandlers/DefaultHandler.java    |  59 ++--
 .../rest/reshandlers/InputStreamHandler.java       |   3 +-
 .../juneau/rest/reshandlers/ReaderHandler.java     |   3 +-
 .../apache/juneau/http/SerializedHeader_Test.java  |   6 +-
 .../juneau/http/SerializedNameValuePair_Test.java  |   6 +-
 .../juneau/http/exception/BadRequest_Test.java     |  20 +-
 .../juneau/http/exception/Conflict_Test.java       |  20 +-
 .../http/exception/ExpectationFailed_Test.java     |  20 +-
 .../http/exception/FailedDependency_Test.java      |  20 +-
 .../juneau/http/exception/Forbidden_Test.java      |  20 +-
 .../apache/juneau/http/exception/Gone_Test.java    |  20 +-
 .../exception/HttpVersionNotSupported_Test.java    |  20 +-
 .../http/exception/InsufficentStorage_Test.java    |  20 +-
 .../http/exception/InternalServerError_Test.java   |  20 +-
 .../juneau/http/exception/LengthRequired_Test.java |  20 +-
 .../apache/juneau/http/exception/Locked_Test.java  |  20 +-
 .../juneau/http/exception/LoopDetected_Test.java   |  20 +-
 .../http/exception/MethodNotAllowed_Test.java      |  20 +-
 .../http/exception/MisdirectedRequest_Test.java    |  20 +-
 .../NetworkAuthenticationRequired_Test.java        |  20 +-
 .../juneau/http/exception/NotAcceptable_Test.java  |  20 +-
 .../juneau/http/exception/NotExtended_Test.java    |  20 +-
 .../juneau/http/exception/NotFound_Test.java       |  20 +-
 .../juneau/http/exception/NotImplemented_Test.java |  20 +-
 .../http/exception/PayloadTooLarge_Test.java       |  20 +-
 .../http/exception/PreconditionFailed_Test.java    |  20 +-
 .../http/exception/PreconditionRequired_Test.java  |  20 +-
 .../http/exception/RangeNotSatisfiable_Test.java   |  20 +-
 .../RequestHeaderFieldsTooLarge_Test.java          |  20 +-
 .../http/exception/ServiceUnavailable_Test.java    |  20 +-
 .../http/exception/TooManyRequests_Test.java       |  20 +-
 .../juneau/http/exception/Unauthorized_Test.java   |  20 +-
 .../exception/UnavailableForLegalReasons_Test.java |  20 +-
 .../http/exception/UnprocessableEntity_Test.java   |  20 +-
 .../http/exception/UnsupportedMediaType_Test.java  |  20 +-
 .../http/exception/UpgradeRequired_Test.java       |  20 +-
 .../juneau/http/exception/UriTooLong_Test.java     |  20 +-
 .../http/exception/VariantAlsoNegotiates_Test.java |  20 +-
 .../http/remote/Remote_CommonInterfaces_Test.java  | 154 +++++-----
 .../apache/juneau/http/response/Accepted_Test.java |   7 +-
 .../juneau/http/response/AlreadyReported_Test.java |   7 +-
 .../apache/juneau/http/response/Continue_Test.java |   7 +-
 .../apache/juneau/http/response/Created_Test.java  |   7 +-
 .../juneau/http/response/EarlyHints_Test.java      |   7 +-
 .../apache/juneau/http/response/Found_Test.java    |  12 +-
 .../apache/juneau/http/response/IMUsed_Test.java   |   7 +-
 .../http/response/MovedPermanently_Test.java       |  12 +-
 .../juneau/http/response/MultiStatus_Test.java     |   7 +-
 .../juneau/http/response/MultipleChoices_Test.java |   7 +-
 .../juneau/http/response/NoContent_Test.java       |   7 +-
 .../response/NonAuthoritativeInformation_Test.java |   7 +-
 .../juneau/http/response/NotModified_Test.java     |   7 +-
 .../org/apache/juneau/http/response/Ok_Test.java   |   7 +-
 .../juneau/http/response/PartialContent_Test.java  |   7 +-
 .../http/response/PermanentRedirect_Test.java      |  12 +-
 .../juneau/http/response/Processing_Test.java      |   7 +-
 .../juneau/http/response/ResetContent_Test.java    |   7 +-
 .../apache/juneau/http/response/SeeOther_Test.java |  12 +-
 .../http/response/SwitchingProtocols_Test.java     |   7 +-
 .../http/response/TemporaryRedirect_Test.java      |  12 +-
 .../apache/juneau/http/response/UseProxy_Test.java |   7 +-
 .../apache/juneau/rest/RestOp_Returns_Test.java    | 133 +++++----
 .../org/apache/juneau/rest/RestOp_Throws_Test.java |  66 ++--
 .../client/BasicHttpRequestRetryHandler_Test.java  |   3 +-
 .../client/RestClient_Config_RestClient_Test.java  |   6 +-
 140 files changed, 3288 insertions(+), 1472 deletions(-)

diff --git a/TODO.txt b/TODO.txt
index bc99b12..998379f 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -8,4 +8,5 @@ HttpException subclasses can set status, but does it use code?
 HttpException should use list of Headers and have a headers(Header...) method.
 
 JsonSchema should have fluent getters and setters.
+Break out @Response bean handling into it's own handler.
 
diff --git a/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java b/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
index f1ec8a6..a99746a 100644
--- a/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
+++ b/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
@@ -63,6 +63,7 @@ public class ConfigurablePropertyCodeGenerator {
 		BasicHeader.class,
 		BasicHttpEntity.class,
 		BasicHttpResource.class,
+		BasicLocationHttpResponse.class,
 		BasicNameValuePair.class,
 		BasicRuntimeException.class,
 		BeanAssertion.class,
@@ -126,7 +127,7 @@ public class ConfigurablePropertyCodeGenerator {
 		HtmlSerializerBuilder.class,
 		HtmlStrippedDocSerializerBuilder.class,
 		HttpException.class,
-		HttpResponse.class,
+		BasicHttpResponse.class,
 		HttpVersionNotSupported.class,
 		IMUsed.class,
 		InputStreamParserBuilder.class,
@@ -239,7 +240,9 @@ public class ConfigurablePropertyCodeGenerator {
 
 	static Set<Class<?>> ignoreClasses = ASet.of(
 		org.apache.http.entity.AbstractHttpEntity.class,
-		org.apache.http.entity.BasicHttpEntity.class
+		org.apache.http.entity.BasicHttpEntity.class,
+		org.apache.http.message.AbstractHttpMessage.class,
+		org.apache.http.message.BasicHttpResponse.class
 	);
 
 	private static String[] SOURCE_PATHS = {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 626c937..e0ee8e2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -1041,6 +1041,26 @@ public final class ClassMeta<T> implements Type {
 	}
 
 	/**
+	 * Returns <jk>true</jk> if the specified class is an exact match for this metadata.
+	 *
+	 * @param value The value to check against.
+	 * @return <jk>true</jk> if the specified class is an exact match for this metadata.
+	 */
+	public boolean is(Class<?> value) {
+		return eq(innerClass, value);
+	}
+
+	/**
+	 * Returns <jk>true</jk> if this metadata represents the specified type.
+	 *
+	 * @param c The class to test against.
+	 * @return <jk>true</jk> if this metadata represents the specified type.
+	 */
+	public boolean isChildOf(Class<?> c) {
+		return info.isChildOf(c);
+	}
+
+	/**
 	 * Returns <jk>true</jk> if this class is a subclass of {@link Map}.
 	 *
 	 * @return <jk>true</jk> if this class is a subclass of {@link Map}.
@@ -1257,16 +1277,6 @@ public final class ClassMeta<T> implements Type {
 	}
 
 	/**
-	 * Returns <jk>true</jk> if this metadata represents the specified type.
-	 *
-	 * @param c The class to test against.
-	 * @return <jk>true</jk> if this metadata represents the specified type.
-	 */
-	public boolean isType(Class<?> c) {
-		return info.isChildOf(c);
-	}
-
-	/**
 	 * Returns <jk>true</jk> if this class is a {@link Boolean}.
 	 *
 	 * @return <jk>true</jk> if this class is a {@link Boolean}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicHeader.java
index 819d8f8..a3e6936 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicHeader.java
@@ -162,6 +162,16 @@ public class BasicHeader implements Header, Cloneable, Serializable {
 		this.value = value;
 	}
 
+	/**
+	 * Copy constructor.
+	 *
+	 * @param copyFrom The object to copy.
+	 */
+	protected BasicHeader(BasicHeader copyFrom) {
+		this.name = copyFrom.name;
+		this.value = copyFrom.value;
+	}
+
 	@Override /* Header */
 	public String getName() {
 		return name;
@@ -177,7 +187,7 @@ public class BasicHeader implements Header, Cloneable, Serializable {
 	 *
 	 * @return The raw value of the header.
 	 */
-	protected Object getRawValue() {
+	public Object getRawValue() {
 		return unwrap(value);
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNameValuePair.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNameValuePair.java
index ed3e40c..7a2c114 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNameValuePair.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNameValuePair.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.http;
 
+import static org.apache.juneau.assertions.Assertions.*;
 import static org.apache.juneau.internal.StringUtils.*;
 
 import java.util.*;
@@ -132,6 +133,17 @@ public class BasicNameValuePair implements NameValuePair, Headerable {
 	}
 
 	/**
+	 * Copy constructor.
+	 *
+	 * @param copyFrom The object to copy.
+	 */
+	protected BasicNameValuePair(BasicNameValuePair copyFrom) {
+		assertArgNotNull("copyFrom", copyFrom);
+		this.name = copyFrom.name;
+		this.value = copyFrom.value;
+	}
+
+	/**
 	 * Provides an object for performing assertions against the name of this pair.
 	 *
 	 * @return An object for performing assertions against the name of this pair.
@@ -169,7 +181,7 @@ public class BasicNameValuePair implements NameValuePair, Headerable {
 	 *
 	 * @return The raw value of the parameter.
 	 */
-	protected Object getRawValue() {
+	public Object getRawValue() {
 		return unwrap(value);
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNamedAttribute.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNamedAttribute.java
index b9767c4..255e2bf 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNamedAttribute.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNamedAttribute.java
@@ -83,6 +83,16 @@ public class BasicNamedAttribute implements NamedAttribute {
 	}
 
 	/**
+	 * Copy constructor.
+	 *
+	 * @param copyOf The object to copy.
+	 */
+	protected BasicNamedAttribute(BasicNamedAttribute copyOf) {
+		this.name = copyOf.name;
+		this.value = copyOf.value;
+	}
+
+	/**
 	 * Provides an object for performing assertions against the name of this pair.
 	 *
 	 * @return An object for performing assertions against the name of this pair.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/SerializedHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/SerializedHeader.java
index d4d1690..9fe2b64 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/SerializedHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/SerializedHeader.java
@@ -87,6 +87,28 @@ public class SerializedHeader extends BasicHeader {
 	}
 
 	/**
+	 * Copy constructor.
+	 *
+	 * @param copyFrom The object to copy.
+	 */
+	protected SerializedHeader(SerializedHeader copyFrom) {
+		super(copyFrom);
+		this.value = copyFrom.value;
+		this.serializer = copyFrom.serializer == null ? serializer : copyFrom.serializer;
+		this.schema = copyFrom.schema == null ? schema : copyFrom.schema;
+		this.skipIfEmpty = copyFrom.skipIfEmpty;
+	}
+
+	/**
+	 * Creates a copy of this object.
+	 *
+	 * @return A new copy of this object.
+	 */
+	public SerializedHeader copy() {
+		return new SerializedHeader(this);
+	}
+
+	/**
 	 * Sets the serializer to use for serializing the value to a string value.
 	 *
 	 * @param value The new value for this property.
@@ -105,19 +127,19 @@ public class SerializedHeader extends BasicHeader {
 	 * @return This object (for method chaining).
 	 */
 	public SerializedHeader serializer(HttpPartSerializerSession value) {
-		return serializer(value, true);
+		serializer = value;
+		return this;
 	}
 
 	/**
-	 * Sets the serializer to use for serializing the value to a string value.
+	 * Sets the serializer to use for serializing the value to a string value if it's not already set on this object.
 	 *
 	 * @param value The new value for this property.
-	 * @param overwrite If <jk>true</jk>, overwrites the existing value if the old value is <jk>null</jk>.
 	 * @return This object (for method chaining).
 	 */
-	public SerializedHeader serializer(HttpPartSerializerSession value, boolean overwrite) {
-		if (overwrite || serializer == null)
-			this.serializer = value;
+	public SerializedHeader serializerIfNotSet(HttpPartSerializerSession value) {
+		if (serializer == null)
+			serializer = value;
 		return this;
 	}
 
@@ -133,6 +155,18 @@ public class SerializedHeader extends BasicHeader {
 	}
 
 	/**
+	 * Sets the schema object that defines the format of the output if it's not already set on this object.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 */
+	public SerializedHeader schemaIfNotSet(HttpPartSchema value) {
+		if (schema == null)
+			schema = value;
+		return this;
+	}
+
+	/**
 	 * Don't serialize this header if the value is <jk>null</jk> or an empty string.
 	 *
 	 * @return This object (for method chaining).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/SerializedNameValuePair.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/SerializedNameValuePair.java
index 8a8492b..7a84a8c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/SerializedNameValuePair.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/SerializedNameValuePair.java
@@ -87,13 +87,36 @@ public class SerializedNameValuePair extends BasicNameValuePair implements Heade
 	}
 
 	/**
+	 * Copy constructor.
+	 *
+	 * @param copyFrom The object to copy.
+	 */
+	protected SerializedNameValuePair(SerializedNameValuePair copyFrom) {
+		super(copyFrom);
+		this.value = copyFrom.value;
+		this.type = copyFrom.type;
+		this.serializer = copyFrom.serializer == null ? serializer : copyFrom.serializer;
+		this.schema = copyFrom.schema == null ? schema : copyFrom.schema;
+		this.skipIfEmpty = copyFrom.skipIfEmpty;
+	}
+
+	/**
+	 * Creates a copy of this object.
+	 *
+	 * @return A new copy of this object.
+	 */
+	public SerializedNameValuePair copy() {
+		return new SerializedNameValuePair(this);
+	}
+
+	/**
 	 * Sets the HTTP part type.
 	 *
 	 * @param value The new value for this property.
 	 * @return This object (for method chaining).
 	 */
 	public SerializedNameValuePair type(HttpPartType value) {
-		this.type = value;
+		type = value;
 		return this;
 	}
 
@@ -116,19 +139,19 @@ public class SerializedNameValuePair extends BasicNameValuePair implements Heade
 	 * @return This object (for method chaining).
 	 */
 	public SerializedNameValuePair serializer(HttpPartSerializerSession value) {
-		return serializer(value, true);
+		serializer = value;
+		return this;
 	}
 
 	/**
-	 * Sets the serializer to use for serializing the value to a string value.
+	 * Sets the serializer to use for serializing the value to a string value if it's not already set on this object.
 	 *
 	 * @param value The new value for this property.
-	 * @param overwrite If <jk>true</jk>, overwrites the existing value if the old value is <jk>null</jk>.
 	 * @return This object (for method chaining).
 	 */
-	public SerializedNameValuePair serializer(HttpPartSerializerSession value, boolean overwrite) {
-		if (overwrite || serializer == null)
-			this.serializer = value;
+	public SerializedNameValuePair serializerIfNotSet(HttpPartSerializerSession value) {
+		if (serializer == null)
+			serializer = value;
 		return this;
 	}
 
@@ -144,6 +167,18 @@ public class SerializedNameValuePair extends BasicNameValuePair implements Heade
 	}
 
 	/**
+	 * Sets the schema object that defines the format of the output if it's not already set on this object.
+	 *
+	 * @param value The new value for this property.
+	 * @return This object (for method chaining).
+	 */
+	public SerializedNameValuePair schemaIfNotSet(HttpPartSchema value) {
+		if (schema == null)
+			schema = value;
+		return this;
+	}
+
+	/**
 	 * Don't serialize this pair if the value is <jk>null</jk> or an empty string.
 	 *
 	 * @return This object (for method chaining).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/BadRequest.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/BadRequest.java
index 40aa166..f87cdea 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/BadRequest.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/BadRequest.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing).
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class BadRequest extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 400;
+	public static final int STATUS_CODE = 400;
 
-	/** Default message */
-	public static final String MESSAGE = "Bad Request";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Bad Request";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class BadRequest extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public BadRequest(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class BadRequest extends HttpException {
 	 * Constructor.
 	 */
 	public BadRequest() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Conflict.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Conflict.java
index 06cd291..b86b11d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Conflict.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Conflict.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * Indicates that the request could not be processed because of conflict in the request, such as an edit conflict between multiple simultaneous updates.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class Conflict extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 409;
+	public static final int STATUS_CODE = 409;
 
-	/** Default message */
-	public static final String MESSAGE = "Conflict";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Conflict";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class Conflict extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public Conflict(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class Conflict extends HttpException {
 	 * Constructor.
 	 */
 	public Conflict() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ExpectationFailed.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ExpectationFailed.java
index c334085..1bc7ea2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ExpectationFailed.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ExpectationFailed.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server cannot meet the requirements of the Expect request-header field.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class ExpectationFailed extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 417;
+	public static final int STATUS_CODE = 417;
 
-	/** Default message */
-	public static final String MESSAGE = "Expectation Failed";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Expectation Failed";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class ExpectationFailed extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public ExpectationFailed(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class ExpectationFailed extends HttpException {
 	 * Constructor.
 	 */
 	public ExpectationFailed() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/FailedDependency.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/FailedDependency.java
index 9d8d8a8..565f7aa 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/FailedDependency.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/FailedDependency.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The request failed because it depended on another request and that request failed (e.g., a PROPPATCH).
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class FailedDependency extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 424;
+	public static final int STATUS_CODE = 424;
 
-	/** Default message */
-	public static final String MESSAGE = "Failed Dependency";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Failed Dependency";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class FailedDependency extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public FailedDependency(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class FailedDependency extends HttpException {
 	 * Constructor.
 	 */
 	public FailedDependency() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Forbidden.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Forbidden.java
index 539fdfb..46c1167 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Forbidden.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Forbidden.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The request was valid, but the server is refusing action.
  * <br>The user might not have the necessary permissions for a resource, or may need an account of some sort.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class Forbidden extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 403;
+	public static final int STATUS_CODE = 403;
 
-	/** Default message */
-	public static final String MESSAGE = "Forbidden";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Forbidden";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class Forbidden extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public Forbidden(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class Forbidden extends HttpException {
 	 * Constructor.
 	 */
 	public Forbidden() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Gone.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Gone.java
index 4881174..01465fa 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Gone.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Gone.java
@@ -29,16 +29,16 @@ import org.apache.juneau.internal.*;
  * <br>Clients such as search engines should remove the resource from their indices.
  * <br>Most use cases do not require clients and search engines to purge the resource, and a <js>"404 Not Found"</js> may be used instead.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class Gone extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 410;
+	public static final int STATUS_CODE = 410;
 
-	/** Default message */
-	public static final String MESSAGE = "Gone";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Gone";
 
 	/**
 	 * Constructor.
@@ -48,7 +48,7 @@ public class Gone extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public Gone(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -64,7 +64,7 @@ public class Gone extends HttpException {
 	 * Constructor.
 	 */
 	public Gone() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpVersionNotSupported.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpVersionNotSupported.java
index f96b4eb..906d8e9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpVersionNotSupported.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/HttpVersionNotSupported.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server does not support the HTTP protocol version used in the request.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class HttpVersionNotSupported extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 505;
+	public static final int STATUS_CODE = 505;
 
-	/** Default message */
-	public static final String MESSAGE = "HTTP Version Not Supported";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "HTTP Version Not Supported";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class HttpVersionNotSupported extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public HttpVersionNotSupported(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class HttpVersionNotSupported extends HttpException {
 	 * Constructor.
 	 */
 	public HttpVersionNotSupported() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InsufficientStorage.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InsufficientStorage.java
index 07eb19c..45cb8b5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InsufficientStorage.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InsufficientStorage.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server is unable to store the representation needed to complete the request.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class InsufficientStorage extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 507;
+	public static final int STATUS_CODE = 507;
 
-	/** Default message */
-	public static final String MESSAGE = "Insufficient Storage";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Insufficient Storage";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class InsufficientStorage extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public InsufficientStorage(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class InsufficientStorage extends HttpException {
 	 * Constructor.
 	 */
 	public InsufficientStorage() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InternalServerError.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InternalServerError.java
index 5722c86..c3bf1ef 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InternalServerError.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/InternalServerError.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class InternalServerError extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 500;
+	public static final int STATUS_CODE = 500;
 
-	/** Default message */
-	public static final String MESSAGE = "Internal Server Error";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Internal Server Error";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class InternalServerError extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public InternalServerError(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class InternalServerError extends HttpException {
 	 * Constructor.
 	 */
 	public InternalServerError() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LengthRequired.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LengthRequired.java
index e716441..e768d10 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LengthRequired.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LengthRequired.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The request did not specify the length of its content, which is required by the requested resource.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class LengthRequired extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 411;
+	public static final int STATUS_CODE = 411;
 
-	/** Default message */
-	public static final String MESSAGE = "Length Required";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Length Required";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class LengthRequired extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public LengthRequired(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class LengthRequired extends HttpException {
 	 * Constructor.
 	 */
 	public LengthRequired() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Locked.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Locked.java
index 1883d67..95093b9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Locked.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Locked.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The resource that is being accessed is locked.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class Locked extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 423;
+	public static final int STATUS_CODE = 423;
 
-	/** Default message */
-	public static final String MESSAGE = "Locked";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Locked";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class Locked extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public Locked(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class Locked extends HttpException {
 	 * Constructor.
 	 */
 	public Locked() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LoopDetected.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LoopDetected.java
index 46853ed..6d29dfe 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LoopDetected.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/LoopDetected.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server detected an infinite loop while processing the request (sent in lieu of 208 Already Reported).
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class LoopDetected extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 508;
+	public static final int STATUS_CODE = 508;
 
-	/** Default message */
-	public static final String MESSAGE = "Loop Detected";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Loop Detected";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class LoopDetected extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public LoopDetected(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class LoopDetected extends HttpException {
 	 * Constructor.
 	 */
 	public LoopDetected() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MethodNotAllowed.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MethodNotAllowed.java
index 3128528..42cad4b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MethodNotAllowed.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MethodNotAllowed.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * A request method is not supported for the requested resource; for example, a GET request on a form that requires data to be presented via POST, or a PUT request on a read-only resource.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class MethodNotAllowed extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 405;
+	public static final int STATUS_CODE = 405;
 
-	/** Default message */
-	public static final String MESSAGE = "Method Not Allowed";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Method Not Allowed";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class MethodNotAllowed extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public MethodNotAllowed(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class MethodNotAllowed extends HttpException {
 	 * Constructor.
 	 */
 	public MethodNotAllowed() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MisdirectedRequest.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MisdirectedRequest.java
index 619be1b..6e06243 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MisdirectedRequest.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/MisdirectedRequest.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The request was directed at a server that is not able to produce a response (for example because of connection reuse).
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class MisdirectedRequest extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 421;
+	public static final int STATUS_CODE = 421;
 
-	/** Default message */
-	public static final String MESSAGE = "Misdirected Request";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Misdirected Request";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class MisdirectedRequest extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public MisdirectedRequest(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class MisdirectedRequest extends HttpException {
 	 * Constructor.
 	 */
 	public MisdirectedRequest() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired.java
index 4f2d3a5..d85d0d8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The client needs to authenticate to gain network access.
  * <br>Intended for use by intercepting proxies used to control access to the network (e.g., "captive portals" used to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot).
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class NetworkAuthenticationRequired extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 511;
+	public static final int STATUS_CODE = 511;
 
-	/** Default message */
-	public static final String MESSAGE = "Network Authentication Required";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Network Authentication Required";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class NetworkAuthenticationRequired extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public NetworkAuthenticationRequired(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class NetworkAuthenticationRequired extends HttpException {
 	 * Constructor.
 	 */
 	public NetworkAuthenticationRequired() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotAcceptable.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotAcceptable.java
index 984c6a7..b885d3b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotAcceptable.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotAcceptable.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <br>
  * The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class NotAcceptable extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 406;
+	public static final int STATUS_CODE = 406;
 
-	/** Default message */
-	public static final String MESSAGE = "Not Acceptable";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Not Acceptable";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class NotAcceptable extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public NotAcceptable(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class NotAcceptable extends HttpException {
 	 * Constructor.
 	 */
 	public NotAcceptable() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotExtended.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotExtended.java
index 7630323..68e5f80 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotExtended.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotExtended.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * Further extensions to the request are required for the server to fulfill it.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class NotExtended extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 510;
+	public static final int STATUS_CODE = 510;
 
-	/** Default message */
-	public static final String MESSAGE = "Not Extended";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Not Extended";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class NotExtended extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public NotExtended(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class NotExtended extends HttpException {
 	 * Constructor.
 	 */
 	public NotExtended() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotFound.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotFound.java
index c02480b..49c795a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotFound.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotFound.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The requested resource could not be found but may be available in the future.
  * <br>Subsequent requests by the client are permissible.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class NotFound extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 404;
+	public static final int STATUS_CODE = 404;
 
-	/** Default message */
-	public static final String MESSAGE = "Not Found";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Not Found";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class NotFound extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public NotFound(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class NotFound extends HttpException {
 	 * Constructor.
 	 */
 	public NotFound() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotImplemented.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotImplemented.java
index fce8d4a..32f8ffd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotImplemented.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/NotImplemented.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The server either does not recognize the request method, or it lacks the ability to fulfill the request.
  * <br>Usually this implies future availability (e.g., a new feature of a web-service API).
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class NotImplemented extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 501;
+	public static final int STATUS_CODE = 501;
 
-	/** Default message */
-	public static final String MESSAGE = "Not Implemented";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Not Implemented";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class NotImplemented extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public NotImplemented(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class NotImplemented extends HttpException {
 	 * Constructor.
 	 */
 	public NotImplemented() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PayloadTooLarge.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PayloadTooLarge.java
index 33e313c..b9bf014 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PayloadTooLarge.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PayloadTooLarge.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The request is larger than the server is willing or able to process.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class PayloadTooLarge extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 413;
+	public static final int STATUS_CODE = 413;
 
-	/** Default message */
-	public static final String MESSAGE = "Payload Too Large";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Payload Too Large";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class PayloadTooLarge extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public PayloadTooLarge(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class PayloadTooLarge extends HttpException {
 	 * Constructor.
 	 */
 	public PayloadTooLarge() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionFailed.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionFailed.java
index 8a8cfbd..8caae95 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionFailed.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionFailed.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server does not meet one of the preconditions that the requester put on the request.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class PreconditionFailed extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 412;
+	public static final int STATUS_CODE = 412;
 
-	/** Default message */
-	public static final String MESSAGE = "Precondition Failed";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Precondition Failed";
 
 	/**
 	 * Constructor.
@@ -44,14 +44,14 @@ public class PreconditionFailed extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public PreconditionFailed(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
 	 * Constructor.
 	 */
 	public PreconditionFailed() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionRequired.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionRequired.java
index 8e81b6f..1b79123 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionRequired.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/PreconditionRequired.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The origin server requires the request to be conditional.
  * <br>Intended to prevent the 'lost update' problem, where a client GETs a resource's state, modifies it, and PUTs it back to the server, when meanwhile a third party has modified the state on the server, leading to a conflict.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class PreconditionRequired extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 428;
+	public static final int STATUS_CODE = 428;
 
-	/** Default message */
-	public static final String MESSAGE = "Precondition Required";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Precondition Required";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class PreconditionRequired extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public PreconditionRequired(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class PreconditionRequired extends HttpException {
 	 * Constructor.
 	 */
 	public PreconditionRequired() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RangeNotSatisfiable.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RangeNotSatisfiable.java
index c23b849..9fd3eed 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RangeNotSatisfiable.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RangeNotSatisfiable.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The client has asked for a portion of the file (byte serving), but the server cannot supply that portion.
  * <br>For example, if the client asked for a part of the file that lies beyond the end of the file.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class RangeNotSatisfiable extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 416;
+	public static final int STATUS_CODE = 416;
 
-	/** Default message */
-	public static final String MESSAGE = "Range Not Satisfiable";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Range Not Satisfiable";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class RangeNotSatisfiable extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public RangeNotSatisfiable(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class RangeNotSatisfiable extends HttpException {
 	 * Constructor.
 	 */
 	public RangeNotSatisfiable() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge.java
index 2b13bee..aec88c0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class RequestHeaderFieldsTooLarge extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 431;
+	public static final int STATUS_CODE = 431;
 
-	/** Default message */
-	public static final String MESSAGE = "Request Header Fields Too Large";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Request Header Fields Too Large";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class RequestHeaderFieldsTooLarge extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public RequestHeaderFieldsTooLarge(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class RequestHeaderFieldsTooLarge extends HttpException {
 	 * Constructor.
 	 */
 	public RequestHeaderFieldsTooLarge() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ServiceUnavailable.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ServiceUnavailable.java
index 10ca1a0..3b609cc 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ServiceUnavailable.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/ServiceUnavailable.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The server is currently unavailable (because it is overloaded or down for maintenance).
  * <br>Generally, this is a temporary state.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class ServiceUnavailable extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 503;
+	public static final int STATUS_CODE = 503;
 
-	/** Default message */
-	public static final String MESSAGE = "Service Unavailable";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Service Unavailable";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class ServiceUnavailable extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public ServiceUnavailable(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class ServiceUnavailable extends HttpException {
 	 * Constructor.
 	 */
 	public ServiceUnavailable() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/TooManyRequests.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/TooManyRequests.java
index 7eeea88..2e055d3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/TooManyRequests.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/TooManyRequests.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The user has sent too many requests in a given amount of time.
  * <br>Intended for use with rate-limiting schemes.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class TooManyRequests extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 429;
+	public static final int STATUS_CODE = 429;
 
-	/** Default message */
-	public static final String MESSAGE = "Too Many Requests";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Too Many Requests";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class TooManyRequests extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public TooManyRequests(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class TooManyRequests extends HttpException {
 	 * Constructor.
 	 */
 	public TooManyRequests() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Unauthorized.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Unauthorized.java
index 6b3252a..3dbd83e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Unauthorized.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/Unauthorized.java
@@ -28,16 +28,16 @@ import org.apache.juneau.internal.*;
  * <br>401 semantically means "unauthenticated",i.e. the user does not have the necessary credentials.
  * <br>Note: Some sites issue HTTP 401 when an IP address is banned from the website (usually the website domain) and that specific address is refused permission to access a website.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class Unauthorized extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 401;
+	public static final int STATUS_CODE = 401;
 
-	/** Default message */
-	public static final String MESSAGE = "Unauthorized";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Unauthorized";
 
 	/**
 	 * Constructor.
@@ -47,7 +47,7 @@ public class Unauthorized extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public Unauthorized(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -63,7 +63,7 @@ public class Unauthorized extends HttpException {
 	 * Constructor.
 	 */
 	public Unauthorized() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnavailableForLegalReasons.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnavailableForLegalReasons.java
index 84b4fed..b6577ea 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnavailableForLegalReasons.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnavailableForLegalReasons.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * A server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class UnavailableForLegalReasons extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 451;
+	public static final int STATUS_CODE = 451;
 
-	/** Default message */
-	public static final String MESSAGE = "Unavailable For Legal Reasons";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Unavailable For Legal Reasons";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class UnavailableForLegalReasons extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public UnavailableForLegalReasons(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class UnavailableForLegalReasons extends HttpException {
 	 * Constructor.
 	 */
 	public UnavailableForLegalReasons() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnprocessableEntity.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnprocessableEntity.java
index 27d99d6..511e297 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnprocessableEntity.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnprocessableEntity.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The request was well-formed but was unable to be followed due to semantic errors.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class UnprocessableEntity extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 422;
+	public static final int STATUS_CODE = 422;
 
-	/** Default message */
-	public static final String MESSAGE = "Unprocessable Entity";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Unprocessable Entity";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class UnprocessableEntity extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public UnprocessableEntity(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class UnprocessableEntity extends HttpException {
 	 * Constructor.
 	 */
 	public UnprocessableEntity() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnsupportedMediaType.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnsupportedMediaType.java
index 839528e..56cedac 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnsupportedMediaType.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UnsupportedMediaType.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The request entity has a media type which the server or resource does not support.
  * <br>For example, the client uploads an image as image/svg+xml, but the server requires that images use a different format.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class UnsupportedMediaType extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 415;
+	public static final int STATUS_CODE = 415;
 
-	/** Default message */
-	public static final String MESSAGE = "Unsupported Media Type";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Unsupported Media Type";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class UnsupportedMediaType extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public UnsupportedMediaType(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class UnsupportedMediaType extends HttpException {
 	 * Constructor.
 	 */
 	public UnsupportedMediaType() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UpgradeRequired.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UpgradeRequired.java
index 550adb1..ea9ed4a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UpgradeRequired.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UpgradeRequired.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class UpgradeRequired extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 426;
+	public static final int STATUS_CODE = 426;
 
-	/** Default message */
-	public static final String MESSAGE = "Upgrade Required";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Upgrade Required";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class UpgradeRequired extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public UpgradeRequired(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class UpgradeRequired extends HttpException {
 	 * Constructor.
 	 */
 	public UpgradeRequired() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UriTooLong.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UriTooLong.java
index 573a7ac..e22852f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UriTooLong.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/UriTooLong.java
@@ -26,16 +26,16 @@ import org.apache.juneau.internal.*;
  * The URI provided was too long for the server to process.
  * <br>Often the result of too much data being encoded as a query-string of a GET request, in which case it should be converted to a POST request.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class UriTooLong extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 414;
+	public static final int STATUS_CODE = 414;
 
-	/** Default message */
-	public static final String MESSAGE = "URI Too Long";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "URI Too Long";
 
 	/**
 	 * Constructor.
@@ -45,7 +45,7 @@ public class UriTooLong extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public UriTooLong(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -61,7 +61,7 @@ public class UriTooLong extends HttpException {
 	 * Constructor.
 	 */
 	public UriTooLong() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/VariantAlsoNegotiates.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/VariantAlsoNegotiates.java
index 4012d97..83dc16b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/VariantAlsoNegotiates.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/exception/VariantAlsoNegotiates.java
@@ -25,16 +25,16 @@ import org.apache.juneau.internal.*;
  * <p>
  * Transparent content negotiation for the request results in a circular reference.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
 public class VariantAlsoNegotiates extends HttpException {
 	private static final long serialVersionUID = 1L;
 
 	/** HTTP status code */
-	public static final int CODE = 506;
+	public static final int STATUS_CODE = 506;
 
-	/** Default message */
-	public static final String MESSAGE = "Variant Also Negotiates";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Variant Also Negotiates";
 
 	/**
 	 * Constructor.
@@ -44,7 +44,7 @@ public class VariantAlsoNegotiates extends HttpException {
 	 * @param args Optional {@link MessageFormat}-style arguments in the message.
 	 */
 	public VariantAlsoNegotiates(Throwable cause, String msg, Object...args) {
-		super(cause, CODE, msg, args);
+		super(cause, STATUS_CODE, msg, args);
 	}
 
 	/**
@@ -60,7 +60,7 @@ public class VariantAlsoNegotiates extends HttpException {
 	 * Constructor.
 	 */
 	public VariantAlsoNegotiates() {
-		this((Throwable)null, MESSAGE);
+		this((Throwable)null, REASON_PHRASE);
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Accepted.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Accepted.java
index ec868cd..5113997 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Accepted.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Accepted.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.Accepted.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -24,32 +26,47 @@ import org.apache.juneau.internal.*;
  * The request has been accepted for processing, but the processing has not been completed.
  * The request might or might not be eventually acted upon, and may be disallowed when processing occurs.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class Accepted extends HttpResponse {
+public class Accepted extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 202;
+	public static final int STATUS_CODE = 202;
 
-	/** Default message */
-	public static final String MESSAGE = "Accepted";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Accepted";
 
-	/** Reusable instance. */
-	public static final Accepted INSTANCE = new Accepted();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final Accepted INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static Accepted create() {
+		return new Accepted();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public Accepted() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public Accepted(String message) {
-		super(message);
+	public Accepted(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -58,9 +75,45 @@ public class Accepted extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public Accepted header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public Accepted body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Accepted body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Accepted header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Accepted headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Accepted reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Accepted statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Accepted unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/AlreadyReported.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/AlreadyReported.java
index 1c8c208..5dd6991 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/AlreadyReported.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/AlreadyReported.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.AlreadyReported.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -23,32 +25,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, and are not being included again.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class AlreadyReported extends HttpResponse {
+public class AlreadyReported extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 208;
+	public static final int STATUS_CODE = 208;
 
-	/** Default message */
-	public static final String MESSAGE = "Already Reported";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Already Reported";
 
-	/** Reusable instance. */
-	public static final AlreadyReported INSTANCE = new AlreadyReported();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final AlreadyReported INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static AlreadyReported create() {
+		return new AlreadyReported();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public AlreadyReported() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public AlreadyReported(String message) {
-		super(message);
+	public AlreadyReported(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -57,9 +74,45 @@ public class AlreadyReported extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public AlreadyReported header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public AlreadyReported body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public AlreadyReported body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public AlreadyReported header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public AlreadyReported headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public AlreadyReported reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public AlreadyReported statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public AlreadyReported unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
new file mode 100644
index 0000000..40c9d8c
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
@@ -0,0 +1,264 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              *
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.http.response;
+
+import java.io.*;
+import java.util.*;
+
+import org.apache.http.*;
+import org.apache.http.Header;
+import org.apache.http.entity.*;
+import org.apache.http.message.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.http.BasicHeader;
+import org.apache.juneau.http.annotation.*;
+import org.apache.juneau.internal.*;
+
+/**
+ * Superclass of all predefined responses in this package.
+ */
+@Response
+@BeanIgnore
+@FluentSetters
+public abstract class BasicHttpResponse extends org.apache.http.message.BasicHttpResponse {
+
+	private boolean unmodifiable;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param statusCode The HTTP status code.
+	 * @param reasonPhrase The HTTP status reason phrase.
+	 */
+	protected BasicHttpResponse(int statusCode, String reasonPhrase) {
+		this(new BasicStatusLine(new ProtocolVersion("HTTP",1,1), statusCode, reasonPhrase));
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param statusLine The HTTP status line.
+	 */
+	protected BasicHttpResponse(StatusLine statusLine) {
+		super(statusLine);
+	}
+
+	/**
+	 * Overrides the status code on this response.
+	 *
+	 * @param value The new status code value.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicHttpResponse statusCode(int value) {
+		setStatusCode(value);
+		return this;
+	}
+
+	/**
+	 * Overrides the reason phrase on this response.
+	 *
+	 * @param value The new reason value.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicHttpResponse reasonPhrase(String value) {
+		setReasonPhrase(value);
+		return this;
+	}
+
+	/**
+	 * Adds a header to this response.
+	 *
+	 * @param name The header name.
+	 * @param value The header value.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicHttpResponse header(String name, Object value) {
+		addHeader(new BasicHeader(name, value));
+		return this;
+	}
+
+	/**
+	 * Adds headers to this response.
+	 *
+	 * @param values The header values.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicHttpResponse headers(Header...values) {
+		for (Header h : values)
+			if (h != null)
+				addHeader(h);
+		return this;
+	}
+
+	/**
+	 * Sets the entity on this response.
+	 *
+	 * @param value The entity on this response.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicHttpResponse body(HttpEntity value) {
+		setEntity(value);
+		return this;
+	}
+
+	/**
+	 * Sets the entity on this response.
+	 *
+	 * @param value The entity on this response.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicHttpResponse body(String value) {
+		try {
+			setEntity(value == null ? null : new StringEntity(value));
+		} catch (UnsupportedEncodingException e) { /* Not possible */ }
+		return this;
+	}
+
+	/**
+	 * Causes any modifications to this bean to throw an {@link UnsupportedOperationException}.
+	 *
+	 * <p>
+	 * TODO - Need to make sure headers are not modifiable through various getters.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicHttpResponse unmodifiable() {
+		this.unmodifiable = true;
+		return this;
+	}
+
+	/**
+	 * Throws an {@link UnsupportedOperationException} if the unmodifiable flag is set on this bean.
+	 */
+	protected void assertModifiable() {
+		if (unmodifiable)
+			throw new UnsupportedOperationException("Bean is read-only");
+	}
+
+	@Override
+	public void setStatusLine(StatusLine value) {
+		assertModifiable();
+		super.setStatusLine(value);
+	}
+
+	@Override
+	public void setStatusLine(ProtocolVersion ver, int code) {
+		assertModifiable();
+		super.setStatusLine(ver, code);
+	}
+
+	@Override
+	public void setStatusLine(ProtocolVersion ver, int code, String reason) {
+		assertModifiable();
+		super.setStatusLine(ver, code, reason);
+	}
+
+	@Override
+	public void setStatusCode(int value) {
+		assertModifiable();
+		super.setStatusCode(value);
+	}
+
+	@Override
+	public void setReasonPhrase(String value) {
+		assertModifiable();
+		super.setReasonPhrase(value);
+	}
+
+	@Override
+	public void setEntity(HttpEntity value) {
+		assertModifiable();
+		super.setEntity(value);
+	}
+
+	@Override
+	public void setLocale(Locale value) {
+		assertModifiable();
+		super.setLocale(value);
+	}
+
+	@Override
+	public void addHeader(Header value) {
+		assertModifiable();
+		super.addHeader(value);
+	}
+
+	@Override
+	public void addHeader(String name, String value) {
+		assertModifiable();
+		super.addHeader(name, value);
+	}
+
+	@Override
+	public void setHeader(Header value) {
+		assertModifiable();
+		super.setHeader(value);
+	}
+
+	@Override
+	public void setHeader(String name, String value) {
+		assertModifiable();
+		super.setHeader(name, value);
+	}
+
+	@Override
+	public void setHeaders(Header[] value) {
+		assertModifiable();
+		super.setHeaders(value);
+	}
+
+	@Override
+	public void removeHeader(Header value) {
+		assertModifiable();
+		super.removeHeader(value);
+	}
+
+	@Override
+	public void removeHeaders(String name) {
+		assertModifiable();
+		super.removeHeaders(name);
+	}
+
+	@ResponseHeader("*")
+	@Override /* Resource */
+	public Header[] getAllHeaders() {
+		return super.getAllHeaders();
+	}
+
+	/**
+	 * Returns the status code on this response.
+	 *
+	 * @return The status code on this response.
+	 */
+	@ResponseStatus
+	public int getStatusCode() {
+		return super.getStatusLine().getStatusCode();
+	}
+
+	@Override
+	@ResponseBody
+	public HttpEntity getEntity() {
+		return super.getEntity();
+	}
+
+	// <FluentSetters>
+
+	// </FluentSetters>
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicLocationHttpResponse.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicLocationHttpResponse.java
new file mode 100644
index 0000000..ec9dd3e
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicLocationHttpResponse.java
@@ -0,0 +1,126 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              *
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.http.response;
+
+import java.net.*;
+
+import org.apache.http.*;
+import org.apache.http.Header;
+import org.apache.juneau.http.annotation.*;
+import org.apache.juneau.internal.*;
+
+/**
+ * Superclass of all predefined responses in this package that typically include a <c>Location</c> header.
+ */
+@FluentSetters
+public abstract class BasicLocationHttpResponse extends BasicHttpResponse {
+
+	private URI location;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param statusCode The HTTP status code.
+	 * @param reasonPhrase The HTTP status reason phrase.
+	 */
+	protected BasicLocationHttpResponse(int statusCode, String reasonPhrase) {
+		super(statusCode, reasonPhrase);
+	}
+
+	/**
+	 * Constructor.
+	 *
+	 * @param statusLine The HTTP status line.
+	 */
+	protected BasicLocationHttpResponse(StatusLine statusLine) {
+		super(statusLine);
+	}
+
+	/**
+	 * Specifies the value for the <c>Location</c> header.
+	 *
+	 * @param value The new header location.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicLocationHttpResponse location(URI value) {
+		assertModifiable();
+		this.location = value;
+		return this;
+	}
+
+	/**
+	 * Specifies the value for the <c>Location</c> header.
+	 *
+	 * @param value The new header location.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public BasicLocationHttpResponse location(String value) {
+		return location(URI.create(value));
+	}
+
+	/**
+	 * @return <c>Location</c> header value.
+	 */
+	@ResponseHeader(name="Location", description="Location of resource.")
+	public URI getLocation() {
+		return location;
+	}
+
+	// <FluentSetters>
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public BasicLocationHttpResponse body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public BasicLocationHttpResponse body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public BasicLocationHttpResponse header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public BasicLocationHttpResponse headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public BasicLocationHttpResponse reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public BasicLocationHttpResponse statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public BasicLocationHttpResponse unmodifiable() {
+		super.unmodifiable();
+		return this;
+	}
+
+	// </FluentSetters>
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Continue.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Continue.java
index 53ee30e..59f638d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Continue.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Continue.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.Continue.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -27,32 +29,47 @@ import org.apache.juneau.internal.*;
  * If the client receives an error code such as 403 (Forbidden) or 405 (Method Not Allowed) then it shouldn't send the request's body.
  * The response 417 Expectation Failed indicates that the request should be repeated without the Expect header as it indicates that the server doesn't support expectations (this is the case, for example, of HTTP/1.0 servers).
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class Continue extends HttpResponse {
+public class Continue extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 100;
+	public static final int STATUS_CODE = 100;
 
-	/** Default message */
-	public static final String MESSAGE = "Continue";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Continue";
 
-	/** Reusable instance.*/
-	public static final Continue INSTANCE = new Continue();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final Continue INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static Continue create() {
+		return new Continue();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public Continue() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public Continue(String message) {
-		super(message);
+	public Continue(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -61,9 +78,45 @@ public class Continue extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public Continue header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public Continue body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Continue body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Continue header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Continue headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Continue reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Continue statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Continue unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Created.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Created.java
index 219066c..1974c68 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Created.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Created.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.Created.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -23,32 +25,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * The request has been fulfilled, resulting in the creation of a new resource.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class Created extends HttpResponse {
+public class Created extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 201;
+	public static final int STATUS_CODE = 201;
 
-	/** Default message */
-	public static final String MESSAGE = "Created";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Created";
 
-	/** Reusable instance. */
-	public static final Created INSTANCE = new Created();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final Created INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static Created create() {
+		return new Created();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public Created() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public Created(String message) {
-		super(message);
+	public Created(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -57,9 +74,45 @@ public class Created extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public Created header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public Created body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Created body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Created header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Created headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Created reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Created statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Created unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/EarlyHints.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/EarlyHints.java
index b32cebb..0f5f7ef 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/EarlyHints.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/EarlyHints.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.EarlyHints.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -23,32 +25,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * Used to return some response headers before final HTTP message.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class EarlyHints extends HttpResponse {
+public class EarlyHints extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 103;
+	public static final int STATUS_CODE = 103;
 
-	/** Default message */
-	public static final String MESSAGE = "Early Hints";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Early Hints";
 
-	/** Reusable instance. */
-	public static final EarlyHints INSTANCE = new EarlyHints();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final EarlyHints INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static EarlyHints create() {
+		return new EarlyHints();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public EarlyHints() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public EarlyHints(String message) {
-		super(message);
+	public EarlyHints(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -57,9 +74,45 @@ public class EarlyHints extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public EarlyHints header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public EarlyHints body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public EarlyHints body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public EarlyHints header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public EarlyHints headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public EarlyHints reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public EarlyHints statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public EarlyHints unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Found.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Found.java
index df89082..15f4d83 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Found.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Found.java
@@ -12,10 +12,12 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.http.response;
 
-import java.net.*;
-
 import static org.apache.juneau.http.response.Found.*;
 
+import java.net.*;
+
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -29,64 +31,47 @@ import org.apache.juneau.internal.*;
  * Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviours.
  * However, some Web applications and frameworks use the 302 status code as if it were the 303.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class Found extends HttpResponse {
+public class Found extends BasicLocationHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 302;
+	public static final int STATUS_CODE = 302;
 
 	/** Default message */
-	public static final String MESSAGE = "Found";
-
-	/** Reusable instance. */
-	public static final Found INSTANCE = new Found();
-
-	private final URI location;
-
-	/**
-	 * Constructor using HTTP-standard message.
-	 */
-	public Found() {
-		this(MESSAGE, null);
-	}
+	public static final String REASON_PHRASE = "Found";
 
 	/**
-	 * Constructor with no redirect.
-	 * <p>
-	 * Used for end-to-end interfaces.
+	 * Default unmodifiable instance.
 	 *
-	 * @param message Message to send as the response.
+	 * <br>Response body contains the reason phrase.
 	 */
-	public Found(String message) {
-		super(message);
-		this.location = null;
-	}
+	public static final Found INSTANCE = create().body(REASON_PHRASE).unmodifiable();
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
-	 * @param location <c>Location</c> header value.
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
 	 */
-	public Found(String message, URI location) {
-		super(message);
-		this.location = location;
+	public static Found create() {
+		return new Found();
 	}
 
 	/**
 	 * Constructor.
-	 * @param location <c>Location</c> header value.
 	 */
-	public Found(URI location) {
-		this(MESSAGE, location);
+	public Found() {
+		this(null);
 	}
 
 	/**
-	 * @return <c>Location</c> header value.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	@ResponseHeader(name="Location", description="Location of resource.")
-	public URI getLocation() {
-		return location;
+	public Found(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -95,9 +80,57 @@ public class Found extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public Found header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public Found body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Found body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Found header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Found headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Found reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Found statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Found unmodifiable() {
+		super.unmodifiable();
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public Found location(String value) {
+		super.location(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public Found location(URI value) {
+		super.location(value);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponse.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponse.java
deleted file mode 100644
index 8f726c3..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponse.java
+++ /dev/null
@@ -1,77 +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.http.response;
-
-import java.util.*;
-
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.collections.*;
-import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.internal.*;
-
-/**
- * Superclass of all predefined responses in this package.
- *
- * <p>
- * Consists simply of a simple string message.
- */
-@Response
-@BeanIgnore
-@FluentSetters
-public abstract class HttpResponse {
-
-	private final String message;
-	private AMap<String,Object> headers = AMap.create();
-
-	/**
-	 * Constructor.
-	 *
-	 * @param message Message to send as the response.
-	 */
-	protected HttpResponse(String message) {
-		this.message = message;
-	}
-
-	/**
-	 * Add an HTTP header to this response.
-	 *
-	 * @param name The header name.
-	 * @param val The header value.
-	 * @return This object (for method chaining).
-	 */
-	@FluentSetter
-	public HttpResponse header(String name, Object val) {
-		headers.a(name, val);
-		return this;
-	}
-
-	/**
-	 * Returns the headers associated with this exception.
-	 *
-	 * @return The headers associated with this exception.
-	 */
-	@ResponseHeader("*")
-	public Map<String,Object> getHeaders() {
-		return headers;
-	}
-
-	@ResponseBody
-	@Override /* Object */
-	public String toString() {
-		return message;
-	}
-
-	// <FluentSetters>
-
-	// </FluentSetters>
-}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/IMUsed.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/IMUsed.java
index eb40e20..315e15a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/IMUsed.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/IMUsed.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.IMUsed.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -23,32 +25,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server has fulfilled a request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class IMUsed extends HttpResponse {
+public class IMUsed extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 226;
+	public static final int STATUS_CODE = 226;
 
-	/** Default message */
-	public static final String MESSAGE = "IM Used";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "IM Used";
 
-	/** Reusable instance. */
-	public static final IMUsed INSTANCE = new IMUsed();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final IMUsed INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static IMUsed create() {
+		return new IMUsed();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public IMUsed() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public IMUsed(String message) {
-		super(message);
+	public IMUsed(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -57,9 +74,45 @@ public class IMUsed extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public IMUsed header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public IMUsed body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public IMUsed body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public IMUsed header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public IMUsed headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public IMUsed reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public IMUsed statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public IMUsed unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MovedPermanently.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MovedPermanently.java
index 5459ef2..bbfdddc 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MovedPermanently.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MovedPermanently.java
@@ -16,6 +16,8 @@ import static org.apache.juneau.http.response.MovedPermanently.*;
 
 import java.net.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -25,64 +27,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * This and all future requests should be directed to the given URI.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class MovedPermanently extends HttpResponse {
+public class MovedPermanently extends BasicLocationHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 301;
+	public static final int STATUS_CODE = 301;
 
-	/** Default message */
-	public static final String MESSAGE = "Moved Permanently";
-
-	/** Reusable instance. */
-	public static final MovedPermanently INSTANCE = new MovedPermanently();
-
-	private final URI location;
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Moved Permanently";
 
 	/**
-	 * Constructor using HTTP-standard message.
-	 */
-	public MovedPermanently() {
-		this(MESSAGE, null);
-	}
-
-	/**
-	 * Constructor with no redirect.
-	 * <p>
-	 * Used for end-to-end interfaces.
+	 * Default unmodifiable instance.
 	 *
-	 * @param message Message to send as the response.
+	 * <br>Response body contains the reason phrase.
 	 */
-	public MovedPermanently(String message) {
-		super(message);
-		this.location = null;
-	}
+	public static final MovedPermanently INSTANCE = create().body(REASON_PHRASE).unmodifiable();
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
-	 * @param location <c>Location</c> header value.
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
 	 */
-	public MovedPermanently(String message, URI location) {
-		super(message);
-		this.location = location;
+	public static MovedPermanently create() {
+		return new MovedPermanently();
 	}
 
 	/**
 	 * Constructor.
-	 * @param location <c>Location</c> header value.
 	 */
-	public MovedPermanently(URI location) {
-		this(MESSAGE, location);
+	public MovedPermanently() {
+		this(null);
 	}
 
 	/**
-	 * @return <c>Location</c> header value.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	@ResponseHeader(name="Location", description="New location of resource.")
-	public URI getLocation() {
-		return location;
+	public MovedPermanently(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -91,9 +76,57 @@ public class MovedPermanently extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public MovedPermanently header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public MovedPermanently body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MovedPermanently body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MovedPermanently header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MovedPermanently headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MovedPermanently reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MovedPermanently statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MovedPermanently unmodifiable() {
+		super.unmodifiable();
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public MovedPermanently location(String value) {
+		super.location(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public MovedPermanently location(URI value) {
+		super.location(value);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultiStatus.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultiStatus.java
index d420ee4..873f32e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultiStatus.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultiStatus.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.MultiStatus.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -23,32 +25,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * The message body that follows is by default an XML message and can contain a number of separate response codes, depending on how many sub-requests were made.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class MultiStatus extends HttpResponse {
+public class MultiStatus extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 207;
+	public static final int STATUS_CODE = 207;
 
-	/** Default message */
-	public static final String MESSAGE = "Multi-Status";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Multi-Status";
 
-	/** Reusable instance. */
-	public static final MultiStatus INSTANCE = new MultiStatus();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final MultiStatus INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static MultiStatus create() {
+		return new MultiStatus();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public MultiStatus() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public MultiStatus(String message) {
-		super(message);
+	public MultiStatus(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -57,9 +74,45 @@ public class MultiStatus extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public MultiStatus header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultiStatus body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultiStatus body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultiStatus header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultiStatus headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultiStatus reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultiStatus statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultiStatus unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultipleChoices.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultipleChoices.java
index 302f6ec..cbcc731 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultipleChoices.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/MultipleChoices.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.MultipleChoices.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -24,32 +26,47 @@ import org.apache.juneau.internal.*;
  * Indicates multiple options for the resource from which the client may choose (via agent-driven content negotiation).
  * For example, this code could be used to present multiple video format options, to list files with different filename extensions, or to suggest word-sense disambiguation.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class MultipleChoices extends HttpResponse {
+public class MultipleChoices extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 300;
+	public static final int STATUS_CODE = 300;
 
-	/** Default message */
-	public static final String MESSAGE = "Multiple Choices";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Multiple Choices";
 
-	/** Reusable instance. */
-	public static final MultipleChoices INSTANCE = new MultipleChoices();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final MultipleChoices INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static MultipleChoices create() {
+		return new MultipleChoices();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public MultipleChoices() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public MultipleChoices(String message) {
-		super(message);
+	public MultipleChoices(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -58,9 +75,45 @@ public class MultipleChoices extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public MultipleChoices header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultipleChoices body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultipleChoices body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultipleChoices header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultipleChoices headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultipleChoices reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultipleChoices statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public MultipleChoices unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NoContent.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NoContent.java
index fec84cc..c40a793 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NoContent.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NoContent.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.NoContent.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -23,32 +25,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server successfully processed the request and is not returning any content.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class NoContent extends HttpResponse {
+public class NoContent extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 204;
+	public static final int STATUS_CODE = 204;
 
-	/** Default message */
-	public static final String MESSAGE = "No Content";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "No Content";
 
-	/** Reusable instance. */
-	public static final NoContent INSTANCE = new NoContent();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final NoContent INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static NoContent create() {
+		return new NoContent();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public NoContent() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public NoContent(String message) {
-		super(message);
+	public NoContent(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -57,9 +74,45 @@ public class NoContent extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public NoContent header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public NoContent body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NoContent body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NoContent header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NoContent headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NoContent reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NoContent statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NoContent unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NonAuthoritiveInformation.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NonAuthoritiveInformation.java
index 7abd62a..f5e3f7e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NonAuthoritiveInformation.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NonAuthoritiveInformation.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.NonAuthoritiveInformation.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -23,32 +25,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * The server is a transforming proxy (e.g. a Web accelerator) that received a 200 OK from its origin, but is returning a modified version of the origin's response.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class NonAuthoritiveInformation extends HttpResponse {
+public class NonAuthoritiveInformation extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 203;
+	public static final int STATUS_CODE = 203;
 
-	/** Default message */
-	public static final String MESSAGE = "Non-Authoritative Information";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Non-Authoritative Information";
 
-	/** Reusable instance. */
-	public static final NonAuthoritiveInformation INSTANCE = new NonAuthoritiveInformation();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final NonAuthoritiveInformation INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static NonAuthoritiveInformation create() {
+		return new NonAuthoritiveInformation();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public NonAuthoritiveInformation() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public NonAuthoritiveInformation(String message) {
-		super(message);
+	public NonAuthoritiveInformation(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -57,9 +74,45 @@ public class NonAuthoritiveInformation extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public NonAuthoritiveInformation header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public NonAuthoritiveInformation body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NonAuthoritiveInformation body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NonAuthoritiveInformation header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NonAuthoritiveInformation headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NonAuthoritiveInformation reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NonAuthoritiveInformation statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NonAuthoritiveInformation unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NotModified.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NotModified.java
index 56d167c..fb3760d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NotModified.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/NotModified.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.NotModified.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -24,32 +26,47 @@ import org.apache.juneau.internal.*;
  * Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match.
  * In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class NotModified extends HttpResponse {
+public class NotModified extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 304;
+	public static final int STATUS_CODE = 304;
 
-	/** Default message */
-	public static final String MESSAGE = "Not Modified";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Not Modified";
 
-	/** Reusable instance. */
-	public static final NotModified INSTANCE = new NotModified();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final NotModified INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static NotModified create() {
+		return new NotModified();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public NotModified() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public NotModified(String message) {
-		super(message);
+	public NotModified(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -58,9 +75,45 @@ public class NotModified extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public NotModified header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public NotModified body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NotModified body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NotModified header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NotModified headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NotModified reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NotModified statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public NotModified unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Ok.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Ok.java
index da57ff6..70704e3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Ok.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Ok.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.Ok.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -25,34 +27,47 @@ import org.apache.juneau.internal.*;
  * In a GET request, the response will contain an entity corresponding to the requested resource.
  * In a POST request, the response will contain an entity describing or containing the result of the action.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class Ok extends HttpResponse {
+public class Ok extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 200;
+	public static final int STATUS_CODE = 200;
 
-	/** Default message */
-	public static final String MESSAGE = "OK";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "OK";
 
-	/** Reusable instance. */
-	public static final Ok INSTANCE = new Ok();
-	/** Reusable instance. */
-	public static final Ok OK = new Ok();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final Ok INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static Ok create() {
+		return new Ok();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public Ok() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public Ok(String message) {
-		super(message);
+	public Ok(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -61,9 +76,45 @@ public class Ok extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public Ok header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public Ok body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Ok body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Ok header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Ok headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Ok reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Ok statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Ok unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PartialContent.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PartialContent.java
index f919a48..0e87b4c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PartialContent.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PartialContent.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.PartialContent.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -24,32 +26,47 @@ import org.apache.juneau.internal.*;
  * The server is delivering only part of the resource (byte serving) due to a range header sent by the client.
  * The range header is used by HTTP clients to enable resuming of interrupted downloads, or split a download into multiple simultaneous streams.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class PartialContent extends HttpResponse {
+public class PartialContent extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 206;
+	public static final int STATUS_CODE = 206;
 
-	/** Default message */
-	public static final String MESSAGE = "Partial Content";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Partial Content";
 
-	/** Reusable instance. */
-	public static final PartialContent INSTANCE = new PartialContent();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final PartialContent INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static PartialContent create() {
+		return new PartialContent();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public PartialContent() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public PartialContent(String message) {
-		super(message);
+	public PartialContent(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -58,9 +75,45 @@ public class PartialContent extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public PartialContent header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public PartialContent body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PartialContent body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PartialContent header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PartialContent headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PartialContent reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PartialContent statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PartialContent unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PermanentRedirect.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PermanentRedirect.java
index 1cf411a..e209960 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PermanentRedirect.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/PermanentRedirect.java
@@ -16,6 +16,8 @@ import static org.apache.juneau.http.response.PermanentRedirect.*;
 
 import java.net.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -26,64 +28,47 @@ import org.apache.juneau.internal.*;
  * The request and all future requests should be repeated using another URI. 307 and 308 parallel the behaviors of 302 and 301, but do not allow the HTTP method to change.
  * So, for example, submitting a form to a permanently redirected resource may continue smoothly.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class PermanentRedirect extends HttpResponse {
+public class PermanentRedirect extends BasicLocationHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 308;
+	public static final int STATUS_CODE = 308;
 
-	/** Default message */
-	public static final String MESSAGE = "Permanent Redirect";
-
-	/** Reusable instance. */
-	public static final PermanentRedirect INSTANCE = new PermanentRedirect();
-
-	private final URI location;
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Permanent Redirect";
 
 	/**
-	 * Constructor using HTTP-standard message.
-	 */
-	public PermanentRedirect() {
-		this(MESSAGE, null);
-	}
-
-	/**
-	 * Constructor with no redirect.
-	 * <p>
-	 * Used for end-to-end interfaces.
+	 * Default unmodifiable instance.
 	 *
-	 * @param message Message to send as the response.
+	 * <br>Response body contains the reason phrase.
 	 */
-	public PermanentRedirect(String message) {
-		super(message);
-		this.location = null;
-	}
+	public static final PermanentRedirect INSTANCE = create().body(REASON_PHRASE).unmodifiable();
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
-	 * @param location <c>Location</c> header value.
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
 	 */
-	public PermanentRedirect(String message, URI location) {
-		super(message);
-		this.location = location;
+	public static PermanentRedirect create() {
+		return new PermanentRedirect();
 	}
 
 	/**
 	 * Constructor.
-	 * @param location <c>Location</c> header value.
 	 */
-	public PermanentRedirect(URI location) {
-		this(MESSAGE, location);
+	public PermanentRedirect() {
+		this(null);
 	}
 
 	/**
-	 * @return <c>Location</c> header value.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	@ResponseHeader(name="Location", description="New location of resource.")
-	public URI getLocation() {
-		return location;
+	public PermanentRedirect(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -92,9 +77,57 @@ public class PermanentRedirect extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public PermanentRedirect header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public PermanentRedirect body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PermanentRedirect body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PermanentRedirect header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PermanentRedirect headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PermanentRedirect reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PermanentRedirect statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public PermanentRedirect unmodifiable() {
+		super.unmodifiable();
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public PermanentRedirect location(String value) {
+		super.location(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public PermanentRedirect location(URI value) {
+		super.location(value);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Processing.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Processing.java
index 25a3d43..29d025d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Processing.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/Processing.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.Processing.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -25,32 +27,47 @@ import org.apache.juneau.internal.*;
  * This code indicates that the server has received and is processing the request, but no response is available yet.
  * This prevents the client from timing out and assuming the request was lost.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class Processing extends HttpResponse {
+public class Processing extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 102;
+	public static final int STATUS_CODE = 102;
 
-	/** Default message */
-	public static final String MESSAGE = "Processing";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Processing";
 
-	/** Reusable instance. */
-	public static final Processing INSTANCE = new Processing();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final Processing INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static Processing create() {
+		return new Processing();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public Processing() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public Processing(String message) {
-		super(message);
+	public Processing(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -59,9 +76,45 @@ public class Processing extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public Processing header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public Processing body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Processing body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Processing header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Processing headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Processing reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Processing statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public Processing unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/ResetContent.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/ResetContent.java
index 98670d5..b76a9fe 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/ResetContent.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/ResetContent.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.ResetContent.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -24,32 +26,47 @@ import org.apache.juneau.internal.*;
  * The server successfully processed the request, but is not returning any content.
  * Unlike a 204 response, this response requires that the requester reset the document view.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class ResetContent extends HttpResponse {
+public class ResetContent extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 205;
+	public static final int STATUS_CODE = 205;
 
-	/** Default message */
-	public static final String MESSAGE = "Reset Content";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Reset Content";
 
-	/** Reusable instance. */
-	public static final ResetContent INSTANCE = new ResetContent();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final ResetContent INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static ResetContent create() {
+		return new ResetContent();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public ResetContent() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public ResetContent(String message) {
-		super(message);
+	public ResetContent(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -58,9 +75,45 @@ public class ResetContent extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public ResetContent header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public ResetContent body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public ResetContent body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public ResetContent header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public ResetContent headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public ResetContent reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public ResetContent statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public ResetContent unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SeeOther.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SeeOther.java
index 10fa6d2..5ee80c1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SeeOther.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SeeOther.java
@@ -16,6 +16,8 @@ import static org.apache.juneau.http.response.SeeOther.*;
 
 import java.net.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -26,66 +28,47 @@ import org.apache.juneau.internal.*;
  * The response to the request can be found under another URI using the GET method.
  * When received in response to a POST (or PUT/DELETE), the client should presume that the server has received the data and should issue a new GET request to the given URI.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class SeeOther extends HttpResponse {
+public class SeeOther extends BasicLocationHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 303;
+	public static final int STATUS_CODE = 303;
 
-	/** Default message */
-	public static final String MESSAGE = "See Other";
-
-	/** Reusable instance. */
-	public static final SeeOther INSTANCE = new SeeOther();
-
-	private final URI location;
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "See Other";
 
 	/**
-	 * Constructor using HTTP-standard message.
-	 */
-	public SeeOther() {
-		this(MESSAGE, null);
-	}
-
-	/**
-	 * Constructor with no redirect.
-	 * <p>
-	 * Used for end-to-end interfaces.
+	 * Default unmodifiable instance.
 	 *
-	 * @param message Message to send as the response.
+	 * <br>Response body contains the reason phrase.
 	 */
-	public SeeOther(String message) {
-		super(message);
-		this.location = null;
-	}
+	public static final SeeOther INSTANCE = create().body(REASON_PHRASE).unmodifiable();
 
 	/**
-	 * Constructor using custom message.
+	 * Static creator.
 	 *
-	 * @param message Message to send as the response.
-	 * @param location <c>Location</c> header value.
+	 * @return A new instance of this bean.
 	 */
-	public SeeOther(String message, URI location) {
-		super(message);
-		this.location = location;
+	public static SeeOther create() {
+		return new SeeOther();
 	}
 
 	/**
 	 * Constructor.
-	 *
-	 * @param location <c>Location</c> header value.
 	 */
-	public SeeOther(URI location) {
-		this(MESSAGE, location);
+	public SeeOther() {
+		this(null);
 	}
 
 	/**
-	 * @return <c>Location</c> header value.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	@ResponseHeader(name="Location", description="Other location.")
-	public URI getLocation() {
-		return location;
+	public SeeOther(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -94,9 +77,57 @@ public class SeeOther extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public SeeOther header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public SeeOther body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SeeOther body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SeeOther header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SeeOther headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SeeOther reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SeeOther statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SeeOther unmodifiable() {
+		super.unmodifiable();
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public SeeOther location(String value) {
+		super.location(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public SeeOther location(URI value) {
+		super.location(value);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/StandardResponses.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/StandardResponses.java
new file mode 100644
index 0000000..11d5812
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/StandardResponses.java
@@ -0,0 +1,332 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              *
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.http.response;
+
+/**
+ * Standard predefined HTTP responses.
+ */
+public class StandardResponses {
+
+	/**
+	 * A synonym for {@link Accepted#INSTANCE}.
+	 */
+	public static final Accepted ACCEPTED = Accepted.INSTANCE;
+
+	/**
+	 * A synonym for {@link AlreadyReported#INSTANCE}.
+	 */
+	public static final AlreadyReported ALREADY_REPORTED = AlreadyReported.INSTANCE;
+
+	/**
+	 * A synonym for {@link Continue#INSTANCE}.
+	 */
+	public static final Continue CONTINUE = Continue.INSTANCE;
+
+	/**
+	 * A synonym for {@link Created#INSTANCE}.
+	 */
+	public static final Created CREATED = Created.INSTANCE;
+
+	/**
+	 * A synonym for {@link EarlyHints#INSTANCE}.
+	 */
+	public static final EarlyHints EARLY_HINTS = EarlyHints.INSTANCE;
+
+	/**
+	 * A synonym for {@link Found#INSTANCE}.
+	 */
+	public static final Found FOUND = Found.INSTANCE;
+
+	/**
+	 * A synonym for {@link IMUsed#INSTANCE}.
+	 */
+	public static final IMUsed IM_USED = IMUsed.INSTANCE;
+
+	/**
+	 * A synonym for {@link MovedPermanently#INSTANCE}.
+	 */
+	public static final MovedPermanently MOVED_PERMANENTLY = MovedPermanently.INSTANCE;
+
+	/**
+	 * A synonym for {@link MultipleChoices#INSTANCE}.
+	 */
+	public static final MultipleChoices MULTIPLE_CHOICES = MultipleChoices.INSTANCE;
+
+	/**
+	 * A synonym for {@link MultiStatus#INSTANCE}.
+	 */
+	public static final MultiStatus MULTI_STATUS = MultiStatus.INSTANCE;
+
+	/**
+	 * A synonym for {@link NoContent#INSTANCE}.
+	 */
+	public static final NoContent NO_CONTENT = NoContent.INSTANCE;
+
+	/**
+	 * A synonym for {@link NonAuthoritiveInformation#INSTANCE}.
+	 */
+	public static final NonAuthoritiveInformation NON_AUTHORATIVE_INFORMATION = NonAuthoritiveInformation.INSTANCE;
+
+	/**
+	 * A synonym for {@link NotModified#INSTANCE}.
+	 */
+	public static final NotModified NOT_MODIFIED = NotModified.INSTANCE;
+
+	/**
+	 * A synonym for {@link Ok#INSTANCE}.
+	 */
+	public static final Ok OK = Ok.INSTANCE;
+
+	/**
+	 * A synonym for {@link PartialContent#INSTANCE}.
+	 */
+	public static final PartialContent PARTIAL_CONTENT = PartialContent.INSTANCE;
+
+	/**
+	 * A synonym for {@link PermanentRedirect#INSTANCE}.
+	 */
+	public static final PermanentRedirect PERMANENT_REDIRECT = PermanentRedirect.INSTANCE;
+
+	/**
+	 * A synonym for {@link Processing#INSTANCE}.
+	 */
+	public static final Processing PROCESSING = Processing.INSTANCE;
+
+	/**
+	 * A synonym for {@link ResetContent#INSTANCE}.
+	 */
+	public static final ResetContent RESET_CONTENT = ResetContent.INSTANCE;
+
+	/**
+	 * A synonym for {@link SeeOther#INSTANCE}.
+	 */
+	public static final SeeOther SEE_OTHER = SeeOther.INSTANCE;
+
+	/**
+	 * A synonym for {@link SwitchingProtocols#INSTANCE}.
+	 */
+	public static final SwitchingProtocols SWITCHING_PROTOCOLS = SwitchingProtocols.INSTANCE;
+
+	/**
+	 * A synonym for {@link TemporaryRedirect#INSTANCE}.
+	 */
+	public static final TemporaryRedirect TEMPORARY_REDIRECT = TemporaryRedirect.INSTANCE;
+
+	/**
+	 * A synonym for {@link UseProxy#INSTANCE}.
+	 */
+	public static final UseProxy USE_PROXY = UseProxy.INSTANCE;
+
+	/**
+	 * A shortcut for calling {@link Accepted#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static Accepted accepted() {
+		return Accepted.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link AlreadyReported#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static AlreadyReported alreadyReported() {
+		return AlreadyReported.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link Continue#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static Continue _continue() {
+		return Continue.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link Created#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static Created created() {
+		return Created.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link EarlyHints#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static EarlyHints earlyHints() {
+		return EarlyHints.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link Found#create()}.
+	 *
+	 * @param location The value for the Location header.
+	 * @return A new bean.
+	 */
+	public static Found found(String location) {
+		return Found.create().location(location);
+	}
+
+	/**
+	 * A shortcut for calling {@link IMUsed#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static IMUsed imUsed() {
+		return IMUsed.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link MovedPermanently#create()}.
+	 *
+	 * @param location The value for the Location header.
+	 * @return A new bean.
+	 */
+	public static MovedPermanently movedPermanently(String location) {
+		return MovedPermanently.create().location(location);
+	}
+
+	/**
+	 * A shortcut for calling {@link MovedPermanently#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static MultipleChoices multipleChoices() {
+		return MultipleChoices.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link MultiStatus#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static MultiStatus multiStatus() {
+		return MultiStatus.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link NoContent#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static NoContent noContent() {
+		return NoContent.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link NonAuthoritiveInformation#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static NonAuthoritiveInformation nonAuthoritiveInformation() {
+		return NonAuthoritiveInformation.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link NotModified#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static NotModified notModified() {
+		return NotModified.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link Ok#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static Ok ok() {
+		return Ok.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link PartialContent#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static PartialContent partialContent() {
+		return PartialContent.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link PermanentRedirect#create()}.
+	 *
+	 * @param location The value for the Location header.
+	 * @return A new bean.
+	 */
+	public static PermanentRedirect permanentRedirect(String location) {
+		return PermanentRedirect.create().location(location);
+	}
+
+	/**
+	 * A shortcut for calling {@link Processing#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static Processing processing() {
+		return Processing.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link ResetContent#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static ResetContent resetContent() {
+		return ResetContent.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link SeeOther#create()}.
+	 *
+	 * @param location The value for the Location header.
+	 * @return A new bean.
+	 */
+	public static SeeOther seeOther(String location) {
+		return SeeOther.create().location(location);
+	}
+
+	/**
+	 * A shortcut for calling {@link SwitchingProtocols#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static SwitchingProtocols switchingProtocols() {
+		return SwitchingProtocols.create();
+	}
+
+	/**
+	 * A shortcut for calling {@link TemporaryRedirect#create()}.
+	 *
+	 * @param location The value for the Location header.
+	 * @return A new bean.
+	 */
+	public static TemporaryRedirect temporaryRedirect(String location) {
+		return TemporaryRedirect.create().location(location);
+	}
+
+	/**
+	 * A shortcut for calling {@link UseProxy#create()}.
+	 *
+	 * @return A new bean.
+	 */
+	public static UseProxy useProxy() {
+		return UseProxy.create();
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SwitchingProtocols.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SwitchingProtocols.java
index 3041314..222767b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SwitchingProtocols.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/SwitchingProtocols.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.SwitchingProtocols.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -23,32 +25,47 @@ import org.apache.juneau.internal.*;
  * <p>
  * The requester has asked the server to switch protocols and the server has agreed to do so.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class SwitchingProtocols extends HttpResponse {
+public class SwitchingProtocols extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 101;
+	public static final int STATUS_CODE = 101;
 
-	/** Default message */
-	public static final String MESSAGE = "Switching Protocols";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Switching Protocols";
 
-	/** Reusable instance. */
-	public static final SwitchingProtocols INSTANCE = new SwitchingProtocols();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final SwitchingProtocols INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static SwitchingProtocols create() {
+		return new SwitchingProtocols();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public SwitchingProtocols() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public SwitchingProtocols(String message) {
-		super(message);
+	public SwitchingProtocols(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -57,9 +74,45 @@ public class SwitchingProtocols extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public SwitchingProtocols header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public SwitchingProtocols body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SwitchingProtocols body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SwitchingProtocols header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SwitchingProtocols headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SwitchingProtocols reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SwitchingProtocols statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public SwitchingProtocols unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/TemporaryRedirect.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/TemporaryRedirect.java
index 98b306f..b63ed1d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/TemporaryRedirect.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/TemporaryRedirect.java
@@ -16,6 +16,8 @@ import static org.apache.juneau.http.response.TemporaryRedirect.*;
 
 import java.net.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -27,64 +29,47 @@ import org.apache.juneau.internal.*;
  * In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request.
  * For example, a POST request should be repeated using another POST request.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class TemporaryRedirect extends HttpResponse {
+public class TemporaryRedirect extends BasicLocationHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 307;
+	public static final int STATUS_CODE = 307;
 
-	/** Default message */
-	public static final String MESSAGE = "Temporary Redirect";
-
-	/** Reusable instance. */
-	public static final TemporaryRedirect INSTANCE = new TemporaryRedirect();
-
-	private final URI location;
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Temporary Redirect";
 
 	/**
-	 * Constructor using HTTP-standard message.
-	 */
-	public TemporaryRedirect() {
-		this(MESSAGE, null);
-	}
-
-	/**
-	 * Constructor with no redirect.
-	 * <p>
-	 * Used for end-to-end interfaces.
+	 * Default unmodifiable instance.
 	 *
-	 * @param message Message to send as the response.
+	 * <br>Response body contains the reason phrase.
 	 */
-	public TemporaryRedirect(String message) {
-		super(message);
-		this.location = null;
-	}
+	public static final TemporaryRedirect INSTANCE = create().body(REASON_PHRASE).unmodifiable();
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
-	 * @param location <c>Location</c> header value.
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
 	 */
-	public TemporaryRedirect(String message, URI location) {
-		super(message);
-		this.location = location;
+	public static TemporaryRedirect create() {
+		return new TemporaryRedirect();
 	}
 
 	/**
 	 * Constructor.
-	 * @param location <c>Location</c> header value.
 	 */
-	public TemporaryRedirect(URI location) {
-		this(MESSAGE, location);
+	public TemporaryRedirect() {
+		this(null);
 	}
 
 	/**
-	 * @return <c>Location</c> header value.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	@ResponseHeader(name="Location", description="Temporary location of resource.")
-	public URI getLocation() {
-		return location;
+	public TemporaryRedirect(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -93,9 +78,57 @@ public class TemporaryRedirect extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public TemporaryRedirect header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public TemporaryRedirect body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public TemporaryRedirect body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public TemporaryRedirect header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public TemporaryRedirect headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public TemporaryRedirect reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public TemporaryRedirect statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public TemporaryRedirect unmodifiable() {
+		super.unmodifiable();
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public TemporaryRedirect location(String value) {
+		super.location(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicLocationHttpResponse */
+	public TemporaryRedirect location(URI value) {
+		super.location(value);
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/UseProxy.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/UseProxy.java
index 8fb53b1..39eb00c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/UseProxy.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/UseProxy.java
@@ -14,6 +14,8 @@ package org.apache.juneau.http.response;
 
 import static org.apache.juneau.http.response.UseProxy.*;
 
+import org.apache.http.*;
+import org.apache.http.Header;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
 
@@ -24,32 +26,47 @@ import org.apache.juneau.internal.*;
  * The requested resource is available only through a proxy, the address for which is provided in the response.
  * Many HTTP clients (such as Mozilla and Internet Explorer) do not correctly handle responses with this status code, primarily for security reasons.
  */
-@Response(code=CODE, description=MESSAGE)
+@Response(code=STATUS_CODE, description=REASON_PHRASE)
 @FluentSetters
-public class UseProxy extends HttpResponse {
+public class UseProxy extends BasicHttpResponse {
 
 	/** HTTP status code */
-	public static final int CODE = 305;
+	public static final int STATUS_CODE = 305;
 
-	/** Default message */
-	public static final String MESSAGE = "Use Proxy";
+	/** Reason phrase */
+	public static final String REASON_PHRASE = "Use Proxy";
 
-	/** Reusable instance. */
-	public static final UseProxy INSTANCE = new UseProxy();
+	/**
+	 * Default unmodifiable instance.
+	 *
+	 * <br>Response body contains the reason phrase.
+	 */
+	public static final UseProxy INSTANCE = create().body(REASON_PHRASE).unmodifiable();
+
+	/**
+	 * Static creator.
+	 *
+	 * @return A new instance of this bean.
+	 */
+	public static UseProxy create() {
+		return new UseProxy();
+	}
 
 	/**
-	 * Constructor using HTTP-standard message.
+	 * Constructor.
 	 */
 	public UseProxy() {
-		this(MESSAGE);
+		this(null);
 	}
 
 	/**
-	 * Constructor using custom message.
-	 * @param message Message to send as the response.
+	 * Constructor.
+	 *
+	 * @param body Body of the response.  Can be <jk>null</jk>.
 	 */
-	public UseProxy(String message) {
-		super(message);
+	public UseProxy(String body) {
+		super(STATUS_CODE, REASON_PHRASE);
+		body(body);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -58,9 +75,45 @@ public class UseProxy extends HttpResponse {
 
 	// <FluentSetters>
 
-	@Override /* GENERATED - HttpResponse */
-	public UseProxy header(String name, Object val) {
-		super.header(name, val);
+	@Override /* GENERATED - BasicHttpResponse */
+	public UseProxy body(String value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public UseProxy body(HttpEntity value) {
+		super.body(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public UseProxy header(String name, Object value) {
+		super.header(name, value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public UseProxy headers(Header...values) {
+		super.headers(values);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public UseProxy reasonPhrase(String value) {
+		super.reasonPhrase(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public UseProxy statusCode(int value) {
+		super.statusCode(value);
+		return this;
+	}
+
+	@Override /* GENERATED - BasicHttpResponse */
+	public UseProxy unmodifiable() {
+		super.unmodifiable();
 		return this;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanPropertyMeta.java
index dcc9736..8b6e262 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanPropertyMeta.java
@@ -15,6 +15,7 @@ package org.apache.juneau.httppart.bean;
 import static org.apache.juneau.internal.ClassUtils.*;
 
 import java.lang.reflect.*;
+import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.*;
@@ -89,8 +90,8 @@ public class ResponseBeanPropertyMeta {
 	 *
 	 * @return The HTTP part name, or <jk>null</jk> if it doesn't have a part name.
 	 */
-	public String getPartName() {
-		return schema == null ? null : schema.getName();
+	public Optional<String> getPartName() {
+		return Optional.ofNullable(schema == null ? null : schema.getName());
 	}
 
 	/**
@@ -118,21 +119,19 @@ public class ResponseBeanPropertyMeta {
 	/**
 	 * Returns the serializer to use for serializing the bean property value.
 	 *
-	 * @param _default The default serializer to use if not defined on the annotation.
 	 * @return The serializer to use for serializing the bean property value.
 	 */
-	public HttpPartSerializerSession getSerializer(HttpPartSerializerSession _default) {
-		return serializer == null ? _default : serializer.createPartSession(null);
+	public Optional<HttpPartSerializerSession> getSerializerSession() {
+		return Optional.ofNullable(serializer == null ? null : serializer.createPartSession(null));
 	}
 
 	/**
 	 * Returns the parser to use for parsing the bean property value.
 	 *
-	 * @param _default The default parser to use if not defined on the annotation.
 	 * @return The parser to use for parsing the bean property value.
 	 */
-	public HttpPartParserSession getParser(HttpPartParserSession _default) {
-		return parser == null ? _default : parser.createPartSession(null);
+	public Optional<HttpPartParserSession> getParserSession() {
+		return Optional.ofNullable(parser == null ? null : parser.createPartSession(null));
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseBody.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseBody.java
index c47eed2..f01b595 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseBody.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseBody.java
@@ -648,21 +648,19 @@ public class ResponseBody implements HttpEntity {
 	@SuppressWarnings("unchecked")
 	public <T> T asType(ClassMeta<T> type) throws RestCallException {
 		try {
-			Class<?> ic = type.getInnerClass();
-
-			if (ic.equals(ResponseBody.class) || ic.equals(HttpEntity.class))
+			if (type.is(ResponseBody.class) || type.is(HttpEntity.class))
 				return (T)this;
 
-			if (ic.equals(Reader.class))
+			if (type.is(Reader.class))
 				return (T)asReader();
 
-			if (ic.equals(InputStream.class))
+			if (type.is(InputStream.class))
 				return (T)asInputStream();
 
-			if (type.isType(HttpResponse.class))
+			if (type.is(HttpResponse.class))
 				return (T)response;
 
-			if (type.isType(HttpResource.class)) {
+			if (type.isChildOf(HttpResource.class)) {
 				BasicHttpResource r = BasicHttpResource.of(asInputStream());
 				for (Header h : response.getAllHeaders()) {
 					if (h.getName().equalsIgnoreCase("Content-Type"))
@@ -682,7 +680,7 @@ public class ResponseBody implements HttpEntity {
 
 			MediaType mt = MediaType.of(ct);
 
-			if (parser == null || (mt.toString().equals("text/plain") && ! parser.canHandle(ct))) {
+			if (parser == null || (mt.toString().contains("text/plain") && ! parser.canHandle(ct))) {
 				if (type.hasStringMutater())
 					return type.getStringMutater().mutate(asString());
 			}
@@ -701,7 +699,7 @@ public class ResponseBody implements HttpEntity {
 					T t = parser.createSession(pArgs).parse(in, type);
 
 					// Some HTTP responses have no body, so try to create these beans if they've got no-arg constructors.
-					if (t == null && ! type.isType(String.class)) {
+					if (t == null && ! type.is(String.class)) {
 						ConstructorInfo c = type.getInfo().getPublicConstructor();
 						if (c != null) {
 							try {
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index 5a3cd8b..cc1a502 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -134,7 +134,7 @@ import org.apache.juneau.utils.*;
  * <ul class='javatree'>
  * 	<li class='jc'>{@link RestClient} <jk>extends</jk> {@link HttpClient}, creates {@link RestRequest} objects.
  * 	<li class='jc'>{@link RestRequest} <jk>extends</jk> {@link HttpUriRequest}, creates {@link RestResponse} objects.
- * 	<li class='jc'>{@link RestResponse} <jk>extends</jk> {@link HttpResponse}, creates {@link ResponseBody} and {@link ResponseHeader} objects.
+ * 	<li class='jc'>{@link RestResponse} creates {@link ResponseBody} and {@link ResponseHeader} objects.
  * 	<li class='jc'>{@link ResponseBody} <jk>extends</jk> {@link HttpEntity}
  * 	<li class='jc'>{@link ResponseHeader} <jk>extends</jk> {@link Header}
  * </ul>
@@ -2121,9 +2121,9 @@ public class RestClient extends BeanContext implements HttpClient, Closeable, Re
 
 	private static Object buildBuilders(Object o, HttpPartSerializerSession ss) {
 		if (o instanceof SerializedHeader)
-			return ((SerializedHeader)o).serializer(ss, false);
+			return ((SerializedHeader)o).copy().serializerIfNotSet(ss);
 		if (o instanceof SerializedNameValuePair)
-			return ((SerializedNameValuePair)o).serializer(ss, false);
+			return ((SerializedNameValuePair)o).copy().serializerIfNotSet(ss);
 		return o;
 	}
 
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
index 0f418fc..68d7f57 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
@@ -444,10 +444,10 @@ public class RestResponse implements HttpResponse {
 				@Override /* InvocationHandler */
 				public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 					ResponseBeanPropertyMeta pm = rbm.getProperty(method.getName());
-					HttpPartParserSession pp = pm.getParser(partParser);
+					HttpPartParserSession pp = pm.getParserSession().orElse(partParser);
 					HttpPartSchema schema = pm.getSchema();
 					HttpPartType pt = pm.getPartType();
-					String name = pm.getPartName();
+					String name = pm.getPartName().orElse(null);
 					ClassMeta<?> type = rc.getClassMeta(method.getGenericReturnType());
 					if (pt == RESPONSE_HEADER)
 						return getResponseHeader(name).parser(pp).schema(schema).asType(type).orElse(null);
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
index 75f8ad2..7d75ab9 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
@@ -93,8 +93,7 @@ public interface ResponseHandler {
 	 * Process this response if possible.
 	 * This method should return <jk>false</jk> if it wasn't able to process the response.
 	 *
-	 * @param req The HTTP servlet request.
-	 * @param res The HTTP servlet response;
+	 * @param call The HTTP call.
 	 * @return true If this handler handled the response.
 	 * @throws IOException
 	 * 	If low-level exception occurred on output stream.
@@ -103,5 +102,5 @@ public interface ResponseHandler {
 	 * 	If some other exception occurred.
 	 * 	Can be used to provide an appropriate HTTP response code and message.
 	 */
-	boolean handle(RestRequest req, RestResponse res) throws IOException, HttpException;
+	boolean handle(RestCall call) throws IOException, HttpException;
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index ce7c3aa..0d2d54f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -6768,7 +6768,7 @@ public class RestContext extends BeanContext {
 	 *
 	 * <p>
 	 * The default implementation simply iterates through the response handlers on this resource
-	 * looking for the first one whose {@link ResponseHandler#handle(RestRequest,RestResponse)} method returns
+	 * looking for the first one whose {@link ResponseHandler#handle(RestCall)} method returns
 	 * <jk>true</jk>.
 	 *
 	 * @param call The HTTP call.
@@ -6778,15 +6778,12 @@ public class RestContext extends BeanContext {
 	 */
 	public void handleResponse(RestCall call) throws IOException, HttpException, NotImplemented {
 
-		RestRequest req = call.getRestRequest();
-		RestResponse res = call.getRestResponse();
-
 		// Loop until we find the correct handler for the POJO.
 		for (ResponseHandler h : getResponseHandlers())
-			if (h.handle(req, res))
+			if (h.handle(call))
 				return;
 
-		Object output = res.getOutput().get().orElse(null);
+		Object output = call.getRestResponse().getOutput().get().orElse(null);
 		throw new NotImplemented("No response handlers found to process output of type '"+(output == null ? null : output.getClass().getName())+"'");
 	}
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
index d1657c7..8aedec3 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -831,6 +831,40 @@ public final class RestResponse {
 	}
 
 	/**
+	 * Sets a response header.
+	 *
+	 * <p>
+	 * Any previous header values are removed.
+	 *
+	 * <p>
+	 * Value is added at the end of the headers.
+	 *
+	 * @param header The header.
+	 * @return This object (for method chaining).
+	 */
+	public RestResponse setHeader(Header header) {
+		inner.setHeader(header.getName(), header.getValue());
+		return this;
+	}
+
+	/**
+	 * Adds a response header.
+	 *
+	 * <p>
+	 * Any previous header values are preserved.
+	 *
+	 * <p>
+	 * Value is added at the end of the headers.
+	 *
+	 * @param header The header.
+	 * @return This object (for method chaining).
+	 */
+	public RestResponse addHeader(Header header) {
+		inner.addHeader(header.getName(), header.getValue());
+		return this;
+	}
+
+	/**
 	 * Gets the value of the response header with the given name.
 	 *
 	 * <p>
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/SeeOtherRoot.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/SeeOtherRoot.java
index 4d9aec2..f14db58 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/SeeOtherRoot.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/helper/SeeOtherRoot.java
@@ -12,8 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.helper;
 
-import java.net.*;
-
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.http.response.*;
 
@@ -32,7 +30,8 @@ public class SeeOtherRoot extends SeeOther {
 	 * Constructor.
 	 */
 	public SeeOtherRoot() {
-		super(URI.create("servlet:/"));
+		super();
+		location("servlet:/");
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
index 94fc565..0d56c6f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
@@ -53,11 +53,14 @@ public class DefaultHandler implements ResponseHandler {
 
 	@SuppressWarnings("resource")
 	@Override /* ResponseHandler */
-	public boolean handle(RestRequest req, RestResponse res) throws IOException, InternalServerError, NotAcceptable {
+	public boolean handle(RestCall call) throws IOException, InternalServerError, NotAcceptable {
+		RestRequest req = call.getRestRequest();
+		RestResponse res = call.getRestResponse();
 		SerializerGroup g = res.getOpContext().getSerializers();
 		String accept = req.getHeader("Accept").orElse("*/*");
 		SerializerMatch sm = g.getSerializerMatch(accept);
 		HttpPartSchema schema = null;
+		HttpPartSerializerSession ps = req.getPartSerializerSession();
 
 		Optional<Optional<Object>> output = res.getOutput();
 		Object o = output.isPresent() ? output.get().orElse(null) : null;
@@ -68,7 +71,7 @@ public class DefaultHandler implements ResponseHandler {
 
 		if (rm != null) {
 
-			boolean isThrowable = rm.getClassMeta().isType(Throwable.class);
+			boolean isThrowable = rm.getClassMeta().isChildOf(Throwable.class);
 			if (isThrowable && o != null) {
 				Throwable t = (Throwable)o;
 				res.setHeaderSafe("Exception-Name", rm.getClassMeta().getName());
@@ -89,35 +92,57 @@ public class DefaultHandler implements ResponseHandler {
 			}
 
 			for (ResponseBeanPropertyMeta hm : rm.getHeaderMethods()) {
+				String n = hm.getPartName().orElse(null);
 				try {
 					Object ho = hm.getGetter().invoke(o);
-					String n = hm.getPartName();
+					HttpPartSchema partSchema = hm.getSchema();
 					if ("*".equals(n)) {
 						for (Object ho2 : iterate(ho)) {
 							if (ho2 instanceof Map.Entry) {
 								@SuppressWarnings("rawtypes")
-								Map.Entry e = (Map.Entry)ho2;
-								String k = stringify(e.getKey());
-								Object v = e.getValue();
-								HttpPartSchema s = hm.getSchema().getProperty(k);
-								res.setHeader(new HttpPart(k, RESPONSE_HEADER, s, hm.getSerializer(req.getPartSerializerSession()), v));
+								Map.Entry x = (Map.Entry)ho2;
+								String k = stringify(x.getKey());
+								Object v = x.getValue();
+								res.setHeader(new HttpPart(k, RESPONSE_HEADER, partSchema.getProperty(k), hm.getSerializerSession().orElse(ps), v));
+							} else if (ho2 instanceof SerializedHeader) {
+								SerializedHeader x = ((SerializedHeader)ho2).copy().serializerIfNotSet(ps);
+								x.schemaIfNotSet(partSchema.getProperty(x.getName()));
+								res.setHeader(x.getName(), x.getValue());
+							} else if (ho2 instanceof SerializedNameValuePair) {
+								SerializedNameValuePair x = ((SerializedNameValuePair)ho2).copy().serializerIfNotSet(ps);
+								x.schemaIfNotSet(partSchema.getProperty(x.getName()));
+								res.setHeader(x.getName(), x.getValue());
+							} else if (ho2 instanceof Header) {
+								Header x = (Header)ho2;
+								res.setHeader(x.getName(), x.getValue());
 							} else if (ho2 instanceof NameValuePair) {
-								NameValuePair p = (NameValuePair)ho2;
-								res.setHeader(p.getName(), p.getValue());
+								NameValuePair x = (NameValuePair)ho2;
+								res.setHeader(x.getName(), x.getValue());
 							} else {
-								throw new InternalServerError("Invalid type ''{0}'' for header ''{1}''", hm.getPartName(), ho2 == null ? null : ho2.getClass().getName());
+								throw new InternalServerError("Invalid type ''{0}'' for header ''{1}''", ho2 == null ? null : ho2.getClass().getName(), n);
 							}
 						}
 					} else {
-						if (ho instanceof NameValuePair) {
-							NameValuePair p = (NameValuePair)ho;
-							res.setHeader(p.getName(), p.getValue());
+						if (ho instanceof SerializedHeader) {
+							SerializedHeader x = ((SerializedHeader)ho).copy().serializerIfNotSet(ps);
+							x.schemaIfNotSet(schema);
+							res.setHeader(x.getName(), x.getValue());
+						} else if (ho instanceof SerializedNameValuePair) {
+							SerializedNameValuePair x = ((SerializedNameValuePair)ho).copy().serializerIfNotSet(ps);
+							x.schemaIfNotSet(schema);
+							res.setHeader(x.getName(), x.getValue());
+						} else if (ho instanceof Header) {
+							Header x = (Header)ho;
+							res.setHeader(x.getName(), x.getValue());
+						} else if (ho instanceof NameValuePair) {
+							NameValuePair x = (NameValuePair)ho;
+							res.setHeader(x.getName(), x.getValue());
 						} else {
-							res.setHeader(new HttpPart(n, RESPONSE_HEADER, hm.getSchema(), hm.getSerializer(req.getPartSerializerSession()), ho));
+							res.setHeader(new HttpPart(n, RESPONSE_HEADER, hm.getSchema(), hm.getSerializerSession().orElse(ps), ho));
 						}
 					}
 				} catch (Exception e) {
-					throw new InternalServerError(e, "Could not set header ''{0}''", hm.getPartName());
+					throw new InternalServerError(e, "Could not set header ''{0}''", n);
 				}
 			}
 
@@ -258,7 +283,7 @@ public class DefaultHandler implements ResponseHandler {
 		if (o instanceof Map)
 			return ((Map<?,?>)o).entrySet();
 		if (o.getClass().isArray())
-			return Arrays.asList(o);
+			return Arrays.asList((Object[])o);
 		if (o instanceof Collection)
 			return (Collection<?>)o;
 		throw new InternalServerError("Could not iterate over Headers of type ''{0}''", o.getClass().getName());
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
index 6308d4f..d579278 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
@@ -34,7 +34,8 @@ import org.apache.juneau.utils.*;
 public final class InputStreamHandler implements ResponseHandler {
 
 	@Override /* ResponseHandler */
-	public boolean handle(RestRequest req, RestResponse res) throws IOException, NotAcceptable, HttpException {
+	public boolean handle(RestCall call) throws IOException, NotAcceptable, HttpException {
+		RestResponse res = call.getRestResponse();
 		if (res.isOutputType(InputStream.class)) {
 			try (OutputStream os = res.getNegotiatedOutputStream()) {
 				IOPipe.create(res.getOutput(InputStream.class), os).run();
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
index 8979fbb..c33a26e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
@@ -31,7 +31,8 @@ import org.apache.juneau.utils.*;
 public final class ReaderHandler implements ResponseHandler {
 
 	@Override /* ResponseHandler */
-	public boolean handle(RestRequest req, RestResponse res) throws IOException, NotAcceptable, HttpException {
+	public boolean handle(RestCall call) throws IOException, NotAcceptable, HttpException {
+		RestResponse res = call.getRestResponse();
 		if (res.isOutputType(Reader.class)) {
 			try (Writer w = res.getNegotiatedWriter()) {
 				IOPipe.create(res.getOutput(Reader.class), w).run();
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/SerializedHeader_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/SerializedHeader_Test.java
index 299e416..74ff350 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/SerializedHeader_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/SerializedHeader_Test.java
@@ -52,11 +52,11 @@ public class SerializedHeader_Test {
 		assertString(x1.getValue()).is("['bar','baz']");
 		SerializedHeader x2 = of("Foo",list("bar","baz")).serializer((HttpPartSerializer)null).serializer(OAPI_SERIALIZER);
 		assertString(x2.getValue()).is("bar,baz");
-		SerializedHeader x3 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER).serializer((HttpPartSerializerSession)null,true);
+		SerializedHeader x3 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER).serializer((HttpPartSerializerSession)null);
 		assertString(x3.getValue()).is("['bar','baz']");
-		SerializedHeader x4 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER).serializer((HttpPartSerializerSession)null,false);
+		SerializedHeader x4 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER).serializerIfNotSet((HttpPartSerializerSession)null);
 		assertString(x4.getValue()).is("bar,baz");
-		SerializedHeader x5 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER.createPartSession(null),false);
+		SerializedHeader x5 = of("Foo",list("bar","baz")).serializerIfNotSet(OAPI_SERIALIZER.createPartSession(null));
 		assertString(x5.getValue()).is("bar,baz");
 	}
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/SerializedNameValuePair_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/SerializedNameValuePair_Test.java
index cd885f0..5c45e8a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/SerializedNameValuePair_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/SerializedNameValuePair_Test.java
@@ -53,11 +53,11 @@ public class SerializedNameValuePair_Test {
 		assertString(x1.getValue()).is("['bar','baz']");
 		SerializedNameValuePair x2 = of("Foo",list("bar","baz")).serializer((HttpPartSerializer)null).serializer(OAPI_SERIALIZER);
 		assertString(x2.getValue()).is("bar,baz");
-		SerializedNameValuePair x3 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER).serializer((HttpPartSerializerSession)null,true);
+		SerializedNameValuePair x3 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER).serializer((HttpPartSerializerSession)null);
 		assertString(x3.getValue()).is("['bar','baz']");
-		SerializedNameValuePair x4 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER).serializer((HttpPartSerializerSession)null,false);
+		SerializedNameValuePair x4 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER).serializerIfNotSet((HttpPartSerializerSession)null);
 		assertString(x4.getValue()).is("bar,baz");
-		SerializedNameValuePair x5 = of("Foo",list("bar","baz")).serializer(OAPI_SERIALIZER.createPartSession(null),false);
+		SerializedNameValuePair x5 = of("Foo",list("bar","baz")).serializerIfNotSet(OAPI_SERIALIZER.createPartSession(null));
 		assertString(x5.getValue()).is("bar,baz");
 	}
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/BadRequest_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/BadRequest_Test.java
index a53b81e..b987d5a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/BadRequest_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/BadRequest_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.BadRequest.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class BadRequest_Test {
 
-	private static final int CODE = BadRequest.CODE;
-	private static final String MESSAGE = BadRequest.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class BadRequest_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Conflict_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Conflict_Test.java
index 16ab813..199d758 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Conflict_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Conflict_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.Conflict.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class Conflict_Test {
 
-	private static final int CODE = Conflict.CODE;
-	private static final String MESSAGE = Conflict.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class Conflict_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/ExpectationFailed_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/ExpectationFailed_Test.java
index fb5f364..e86862a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/ExpectationFailed_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/ExpectationFailed_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.ExpectationFailed.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class ExpectationFailed_Test {
 
-	private static final int CODE = ExpectationFailed.CODE;
-	private static final String MESSAGE = ExpectationFailed.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class ExpectationFailed_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/FailedDependency_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/FailedDependency_Test.java
index 1eb965d..3f78ae3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/FailedDependency_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/FailedDependency_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.FailedDependency.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class FailedDependency_Test {
 
-	private static final int CODE = FailedDependency.CODE;
-	private static final String MESSAGE = FailedDependency.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class FailedDependency_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Forbidden_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Forbidden_Test.java
index cda9c23..31d9fba 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Forbidden_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Forbidden_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.Forbidden.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class Forbidden_Test {
 
-	private static final int CODE = Forbidden.CODE;
-	private static final String MESSAGE = Forbidden.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class Forbidden_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Gone_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Gone_Test.java
index 58c70c2..0e3dce6 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Gone_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Gone_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.Gone.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class Gone_Test {
 
-	private static final int CODE = Gone.CODE;
-	private static final String MESSAGE = Gone.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class Gone_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/HttpVersionNotSupported_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/HttpVersionNotSupported_Test.java
index 70aab8b..cb01ffd 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/HttpVersionNotSupported_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/HttpVersionNotSupported_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.HttpVersionNotSupported.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class HttpVersionNotSupported_Test {
 
-	private static final int CODE = HttpVersionNotSupported.CODE;
-	private static final String MESSAGE = HttpVersionNotSupported.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class HttpVersionNotSupported_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/InsufficentStorage_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/InsufficentStorage_Test.java
index 1fadc2a..31dc7a4 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/InsufficentStorage_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/InsufficentStorage_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.InsufficientStorage.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class InsufficentStorage_Test {
 
-	private static final int CODE = InsufficientStorage.CODE;
-	private static final String MESSAGE = InsufficientStorage.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class InsufficentStorage_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/InternalServerError_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/InternalServerError_Test.java
index f3eaa2d..adc31f1 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/InternalServerError_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/InternalServerError_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.InternalServerError.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class InternalServerError_Test {
 
-	private static final int CODE = InternalServerError.CODE;
-	private static final String MESSAGE = InternalServerError.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class InternalServerError_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/LengthRequired_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/LengthRequired_Test.java
index 493f5c3..ad3b876 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/LengthRequired_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/LengthRequired_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.LengthRequired.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class LengthRequired_Test {
 
-	private static final int CODE = LengthRequired.CODE;
-	private static final String MESSAGE = LengthRequired.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class LengthRequired_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Locked_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Locked_Test.java
index f4eb10e..624014f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Locked_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Locked_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.Locked.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class Locked_Test {
 
-	private static final int CODE = Locked.CODE;
-	private static final String MESSAGE = Locked.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class Locked_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/LoopDetected_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/LoopDetected_Test.java
index 29d4e71..ed5560f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/LoopDetected_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/LoopDetected_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.LoopDetected.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class LoopDetected_Test {
 
-	private static final int CODE = LoopDetected.CODE;
-	private static final String MESSAGE = LoopDetected.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class LoopDetected_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/MethodNotAllowed_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/MethodNotAllowed_Test.java
index 25e40b4..bdc03b1 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/MethodNotAllowed_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/MethodNotAllowed_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.MethodNotAllowed.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class MethodNotAllowed_Test {
 
-	private static final int CODE = MethodNotAllowed.CODE;
-	private static final String MESSAGE = MethodNotAllowed.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class MethodNotAllowed_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/MisdirectedRequest_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/MisdirectedRequest_Test.java
index af0a69c..5255a21 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/MisdirectedRequest_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/MisdirectedRequest_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.MisdirectedRequest.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class MisdirectedRequest_Test {
 
-	private static final int CODE = MisdirectedRequest.CODE;
-	private static final String MESSAGE = MisdirectedRequest.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class MisdirectedRequest_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired_Test.java
index 5bdf1c5..1383fb8 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NetworkAuthenticationRequired_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.NetworkAuthenticationRequired.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class NetworkAuthenticationRequired_Test {
 
-	private static final int CODE = NetworkAuthenticationRequired.CODE;
-	private static final String MESSAGE = NetworkAuthenticationRequired.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class NetworkAuthenticationRequired_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotAcceptable_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotAcceptable_Test.java
index 2aa39b1..dbb6f2a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotAcceptable_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotAcceptable_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.NotAcceptable.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class NotAcceptable_Test {
 
-	private static final int CODE = NotAcceptable.CODE;
-	private static final String MESSAGE = NotAcceptable.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class NotAcceptable_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotExtended_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotExtended_Test.java
index c64c27c..62e27e1 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotExtended_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotExtended_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.NotExtended.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class NotExtended_Test {
 
-	private static final int CODE = NotExtended.CODE;
-	private static final String MESSAGE = NotExtended.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class NotExtended_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotFound_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotFound_Test.java
index 4622727..94693e6 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotFound_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotFound_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.NotFound.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class NotFound_Test {
 
-	private static final int CODE = NotFound.CODE;
-	private static final String MESSAGE = NotFound.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class NotFound_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotImplemented_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotImplemented_Test.java
index 3f42789..3816311 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotImplemented_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/NotImplemented_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.NotImplemented.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class NotImplemented_Test {
 
-	private static final int CODE = NotImplemented.CODE;
-	private static final String MESSAGE = NotImplemented.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class NotImplemented_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/PayloadTooLarge_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/PayloadTooLarge_Test.java
index 3a37b3d..b0097a7 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/PayloadTooLarge_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/PayloadTooLarge_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.PayloadTooLarge.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class PayloadTooLarge_Test {
 
-	private static final int CODE = PayloadTooLarge.CODE;
-	private static final String MESSAGE = PayloadTooLarge.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class PayloadTooLarge_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/PreconditionFailed_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/PreconditionFailed_Test.java
index 64b952f..52a93b3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/PreconditionFailed_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/PreconditionFailed_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.PreconditionFailed.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class PreconditionFailed_Test {
 
-	private static final int CODE = PreconditionFailed.CODE;
-	private static final String MESSAGE = PreconditionFailed.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class PreconditionFailed_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/PreconditionRequired_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/PreconditionRequired_Test.java
index cc319dc..77d1878 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/PreconditionRequired_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/PreconditionRequired_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.PreconditionRequired.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class PreconditionRequired_Test {
 
-	private static final int CODE = PreconditionRequired.CODE;
-	private static final String MESSAGE = PreconditionRequired.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class PreconditionRequired_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/RangeNotSatisfiable_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/RangeNotSatisfiable_Test.java
index 02c0666..710c2fa 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/RangeNotSatisfiable_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/RangeNotSatisfiable_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.RangeNotSatisfiable.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class RangeNotSatisfiable_Test {
 
-	private static final int CODE = RangeNotSatisfiable.CODE;
-	private static final String MESSAGE = RangeNotSatisfiable.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class RangeNotSatisfiable_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge_Test.java
index 3dfb09a..3779f32 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/RequestHeaderFieldsTooLarge_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.RequestHeaderFieldsTooLarge.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class RequestHeaderFieldsTooLarge_Test {
 
-	private static final int CODE = RequestHeaderFieldsTooLarge.CODE;
-	private static final String MESSAGE = RequestHeaderFieldsTooLarge.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class RequestHeaderFieldsTooLarge_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/ServiceUnavailable_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/ServiceUnavailable_Test.java
index 471abcc..d107d7f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/ServiceUnavailable_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/ServiceUnavailable_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.ServiceUnavailable.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class ServiceUnavailable_Test {
 
-	private static final int CODE = ServiceUnavailable.CODE;
-	private static final String MESSAGE = ServiceUnavailable.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class ServiceUnavailable_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/TooManyRequests_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/TooManyRequests_Test.java
index 489184e..b2a3e8e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/TooManyRequests_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/TooManyRequests_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.TooManyRequests.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class TooManyRequests_Test {
 
-	private static final int CODE = TooManyRequests.CODE;
-	private static final String MESSAGE = TooManyRequests.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class TooManyRequests_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Unauthorized_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Unauthorized_Test.java
index 20675da..54bccad 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/Unauthorized_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/Unauthorized_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.Unauthorized.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class Unauthorized_Test {
 
-	private static final int CODE = Unauthorized.CODE;
-	private static final String MESSAGE = Unauthorized.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class Unauthorized_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnavailableForLegalReasons_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnavailableForLegalReasons_Test.java
index 3016817..32e6ea0 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnavailableForLegalReasons_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnavailableForLegalReasons_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.UnavailableForLegalReasons.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class UnavailableForLegalReasons_Test {
 
-	private static final int CODE = UnavailableForLegalReasons.CODE;
-	private static final String MESSAGE = UnavailableForLegalReasons.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class UnavailableForLegalReasons_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnprocessableEntity_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnprocessableEntity_Test.java
index a76f5aa..4625725 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnprocessableEntity_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnprocessableEntity_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.UnprocessableEntity.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class UnprocessableEntity_Test {
 
-	private static final int CODE = UnprocessableEntity.CODE;
-	private static final String MESSAGE = UnprocessableEntity.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class UnprocessableEntity_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnsupportedMediaType_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnsupportedMediaType_Test.java
index 98a0951..0ab49d2 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnsupportedMediaType_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UnsupportedMediaType_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.UnsupportedMediaType.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class UnsupportedMediaType_Test {
 
-	private static final int CODE = UnsupportedMediaType.CODE;
-	private static final String MESSAGE = UnsupportedMediaType.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class UnsupportedMediaType_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UpgradeRequired_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UpgradeRequired_Test.java
index 9d30b66..6942975 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UpgradeRequired_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UpgradeRequired_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.UpgradeRequired.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class UpgradeRequired_Test {
 
-	private static final int CODE = UpgradeRequired.CODE;
-	private static final String MESSAGE = UpgradeRequired.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class UpgradeRequired_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UriTooLong_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UriTooLong_Test.java
index 05797b9..58a6a13 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/UriTooLong_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/UriTooLong_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.UriTooLong.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class UriTooLong_Test {
 
-	private static final int CODE = UriTooLong.CODE;
-	private static final String MESSAGE = UriTooLong.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class UriTooLong_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/exception/VariantAlsoNegotiates_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/exception/VariantAlsoNegotiates_Test.java
index 3cf88dd..fcdf4b9 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/exception/VariantAlsoNegotiates_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/exception/VariantAlsoNegotiates_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.exception;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.exception.VariantAlsoNegotiates.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -22,9 +23,6 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class VariantAlsoNegotiates_Test {
 
-	private static final int CODE = VariantAlsoNegotiates.CODE;
-	private static final String MESSAGE = VariantAlsoNegotiates.MESSAGE;
-
 	@Rest
 	public static class A {
 		@RestGet
@@ -58,23 +56,23 @@ public class VariantAlsoNegotiates_Test {
 		RestClient c = MockRestClient.create(A.class).ignoreErrors().noLog().build();
 
 		c.get("/f1").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE);
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE);
 		c.get("/f2").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f3").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("baz");
 		c.get("/f4").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo bar");
 		c.get("/f5").run()
-			.assertStatus().code().is(CODE)
-			.assertBody().is(MESSAGE)
+			.assertStatus().code().is(STATUS_CODE)
+			.assertBody().is(REASON_PHRASE)
 			.assertHeader("Foo").is("bar");
 		c.get("/f6").run()
-			.assertStatus().code().is(CODE)
+			.assertStatus().code().is(STATUS_CODE)
 			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_CommonInterfaces_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_CommonInterfaces_Test.java
index d96cf52..930721e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_CommonInterfaces_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_CommonInterfaces_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.remote;
 
 import static org.apache.juneau.assertions.Assertions.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 import static org.junit.Assert.*;
 import static org.junit.runners.MethodSorters.*;
 
@@ -141,59 +142,54 @@ public class Remote_CommonInterfaces_Test {
 	}
 
 	public static class C1 implements C {
-		@Override public Ok ok() { return Ok.OK; }
-		@Override public Accepted accepted() { return Accepted.INSTANCE; }
-		@Override public AlreadyReported alreadyReported() { return AlreadyReported.INSTANCE; }
+		@Override public Ok ok() { return OK; }
+		@Override public Accepted accepted() { return ACCEPTED; }
+		@Override public AlreadyReported alreadyReported() { return ALREADY_REPORTED; }
 		//@Override public Continue _continue() { return Continue.INSTANCE; }
-		@Override public Created created() { return Created.INSTANCE; }
+		@Override public Created created() { return CREATED; }
 		//@Override public EarlyHints earlyHints() { return EarlyHints.INSTANCE; }
-		@Override public Found found() { return Found.INSTANCE; }
-		@Override public IMUsed iMUsed() { return IMUsed.INSTANCE; }
-		@Override public MovedPermanently movedPermanently() { return MovedPermanently.INSTANCE; }
-		@Override public MultipleChoices multipleChoices() { return MultipleChoices.INSTANCE; }
-		@Override public MultiStatus multiStatus() { return MultiStatus.INSTANCE; }
-		@Override public NoContent noContent() { return NoContent.INSTANCE; }
-		@Override public NonAuthoritiveInformation nonAuthoritiveInformation() { return NonAuthoritiveInformation.INSTANCE; }
-		@Override public NotModified notModified() { return NotModified.INSTANCE; }
-		@Override public PartialContent partialContent() { return PartialContent.INSTANCE; }
-		@Override public PermanentRedirect permanentRedirect() { return PermanentRedirect.INSTANCE; }
+		@Override public Found found() { return FOUND; }
+		@Override public IMUsed iMUsed() { return IM_USED; }
+		@Override public MovedPermanently movedPermanently() { return MOVED_PERMANENTLY; }
+		@Override public MultipleChoices multipleChoices() { return MULTIPLE_CHOICES; }
+		@Override public MultiStatus multiStatus() { return MULTI_STATUS; }
+		@Override public NoContent noContent() { return NO_CONTENT; }
+		@Override public NonAuthoritiveInformation nonAuthoritiveInformation() { return NON_AUTHORATIVE_INFORMATION; }
+		@Override public NotModified notModified() { return NOT_MODIFIED; }
+		@Override public PartialContent partialContent() { return PARTIAL_CONTENT; }
+		@Override public PermanentRedirect permanentRedirect() { return PERMANENT_REDIRECT; }
 		//@Override public Processing processing() { return Processing.INSTANCE; }
-		@Override public ResetContent resetContent() { return ResetContent.INSTANCE; }
-		@Override public SeeOther seeOther() { return SeeOther.INSTANCE; }
+		@Override public ResetContent resetContent() { return RESET_CONTENT; }
+		@Override public SeeOther seeOther() { return SEE_OTHER; }
 		//@Override public SwitchingProtocols switchingProtocols() { return SwitchingProtocols.INSTANCE; }
-		@Override public TemporaryRedirect temporaryRedirect() { return TemporaryRedirect.INSTANCE; }
-		@Override public UseProxy useProxy() { return UseProxy.INSTANCE; }
+		@Override public TemporaryRedirect temporaryRedirect() { return TEMPORARY_REDIRECT; }
+		@Override public UseProxy useProxy() { return USE_PROXY; }
 	}
 
 	@Test
 	public void c01_standardResponses() throws Exception {
-		C x = MockRestClient.create(C1.class).json().disableRedirectHandling().build().getRemote(C.class);
-		assertEquals("OK",x.ok().toString());
-		assertEquals("Accepted",x.accepted().toString());
-		assertEquals("Already Reported",x.alreadyReported().toString());
-		// HttpClient goes into loop if status code is less than 200.
-		//assertEquals("Continue",ic._continue().toString());
-		assertEquals("Created",x.created().toString());
-		// HttpClient goes into loop if status code is less than 200.
-		//assertEquals("Early Hints",ic.earlyHints().toString());
-		assertEquals("Found",x.found().toString());
-		assertEquals("IM Used",x.iMUsed().toString());
-		assertEquals("Moved Permanently",x.movedPermanently().toString());
-		assertEquals("Multiple Choices",x.multipleChoices().toString());
-		assertEquals("Multi-Status",x.multiStatus().toString());
-		assertEquals("No Content",x.noContent().toString());
-		assertEquals("Non-Authoritative Information",x.nonAuthoritiveInformation().toString());
-		assertEquals("Not Modified",x.notModified().toString());
-		assertEquals("Partial Content",x.partialContent().toString());
-		assertEquals("Permanent Redirect",x.permanentRedirect().toString());
-		// HttpClient goes into loop if status code is less than 200.
-		//assertEquals("Processing",ic.processing().toString());
-		assertEquals("Reset Content",x.resetContent().toString());
-		assertEquals("See Other",x.seeOther().toString());
-		// HttpClient goes into loop if status code is less than 200.
-		//assertEquals("Switching Protocols",ic.switchingProtocols().toString());
-		assertEquals("Temporary Redirect",x.temporaryRedirect().toString());
-		assertEquals("Use Proxy",x.useProxy().toString());
+
+		// HttpClient goes into loop if status code is less than 200 so we can't test those.
+
+		C x = MockRestClient.create(C1.class).json().disableRedirectHandling().debug().build().getRemote(C.class);
+		assertObject(x.ok()).asString().contains("HTTP/1.1 200 OK");
+		assertObject(x.accepted()).asString().contains("HTTP/1.1 202 Accepted");
+		assertObject(x.alreadyReported()).asString().contains("HTTP/1.1 208 Already Reported");
+		assertObject(x.created()).asString().contains("HTTP/1.1 201 Created");
+		assertObject(x.found()).asString().contains("HTTP/1.1 302 Found");
+		assertObject(x.iMUsed()).asString().contains("HTTP/1.1 226 IM Used");
+		assertObject(x.movedPermanently()).asString().contains("HTTP/1.1 301 Moved Permanently");
+		assertObject(x.multipleChoices()).asString().contains("HTTP/1.1 300 Multiple Choices");
+		assertObject(x.multiStatus()).asString().contains("HTTP/1.1 207 Multi-Status");
+		assertObject(x.noContent()).asString().contains("HTTP/1.1 204 No Content");
+		assertObject(x.nonAuthoritiveInformation()).asString().contains("HTTP/1.1 203 Non-Authoritative Information");
+		assertObject(x.notModified()).asString().contains("HTTP/1.1 304 Not Modified");
+		assertObject(x.partialContent()).asString().contains("HTTP/1.1 206 Partial Content");
+		assertObject(x.permanentRedirect()).asString().contains("HTTP/1.1 308 Permanent Redirect");
+		assertObject(x.resetContent()).asString().contains("HTTP/1.1 205 Reset Content");
+		assertObject(x.seeOther()).asString().contains("HTTP/1.1 303 See Other");
+		assertObject(x.temporaryRedirect()).asString().contains("HTTP/1.1 307 Temporary Redirect");
+		assertObject(x.useProxy()).asString().contains("HTTP/1.1 305 Use Proxy");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -403,39 +399,39 @@ public class Remote_CommonInterfaces_Test {
 	@Test
 	public void e01_predefinedExceptions() {
 		E x = MockRestClient.create(E1.class).ignoreErrors(false).noLog().build().getRemote(E.class);
-		assertThrown(()->x.badRequest()).isType(BadRequest.class).is(BadRequest.MESSAGE);
-		assertThrown(()->x.conflict()).is(Conflict.MESSAGE);
-		assertThrown(()->x.expectationFailed()).is(ExpectationFailed.MESSAGE);
-		assertThrown(()->x.failedDependency()).is(FailedDependency.MESSAGE);
-		assertThrown(()->x.forbidden()).is(Forbidden.MESSAGE);
-		assertThrown(()->x.gone()).is(Gone.MESSAGE);
-		assertThrown(()->x.httpVersionNotSupported()).is(HttpVersionNotSupported.MESSAGE);
-		assertThrown(()->x.insufficientStorage()).is(InsufficientStorage.MESSAGE);
-		assertThrown(()->x.internalServerError()).is(InternalServerError.MESSAGE);
-		assertThrown(()->x.lengthRequired()).is(LengthRequired.MESSAGE);
-		assertThrown(()->x.locked()).is(Locked.MESSAGE);
-		assertThrown(()->x.loopDetected()).is(LoopDetected.MESSAGE);
-		assertThrown(()->x.methodNotAllowed()).is(MethodNotAllowed.MESSAGE);
-		assertThrown(()->x.misdirectedRequest()).is(MisdirectedRequest.MESSAGE);
-		assertThrown(()->x.networkAuthenticationRequired()).is(NetworkAuthenticationRequired.MESSAGE);
-		assertThrown(()->x.notAcceptable()).is(NotAcceptable.MESSAGE);
-		assertThrown(()->x.notExtended()).is(NotExtended.MESSAGE);
-		assertThrown(()->x.notFound()).is(NotFound.MESSAGE);
-		assertThrown(()->x.notImplemented()).is(NotImplemented.MESSAGE);
-		assertThrown(()->x.payloadTooLarge()).is(PayloadTooLarge.MESSAGE);
-		assertThrown(()->x.preconditionFailed()).is(PreconditionFailed.MESSAGE);
-		assertThrown(()->x.preconditionRequired()).is(PreconditionRequired.MESSAGE);
-		assertThrown(()->x.rangeNotSatisfiable()).is(RangeNotSatisfiable.MESSAGE);
-		assertThrown(()->x.requestHeaderFieldsTooLarge()).is(RequestHeaderFieldsTooLarge.MESSAGE);
-		assertThrown(()->x.serviceUnavailable()).is(ServiceUnavailable.MESSAGE);
-		assertThrown(()->x.tooManyRequests()).is(TooManyRequests.MESSAGE);
-		assertThrown(()->x.unauthorized()).is(Unauthorized.MESSAGE);
-		assertThrown(()->x.unavailableForLegalReasons()).is(UnavailableForLegalReasons.MESSAGE);
-		assertThrown(()->x.unprocessableEntity()).is(UnprocessableEntity.MESSAGE);
-		assertThrown(()->x.unsupportedMediaType()).is(UnsupportedMediaType.MESSAGE);
-		assertThrown(()->x.upgradeRequired()).is(UpgradeRequired.MESSAGE);
-		assertThrown(()->x.uriTooLong()).is(UriTooLong.MESSAGE);
-		assertThrown(()->x.variantAlsoNegotiates()).is(VariantAlsoNegotiates.MESSAGE);
+		assertThrown(()->x.badRequest()).isType(BadRequest.class).is(BadRequest.REASON_PHRASE);
+		assertThrown(()->x.conflict()).is(Conflict.REASON_PHRASE);
+		assertThrown(()->x.expectationFailed()).is(ExpectationFailed.REASON_PHRASE);
+		assertThrown(()->x.failedDependency()).is(FailedDependency.REASON_PHRASE);
+		assertThrown(()->x.forbidden()).is(Forbidden.REASON_PHRASE);
+		assertThrown(()->x.gone()).is(Gone.REASON_PHRASE);
+		assertThrown(()->x.httpVersionNotSupported()).is(HttpVersionNotSupported.REASON_PHRASE);
+		assertThrown(()->x.insufficientStorage()).is(InsufficientStorage.REASON_PHRASE);
+		assertThrown(()->x.internalServerError()).is(InternalServerError.REASON_PHRASE);
+		assertThrown(()->x.lengthRequired()).is(LengthRequired.REASON_PHRASE);
+		assertThrown(()->x.locked()).is(Locked.REASON_PHRASE);
+		assertThrown(()->x.loopDetected()).is(LoopDetected.REASON_PHRASE);
+		assertThrown(()->x.methodNotAllowed()).is(MethodNotAllowed.REASON_PHRASE);
+		assertThrown(()->x.misdirectedRequest()).is(MisdirectedRequest.REASON_PHRASE);
+		assertThrown(()->x.networkAuthenticationRequired()).is(NetworkAuthenticationRequired.REASON_PHRASE);
+		assertThrown(()->x.notAcceptable()).is(NotAcceptable.REASON_PHRASE);
+		assertThrown(()->x.notExtended()).is(NotExtended.REASON_PHRASE);
+		assertThrown(()->x.notFound()).is(NotFound.REASON_PHRASE);
+		assertThrown(()->x.notImplemented()).is(NotImplemented.REASON_PHRASE);
+		assertThrown(()->x.payloadTooLarge()).is(PayloadTooLarge.REASON_PHRASE);
+		assertThrown(()->x.preconditionFailed()).is(PreconditionFailed.REASON_PHRASE);
+		assertThrown(()->x.preconditionRequired()).is(PreconditionRequired.REASON_PHRASE);
+		assertThrown(()->x.rangeNotSatisfiable()).is(RangeNotSatisfiable.REASON_PHRASE);
+		assertThrown(()->x.requestHeaderFieldsTooLarge()).is(RequestHeaderFieldsTooLarge.REASON_PHRASE);
+		assertThrown(()->x.serviceUnavailable()).is(ServiceUnavailable.REASON_PHRASE);
+		assertThrown(()->x.tooManyRequests()).is(TooManyRequests.REASON_PHRASE);
+		assertThrown(()->x.unauthorized()).is(Unauthorized.REASON_PHRASE);
+		assertThrown(()->x.unavailableForLegalReasons()).is(UnavailableForLegalReasons.REASON_PHRASE);
+		assertThrown(()->x.unprocessableEntity()).is(UnprocessableEntity.REASON_PHRASE);
+		assertThrown(()->x.unsupportedMediaType()).is(UnsupportedMediaType.REASON_PHRASE);
+		assertThrown(()->x.upgradeRequired()).is(UpgradeRequired.REASON_PHRASE);
+		assertThrown(()->x.uriTooLong()).is(UriTooLong.REASON_PHRASE);
+		assertThrown(()->x.variantAlsoNegotiates()).is(VariantAlsoNegotiates.REASON_PHRASE);
 	}
 
 	public static class E2 implements E {
@@ -875,6 +871,6 @@ public class Remote_CommonInterfaces_Test {
 	@Test
 	public void h01_seeOtherRoot() throws Exception {
 		IH x = MockRestClient.create(H.class).json().disableRedirectHandling().build().getRemote(IH.class);
-		assertEquals("See Other",x.seeOtherRoot().toString());
+		assertObject(x.seeOtherRoot()).asString().contains("HTTP/1.1 303 See Other");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/Accepted_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/Accepted_Test.java
index 9123874..6b47a55 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/Accepted_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/Accepted_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class Accepted_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public Accepted a1() { return new Accepted(); }
-		@RestGet public Accepted a2() { return new Accepted("foo"); }
-		@RestGet public Accepted a3() { return new Accepted().header("Foo","bar"); }
+		@RestGet public Accepted a1() { return ACCEPTED; }
+		@RestGet public Accepted a2() { return accepted().body("foo"); }
+		@RestGet public Accepted a3() { return accepted().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/AlreadyReported_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/AlreadyReported_Test.java
index c91148f..88cf67b 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/AlreadyReported_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/AlreadyReported_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class AlreadyReported_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public AlreadyReported a1() { return new AlreadyReported(); }
-		@RestGet public AlreadyReported a2() { return new AlreadyReported("foo"); }
-		@RestGet public AlreadyReported a3() { return new AlreadyReported().header("Foo","bar"); }
+		@RestGet public AlreadyReported a1() { return ALREADY_REPORTED; }
+		@RestGet public AlreadyReported a2() { return alreadyReported().body("foo"); }
+		@RestGet public AlreadyReported a3() { return alreadyReported().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/Continue_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/Continue_Test.java
index a0ee208..fac8ebd 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/Continue_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/Continue_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class Continue_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public Continue a1() { return new Continue(); }
-		@RestGet public Continue a2() { return new Continue("foo"); }
-		@RestGet public Continue a3() { return new Continue().header("Foo","bar"); }
+		@RestGet public Continue a1() { return CONTINUE; }
+		@RestGet public Continue a2() { return _continue().body("foo"); }
+		@RestGet public Continue a3() { return _continue().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/Created_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/Created_Test.java
index 7cf95a5..affca7e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/Created_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/Created_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class Created_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public Created a1() { return new Created(); }
-		@RestGet public Created a2() { return new Created("foo"); }
-		@RestGet public Created a3() { return new Created().header("Foo","bar"); }
+		@RestGet public Created a1() { return CREATED; }
+		@RestGet public Created a2() { return created().body("foo"); }
+		@RestGet public Created a3() { return created().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/EarlyHints_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/EarlyHints_Test.java
index d8b5848..1b76405 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/EarlyHints_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/EarlyHints_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class EarlyHints_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public EarlyHints a1() { return new EarlyHints(); }
-		@RestGet public EarlyHints a2() { return new EarlyHints("foo"); }
-		@RestGet public EarlyHints a3() { return new EarlyHints().header("Foo","bar"); }
+		@RestGet public EarlyHints a1() { return EARLY_HINTS; }
+		@RestGet public EarlyHints a2() { return earlyHints().body("foo"); }
+		@RestGet public EarlyHints a3() { return earlyHints().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/Found_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/Found_Test.java
index b0d7eae..099c9f2 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/Found_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/Found_Test.java
@@ -13,8 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
-
-import java.net.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -25,10 +24,10 @@ public class Found_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public Found a1() { return new Found(); }
-		@RestGet public Found a2() { return new Found("foo"); }
-		@RestGet public Found a3() { return new Found(URI.create("servlet:/foo")); }
-		@RestGet public Found a4() { return new Found().header("Foo","bar"); }
+		@RestGet public Found a1() { return FOUND; }
+		@RestGet public Found a2() { return found("servlet:/foo").body("foo"); }
+		@RestGet public Found a3() { return found("servlet:/foo"); }
+		@RestGet public Found a4() { return found("servlet:/foo").header("Foo","bar"); }
 	}
 
 	@Test
@@ -46,7 +45,6 @@ public class Found_Test {
 		client.get("/a3")
 			.run()
 			.assertCode().is(302)
-			.assertBody().is("Found")
 			.assertHeader("Location").is("/foo");
 		client.get("/a4")
 			.run()
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/IMUsed_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/IMUsed_Test.java
index 270f335..ac21ab0 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/IMUsed_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/IMUsed_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class IMUsed_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public IMUsed a1() { return new IMUsed(); }
-		@RestGet public IMUsed a2() { return new IMUsed("foo"); }
-		@RestGet public IMUsed a3() { return new IMUsed().header("Foo","bar"); }
+		@RestGet public IMUsed a1() { return IM_USED; }
+		@RestGet public IMUsed a2() { return imUsed().body("foo"); }
+		@RestGet public IMUsed a3() { return imUsed().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/MovedPermanently_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/MovedPermanently_Test.java
index 2ac65b5..c8868a7 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/MovedPermanently_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/MovedPermanently_Test.java
@@ -13,8 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
-
-import java.net.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -25,10 +24,10 @@ public class MovedPermanently_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public MovedPermanently a1() { return new MovedPermanently(); }
-		@RestGet public MovedPermanently a2() { return new MovedPermanently("foo"); }
-		@RestGet public MovedPermanently a3() { return new MovedPermanently(URI.create("servlet:/foo")); }
-		@RestGet public MovedPermanently a4() { return new MovedPermanently().header("Foo","bar"); }
+		@RestGet public MovedPermanently a1() { return MOVED_PERMANENTLY; }
+		@RestGet public MovedPermanently a2() { return movedPermanently("servlet:/foo").body("foo"); }
+		@RestGet public MovedPermanently a3() { return movedPermanently("servlet:/foo").location("servlet:/foo"); }
+		@RestGet public MovedPermanently a4() { return movedPermanently("servlet:/foo").header("Foo","bar"); }
 	}
 
 	@Test
@@ -46,7 +45,6 @@ public class MovedPermanently_Test {
 		client.get("/a3")
 			.run()
 			.assertCode().is(301)
-			.assertBody().is("Moved Permanently")
 			.assertHeader("Location").is("/foo");
 		client.get("/a4")
 			.run()
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/MultiStatus_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/MultiStatus_Test.java
index 54a3b91..5dd2c7b 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/MultiStatus_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/MultiStatus_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class MultiStatus_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public MultiStatus a1() { return new MultiStatus(); }
-		@RestGet public MultiStatus a2() { return new MultiStatus("foo"); }
-		@RestGet public MultiStatus a3() { return new MultiStatus().header("Foo","bar"); }
+		@RestGet public MultiStatus a1() { return MULTI_STATUS; }
+		@RestGet public MultiStatus a2() { return multiStatus().body("foo"); }
+		@RestGet public MultiStatus a3() { return multiStatus().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/MultipleChoices_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/MultipleChoices_Test.java
index a6e5148..2a1e3e1 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/MultipleChoices_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/MultipleChoices_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class MultipleChoices_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public MultipleChoices a1() { return new MultipleChoices(); }
-		@RestGet public MultipleChoices a2() { return new MultipleChoices("foo"); }
-		@RestGet public MultipleChoices a3() { return new MultipleChoices().header("Foo","bar"); }
+		@RestGet public MultipleChoices a1() { return MULTIPLE_CHOICES; }
+		@RestGet public MultipleChoices a2() { return multipleChoices().body("foo"); }
+		@RestGet public MultipleChoices a3() { return multipleChoices().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/NoContent_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/NoContent_Test.java
index e3a2ca9..ec1d58e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/NoContent_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/NoContent_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class NoContent_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public NoContent a1() { return new NoContent(); }
-		@RestGet public NoContent a2() { return new NoContent("foo"); }
-		@RestGet public NoContent a3() { return new NoContent().header("Foo","bar"); }
+		@RestGet public NoContent a1() { return NO_CONTENT; }
+		@RestGet public NoContent a2() { return noContent().body("foo"); }
+		@RestGet public NoContent a3() { return noContent().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/NonAuthoritativeInformation_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/NonAuthoritativeInformation_Test.java
index fd2b2a8..0f692c1 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/NonAuthoritativeInformation_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/NonAuthoritativeInformation_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class NonAuthoritativeInformation_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public NonAuthoritiveInformation a1() { return new NonAuthoritiveInformation(); }
-		@RestGet public NonAuthoritiveInformation a2() { return new NonAuthoritiveInformation("foo"); }
-		@RestGet public NonAuthoritiveInformation a3() { return new NonAuthoritiveInformation().header("Foo","bar"); }
+		@RestGet public NonAuthoritiveInformation a1() { return NON_AUTHORATIVE_INFORMATION; }
+		@RestGet public NonAuthoritiveInformation a2() { return nonAuthoritiveInformation().body("foo"); }
+		@RestGet public NonAuthoritiveInformation a3() { return nonAuthoritiveInformation().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/NotModified_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/NotModified_Test.java
index 61e7fd6..5f79301 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/NotModified_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/NotModified_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class NotModified_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public NotModified a1() { return new NotModified(); }
-		@RestGet public NotModified a2() { return new NotModified("foo"); }
-		@RestGet public NotModified a3() { return new NotModified().header("Foo","bar"); }
+		@RestGet public NotModified a1() { return NOT_MODIFIED; }
+		@RestGet public NotModified a2() { return notModified().body("foo"); }
+		@RestGet public NotModified a3() { return notModified().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/Ok_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/Ok_Test.java
index 4880049..892cf96 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/Ok_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/Ok_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class Ok_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public Ok a1() { return new Ok(); }
-		@RestGet public Ok a2() { return new Ok("foo"); }
-		@RestGet public Ok a3() { return new Ok().header("Foo","bar"); }
+		@RestGet public Ok a1() { return OK; }
+		@RestGet public Ok a2() { return ok().body("foo"); }
+		@RestGet public Ok a3() { return ok().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/PartialContent_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/PartialContent_Test.java
index 88a6c53..69ac016 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/PartialContent_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/PartialContent_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class PartialContent_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public PartialContent a1() { return new PartialContent(); }
-		@RestGet public PartialContent a2() { return new PartialContent("foo"); }
-		@RestGet public PartialContent a3() { return new PartialContent().header("Foo","bar"); }
+		@RestGet public PartialContent a1() { return PARTIAL_CONTENT; }
+		@RestGet public PartialContent a2() { return partialContent().body("foo"); }
+		@RestGet public PartialContent a3() { return partialContent().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/PermanentRedirect_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/PermanentRedirect_Test.java
index 2a140f5..9d484ea 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/PermanentRedirect_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/PermanentRedirect_Test.java
@@ -13,8 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
-
-import java.net.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -25,10 +24,10 @@ public class PermanentRedirect_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public PermanentRedirect a1() { return new PermanentRedirect(); }
-		@RestGet public PermanentRedirect a2() { return new PermanentRedirect("foo"); }
-		@RestGet public PermanentRedirect a3() { return new PermanentRedirect(URI.create("servlet:/foo")); }
-		@RestGet public PermanentRedirect a4() { return new PermanentRedirect().header("Foo","bar"); }
+		@RestGet public PermanentRedirect a1() { return PERMANENT_REDIRECT; }
+		@RestGet public PermanentRedirect a2() { return permanentRedirect("servlet:/foo").body("foo"); }
+		@RestGet public PermanentRedirect a3() { return permanentRedirect("servlet:/foo"); }
+		@RestGet public PermanentRedirect a4() { return permanentRedirect("servlet:/foo").header("Foo","bar"); }
 	}
 
 	@Test
@@ -46,7 +45,6 @@ public class PermanentRedirect_Test {
 		client.get("/a3")
 			.run()
 			.assertCode().is(308)
-			.assertBody().is("Permanent Redirect")
 			.assertHeader("Location").is("/foo");
 		client.get("/a4")
 			.run()
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/Processing_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/Processing_Test.java
index 3533c2a..e7bc533 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/Processing_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/Processing_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class Processing_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public Processing a1() { return new Processing(); }
-		@RestGet public Processing a2() { return new Processing("foo"); }
-		@RestGet public Processing a3() { return new Processing().header("Foo","bar"); }
+		@RestGet public Processing a1() { return PROCESSING; }
+		@RestGet public Processing a2() { return processing().body("foo"); }
+		@RestGet public Processing a3() { return processing().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/ResetContent_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/ResetContent_Test.java
index ac05284..a8f2c96 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/ResetContent_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/ResetContent_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class ResetContent_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public ResetContent a1() { return new ResetContent(); }
-		@RestGet public ResetContent a2() { return new ResetContent("foo"); }
-		@RestGet public ResetContent a3() { return new ResetContent().header("Foo","bar"); }
+		@RestGet public ResetContent a1() { return RESET_CONTENT; }
+		@RestGet public ResetContent a2() { return resetContent().body("foo"); }
+		@RestGet public ResetContent a3() { return resetContent().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/SeeOther_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/SeeOther_Test.java
index fc0dea6..db22305 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/SeeOther_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/SeeOther_Test.java
@@ -13,8 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
-
-import java.net.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -25,10 +24,10 @@ public class SeeOther_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public SeeOther a1() { return new SeeOther(); }
-		@RestGet public SeeOther a2() { return new SeeOther("foo"); }
-		@RestGet public SeeOther a3() { return new SeeOther(URI.create("servlet:/foo")); }
-		@RestGet public SeeOther a4() { return new SeeOther().header("Foo","bar"); }
+		@RestGet public SeeOther a1() { return SEE_OTHER; }
+		@RestGet public SeeOther a2() { return seeOther("servlet:/foo").body("foo"); }
+		@RestGet public SeeOther a3() { return seeOther("servlet:/foo"); }
+		@RestGet public SeeOther a4() { return seeOther("servlet:/foo").header("Foo","bar"); }
 	}
 
 	@Test
@@ -46,7 +45,6 @@ public class SeeOther_Test {
 		client.get("/a3")
 			.run()
 			.assertCode().is(303)
-			.assertBody().is("See Other")
 			.assertHeader("Location").is("/foo");
 		client.get("/a4")
 			.run()
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/SwitchingProtocols_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/SwitchingProtocols_Test.java
index a766e75..d5e8d61 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/SwitchingProtocols_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/SwitchingProtocols_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class SwitchingProtocols_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public SwitchingProtocols a1() { return new SwitchingProtocols(); }
-		@RestGet public SwitchingProtocols a2() { return new SwitchingProtocols("foo"); }
-		@RestGet public SwitchingProtocols a3() { return new SwitchingProtocols().header("Foo","bar"); }
+		@RestGet public SwitchingProtocols a1() { return SWITCHING_PROTOCOLS; }
+		@RestGet public SwitchingProtocols a2() { return switchingProtocols().body("foo"); }
+		@RestGet public SwitchingProtocols a3() { return switchingProtocols().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/TemporaryRedirect_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/TemporaryRedirect_Test.java
index 8e12dcb..1abbc95 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/TemporaryRedirect_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/TemporaryRedirect_Test.java
@@ -13,8 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
-
-import java.net.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -25,10 +24,10 @@ public class TemporaryRedirect_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public TemporaryRedirect a1() { return new TemporaryRedirect(); }
-		@RestGet public TemporaryRedirect a2() { return new TemporaryRedirect("foo"); }
-		@RestGet public TemporaryRedirect a3() { return new TemporaryRedirect(URI.create("servlet:/foo")); }
-		@RestGet public TemporaryRedirect a4() { return new TemporaryRedirect().header("Foo","bar"); }
+		@RestGet public TemporaryRedirect a1() { return TEMPORARY_REDIRECT; }
+		@RestGet public TemporaryRedirect a2() { return temporaryRedirect("servlet:/foo").body("foo"); }
+		@RestGet public TemporaryRedirect a3() { return temporaryRedirect("servlet:/foo"); }
+		@RestGet public TemporaryRedirect a4() { return temporaryRedirect("servlet:/foo").header("Foo","bar"); }
 	}
 
 	@Test
@@ -46,7 +45,6 @@ public class TemporaryRedirect_Test {
 		client.get("/a3")
 			.run()
 			.assertCode().is(307)
-			.assertBody().is("Temporary Redirect")
 			.assertHeader("Location").is("/foo");
 		client.get("/a4")
 			.run()
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/response/UseProxy_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/response/UseProxy_Test.java
index 0d77fcc..b997674 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/response/UseProxy_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/response/UseProxy_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.response;
 
 import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -23,9 +24,9 @@ public class UseProxy_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public UseProxy a1() { return new UseProxy(); }
-		@RestGet public UseProxy a2() { return new UseProxy("foo"); }
-		@RestGet public UseProxy a3() { return new UseProxy().header("Foo","bar"); }
+		@RestGet public UseProxy a1() { return USE_PROXY; }
+		@RestGet public UseProxy a2() { return useProxy().body("foo"); }
+		@RestGet public UseProxy a3() { return useProxy().header("Foo","bar"); }
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/RestOp_Returns_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/RestOp_Returns_Test.java
index 8b5768f..730938b 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/RestOp_Returns_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/RestOp_Returns_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.rest;
 
 import static org.apache.juneau.rest.testutils.TestUtils.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import static org.junit.Assert.*;
 import static org.junit.runners.MethodSorters.*;
@@ -37,82 +38,82 @@ public class RestOp_Returns_Test {
 
 	@Rest
 	public static class A {
-		@RestGet public Accepted accepted() { return new Accepted(); }
-		@RestGet public AlreadyReported alreadyReported() { return new AlreadyReported(); }
-		@RestGet(path="/continue") public Continue _continue() { return new Continue(); }
-		@RestGet public Created created() { return new Created(); }
-		@RestGet public EarlyHints earlyHints() { return new EarlyHints(); }
-		@RestGet public Found found() { return new Found(); }
-		@RestGet public IMUsed imUsed() { return new IMUsed(); }
-		@RestGet public MovedPermanently movedPermanently() { return new MovedPermanently(); }
-		@RestGet public MultipleChoices multipleChoices() { return new MultipleChoices(); }
-		@RestGet public MultiStatus multiStatus() { return new MultiStatus(); }
-		@RestGet public NoContent noContent() { return new NoContent(); }
-		@RestGet public NonAuthoritiveInformation nonAuthoritiveInformation() { return new NonAuthoritiveInformation(); }
-		@RestGet public NotModified notModified() { return new NotModified(); }
-		@RestGet public Ok ok() { return new Ok(); }
-		@RestGet public PartialContent partialContent() { return new PartialContent(); }
-		@RestGet public PermanentRedirect permanentRedirect() { return new PermanentRedirect(); }
-		@RestGet public Processing processing() { return new Processing(); }
-		@RestGet public ResetContent resetContent() { return new ResetContent(); }
-		@RestGet public SeeOther seeOther() { return new SeeOther(); }
-		@RestGet public SwitchingProtocols switchingProtocols() { return new SwitchingProtocols(); }
-		@RestGet public TemporaryRedirect temporaryRedirect() { return new TemporaryRedirect(); }
-		@RestGet public UseProxy useProxy() { return new UseProxy(); }
+		@RestGet public Accepted accepted() { return ACCEPTED; }
+		@RestGet public AlreadyReported alreadyReported() { return ALREADY_REPORTED; }
+		@RestGet(path="/continue") public Continue _continue() { return CONTINUE; }
+		@RestGet public Created created() { return CREATED; }
+		@RestGet public EarlyHints earlyHints() { return EARLY_HINTS; }
+		@RestGet public Found found() { return FOUND; }
+		@RestGet public IMUsed imUsed() { return IM_USED; }
+		@RestGet public MovedPermanently movedPermanently() { return MOVED_PERMANENTLY; }
+		@RestGet public MultipleChoices multipleChoices() { return MULTIPLE_CHOICES; }
+		@RestGet public MultiStatus multiStatus() { return MULTI_STATUS; }
+		@RestGet public NoContent noContent() { return NO_CONTENT; }
+		@RestGet public NonAuthoritiveInformation nonAuthoritiveInformation() { return NON_AUTHORATIVE_INFORMATION; }
+		@RestGet public NotModified notModified() { return NOT_MODIFIED; }
+		@RestGet public Ok ok() { return OK; }
+		@RestGet public PartialContent partialContent() { return PARTIAL_CONTENT; }
+		@RestGet public PermanentRedirect permanentRedirect() { return PERMANENT_REDIRECT; }
+		@RestGet public Processing processing() { return PROCESSING; }
+		@RestGet public ResetContent resetContent() { return RESET_CONTENT; }
+		@RestGet public SeeOther seeOther() { return SEE_OTHER; }
+		@RestGet public SwitchingProtocols switchingProtocols() { return SWITCHING_PROTOCOLS; }
+		@RestGet public TemporaryRedirect temporaryRedirect() { return TEMPORARY_REDIRECT; }
+		@RestGet public UseProxy useProxy() { return USE_PROXY; }
 	}
 
 	@Test
 	public void a01_responseBeans() throws Exception {
 		RestClient c = client(A.class);
-		c.get("/accepted").run().assertStatus().code().is(Accepted.CODE).assertBody().is(Accepted.MESSAGE);
-		c.get("/alreadyReported").run().assertStatus().code().is(AlreadyReported.CODE).assertBody().is(AlreadyReported.MESSAGE);
-		c.get("/continue").run().assertStatus().code().is(Continue.CODE + 1000).assertBody().is(Continue.MESSAGE);
-		c.get("/created").run().assertStatus().code().is(Created.CODE).assertBody().is(Created.MESSAGE);
-		c.get("/earlyHints").run().assertStatus().code().is(EarlyHints.CODE + 1000).assertBody().is(EarlyHints.MESSAGE);
-		c.get("/found").run().assertStatus().code().is(Found.CODE).assertBody().is(Found.MESSAGE);
-		c.get("/imUsed").run().assertStatus().code().is(IMUsed.CODE).assertBody().is(IMUsed.MESSAGE);
-		c.get("/movedPermanently").run().assertStatus().code().is(MovedPermanently.CODE).assertBody().is(MovedPermanently.MESSAGE);
-		c.get("/multipleChoices").run().assertStatus().code().is(MultipleChoices.CODE).assertBody().is(MultipleChoices.MESSAGE);
-		c.get("/multiStatus").run().assertStatus().code().is(MultiStatus.CODE).assertBody().is(MultiStatus.MESSAGE);
-		c.get("/noContent").run().assertStatus().code().is(NoContent.CODE).assertBody().isEmpty();
-		c.get("/nonAuthoritiveInformation").run().assertStatus().code().is(NonAuthoritiveInformation.CODE).assertBody().is(NonAuthoritiveInformation.MESSAGE);
-		c.get("/notModified").run().assertStatus().code().is(NotModified.CODE).assertBody().isEmpty();
-		c.get("/ok").run().assertStatus().code().is(Ok.CODE).assertBody().is(Ok.MESSAGE);
-		c.get("/partialContent").run().assertStatus().code().is(PartialContent.CODE).assertBody().is(PartialContent.MESSAGE);
-		c.get("/permanentRedirect").run().assertStatus().code().is(PermanentRedirect.CODE).assertBody().is(PermanentRedirect.MESSAGE);
-		c.get("/processing").run().assertStatus().code().is(Processing.CODE + 1000).assertBody().is(Processing.MESSAGE);
-		c.get("/resetContent").run().assertStatus().code().is(ResetContent.CODE).assertBody().isEmpty();
-		c.get("/seeOther").run().assertStatus().code().is(SeeOther.CODE).assertBody().is(SeeOther.MESSAGE);
-		c.get("/switchingProtocols").run().assertStatus().code().is(SwitchingProtocols.CODE + 1000).assertBody().is(SwitchingProtocols.MESSAGE);
-		c.get("/temporaryRedirect").run().assertStatus().code().is(TemporaryRedirect.CODE).assertBody().is(TemporaryRedirect.MESSAGE);
-		c.get("/useProxy").run().assertStatus().code().is(UseProxy.CODE).assertBody().is(UseProxy.MESSAGE);
+		c.get("/accepted").run().assertStatus().code().is(Accepted.STATUS_CODE).assertBody().is(Accepted.REASON_PHRASE);
+		c.get("/alreadyReported").run().assertStatus().code().is(AlreadyReported.STATUS_CODE).assertBody().is(AlreadyReported.REASON_PHRASE);
+		c.get("/continue").run().assertStatus().code().is(Continue.STATUS_CODE + 1000).assertBody().is(Continue.REASON_PHRASE);
+		c.get("/created").run().assertStatus().code().is(Created.STATUS_CODE).assertBody().is(Created.REASON_PHRASE);
+		c.get("/earlyHints").run().assertStatus().code().is(EarlyHints.STATUS_CODE + 1000).assertBody().is(EarlyHints.REASON_PHRASE);
+		c.get("/found").run().assertStatus().code().is(Found.STATUS_CODE).assertBody().is(Found.REASON_PHRASE);
+		c.get("/imUsed").run().assertStatus().code().is(IMUsed.STATUS_CODE).assertBody().is(IMUsed.REASON_PHRASE);
+		c.get("/movedPermanently").run().assertStatus().code().is(MovedPermanently.STATUS_CODE).assertBody().is(MovedPermanently.REASON_PHRASE);
+		c.get("/multipleChoices").run().assertStatus().code().is(MultipleChoices.STATUS_CODE).assertBody().is(MultipleChoices.REASON_PHRASE);
+		c.get("/multiStatus").run().assertStatus().code().is(MultiStatus.STATUS_CODE).assertBody().is(MultiStatus.REASON_PHRASE);
+		c.get("/noContent").run().assertStatus().code().is(NoContent.STATUS_CODE).assertBody().isEmpty();
+		c.get("/nonAuthoritiveInformation").run().assertStatus().code().is(NonAuthoritiveInformation.STATUS_CODE).assertBody().is(NonAuthoritiveInformation.REASON_PHRASE);
+		c.get("/notModified").run().assertStatus().code().is(NotModified.STATUS_CODE).assertBody().isEmpty();
+		c.get("/ok").run().assertStatus().code().is(Ok.STATUS_CODE).assertBody().is(Ok.REASON_PHRASE);
+		c.get("/partialContent").run().assertStatus().code().is(PartialContent.STATUS_CODE).assertBody().is(PartialContent.REASON_PHRASE);
+		c.get("/permanentRedirect").run().assertStatus().code().is(PermanentRedirect.STATUS_CODE).assertBody().is(PermanentRedirect.REASON_PHRASE);
+		c.get("/processing").run().assertStatus().code().is(Processing.STATUS_CODE + 1000).assertBody().is(Processing.REASON_PHRASE);
+		c.get("/resetContent").run().assertStatus().code().is(ResetContent.STATUS_CODE).assertBody().isEmpty();
+		c.get("/seeOther").run().assertStatus().code().is(SeeOther.STATUS_CODE).assertBody().is(SeeOther.REASON_PHRASE);
+		c.get("/switchingProtocols").run().assertStatus().code().is(SwitchingProtocols.STATUS_CODE + 1000).assertBody().is(SwitchingProtocols.REASON_PHRASE);
+		c.get("/temporaryRedirect").run().assertStatus().code().is(TemporaryRedirect.STATUS_CODE).assertBody().is(TemporaryRedirect.REASON_PHRASE);
+		c.get("/useProxy").run().assertStatus().code().is(UseProxy.STATUS_CODE).assertBody().is(UseProxy.REASON_PHRASE);
 	}
 
 	@Test
 	public void a02_responseBeans_swagger() throws Exception {
 		Map<String,OperationMap> paths = getSwagger(A.class).getPaths();
-		assertEquals(Accepted.MESSAGE, paths.get("/accepted").get("get").getResponse(Accepted.CODE).getDescription());
-		assertEquals(AlreadyReported.MESSAGE, paths.get("/alreadyReported").get("get").getResponse(AlreadyReported.CODE).getDescription());
-		assertEquals(Continue.MESSAGE, paths.get("/continue").get("get").getResponse(Continue.CODE).getDescription());
-		assertEquals(Created.MESSAGE, paths.get("/created").get("get").getResponse(Created.CODE).getDescription());
-		assertEquals(EarlyHints.MESSAGE, paths.get("/earlyHints").get("get").getResponse(EarlyHints.CODE).getDescription());
-		assertEquals(Found.MESSAGE, paths.get("/found").get("get").getResponse(Found.CODE).getDescription());
-		assertEquals(IMUsed.MESSAGE, paths.get("/imUsed").get("get").getResponse(IMUsed.CODE).getDescription());
-		assertEquals(MovedPermanently.MESSAGE, paths.get("/movedPermanently").get("get").getResponse(MovedPermanently.CODE).getDescription());
-		assertEquals(MultipleChoices.MESSAGE, paths.get("/multipleChoices").get("get").getResponse(MultipleChoices.CODE).getDescription());
-		assertEquals(MultiStatus.MESSAGE, paths.get("/multiStatus").get("get").getResponse(MultiStatus.CODE).getDescription());
-		assertEquals(NoContent.MESSAGE, paths.get("/noContent").get("get").getResponse(NoContent.CODE).getDescription());
-		assertEquals(NonAuthoritiveInformation.MESSAGE, paths.get("/nonAuthoritiveInformation").get("get").getResponse(NonAuthoritiveInformation.CODE).getDescription());
-		assertEquals(NotModified.MESSAGE, paths.get("/notModified").get("get").getResponse(NotModified.CODE).getDescription());
-		assertEquals(Ok.MESSAGE, paths.get("/ok").get("get").getResponse(Ok.CODE).getDescription());
-		assertEquals(PartialContent.MESSAGE, paths.get("/partialContent").get("get").getResponse(PartialContent.CODE).getDescription());
-		assertEquals(PermanentRedirect.MESSAGE, paths.get("/permanentRedirect").get("get").getResponse(PermanentRedirect.CODE).getDescription());
-		assertEquals(Processing.MESSAGE, paths.get("/processing").get("get").getResponse(Processing.CODE).getDescription());
-		assertEquals(ResetContent.MESSAGE, paths.get("/resetContent").get("get").getResponse(ResetContent.CODE).getDescription());
-		assertEquals(SeeOther.MESSAGE, paths.get("/seeOther").get("get").getResponse(SeeOther.CODE).getDescription());
-		assertEquals(SwitchingProtocols.MESSAGE, paths.get("/switchingProtocols").get("get").getResponse(SwitchingProtocols.CODE).getDescription());
-		assertEquals(TemporaryRedirect.MESSAGE, paths.get("/temporaryRedirect").get("get").getResponse(TemporaryRedirect.CODE).getDescription());
-		assertEquals(UseProxy.MESSAGE, paths.get("/useProxy").get("get").getResponse(UseProxy.CODE).getDescription());
+		assertEquals(Accepted.REASON_PHRASE, paths.get("/accepted").get("get").getResponse(Accepted.STATUS_CODE).getDescription());
+		assertEquals(AlreadyReported.REASON_PHRASE, paths.get("/alreadyReported").get("get").getResponse(AlreadyReported.STATUS_CODE).getDescription());
+		assertEquals(Continue.REASON_PHRASE, paths.get("/continue").get("get").getResponse(Continue.STATUS_CODE).getDescription());
+		assertEquals(Created.REASON_PHRASE, paths.get("/created").get("get").getResponse(Created.STATUS_CODE).getDescription());
+		assertEquals(EarlyHints.REASON_PHRASE, paths.get("/earlyHints").get("get").getResponse(EarlyHints.STATUS_CODE).getDescription());
+		assertEquals(Found.REASON_PHRASE, paths.get("/found").get("get").getResponse(Found.STATUS_CODE).getDescription());
+		assertEquals(IMUsed.REASON_PHRASE, paths.get("/imUsed").get("get").getResponse(IMUsed.STATUS_CODE).getDescription());
+		assertEquals(MovedPermanently.REASON_PHRASE, paths.get("/movedPermanently").get("get").getResponse(MovedPermanently.STATUS_CODE).getDescription());
+		assertEquals(MultipleChoices.REASON_PHRASE, paths.get("/multipleChoices").get("get").getResponse(MultipleChoices.STATUS_CODE).getDescription());
+		assertEquals(MultiStatus.REASON_PHRASE, paths.get("/multiStatus").get("get").getResponse(MultiStatus.STATUS_CODE).getDescription());
+		assertEquals(NoContent.REASON_PHRASE, paths.get("/noContent").get("get").getResponse(NoContent.STATUS_CODE).getDescription());
+		assertEquals(NonAuthoritiveInformation.REASON_PHRASE, paths.get("/nonAuthoritiveInformation").get("get").getResponse(NonAuthoritiveInformation.STATUS_CODE).getDescription());
+		assertEquals(NotModified.REASON_PHRASE, paths.get("/notModified").get("get").getResponse(NotModified.STATUS_CODE).getDescription());
+		assertEquals(Ok.REASON_PHRASE, paths.get("/ok").get("get").getResponse(Ok.STATUS_CODE).getDescription());
+		assertEquals(PartialContent.REASON_PHRASE, paths.get("/partialContent").get("get").getResponse(PartialContent.STATUS_CODE).getDescription());
+		assertEquals(PermanentRedirect.REASON_PHRASE, paths.get("/permanentRedirect").get("get").getResponse(PermanentRedirect.STATUS_CODE).getDescription());
+		assertEquals(Processing.REASON_PHRASE, paths.get("/processing").get("get").getResponse(Processing.STATUS_CODE).getDescription());
+		assertEquals(ResetContent.REASON_PHRASE, paths.get("/resetContent").get("get").getResponse(ResetContent.STATUS_CODE).getDescription());
+		assertEquals(SeeOther.REASON_PHRASE, paths.get("/seeOther").get("get").getResponse(SeeOther.STATUS_CODE).getDescription());
+		assertEquals(SwitchingProtocols.REASON_PHRASE, paths.get("/switchingProtocols").get("get").getResponse(SwitchingProtocols.STATUS_CODE).getDescription());
+		assertEquals(TemporaryRedirect.REASON_PHRASE, paths.get("/temporaryRedirect").get("get").getResponse(TemporaryRedirect.STATUS_CODE).getDescription());
+		assertEquals(UseProxy.REASON_PHRASE, paths.get("/useProxy").get("get").getResponse(UseProxy.STATUS_CODE).getDescription());
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/RestOp_Throws_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/RestOp_Throws_Test.java
index 2ad9681..fe53fb6 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/RestOp_Throws_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/RestOp_Throws_Test.java
@@ -810,39 +810,39 @@ public class RestOp_Throws_Test {
 	public void f01_swagger() throws Exception {
 		Map<String,OperationMap> paths = getSwagger(F.class).getPaths();
 
-		assertEquals(BadRequest.MESSAGE, paths.get("/badRequest").get("get").getResponse(BadRequest.CODE).getDescription());
-		assertEquals(Conflict.MESSAGE, paths.get("/conflict").get("get").getResponse(Conflict.CODE).getDescription());
-		assertEquals(ExpectationFailed.MESSAGE, paths.get("/expectationFailed").get("get").getResponse(ExpectationFailed.CODE).getDescription());
-		assertEquals(FailedDependency.MESSAGE, paths.get("/failedDependency").get("get").getResponse(FailedDependency.CODE).getDescription());
-		assertEquals(Forbidden.MESSAGE, paths.get("/forbidden").get("get").getResponse(Forbidden.CODE).getDescription());
-		assertEquals(Gone.MESSAGE, paths.get("/gone").get("get").getResponse(Gone.CODE).getDescription());
-		assertEquals(HttpVersionNotSupported.MESSAGE, paths.get("/httpVersionNotSupported").get("get").getResponse(HttpVersionNotSupported.CODE).getDescription());
-		assertEquals(InsufficientStorage.MESSAGE, paths.get("/insufficientStorage").get("get").getResponse(InsufficientStorage.CODE).getDescription());
-		assertEquals(InternalServerError.MESSAGE, paths.get("/internalServerError").get("get").getResponse(InternalServerError.CODE).getDescription());
-		assertEquals(LengthRequired.MESSAGE, paths.get("/lengthRequired").get("get").getResponse(LengthRequired.CODE).getDescription());
-		assertEquals(Locked.MESSAGE, paths.get("/locked").get("get").getResponse(Locked.CODE).getDescription());
-		assertEquals(LoopDetected.MESSAGE, paths.get("/loopDetected").get("get").getResponse(LoopDetected.CODE).getDescription());
-		assertEquals(MethodNotAllowed.MESSAGE, paths.get("/methodNotAllowed").get("get").getResponse(MethodNotAllowed.CODE).getDescription());
-		assertEquals(MisdirectedRequest.MESSAGE, paths.get("/misdirectedRequest").get("get").getResponse(MisdirectedRequest.CODE).getDescription());
-		assertEquals(NetworkAuthenticationRequired.MESSAGE, paths.get("/networkAuthenticationRequired").get("get").getResponse(NetworkAuthenticationRequired.CODE).getDescription());
-		assertEquals(NotAcceptable.MESSAGE, paths.get("/notAcceptable").get("get").getResponse(NotAcceptable.CODE).getDescription());
-		assertEquals(NotExtended.MESSAGE, paths.get("/notExtended").get("get").getResponse(NotExtended.CODE).getDescription());
-		assertEquals(NotFound.MESSAGE, paths.get("/notFound").get("get").getResponse(NotFound.CODE).getDescription());
-		assertEquals(NotImplemented.MESSAGE, paths.get("/notImplemented").get("get").getResponse(NotImplemented.CODE).getDescription());
-		assertEquals(PayloadTooLarge.MESSAGE, paths.get("/payloadTooLarge").get("get").getResponse(PayloadTooLarge.CODE).getDescription());
-		assertEquals(PreconditionFailed.MESSAGE, paths.get("/preconditionFailed").get("get").getResponse(PreconditionFailed.CODE).getDescription());
-		assertEquals(PreconditionRequired.MESSAGE, paths.get("/preconditionRequired").get("get").getResponse(PreconditionRequired.CODE).getDescription());
-		assertEquals(RangeNotSatisfiable.MESSAGE, paths.get("/rangeNotSatisfiable").get("get").getResponse(RangeNotSatisfiable.CODE).getDescription());
-		assertEquals(RequestHeaderFieldsTooLarge.MESSAGE, paths.get("/requestHeaderFieldsTooLarge").get("get").getResponse(RequestHeaderFieldsTooLarge.CODE).getDescription());
-		assertEquals(ServiceUnavailable.MESSAGE, paths.get("/serviceUnavailable").get("get").getResponse(ServiceUnavailable.CODE).getDescription());
-		assertEquals(TooManyRequests.MESSAGE, paths.get("/tooManyRequests").get("get").getResponse(TooManyRequests.CODE).getDescription());
-		assertEquals(Unauthorized.MESSAGE, paths.get("/unauthorized").get("get").getResponse(Unauthorized.CODE).getDescription());
-		assertEquals(UnavailableForLegalReasons.MESSAGE, paths.get("/unavailableForLegalReasons").get("get").getResponse(UnavailableForLegalReasons.CODE).getDescription());
-		assertEquals(UnprocessableEntity.MESSAGE, paths.get("/unprocessableEntity").get("get").getResponse(UnprocessableEntity.CODE).getDescription());
-		assertEquals(UnsupportedMediaType.MESSAGE, paths.get("/unsupportedMediaType").get("get").getResponse(UnsupportedMediaType.CODE).getDescription());
-		assertEquals(UpgradeRequired.MESSAGE, paths.get("/upgradeRequired").get("get").getResponse(UpgradeRequired.CODE).getDescription());
-		assertEquals(UriTooLong.MESSAGE, paths.get("/uriTooLong").get("get").getResponse(UriTooLong.CODE).getDescription());
-		assertEquals(VariantAlsoNegotiates.MESSAGE, paths.get("/variantAlsoNegotiates").get("get").getResponse(VariantAlsoNegotiates.CODE).getDescription());
+		assertEquals(BadRequest.REASON_PHRASE, paths.get("/badRequest").get("get").getResponse(BadRequest.STATUS_CODE).getDescription());
+		assertEquals(Conflict.REASON_PHRASE, paths.get("/conflict").get("get").getResponse(Conflict.STATUS_CODE).getDescription());
+		assertEquals(ExpectationFailed.REASON_PHRASE, paths.get("/expectationFailed").get("get").getResponse(ExpectationFailed.STATUS_CODE).getDescription());
+		assertEquals(FailedDependency.REASON_PHRASE, paths.get("/failedDependency").get("get").getResponse(FailedDependency.STATUS_CODE).getDescription());
+		assertEquals(Forbidden.REASON_PHRASE, paths.get("/forbidden").get("get").getResponse(Forbidden.STATUS_CODE).getDescription());
+		assertEquals(Gone.REASON_PHRASE, paths.get("/gone").get("get").getResponse(Gone.STATUS_CODE).getDescription());
+		assertEquals(HttpVersionNotSupported.REASON_PHRASE, paths.get("/httpVersionNotSupported").get("get").getResponse(HttpVersionNotSupported.STATUS_CODE).getDescription());
+		assertEquals(InsufficientStorage.REASON_PHRASE, paths.get("/insufficientStorage").get("get").getResponse(InsufficientStorage.STATUS_CODE).getDescription());
+		assertEquals(InternalServerError.REASON_PHRASE, paths.get("/internalServerError").get("get").getResponse(InternalServerError.STATUS_CODE).getDescription());
+		assertEquals(LengthRequired.REASON_PHRASE, paths.get("/lengthRequired").get("get").getResponse(LengthRequired.STATUS_CODE).getDescription());
+		assertEquals(Locked.REASON_PHRASE, paths.get("/locked").get("get").getResponse(Locked.STATUS_CODE).getDescription());
+		assertEquals(LoopDetected.REASON_PHRASE, paths.get("/loopDetected").get("get").getResponse(LoopDetected.STATUS_CODE).getDescription());
+		assertEquals(MethodNotAllowed.REASON_PHRASE, paths.get("/methodNotAllowed").get("get").getResponse(MethodNotAllowed.STATUS_CODE).getDescription());
+		assertEquals(MisdirectedRequest.REASON_PHRASE, paths.get("/misdirectedRequest").get("get").getResponse(MisdirectedRequest.STATUS_CODE).getDescription());
+		assertEquals(NetworkAuthenticationRequired.REASON_PHRASE, paths.get("/networkAuthenticationRequired").get("get").getResponse(NetworkAuthenticationRequired.STATUS_CODE).getDescription());
+		assertEquals(NotAcceptable.REASON_PHRASE, paths.get("/notAcceptable").get("get").getResponse(NotAcceptable.STATUS_CODE).getDescription());
+		assertEquals(NotExtended.REASON_PHRASE, paths.get("/notExtended").get("get").getResponse(NotExtended.STATUS_CODE).getDescription());
+		assertEquals(NotFound.REASON_PHRASE, paths.get("/notFound").get("get").getResponse(NotFound.STATUS_CODE).getDescription());
+		assertEquals(NotImplemented.REASON_PHRASE, paths.get("/notImplemented").get("get").getResponse(NotImplemented.STATUS_CODE).getDescription());
+		assertEquals(PayloadTooLarge.REASON_PHRASE, paths.get("/payloadTooLarge").get("get").getResponse(PayloadTooLarge.STATUS_CODE).getDescription());
+		assertEquals(PreconditionFailed.REASON_PHRASE, paths.get("/preconditionFailed").get("get").getResponse(PreconditionFailed.STATUS_CODE).getDescription());
+		assertEquals(PreconditionRequired.REASON_PHRASE, paths.get("/preconditionRequired").get("get").getResponse(PreconditionRequired.STATUS_CODE).getDescription());
+		assertEquals(RangeNotSatisfiable.REASON_PHRASE, paths.get("/rangeNotSatisfiable").get("get").getResponse(RangeNotSatisfiable.STATUS_CODE).getDescription());
+		assertEquals(RequestHeaderFieldsTooLarge.REASON_PHRASE, paths.get("/requestHeaderFieldsTooLarge").get("get").getResponse(RequestHeaderFieldsTooLarge.STATUS_CODE).getDescription());
+		assertEquals(ServiceUnavailable.REASON_PHRASE, paths.get("/serviceUnavailable").get("get").getResponse(ServiceUnavailable.STATUS_CODE).getDescription());
+		assertEquals(TooManyRequests.REASON_PHRASE, paths.get("/tooManyRequests").get("get").getResponse(TooManyRequests.STATUS_CODE).getDescription());
+		assertEquals(Unauthorized.REASON_PHRASE, paths.get("/unauthorized").get("get").getResponse(Unauthorized.STATUS_CODE).getDescription());
+		assertEquals(UnavailableForLegalReasons.REASON_PHRASE, paths.get("/unavailableForLegalReasons").get("get").getResponse(UnavailableForLegalReasons.STATUS_CODE).getDescription());
+		assertEquals(UnprocessableEntity.REASON_PHRASE, paths.get("/unprocessableEntity").get("get").getResponse(UnprocessableEntity.STATUS_CODE).getDescription());
+		assertEquals(UnsupportedMediaType.REASON_PHRASE, paths.get("/unsupportedMediaType").get("get").getResponse(UnsupportedMediaType.STATUS_CODE).getDescription());
+		assertEquals(UpgradeRequired.REASON_PHRASE, paths.get("/upgradeRequired").get("get").getResponse(UpgradeRequired.STATUS_CODE).getDescription());
+		assertEquals(UriTooLong.REASON_PHRASE, paths.get("/uriTooLong").get("get").getResponse(UriTooLong.STATUS_CODE).getDescription());
+		assertEquals(VariantAlsoNegotiates.REASON_PHRASE, paths.get("/variantAlsoNegotiates").get("get").getResponse(VariantAlsoNegotiates.STATUS_CODE).getDescription());
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/client/BasicHttpRequestRetryHandler_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/client/BasicHttpRequestRetryHandler_Test.java
index 6efabb2..0ef9d84 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/client/BasicHttpRequestRetryHandler_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/client/BasicHttpRequestRetryHandler_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.rest.client;
 
 import static org.apache.juneau.assertions.Assertions.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 
 import java.io.*;
 import java.net.*;
@@ -32,7 +33,7 @@ public class BasicHttpRequestRetryHandler_Test {
 	public static class A extends BasicRestObject {
 		@RestGet
 		public Ok get() {
-			return Ok.OK;
+			return OK;
 		}
 	}
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
index 1e05bbb..2669ccc 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.rest.client;
 
 import static org.apache.juneau.assertions.Assertions.*;
+import static org.apache.juneau.http.response.StandardResponses.*;
 import static org.apache.juneau.rest.client.RestClient.*;
 import static org.junit.Assert.*;
 import static org.junit.runners.MethodSorters.*;
@@ -27,6 +28,7 @@ import org.apache.http.HttpResponse;
 import org.apache.http.client.*;
 import org.apache.http.impl.client.*;
 import org.apache.http.message.*;
+import org.apache.http.message.BasicHttpResponse;
 import org.apache.http.protocol.*;
 import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.*;
@@ -82,7 +84,7 @@ public class RestClient_Config_RestClient_Test {
 		}
 		@RestOp(path="/ok")
 		public Ok getOk() {
-			return Ok.OK;
+			return OK;
 		}
 		@RestOp(path="/checkHeader")
 		public String[] getHeader(org.apache.juneau.rest.RestRequest req) {
@@ -450,7 +452,7 @@ public class RestClient_Config_RestClient_Test {
 			assertEquals("{f:1}",foo[0].toString());
 			assertEquals("{f:1}",foo[1].toString());
 			res.header("Foo",bean);
-			return Ok.OK;
+			return OK;
 		}
 	}