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 2020/05/25 18:49:38 UTC

[juneau] branch master updated: Improved assertions on the mock classes.

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 60fc84e  Improved assertions on the mock classes.
60fc84e is described below

commit 60fc84ed161bff2e82b9793f99f7080f4ab5aab2
Author: JamesBognar <ja...@salesforce.com>
AuthorDate: Mon May 25 14:49:22 2020 -0400

    Improved assertions on the mock classes.
---
 .../juneau/assertions/FluentDateAssertion.java     | 206 +++++++
 .../juneau/assertions/FluentIntegerAssertion.java  | 328 ++++++++++
 .../juneau/assertions/FluentLongAssertion.java     | 328 ++++++++++
 .../FluentStringAssertion.java                     |   2 +-
 .../apache/juneau/http/BasicCsvArrayHeader.java    |   2 +-
 .../org/apache/juneau/http/BasicDateHeader.java    |  10 +
 .../http/BasicEntityValidatorArrayHeader.java      |   2 +-
 .../java/org/apache/juneau/http/BasicHeader.java   |   2 +-
 .../org/apache/juneau/http/BasicIntegerHeader.java |   2 +-
 .../org/apache/juneau/http/BasicLongHeader.java    |   2 +-
 .../apache/juneau/http/BasicRangeArrayHeader.java  |   2 +-
 .../org/apache/juneau/http/BasicUriHeader.java     |   2 +-
 .../apache/juneau/utils/FluentIntAssertion.java    | 116 ----
 .../apache/juneau/rest/client2/MarshallTest.java   |  76 +--
 .../apache/juneau/rest/client2/RestClientTest.java |   2 +-
 .../org/apache/juneau/rest/client2/RestClient.java |   7 +-
 .../apache/juneau/rest/client2/RestResponse.java   |  76 ++-
 .../juneau/rest/client2/RestResponseBody.java      |   5 +-
 .../rest/client2/RestResponseBodyAssertion.java    |  84 ---
 .../juneau/rest/client2/RestResponseHeader.java    | 146 ++++-
 .../rest/client2/RestResponseHeaderAssertion.java  |  82 ---
 .../client2/RestResponseStatusCodeAssertion.java   |  40 --
 .../rest/mock2/MockHttpClientConnection.java       |   2 +-
 .../apache/juneau/rest/mock2/MockHttpResponse.java |   2 +-
 .../juneau/rest/mock2/MockServletRequest.java      |   2 +-
 .../juneau/rest/mock2/MockServletResponse.java     | 132 +++-
 .../juneau/rest/mock2/MockServletResponseBody.java | 193 ++++++
 .../mock2/MockServletResponseBodyAssertion.java    |  31 -
 .../rest/mock2/MockServletResponseHeader.java      | 263 ++++++++
 .../mock2/MockServletResponseHeaderAssertion.java  |  31 -
 .../MockServletResponseStatusCodeAssertion.java    |  31 -
 .../juneau/rest/BasicRestInfoProviderTest.java     |   2 +-
 .../java/org/apache/juneau/rest/DebugModeTest.java | 436 ++++++-------
 .../org/apache/juneau/rest/StatusCodesTest.java    |  80 ++-
 .../annotation/ResponseHeaderAnnotationTest.java   |  15 +-
 .../annotation/ResponseStatusAnnotationTest.java   |   4 +-
 .../rest/annotation/RestMethodGuardsTest.java      |  28 +-
 .../rest/annotation/RestResourceLoggingTest.java   |  10 +-
 .../annotation/RestResourceSerializersTest.java    |  43 +-
 .../annotation/RestResourceStaticFilesTest.java    |  86 ++-
 .../rest/annotation2/BodyAnnotationTest.java       | 574 +++++++++++++-----
 .../rest/annotation2/FormDataAnnotationTest.java   |  40 +-
 .../rest/annotation2/HeaderAnnotationTest.java     |  43 +-
 .../rest/annotation2/PathAnnotationTest.java       | 648 +++++++++++++++-----
 .../annotation2/PathRemainderAnnotationTest.java   |  20 +-
 .../rest/annotation2/QueryAnnotationTest.java      |  40 +-
 .../rest/annotation2/ResponseAnnotationTest.java   | 135 ++++-
 .../rest/annotation2/RestResourceParsersTest.java  |  48 +-
 .../juneau/rest/annotation2/RoleGuardTest.java     | 474 +++++++--------
 .../apache/juneau/rest/exceptions/BasicTest.java   | 674 ++++++++++++++++-----
 .../juneau/rest/headers/AcceptCharsetTest.java     |   2 +-
 .../juneau/rest/headers/AcceptEncodingTest.java    |  36 +-
 .../org/apache/juneau/rest/headers/AcceptTest.java |  65 +-
 .../juneau/rest/headers/ContentEncodingTest.java   |  21 +-
 .../juneau/rest/headers/ContentTypeTest.java       |  78 ++-
 .../apache/juneau/rest/helper/HyperlinkTest.java   |  16 +-
 .../juneau/rest/helper/ReaderResourceTest.java     |  29 +-
 .../juneau/rest/helper/StreamResourceTest.java     |  29 +-
 .../apache/juneau/rest/responses/BasicTest.java    | 245 ++++++--
 59 files changed, 4460 insertions(+), 1670 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
new file mode 100644
index 0000000..77d707c
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
@@ -0,0 +1,206 @@
+// ***************************************************************************************************************************
+// * 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.assertions;
+
+
+import java.util.*;
+import java.util.function.*;
+
+import org.apache.juneau.*;
+
+/**
+ * Used for fluent assertion calls.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Validates the response expiration is after the current date.</jc>
+ * 	client
+ * 		.get(<jsf>URL</jsf>)
+ * 		.run()
+ * 		.assertDateHeader(<js>"Expires"</js>).isAfter(<jk>new</jk> Date());
+ * </p>
+ * @param <R> The return type.
+ */
+public class FluentDateAssertion<R> {
+
+	private final Date value;
+	private final R returns;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param value The value being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentDateAssertion(Date value, R returns) {
+		this.value = value;
+		this.returns = returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R equals(Date value) throws AssertionError {
+		if (! this.value.equals(value))
+			throw new BasicAssertionError("Unexpected value.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #equals(Date)}.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R is(Date value) throws AssertionError {
+		return equals(value);
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R doesNotEqual(Date value) throws AssertionError {
+		if (this.value.equals(value))
+			throw new BasicAssertionError("Unexpected value.\n\tExpected not=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #doesNotEqual(Date)}.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNot(Date value) throws AssertionError {
+		return doesNotEqual(value);
+	}
+
+	/**
+	 * Asserts that the date is not null.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isNotNull()}.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R exists() throws AssertionError {
+		return isNotNull();
+	}
+
+	/**
+	 * Asserts that the date is not null.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isNull()}.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R doesNotExist() throws AssertionError {
+		return isNull();
+	}
+
+	/**
+	 * Asserts that the date is not null.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNull() throws AssertionError {
+		if (value != null)
+			throw new BasicAssertionError("Value was not null.");
+		return returns;
+	}
+
+	/**
+	 * Asserts that the date is not null.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNotNull() throws AssertionError {
+		if (value == null)
+			throw new BasicAssertionError("Value was null.");
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is greater than the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isAfter(Date value) throws AssertionError {
+		if (! (this.value.after(value)))
+				throw new BasicAssertionError("Value was not greater than expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is less than the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isBefore(Date value) throws AssertionError {
+		if (! (this.value.before(value)))
+				throw new BasicAssertionError("Value was not less than expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is between (exclusive) the specified upper and lower values.
+	 *
+	 * @param lower The lower value to check against.
+	 * @param upper The upper value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isBetween(Date lower, Date upper) throws AssertionError {
+		isBefore(upper);
+		isAfter(lower);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value passes the specified predicate test.
+	 *
+	 * @param test The predicate to use to test the value.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R passes(Predicate<Date> test) throws AssertionError {
+		if (! test.test(value))
+			throw new BasicAssertionError("Value did not pass predicate test.\n\tValue=[{0}]", value);
+		return returns;
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentIntegerAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentIntegerAssertion.java
new file mode 100644
index 0000000..181ab4f
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentIntegerAssertion.java
@@ -0,0 +1,328 @@
+// ***************************************************************************************************************************
+// * 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.assertions;
+
+
+import java.util.function.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.marshall.*;
+
+/**
+ * Used for fluent assertion calls.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Validates the response status code is 200 or 404.</jc>
+ * 	client
+ * 		.get(<jsf>URL</jsf>)
+ * 		.run()
+ * 		.assertStatus().isAny(200,404);
+ * </p>
+ * @param <R> The return type.
+ */
+public class FluentIntegerAssertion<R> {
+
+	private final Integer value;
+	private final R returns;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param value The value being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentIntegerAssertion(Integer value, R returns) {
+		this.value = value;
+		this.returns = returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R equals(Integer value) throws AssertionError {
+		if (this.value == value)
+			return returns;
+		exists();
+		if (! this.value.equals(value))
+			throw new BasicAssertionError("Unexpected value.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #equals(Integer)}.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R is(Integer value) throws AssertionError {
+		return equals(value);
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R doesNotEqual(Integer value) throws AssertionError {
+		if (this.value != value)
+			return returns;
+		exists();
+		if (this.value.equals(value))
+			throw new BasicAssertionError("Unexpected value.\n\tExpected not=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #doesNotEqual(Integer)}.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNot(Integer value) throws AssertionError {
+		return doesNotEqual(value);
+	}
+
+	/**
+	 * Asserts that the integer is not null.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isNotNull()}.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R exists() throws AssertionError {
+		return isNotNull();
+	}
+
+	/**
+	 * Asserts that the integer is not null.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isNull()}.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R doesNotExist() throws AssertionError {
+		return isNull();
+	}
+
+	/**
+	 * Asserts that the integer is not null.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNull() throws AssertionError {
+		if (value != null)
+			throw new BasicAssertionError("Value was not null.");
+		return returns;
+	}
+
+	/**
+	 * Asserts that the integer is not null.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNotNull() throws AssertionError {
+		if (value == null)
+			throw new BasicAssertionError("Value was null.");
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is one of the specified values.
+	 *
+	 * @param values The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isAny(Integer...values) throws AssertionError {
+		exists();
+		for (Integer v : values)
+			if (this.value.equals(v))
+				return returns;
+		throw new BasicAssertionError("Expected value not found.\n\tExpected=[{0}]\n\tActual=[{1}]", SimpleJson.DEFAULT.toString(values), value);
+	}
+
+	/**
+	 * Asserts that the value is one of the specified values.
+	 *
+	 * @param values The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNotAny(Integer...values) throws AssertionError {
+		exists();
+		for (Integer v : values)
+			if (this.value.equals(v))
+				throw new BasicAssertionError("Unexpected value found.\n\tUnexpected=[{0}]\n\tActual=[{1}]", v, value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is greater than the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isGreaterThan(Integer value) throws AssertionError {
+		exists();
+		if (! (this.value > value))
+				throw new BasicAssertionError("Value was not greater than expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is greater than the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isGreaterThan(Integer)}
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isGt(Integer value) throws AssertionError {
+		return isGreaterThan(value);
+	}
+
+	/**
+	 * Asserts that the value is greater than or equal to the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isGreaterThanOrEquals(Integer value) throws AssertionError {
+		exists();
+		if (! (this.value >= value))
+				throw new BasicAssertionError("Value was not greater than or equals to expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is greater than or equal to the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isGreaterThanOrEquals(Integer)}
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isGte(Integer value) throws AssertionError {
+		return isGreaterThanOrEquals(value);
+	}
+
+	/**
+	 * Asserts that the value is less than the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isLessThan(Integer value) throws AssertionError {
+		exists();
+		if (! (this.value < value))
+				throw new BasicAssertionError("Value was not less than expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is less than the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isLessThan(Integer)}
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isLt(Integer value) throws AssertionError {
+		return isLessThan(value);
+	}
+
+	/**
+	 * Asserts that the value is less than or equals to the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isLessThanOrEquals(Integer value) throws AssertionError {
+		exists();
+		if (! (this.value <= value))
+				throw new BasicAssertionError("Value was not less than or equals to expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is less than or equals to the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isLessThanOrEquals(Integer)}
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isLte(Integer value) throws AssertionError {
+		return isLessThanOrEquals(value);
+	}
+
+	/**
+	 * Asserts that the value is between (inclusive) the specified upper and lower values.
+	 *
+	 * @param lower The lower value to check against.
+	 * @param upper The upper value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isBetween(Integer lower, Integer upper) throws AssertionError {
+		isLessThanOrEquals(upper);
+		isGreaterThanOrEquals(lower);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value passes the specified predicate test.
+	 *
+	 * @param test The predicate to use to test the value.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R passes(Predicate<Integer> test) throws AssertionError {
+		if (! test.test(value))
+			throw new BasicAssertionError("Value did not pass predicate test.\n\tValue=[{0}]", value);
+		return returns;
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentLongAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentLongAssertion.java
new file mode 100644
index 0000000..03d90e2
--- /dev/null
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentLongAssertion.java
@@ -0,0 +1,328 @@
+// ***************************************************************************************************************************
+// * 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.assertions;
+
+
+import java.util.function.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.marshall.*;
+
+/**
+ * Used for fluent assertion calls.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bcode w800'>
+ * 	<jc>// Validates the response length isn't too long.</jc>
+ * 	client
+ * 		.get(<jsf>URL</jsf>)
+ * 		.run()
+ * 		.assertLongHeader(<js>"Length"</js>).isLessThan(100000);
+ * </p>
+ * @param <R> The return type.
+ */
+public class FluentLongAssertion<R> {
+
+	private final Long value;
+	private final R returns;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param value The value being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentLongAssertion(Long value, R returns) {
+		this.value = value;
+		this.returns = returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R equals(Long value) throws AssertionError {
+		if (this.value == value)
+			return returns;
+		exists();
+		if (! this.value.equals(value))
+			throw new BasicAssertionError("Unexpected value.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #equals(Long)}.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R is(Long value) throws AssertionError {
+		return equals(value);
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R doesNotEqual(Long value) throws AssertionError {
+		if (this.value != value)
+			return returns;
+		exists();
+		if (this.value.equals(value))
+			throw new BasicAssertionError("Unexpected value.\n\tExpected not=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value equals the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #doesNotEqual(Long)}.
+	 *
+	 * @param value The value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNot(Long value) throws AssertionError {
+		return doesNotEqual(value);
+	}
+
+	/**
+	 * Asserts that the long is not null.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isNotNull()}.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R exists() throws AssertionError {
+		return isNotNull();
+	}
+
+	/**
+	 * Asserts that the long is not null.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isNull()}.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R doesNotExist() throws AssertionError {
+		return isNull();
+	}
+
+	/**
+	 * Asserts that the long is not null.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNull() throws AssertionError {
+		if (value != null)
+			throw new BasicAssertionError("Value was not null.");
+		return returns;
+	}
+
+	/**
+	 * Asserts that the long is not null.
+	 *
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNotNull() throws AssertionError {
+		if (value == null)
+			throw new BasicAssertionError("Value was null.");
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is one of the specified values.
+	 *
+	 * @param values The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isAny(Long...values) throws AssertionError {
+		exists();
+		for (Long v : values)
+			if (this.value.equals(v))
+				return returns;
+		throw new BasicAssertionError("Expected value not found.\n\tExpected=[{0}]\n\tActual=[{1}]", SimpleJson.DEFAULT.toString(values), value);
+	}
+
+	/**
+	 * Asserts that the value is one of the specified values.
+	 *
+	 * @param values The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isNotAny(Long...values) throws AssertionError {
+		exists();
+		for (Long v : values)
+			if (this.value.equals(v))
+				throw new BasicAssertionError("Unexpected value found.\n\tUnexpected=[{0}]\n\tActual=[{1}]", v, value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is greater than the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isGreaterThan(Long value) throws AssertionError {
+		exists();
+		if (! (this.value > value))
+				throw new BasicAssertionError("Value was not greater than expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is greater than the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isGreaterThan(Long)}
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isGt(Long value) throws AssertionError {
+		return isGreaterThan(value);
+	}
+
+	/**
+	 * Asserts that the value is greater than or equal to the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isGreaterThanOrEquals(Long value) throws AssertionError {
+		exists();
+		if (! (this.value >= value))
+				throw new BasicAssertionError("Value was not greater than or equals to expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is greater than or equal to the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isGreaterThanOrEquals(Long)}
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isGte(Long value) throws AssertionError {
+		return isGreaterThanOrEquals(value);
+	}
+
+	/**
+	 * Asserts that the value is less than the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isLessThan(Long value) throws AssertionError {
+		exists();
+		if (! (this.value < value))
+				throw new BasicAssertionError("Value was not less than expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is less than the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isLessThan(Long)}
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isLt(Long value) throws AssertionError {
+		return isLessThan(value);
+	}
+
+	/**
+	 * Asserts that the value is less than or equals to the specified value.
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isLessThanOrEquals(Long value) throws AssertionError {
+		exists();
+		if (! (this.value <= value))
+				throw new BasicAssertionError("Value was not less than or equals to expected.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value is less than or equals to the specified value.
+	 *
+	 * <p>
+	 * Equivalent to {@link #isLessThanOrEquals(Long)}
+	 *
+	 * @param value The values to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isLte(Long value) throws AssertionError {
+		return isLessThanOrEquals(value);
+	}
+
+	/**
+	 * Asserts that the value is between (inclusive) the specified upper and lower values.
+	 *
+	 * @param lower The lower value to check against.
+	 * @param upper The upper value to check against.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R isBetween(Long lower, Long upper) throws AssertionError {
+		isLessThanOrEquals(upper);
+		isGreaterThanOrEquals(lower);
+		return returns;
+	}
+
+	/**
+	 * Asserts that the value passes the specified predicate test.
+	 *
+	 * @param test The predicate to use to test the value.
+	 * @return The response object (for method chaining).
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R passes(Predicate<Long> test) throws AssertionError {
+		if (! test.test(value))
+			throw new BasicAssertionError("Value did not pass predicate test.\n\tValue=[{0}]", value);
+		return returns;
+	}
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/FluentStringAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
similarity index 99%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/FluentStringAssertion.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
index 4cc745b..c971aba 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/FluentStringAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.utils;
+package org.apache.juneau.assertions;
 
 
 import java.util.function.*;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicCsvArrayHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicCsvArrayHeader.java
index fe07b7c..c1324c5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicCsvArrayHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicCsvArrayHeader.java
@@ -53,7 +53,7 @@ public class BasicCsvArrayHeader extends BasicHeader {
 	 * @param name The HTTP header name.
 	 * @param value The raw header value.
 	 */
-	protected BasicCsvArrayHeader(String name, String value) {
+	public BasicCsvArrayHeader(String name, String value) {
 		super(name, value);
 		this.value = split(value);
 	}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicDateHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicDateHeader.java
index 188c476..7005997 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicDateHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicDateHeader.java
@@ -81,6 +81,16 @@ public class BasicDateHeader extends BasicHeader {
 	}
 
 	/**
+	 * Returns this header value as a {@link java.util.Date}.
+	 *
+	 * @return This header value as a {@link java.util.Date}, or <jk>null</jk> if the header could not be parsed.
+	 */
+	public java.util.Date asDate() {
+		Calendar c = asCalendar();
+		return c == null ? null : c.getTime();
+	}
+
+	/**
 	 * Returns this header value as a {@link java.util.Calendar}.
 	 *
 	 * @return This header value as a {@link java.util.Calendar}, or <jk>null</jk> if the header could not be parsed.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicEntityValidatorArrayHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicEntityValidatorArrayHeader.java
index c19f507..a236989 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicEntityValidatorArrayHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicEntityValidatorArrayHeader.java
@@ -41,7 +41,7 @@ public class BasicEntityValidatorArrayHeader extends BasicHeader {
 	 * @param name The HTTP header name.
 	 * @param value The raw header value.
 	 */
-	protected BasicEntityValidatorArrayHeader(String name, String value) {
+	public BasicEntityValidatorArrayHeader(String name, String value) {
 		super(name, value);
 		String[] s = StringUtils.split(value);
 		this.value = new EntityValidator[s.length];
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 4b192a1..72b6589 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
@@ -32,7 +32,7 @@ public class BasicHeader extends org.apache.http.message.BasicHeader {
 	 * @param name Header name.
 	 * @param value Header value.
 	 */
-	protected BasicHeader(String name, String value) {
+	public BasicHeader(String name, String value) {
 		super(name, value);
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicIntegerHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicIntegerHeader.java
index f1ca35e..3eb9ee2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicIntegerHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicIntegerHeader.java
@@ -41,7 +41,7 @@ public class BasicIntegerHeader extends BasicHeader {
 	 * @param name HTTP header name.
 	 * @param value The raw header value.
 	 */
-	protected BasicIntegerHeader(String name, Object value) {
+	public BasicIntegerHeader(String name, Object value) {
 		super(name, StringUtils.asString(value));
 		this.value = toInt(value);
 	}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicLongHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicLongHeader.java
index dbb7f2a..83ce426 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicLongHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicLongHeader.java
@@ -41,7 +41,7 @@ public class BasicLongHeader extends BasicHeader {
 	 * @param name The HTTP header name.
 	 * @param value The raw header value.
 	 */
-	protected BasicLongHeader(String name, Object value) {
+	public BasicLongHeader(String name, Object value) {
 		super(name, StringUtils.asString(value));
 		this.value = toLong(value);
 	}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicRangeArrayHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicRangeArrayHeader.java
index 6a89778..ec94bd8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicRangeArrayHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicRangeArrayHeader.java
@@ -42,7 +42,7 @@ public class BasicRangeArrayHeader extends BasicHeader {
 	 * @param name The HTTP header name.
 	 * @param value The raw header value.
 	 */
-	protected BasicRangeArrayHeader(String name, String value) {
+	public BasicRangeArrayHeader(String name, String value) {
 		super(name, value);
 		this.typeRanges = StringRange.parse(value);
 		this.typeRangesList = AList.unmodifiable(typeRanges);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicUriHeader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicUriHeader.java
index b7c4322..5e9b714 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicUriHeader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicUriHeader.java
@@ -41,7 +41,7 @@ public class BasicUriHeader extends BasicHeader {
 	 * @param name The HTTP header name.
 	 * @param value The raw header value.
 	 */
-	protected BasicUriHeader(String name, String value) {
+	public BasicUriHeader(String name, String value) {
 		super(name, value);
 		this.value = StringUtils.trim(value);
 	}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/FluentIntAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/FluentIntAssertion.java
deleted file mode 100644
index 92d142d..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/FluentIntAssertion.java
+++ /dev/null
@@ -1,116 +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.utils;
-
-
-import java.util.function.*;
-
-import org.apache.juneau.*;
-import org.apache.juneau.marshall.*;
-
-/**
- * Used for fluent assertion calls.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * 	<jc>// Validates the response status code is 200 or 404.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertStatus().isOneOf(200,404);
- * </p>
- * @param <R> The return type.
- */
-public class FluentIntAssertion<R> {
-
-	private final int value;
-	private final R returns;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param value The value being tested.
-	 * @param returns The object to return after the test.
-	 */
-	public FluentIntAssertion(int value, R returns) {
-		this.value = value;
-		this.returns = returns;
-	}
-
-	/**
-	 * Asserts that the value equals the specified value.
-	 *
-	 * @param value The value to check against.
-	 * @return The response object (for method chaining).
-	 * @throws AssertionError If assertion failed.
-	 */
-	public R equals(int value) throws AssertionError {
-		if (this.value != value)
-			throw new BasicAssertionError("Unexpected value.\n\tExpected=[{0}]\n\tActual=[{1}]", value, this.value);
-		return returns;
-	}
-
-	/**
-	 * Asserts that the value equals the specified value.
-	 *
-	 * @param value The value to check against.
-	 * @return The response object (for method chaining).
-	 * @throws AssertionError If assertion failed.
-	 */
-	public R notEquals(int value) throws AssertionError {
-		if (this.value == value)
-			throw new BasicAssertionError("Unexpected value.\n\tExpected not=[{0}]\n\tActual=[{1}]", value, this.value);
-		return returns;
-	}
-
-	/**
-	 * Asserts that the value is one of the specified values.
-	 *
-	 * @param values The values to check against.
-	 * @return The response object (for method chaining).
-	 * @throws AssertionError If assertion failed.
-	 */
-	public R isOneOf(int...values) throws AssertionError {
-		for (int v : values)
-			if (this.value == v)
-				return returns;
-		throw new BasicAssertionError("Expected value not found.\n\tExpected=[{0}]\n\tActual=[{1}]", SimpleJson.DEFAULT.toString(values), value);
-	}
-
-	/**
-	 * Asserts that the value is one of the specified values.
-	 *
-	 * @param values The values to check against.
-	 * @return The response object (for method chaining).
-	 * @throws AssertionError If assertion failed.
-	 */
-	public R isNotOneOf(int...values) throws AssertionError {
-		for (int v : values)
-			if (this.value == v)
-				throw new BasicAssertionError("Unexpected value found.\n\tUnexpected=[{0}]\n\tActual=[{1}]", v, value);
-		return returns;
-	}
-
-	/**
-	 * Asserts that the value passes the specified predicate test.
-	 *
-	 * @param test The predicate to use to test the value.
-	 * @return The response object (for method chaining).
-	 * @throws AssertionError If assertion failed.
-	 */
-	public R passes(Predicate<Integer> test) throws AssertionError {
-		if (! test.test(value))
-			throw new BasicAssertionError("Value did not pass predicate test.\n\tValue=[{0}]", value);
-		return returns;
-	}
-}
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/MarshallTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/MarshallTest.java
index b134642..281f3b8 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/MarshallTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/MarshallTest.java
@@ -82,55 +82,55 @@ public class MarshallTest {
 			.header("X-Accept", "application/json+simple")
 			.header("X-Content-Type", "application/json+simple")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		a1b.post("/a01", bean)
 			.header("X-Accept", "application/json")
 			.header("X-Content-Type", "application/json")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		a1c.post("/a01", bean)
 			.header("X-Accept", "text/xml")
 			.header("X-Content-Type", "text/xml")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		a1d.post("/a01", bean)
 			.header("X-Accept", "text/html")
 			.header("X-Content-Type", "text/html")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		a1e.post("/a01", bean)
 			.header("X-Accept", "text/plain")
 			.header("X-Content-Type", "text/plain")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		a1f.post("/a01", bean)
 			.header("X-Accept", "octal/msgpack")
 			.header("X-Content-Type", "octal/msgpack")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		a1g.post("/a01", bean)
 			.header("X-Accept", "text/uon")
 			.header("X-Content-Type", "text/uon")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		a1h.post("/a01", bean)
 			.header("X-Accept", "application/x-www-form-urlencoded")
 			.header("X-Content-Type", "application/x-www-form-urlencoded")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		a1i.post("/a01", bean)
 			.header("X-Accept", "text/openapi")
 			.header("X-Content-Type", "text/openapi")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 	}
 
@@ -142,7 +142,7 @@ public class MarshallTest {
 			.header("X-Accept", "application/json")
 			.header("X-Content-Type", "application/json")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 	}
 
@@ -157,7 +157,7 @@ public class MarshallTest {
 			.header("X-Content-Type", "application/json")
 			.body("{f:1}")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.assertBody().is("{\"f\":1}");
 	}
 
@@ -186,7 +186,7 @@ public class MarshallTest {
 			.header("X-Accept", "application/json")
 			.header("X-Content-Type", "application/json")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		b1.post("/a01", bean)
 			.header("Accept", "text/xml")
@@ -194,7 +194,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/xml")
 			.header("X-Content-Type", "text/xml")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		b1.post("/a01", bean)
 			.header("Accept", "text/html")
@@ -202,7 +202,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/html")
 			.header("X-Content-Type", "text/html")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		b1.post("/a01", bean)
 			.header("Accept", "text/plain")
@@ -210,7 +210,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/plain")
 			.header("X-Content-Type", "text/plain")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		b1.post("/a01", bean)
 			.header("Accept", "octal/msgpack")
@@ -218,7 +218,7 @@ public class MarshallTest {
 			.header("X-Accept", "octal/msgpack")
 			.header("X-Content-Type", "octal/msgpack")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		b1.post("/a01", bean)
 			.header("Accept", "text/uon")
@@ -226,7 +226,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/uon")
 			.header("X-Content-Type", "text/uon")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		b1.post("/a01", bean)
 			.header("Accept", "application/x-www-form-urlencoded")
@@ -234,7 +234,7 @@ public class MarshallTest {
 			.header("X-Accept", "application/x-www-form-urlencoded")
 			.header("X-Content-Type", "application/x-www-form-urlencoded")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		b1.post("/a01", bean)
 			.header("Accept", "text/openapi")
@@ -242,7 +242,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/openapi")
 			.header("X-Content-Type", "text/openapi")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 	}
 
@@ -253,7 +253,7 @@ public class MarshallTest {
 			.header("X-Accept", "nil")
 			.header("X-Content-Type", "text/plain")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 	}
 
@@ -274,7 +274,7 @@ public class MarshallTest {
 			.header("X-Accept", "application/json")
 			.header("X-Content-Type", "application/json")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		c1.post("/a01", bean)
 			.header("Accept", "text/xml")
@@ -282,7 +282,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/xml")
 			.header("X-Content-Type", "text/xml")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		c1.post("/a01", bean)
 			.header("Accept", "text/html")
@@ -290,7 +290,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/html")
 			.header("X-Content-Type", "text/html")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		c1.post("/a01", bean)
 			.header("Accept", "text/plain")
@@ -298,7 +298,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/plain")
 			.header("X-Content-Type", "text/plain")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		c1.post("/a01", bean)
 			.header("Accept", "octal/msgpack")
@@ -306,7 +306,7 @@ public class MarshallTest {
 			.header("X-Accept", "octal/msgpack")
 			.header("X-Content-Type", "octal/msgpack")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		c1.post("/a01", bean)
 			.header("Accept", "text/uon")
@@ -314,7 +314,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/uon")
 			.header("X-Content-Type", "text/uon")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		c1.post("/a01", bean)
 			.header("Accept", "application/x-www-form-urlencoded")
@@ -322,7 +322,7 @@ public class MarshallTest {
 			.header("X-Accept", "application/x-www-form-urlencoded")
 			.header("X-Content-Type", "application/x-www-form-urlencoded")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		c1.post("/a01", bean)
 			.header("Accept", "text/openapi")
@@ -330,7 +330,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/openapi")
 			.header("X-Content-Type", "text/openapi")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 	}
 
@@ -340,7 +340,7 @@ public class MarshallTest {
 			.header("X-Accept", "nil")
 			.header("X-Content-Type", "text/plain")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 	}
 
@@ -363,7 +363,7 @@ public class MarshallTest {
 			.header("X-Accept", "application/json")
 			.header("X-Content-Type", "application/json")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		d1.post("/a01", bean)
 			.header("Accept", "text/xml")
@@ -371,7 +371,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/xml")
 			.header("X-Content-Type", "text/xml")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		d1.post("/a01", bean)
 			.header("Accept", "text/html")
@@ -379,7 +379,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/html")
 			.header("X-Content-Type", "text/html")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		d1.post("/a01", bean)
 			.header("Accept", "text/plain")
@@ -387,7 +387,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/plain")
 			.header("X-Content-Type", "text/plain")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		d1.post("/a01", bean)
 			.header("Accept", "octal/msgpack")
@@ -395,7 +395,7 @@ public class MarshallTest {
 			.header("X-Accept", "octal/msgpack")
 			.header("X-Content-Type", "octal/msgpack")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		d1.post("/a01", bean)
 			.header("Accept", "text/uon")
@@ -403,7 +403,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/uon")
 			.header("X-Content-Type", "text/uon")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		d1.post("/a01", bean)
 			.header("Accept", "application/x-www-form-urlencoded")
@@ -411,7 +411,7 @@ public class MarshallTest {
 			.header("X-Accept", "application/x-www-form-urlencoded")
 			.header("X-Content-Type", "application/x-www-form-urlencoded")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 		d1.post("/a01", bean)
 			.header("Accept", "text/openapi")
@@ -419,7 +419,7 @@ public class MarshallTest {
 			.header("X-Accept", "text/openapi")
 			.header("X-Content-Type", "text/openapi")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 	}
 
@@ -429,7 +429,7 @@ public class MarshallTest {
 			.header("X-Accept", "application/json")
 			.header("X-Content-Type", "application/json")
 			.run()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.getBody().as(Bean.class).check();
 	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
index 3c42656..d4e0966 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
@@ -1680,7 +1680,7 @@ public class RestClientTest {
 			.get("/echo")
 			.runFuture()
 			.get()
-			.assertStatusCode().equals(200)
+			.assertStatusCode().is(200)
 			.assertBody().contains("HTTP GET /echo");
 	}
 
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
index 9f88d0a..f7c509f 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
@@ -50,6 +50,7 @@ import org.apache.http.params.*;
 import org.apache.http.protocol.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.assertions.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.http.remote.RemoteReturn;
 import org.apache.juneau.http.*;
@@ -518,7 +519,7 @@ import org.apache.http.client.CookieStore;
  * 		<li class='jm'><c>{@link RestResponse#getStatusCode(Mutable) getStatusCode(Mutable&lt;Integer&gt;)} <jk>returns</jk> {@link RestResponse}</c>
  * 		<li class='jm'><c>{@link RestResponse#getReasonPhrase() getReasonPhrase()} <jk>returns</jk> String</c>
  * 		<li class='jm'><c>{@link RestResponse#getReasonPhrase(Mutable) getReasonPhrase(Mutable&lt;String&gt;)} <jk>returns</jk> {@link RestResponse}</c>
- * 		<li class='jm'><c>{@link RestResponse#assertStatusCode() assertStatusCode()} <jk>returns</jk> {@link RestResponseStatusCodeAssertion}</c>
+ * 		<li class='jm'><c>{@link RestResponse#assertStatusCode() assertStatusCode()} <jk>returns</jk> {@link FluentIntegerAssertion}</c>
  * 	</ul>
  * </ul>
  *
@@ -617,7 +618,7 @@ import org.apache.http.client.CookieStore;
  * 		<li class='jm'><c>{@link RestResponseHeader#asMatcher(Mutable,String) asMatcher(Mutable&lt;Matcher&gt;,String)} <jk>returns</jk> {@link RestResponse}</c>
  * 		<li class='jm'><c>{@link RestResponseHeader#asMatcher(String,int) asMatcher(String,int)} <jk>returns</jk> {@link Matcher}</c>
  * 		<li class='jm'><c>{@link RestResponseHeader#asMatcher(Mutable,String,int) asMatcher(Mutable&lt;Matcher&gt;,String,int)} <jk>returns</jk> {@link RestResponse}</c>
- * 		<li class='jm'><c>{@link RestResponseHeader#assertThat() assertThat()} <jk>returns</jk> {@link RestResponseHeaderAssertion}</c>
+ * 		<li class='jm'><c>{@link RestResponseHeader#assertThat() assertThat()} <jk>returns</jk> {@link FluentStringAssertion}</c>
  * 	</ul>
  * </ul>
  *
@@ -677,7 +678,7 @@ import org.apache.http.client.CookieStore;
  * 		<li class='jm'><c>{@link RestResponseBody#asMatcher(Mutable,String) asMatcher(Mutable&lt;Matcher&gt;,String)} <jk>returns</jk> {@link RestResponse}</c>
  * 		<li class='jm'><c>{@link RestResponseBody#asMatcher(String,int) asMatcher(String,int)} <jk>returns</jk> {@link Matcher}</c>
  * 		<li class='jm'><c>{@link RestResponseBody#asMatcher(Mutable,String,int) asMatcher(Mutable&lt;Matcher&gt;,String,int)} <jk>returns</jk> {@link RestResponse}</c>
- * 		<li class='jm'><c>{@link RestResponseBody#assertThat() assertThat()} <jk>returns</jk> {@link RestResponseBodyAssertion}</c>
+ * 		<li class='jm'><c>{@link RestResponseBody#assertThat() assertThat()} <jk>returns</jk> {@link FluentStringAssertion}</c>
  * 	</ul>
  * </ul>
  *
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponse.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponse.java
index 0b06ce8..c0b3452 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponse.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponse.java
@@ -24,6 +24,7 @@ import org.apache.http.message.*;
 import org.apache.http.params.*;
 import org.apache.http.util.*;
 import org.apache.juneau.*;
+import org.apache.juneau.assertions.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.httppart.bean.*;
 import org.apache.juneau.utils.*;
@@ -156,15 +157,15 @@ public final class RestResponse implements HttpResponse {
 	 * 	MyBean bean = client
 	 * 		.get(<jsf>URL</jsf>)
 	 * 		.run()
-	 * 		.assertStatusCode().equals(200)
+	 * 		.assertStatusCode().is(200)
 	 * 		.getBody().as(MyBean.<jk>class</jk>);
 	 * </p>
 	 *
 	 * @return A new fluent assertion object.
 	 * @throws RestCallException If REST call failed.
 	 */
-	public RestResponseStatusCodeAssertion assertStatusCode() throws RestCallException {
-		return new RestResponseStatusCodeAssertion(getStatusCode(), this);
+	public FluentIntegerAssertion<RestResponse> assertStatusCode() throws RestCallException {
+		return new FluentIntegerAssertion<>(getStatusCode(), this);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -207,8 +208,7 @@ public final class RestResponse implements HttpResponse {
 	}
 
 	/**
-	/**
-	 * Provides the ability to perform fluent-style assertions on this response header.
+	 * Provides the ability to perform fluent-style assertions on a response header.
 	 *
 	 * <h5 class='section'>Examples:</h5>
 	 * <p class='bcode w800'>
@@ -222,7 +222,7 @@ public final class RestResponse implements HttpResponse {
 	 * 	client
 	 * 		.get(<jsf>URL</jsf>)
 	 * 		.run()
-	 * 		.assertHeader(<js>"Content-Type"</js>).equals(<js>"application/json"</js>);
+	 * 		.assertHeader(<js>"Content-Type"</js>).is(<js>"application/json"</js>);
 	 *
 	 * 	<jc>// Validates the content type is JSON using test predicate.</jc>
 	 * 	client
@@ -265,10 +265,70 @@ public final class RestResponse implements HttpResponse {
 	 * @return A new fluent assertion object.
 	 * @throws RestCallException If REST call failed.
 	 */
-	public RestResponseHeaderAssertion assertHeader(String name) throws RestCallException {
+	public FluentStringAssertion<RestResponse> assertHeader(String name) throws RestCallException {
 		return getHeader(name).assertThat();
 	}
 
+	/**
+	 * Provides the ability to perform fluent-style assertions on an integer response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response content age is greater than 1.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertIntHeader(<js>"Age"</js>).isGreaterThan(1);
+	 * </p>
+	 *
+	 * @param name The header name.
+	 * @return A new fluent assertion object.
+	 * @throws RestCallException If REST call failed.
+	 */
+	public FluentIntegerAssertion<RestResponse> assertIntHeader(String name) throws RestCallException {
+		return getHeader(name).assertThatInteger();
+	}
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on a long response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response body is not too large.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertLongHeader(<js>"Length"</js>).isLessThan(100000);
+	 * </p>
+	 *
+	 * @param name The header name.
+	 * @return A new fluent assertion object.
+	 * @throws RestCallException If REST call failed.
+	 */
+	public FluentLongAssertion<RestResponse> assertLongHeader(String name) throws RestCallException {
+		return getHeader(name).assertThatLong();
+	}
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on a date response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response content is not expired.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertDateHeader(<js>"Expires"</js>).isAfter(<jk>new</jk> Date());
+	 * </p>
+	 *
+	 * @param name The header name.
+	 * @return A new fluent assertion object.
+	 * @throws RestCallException If REST call failed.
+	 */
+	public FluentDateAssertion<RestResponse> assertDateHeader(String name) throws RestCallException {
+		return getHeader(name).assertThatDate();
+	}
+
 	//------------------------------------------------------------------------------------------------------------------
 	// Body
 	//------------------------------------------------------------------------------------------------------------------
@@ -351,7 +411,7 @@ public final class RestResponse implements HttpResponse {
 	 * @return A new fluent assertion object.
 	 * @throws RestCallException If REST call failed.
 	 */
-	public RestResponseBodyAssertion assertBody() throws RestCallException {
+	public FluentStringAssertion<RestResponse> assertBody() throws RestCallException {
 		return responseBody.cache().assertThat();
 	}
 
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseBody.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseBody.java
index 53d578e..7a221f6 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseBody.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseBody.java
@@ -23,6 +23,7 @@ import java.util.regex.*;
 import org.apache.http.*;
 import org.apache.http.conn.*;
 import org.apache.juneau.*;
+import org.apache.juneau.assertions.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.http.*;
 import org.apache.juneau.httppart.*;
@@ -1581,8 +1582,8 @@ public class RestResponseBody implements HttpEntity {
 	 * @return A new fluent assertion object.
 	 * @throws RestCallException If REST call failed.
 	 */
-	public RestResponseBodyAssertion assertThat() throws RestCallException {
-		return new RestResponseBodyAssertion(asString(), response);
+	public FluentStringAssertion<RestResponse> assertThat() throws RestCallException {
+		return new FluentStringAssertion<>(asString(), response);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseBodyAssertion.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseBodyAssertion.java
deleted file mode 100644
index 645d681..0000000
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseBodyAssertion.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.client2;
-
-import org.apache.juneau.utils.*;
-
-/**
- * Provides the ability to perform fluent-style assertions on the body of HTTP responses.
- *
- * <h5 class='section'>Examples:</h5>
- * <p class='bcode w800'>
- * 	<jc>// Validates the response body equals the text "OK".</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertBody().equals(<js>"OK"</js>);
- *
- * 	<jc>// Validates the response body contains the text "OK".</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertBody().contains(<js>"OK"</js>);
- *
- * 	<jc>// Validates the response body passes a predicate test.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertBody().passes(x -&gt; x.contains(<js>"OK"</js>));
- *
- * 	<jc>// Validates the response body matches a regular expression.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertBody().matches(<js>".*OK.*"</js>);
- *
- * 	<jc>// Validates the response body matches a regular expression using regex flags.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertBody().matches(<js>".*OK.*"</js>,  <jsf>MULTILINE</jsf> &amp; <jsf>CASE_INSENSITIVE</jsf>);
- *
- * 	<jc>// Validates the response body matches a regular expression in the form of an existing Pattern.</jc>
- * 	Pattern p = Pattern.<jsm>compile</jsm>(<js>".*OK.*"</js>);
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertBody().matches(p);
- * </p>
- *
- * <p>
- * The assertion test returns the original response object allowing you to chain multiple requests like so:
- * <p class='bcode w800'>
- * 	<jc>// Validates the response body matches a regular expression.</jc>
- * 	MyBean bean = client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.cacheBody()  <jc>// Allows multiple calls to getBody() </jc>
- * 		.assertBody().matches(<js>".*OK.*"</js>);
- * 		.assertBody().doesNotMatch(<js>".*ERROR.*"</js>)
- * 		.getBody().as(MyBean.<jk>class</jk>);
- * </p>
- */
-public class RestResponseBodyAssertion extends FluentStringAssertion<RestResponse> {
-
-	/**
-	 * Constructor
-	 *
-	 * @param text The HTTP body as text.
-	 * @param returns The response object.
-	 */
-	public RestResponseBodyAssertion(String text, RestResponse returns) {
-		super(text, returns);
-	}
-}
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeader.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeader.java
index 0a0620a..8a920b0 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeader.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeader.java
@@ -19,6 +19,8 @@ import java.util.regex.*;
 
 import org.apache.http.*;
 import org.apache.juneau.*;
+import org.apache.juneau.assertions.*;
+import org.apache.juneau.http.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.ParseException;
@@ -134,6 +136,86 @@ public class RestResponseHeader implements Header {
 	}
 
 	/**
+	 * Returns the value of this header as a CSV array header.
+	 *
+	 * @return The value of this header as a CSV array header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicCsvArrayHeader asCsvArrayHeader() {
+		String v = getValue();
+		return v == null ? null : new BasicCsvArrayHeader(getName(), v);
+	}
+
+	/**
+	 * Returns the value of this header as a date header.
+	 *
+	 * @return The value of this header as a date header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicDateHeader asDateHeader() {
+		String v = getValue();
+		return v == null ? null : new BasicDateHeader(getName(), v);
+	}
+
+	/**
+	 * Returns the value of this header as an entity validator array header.
+	 *
+	 * @return The value of this header as an entity validator array header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicEntityValidatorArrayHeader asEntityValidatorArrayHeader() {
+		String v = getValue();
+		return v == null ? null : new BasicEntityValidatorArrayHeader(getName(), v);
+	}
+
+	/**
+	 * Returns the value of this header as an integer header.
+	 *
+	 * @return The value of this header as an integer header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicIntegerHeader asIntegerHeader() {
+		String v = getValue();
+		return v == null ? null : new BasicIntegerHeader(getName(), v);
+	}
+
+	/**
+	 * Returns the value of this header as a long header.
+	 *
+	 * @return The value of this header as a long header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicLongHeader asLongHeader() {
+		String v = getValue();
+		return v == null ? null : new BasicLongHeader(getName(), v);
+	}
+
+	/**
+	 * Returns the value of this header as a range array header.
+	 *
+	 * @return The value of this header as a range array header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicRangeArrayHeader asRangeArrayHeader() {
+		String v = getValue();
+		return v == null ? null : new BasicRangeArrayHeader(getName(), v);
+	}
+
+	/**
+	 * Returns the value of this header as a string header.
+	 *
+	 * @return The value of this header as a string header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicHeader asHeader() {
+		String v = getValue();
+		return v == null ? null : new BasicHeader(getName(), v);
+	}
+
+	/**
+	 * Returns the value of this header as a URI header.
+	 *
+	 * @return The value of this header as a URI header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicUriHeader asUriHeader() {
+		String v = getValue();
+		return v == null ? null : new BasicUriHeader(getName(), v);
+	}
+
+	/**
 	 * Same as {@link #asString()} but sets the value in a mutable for fluent calls.
 	 *
 	 * @param m The mutable to set the header value in.
@@ -559,8 +641,68 @@ public class RestResponseHeader implements Header {
 	 * @throws RestCallException If REST call failed.
 	 * @throws AssertionError If assertion failed.
 	 */
-	public RestResponseHeaderAssertion assertThat() throws RestCallException {
-		return new RestResponseHeaderAssertion(asString(), response);
+	public FluentStringAssertion<RestResponse> assertThat() throws RestCallException {
+		return new FluentStringAssertion<>(asString(), response);
+	}
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on an integer response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response content age is greather than 1.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertIntegerHeader(<js>"Age"</js>).isGreaterThan(1);
+	 * </p>
+	 *
+	 * @return A new fluent assertion object.
+	 * @throws RestCallException If REST call failed.
+	 */
+	public FluentIntegerAssertion<RestResponse> assertThatInteger() throws RestCallException {
+		BasicIntegerHeader h = asIntegerHeader();
+		return new FluentIntegerAssertion<>(h == null ? -1 : h.asInt(), response);
+	}
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on a long response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response body is not too long.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertLongHeader(<js>"Length"</js>).isLessThan(100000);
+	 * </p>
+	 *
+	 * @return A new fluent assertion object.
+	 * @throws RestCallException If REST call failed.
+	 */
+	public FluentLongAssertion<RestResponse> assertThatLong() throws RestCallException {
+		BasicLongHeader h = asLongHeader();
+		return new FluentLongAssertion<>(h == null ? -1 : h.asLong(), response);
+	}
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on a date response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response content is not expired.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertDateHeader(<js>"Expires"</js>).isAfter(<jk>new</jk> Date());
+	 * </p>
+	 *
+	 * @return A new fluent assertion object.
+	 * @throws RestCallException If REST call failed.
+	 */
+	public FluentDateAssertion<RestResponse> assertThatDate() throws RestCallException {
+		BasicDateHeader h = asDateHeader();
+		return new FluentDateAssertion<>(h == null ? null : h.asDate(), response);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeaderAssertion.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeaderAssertion.java
deleted file mode 100644
index a8baa37..0000000
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeaderAssertion.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.client2;
-
-import org.apache.juneau.utils.*;
-
-/**
- * Provides the ability to perform fluent-style assertions on response headers.
- *
- * <h5 class='section'>Examples:</h5>
- * <p class='bcode w800'>
- * 	<jc>// Validates the content type header is provided.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertHeader(<js>"Content-Type"</js>).exists();
- *
- * 	<jc>// Validates the content type is JSON.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertHeader(<js>"Content-Type"</js>).equals(<js>"application/json"</js>);
- *
- * 	<jc>// Validates the content type is JSON using test predicate.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertHeader(<js>"Content-Type"</js>).passes(x -&gt; x.equals(<js>"application/json"</js>));
- *
- * 	<jc>// Validates the content type is JSON by just checking for substring.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertHeader(<js>"Content-Type"</js>).contains(<js>"json"</js>);
- *
- * 	<jc>// Validates the content type is JSON using regular expression.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertHeader(<js>"Content-Type"</js>).matches(<js>".*json.*"</js>);
- *
- * 	<jc>// Validates the content type is JSON using case-insensitive regular expression.</jc>
- * 	client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertHeader(<js>"Content-Type"</js>).matches(<js>".*json.*"</js>, <jsf>CASE_INSENSITIVE</jsf>);
- * </p>
- *
- * <p>
- * The assertion test returns the original response object allowing you to chain multiple requests like so:
- * <p class='bcode w800'>
- * 	<jc>// Validates the header and converts it to a bean.</jc>
- * 	MediaType mediaType = client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertHeader(<js>"Content-Type"</js>).exists()
- * 		.assertHeader(<js>"Content-Type"</js>).matches(<js>".*json.*"</js>)
- * 		.getHeader(<js>"Content-Type"</js>).as(MediaType.<jk>class</jk>);
- * </p>
- */
-public class RestResponseHeaderAssertion extends FluentStringAssertion<RestResponse> {
-
-	/**
-	 * Constructor
-	 *
-	 * @param text The header value as text or <jk>null</jk> if it didn't exist.
-	 * @param returns The response object.
-	 */
-	public RestResponseHeaderAssertion(String text, RestResponse returns) {
-		super(text, returns);
-	}
-}
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseStatusCodeAssertion.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseStatusCodeAssertion.java
deleted file mode 100644
index c20a62a..0000000
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseStatusCodeAssertion.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.client2;
-
-import org.apache.juneau.utils.*;
-
-/**
- * Provides the ability to perform fluent-style assertions on the response status code.
- *
- * <h5 class='section'>Examples:</h5>
- * <p class='bcode w800'>
- * 	MyBean bean = client
- * 		.get(<jsf>URL</jsf>)
- * 		.run()
- * 		.assertStatusCode().equals(200)
- * 		.getBody().as(MyBean.<jk>class</jk>);
- * </p>
- */
-public class RestResponseStatusCodeAssertion extends FluentIntAssertion<RestResponse> {
-
-	/**
-	 * Constructor.
-	 *
-	 * @param value The status code.
-	 * @param returns The response object.
-	 */
-	public RestResponseStatusCodeAssertion(int value, RestResponse returns) {
-		super(value, returns);
-	}
-}
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnection.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnection.java
index f6fffa9..b2086e6 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnection.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnection.java
@@ -108,7 +108,7 @@ public class MockHttpClientConnection implements HttpClientConnection {
 	@Override /* HttpClientConnection */
 	public void receiveResponseEntity(HttpResponse response) throws HttpException, IOException {
 		BasicHttpEntity e = new BasicHttpEntity();
-		e.setContent(new ByteArrayInputStream(res.getBody()));
+		e.setContent(res.getBody().asInputStream());
 		response.setEntity(e);
 	}
 
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpResponse.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpResponse.java
index ac1ebd3..0749e69 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpResponse.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpResponse.java
@@ -49,5 +49,5 @@ public interface MockHttpResponse {
 	 *
 	 * @return The body of the response.
 	 */
-	byte[] getBody();
+	MockServletResponseBody getBody();
 }
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletRequest.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletRequest.java
index 6199b39..937f58f 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletRequest.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletRequest.java
@@ -311,7 +311,7 @@ public class MockServletRequest implements HttpServletRequest, MockHttpRequest {
 			for (String h2 : h.getValue())
 				sb.append("\n").append(h.getKey()).append(": ").append(h2);
 		sb.append("\n---response content---\n");
-		sb.append(res.getBodyAsString());
+		sb.append(res.getBody().asString());
 		sb.append("\n=== END =======================================================================");
 
 		System.err.println(sb);  // NOT DEBUG
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponse.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponse.java
index b2da99e..ad53494 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponse.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponse.java
@@ -18,6 +18,7 @@ import java.util.*;
 import javax.servlet.*;
 import javax.servlet.http.*;
 
+import org.apache.juneau.assertions.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.util.*;
 
@@ -332,26 +333,13 @@ public class MockServletResponse implements HttpServletResponse, MockHttpRespons
 	}
 
 	/**
-	 * Returns the body of the request as a string.
-	 *
-	 * @return The body of the request as a string.
-	 */
-	public String getBodyAsString() {
-		try {
-			return baos.toString("UTF-8");
-		} catch (UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	/**
 	 * Returns the body of the request.
 	 *
 	 * @return The body of the request.
 	 */
 	@Override /* MockHttpResponse */
-	public byte[] getBody() {
-		return baos.toByteArray();
+	public MockServletResponseBody getBody() {
+		return new MockServletResponseBody(this, baos.toByteArray());
 	}
 
 	@Override /* MockHttpResponse */
@@ -359,6 +347,25 @@ public class MockServletResponse implements HttpServletResponse, MockHttpRespons
 		return headerMap;
 	}
 
+	/**
+	 * Used for fluent assertion calls against a response header.
+	 *
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Returns the Foo header as a string.</jc>
+	 * 	mockClient
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.getResponseHeader(<js>"Foo"</js>).asString();
+	 * </p>
+	 *
+	 * @param name The response header name.
+	 * @return A new fluent-style assertion object.
+	 */
+	public MockServletResponseHeader getResponseHeader(String name) {
+		return new MockServletResponseHeader(this, name, getHeader(name));
+	}
+
 	//------------------------------------------------------------------------------------------------------------------
 	// Assertions
 	//------------------------------------------------------------------------------------------------------------------
@@ -368,17 +375,17 @@ public class MockServletResponse implements HttpServletResponse, MockHttpRespons
 	 *
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the response status code is 200 or 404.</jc>
+	 * 	<jc>// Validates that the response status code is 200 or 404.</jc>
 	 * 	mockClient
 	 * 		.get(<jsf>URL</jsf>)
 	 * 		.run()
-	 * 		.assertStatus().isOneOf(200,404);
+	 * 		.assertStatus().isAny(200,404);
 	 * </p>
 	 *
 	 * @return A new fluent-style assertion object.
 	 */
-	public MockServletResponseStatusCodeAssertion assertStatus() {
-		return new MockServletResponseStatusCodeAssertion(getStatus(), this);
+	public FluentIntegerAssertion<MockServletResponse> assertStatus() {
+		return new FluentIntegerAssertion<>(getStatus(), this);
 	}
 
 	/**
@@ -386,17 +393,18 @@ public class MockServletResponse implements HttpServletResponse, MockHttpRespons
 	 *
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the response body has the text "OK".</jc>
+	 * 	<jc>// Validates that the response body has the text "OK".</jc>
 	 * 	mockClient
 	 * 		.get(<jsf>URL</jsf>)
 	 * 		.run()
-	 * 		.assertBody().equals(<js>"OK"</js>);
+	 * 		.assertBody().is(<js>"OK"</js>);
 	 * </p>
 	 *
 	 * @return A new fluent-style assertion object.
+	 * @throws IOException An error occurred.
 	 */
-	public MockServletResponseBodyAssertion assertBody() {
-		return new MockServletResponseBodyAssertion(getBodyAsString(), this);
+	public FluentStringAssertion<MockServletResponse> assertBody() throws IOException {
+		return getBody().assertThat();
 	}
 
 	/**
@@ -404,7 +412,7 @@ public class MockServletResponse implements HttpServletResponse, MockHttpRespons
 	 *
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the response has the header Foo and contains "bar".</jc>
+	 * 	<jc>// Validates that the response has the header Foo and contains "bar".</jc>
 	 * 	mockClient
 	 * 		.get(<jsf>URL</jsf>)
 	 * 		.run()
@@ -414,9 +422,73 @@ public class MockServletResponse implements HttpServletResponse, MockHttpRespons
 	 *
 	 * @param name The header name.
 	 * @return A new fluent-style assertion object.
+	 * @throws IOException An error occurred.
+	 */
+	public FluentStringAssertion<MockServletResponse> assertHeader(String name) throws IOException {
+		return getResponseHeader(name).assertThat();
+	}
+
+	/**
+	 * Used for fluent assertion calls against integer response headers.
+	 *
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the age of the response exists and is greater than 1.</jc>
+	 * 	mockClient
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertIntegerHeader(<js>"Age"</js>).exists()
+	 * 		.assertIntegerHeader(<js>"Age"</js>).isGreaterThan(1);
+	 * </p>
+	 *
+	 * @param name The header name.
+	 * @return A new fluent-style assertion object.
+	 * @throws IOException An error occurred.
+	 */
+	public FluentIntegerAssertion<MockServletResponse> assertIntegerHeader(String name) throws IOException {
+		return getResponseHeader(name).assertThatInt();
+	}
+
+	/**
+	 * Used for fluent assertion calls against long response headers.
+	 *
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response length is not too long.</jc>
+	 * 	mockClient
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertLongHeader(<js>"Length"</js>).exists()
+	 * 		.assertLongHeader(<js>"Length"</js>).isLessThan(100000);
+	 * </p>
+	 *
+	 * @param name The header name.
+	 * @return A new fluent-style assertion object.
+	 * @throws IOException An error occurred.
+	 */
+	public FluentLongAssertion<MockServletResponse> assertLongHeader(String name) throws IOException {
+		return getResponseHeader(name).assertThatLong();
+	}
+
+	/**
+	 * Used for fluent assertion calls against date response headers.
+	 *
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response isn't expired.</jc>
+	 * 	mockClient
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertDateHeader(<js>"Expires"</js>).exists()
+	 * 		.assertDateHeader(<js>"Expires"</js>).isAfter(<jk>new</jk> Date());
+	 * </p>
+	 *
+	 * @param name The header name.
+	 * @return A new fluent-style assertion object.
+	 * @throws IOException An error occurred.
 	 */
-	public MockServletResponseHeaderAssertion assertHeader(String name) {
-		return new MockServletResponseHeaderAssertion(getHeader(name), this);
+	public FluentDateAssertion<MockServletResponse> assertDateHeader(String name) throws IOException {
+		return getResponseHeader(name).assertThatDate();
 	}
 
 	/**
@@ -424,16 +496,16 @@ public class MockServletResponse implements HttpServletResponse, MockHttpRespons
 	 *
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the response has the header Foo and contains "bar".</jc>
+	 * 	<jc>// Validates that the response charset is UTF-8.</jc>
 	 * 	mockClient
 	 * 		.get(<jsf>URL</jsf>)
 	 * 		.run()
-	 * 		.assertCharset().equals("utf-8");
+	 * 		.assertCharset().equalsIgnoreCase("utf-8");
 	 * </p>
 	 *
 	 * @return A new fluent-style assertion object.
 	 */
-	public MockServletResponseHeaderAssertion assertCharset() {
-		return new MockServletResponseHeaderAssertion(getCharacterEncoding(), this);
+	public FluentStringAssertion<MockServletResponse> assertCharset() {
+		return new FluentStringAssertion<>(getCharacterEncoding(), this);
 	}
 }
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseBody.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseBody.java
new file mode 100644
index 0000000..1dc9452
--- /dev/null
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseBody.java
@@ -0,0 +1,193 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              *
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.rest.mock2;
+
+import static org.apache.juneau.internal.IOUtils.*;
+
+import java.io.*;
+
+import org.apache.juneau.assertions.*;
+
+/**
+ * Represents the body of an HTTP response.
+ *
+ * <p>
+ * Provides convenience methods for retrieval and assertions of HTTP response bodies.
+ */
+public class MockServletResponseBody {
+
+	private final MockServletResponse response;
+	private final byte[] body;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param response The HTTP response.
+	 * @param body The body of the request.
+	 */
+	public MockServletResponseBody(MockServletResponse response, byte[] body) {
+		this.body = body;
+		this.response = response;
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Raw streams
+	//------------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Returns the HTTP response message body as an input stream.
+	 *
+	 * @return
+	 * 	The HTTP response message body input stream, never <jk>null</jk>.
+	 * 	<br>For responses without a body(e.g. HTTP 204), returns an empty stream.
+	 * @throws IOException If a stream or illegal state exception was thrown.
+	 */
+	public InputStream asInputStream() throws IOException {
+		return new ByteArrayInputStream(body);
+	}
+
+	/**
+	 * Returns the HTTP response message body as a byte array.
+	 *
+	 * @return
+	 * 	The HTTP response message body input stream, never <jk>null</jk>.
+	 * 	<br>For responses without a body(e.g. HTTP 204), returns an empty stream.
+	 * @throws IOException If a stream or illegal state exception was thrown.
+	 */
+	public byte[] asBytes() throws IOException {
+		return body;
+	}
+
+	/**
+	 * Returns the HTTP response message body as a reader based on the charset on the <code>Content-Type</code> response header.
+	 *
+	 * @return
+	 * 	The HTTP response message body reader, never <jk>null</jk>.
+	 * 	<br>For responses without a body(e.g. HTTP 204), returns an empty reader.
+	 * @throws IOException If an exception occurred.
+	 */
+	public Reader asReader() throws IOException {
+
+		// Figure out what the charset of the response is.
+		String cs = null;
+		String ct = response.getContentType();
+
+		// First look for "charset=" in Content-Type header of response.
+		if (ct != null && ct.contains("charset="))
+			cs = ct.substring(ct.indexOf("charset=")+8).trim();
+
+		return asReader(cs);
+	}
+
+	/**
+	 * Returns the HTTP response message body as a reader using the specified charset.
+	 *
+	 * @param charset
+	 * 	The charset to use for the reader.
+	 * 	<br>If <jk>null</jk>, <js>"UTF-8"</js> is used.
+	 * @return
+	 * 	The HTTP response message body reader, never <jk>null</jk>.
+	 * 	<br>For responses without a body(e.g. HTTP 204), returns an empty reader.
+	 * @throws IOException If an exception occurred.
+	 */
+	public Reader asReader(String charset) throws IOException {
+		try {
+			return new InputStreamReader(asInputStream(), charset == null ? "UTF-8" : charset);
+		} catch (UnsupportedEncodingException e) {
+			throw new IOException(e);
+		}
+	}
+
+	/**
+	 * Returns the contents of this body as a string.
+	 *
+	 * @return The response as a string.
+	 */
+	public String asString() {
+		try (Reader r = asReader()) {
+			return read(r).toString();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Assertions
+	//------------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on this response body.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates the response body equals the text "OK".</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertBody().is(<js>"OK"</js>);
+	 *
+	 * 	<jc>// Validates the response body contains the text "OK".</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertBody().contains(<js>"OK"</js>);
+	 *
+	 * 	<jc>// Validates the response body passes a predicate test.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertBody().passes(x -&gt; x.contains(<js>"OK"</js>));
+	 *
+	 * 	<jc>// Validates the response body matches a regular expression.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertBody().matches(<js>".*OK.*"</js>);
+	 *
+	 * 	<jc>// Validates the response body matches a regular expression using regex flags.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertBody().matches(<js>".*OK.*"</js>,  <jsf>MULTILINE</jsf> &amp; <jsf>CASE_INSENSITIVE</jsf>);
+	 *
+	 * 	<jc>// Validates the response body matches a regular expression in the form of an existing Pattern.</jc>
+	 * 	Pattern p = Pattern.<jsm>compile</jsm>(<js>".*OK.*"</js>);
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertBody().matches(p);
+	 * </p>
+	 *
+	 * <p>
+	 * The assertion test returns the original response object allowing you to chain multiple requests like so:
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates the response body matches a regular expression.</jc>
+	 * 	MyBean bean = client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertBody().matches(<js>".*OK.*"</js>);
+	 * 		.assertBody().doesNotMatch(<js>".*ERROR.*"</js>);
+	 * </p>
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 * 		If no charset was found on the <code>Content-Type</code> response header, <js>"UTF-8"</js> is assumed.
+	 * </ul>
+	 *
+	 * @return A new fluent assertion object.
+	 * @throws IOException If REST call failed.
+	 */
+	public FluentStringAssertion<MockServletResponse> assertThat() throws IOException {
+		return new FluentStringAssertion<>(asString(), response);
+	}
+}
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseBodyAssertion.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseBodyAssertion.java
deleted file mode 100644
index 73d0a49..0000000
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseBodyAssertion.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.mock2;
-
-import org.apache.juneau.utils.*;
-
-/**
- * Allows for fluent-style assertions on the HTTP response body.
- */
-public class MockServletResponseBodyAssertion extends FluentStringAssertion<MockServletResponse> {
-
-	/**
-	 * Constructor
-	 *
-	 * @param text The body text.
-	 * @param returns The fluent return object.
-	 */
-	public MockServletResponseBodyAssertion(String text, MockServletResponse returns) {
-		super(text, returns);
-	}
-}
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseHeader.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseHeader.java
new file mode 100644
index 0000000..e5d37b5
--- /dev/null
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseHeader.java
@@ -0,0 +1,263 @@
+// ***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                                                              *
+// *                                                                                                                         *
+// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+// *                                                                                                                         *
+// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the License.                                              *
+// ***************************************************************************************************************************
+package org.apache.juneau.rest.mock2;
+
+
+import java.io.*;
+
+import org.apache.juneau.assertions.*;
+import org.apache.juneau.http.*;
+
+/**
+ * Represents a single header on an HTTP response.
+ *
+ * <p>
+ * Provides convenience methods for retrieving and asserting response header values.
+ */
+public class MockServletResponseHeader {
+
+	private MockServletResponse response;
+	private final String name, value;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param response The response object.
+	 * @param name The response header name.
+	 * @param value The response header value, of <jk>null</jk> if header not specified.
+	 */
+	public MockServletResponseHeader(MockServletResponse response, String name, String value) {
+		this.response = response;
+		this.name = name;
+		this.value = value;
+	}
+
+	/**
+	 * Returns the value of this header as a string.
+	 *
+	 * @return The value of this header as a string, or <jk>null</jk> if header was not present.
+	 */
+	public String asString() {
+		return value;
+	}
+
+	/**
+	 * Returns the value of this header as a CSV array header.
+	 *
+	 * @return The value of this header as a CSV array header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicCsvArrayHeader asCsvArrayHeader() {
+		return value == null ? null : new BasicCsvArrayHeader(getName(), value);
+	}
+
+	/**
+	 * Returns the value of this header as a date header.
+	 *
+	 * @return The value of this header as a date header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicDateHeader asDateHeader() {
+		return value == null ? null : new BasicDateHeader(getName(), value);
+	}
+
+	/**
+	 * Returns the value of this header as an entity validator array header.
+	 *
+	 * @return The value of this header as an entity validator array header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicEntityValidatorArrayHeader asEntityValidatorArrayHeader() {
+		return value == null ? null : new BasicEntityValidatorArrayHeader(getName(), value);
+	}
+
+	/**
+	 * Returns the value of this header as an integer header.
+	 *
+	 * @return The value of this header as an integer header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicIntegerHeader asIntegerHeader() {
+		return value == null ? null : new BasicIntegerHeader(getName(), value);
+	}
+
+	/**
+	 * Returns the value of this header as a long header.
+	 *
+	 * @return The value of this header as a long header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicLongHeader asLongHeader() {
+		return value == null ? null : new BasicLongHeader(getName(), value);
+	}
+
+	/**
+	 * Returns the value of this header as a range array header.
+	 *
+	 * @return The value of this header as a range array header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicRangeArrayHeader asRangeArrayHeader() {
+		return value == null ? null : new BasicRangeArrayHeader(getName(), value);
+	}
+
+	/**
+	 * Returns the value of this header as a string header.
+	 *
+	 * @return The value of this header as a string header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicHeader asHeader() {
+		return value == null ? null : new BasicHeader(getName(), value);
+	}
+
+	/**
+	 * Returns the value of this header as a URI header.
+	 *
+	 * @return The value of this header as a URI header, or <jk>null</jk> if header was not present.
+	 */
+	public BasicUriHeader asUriHeader() {
+		return value == null ? null : new BasicUriHeader(getName(), value);
+	}
+
+	//------------------------------------------------------------------------------------------------------------------
+	// Assertions.
+	//------------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on this response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates the content type header is provided.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertHeader(<js>"Content-Type"</js>).exists();
+	 *
+	 * 	<jc>// Validates the content type is JSON.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertHeader(<js>"Content-Type"</js>).equals(<js>"application/json"</js>);
+	 *
+	 * 	<jc>// Validates the content type is JSON using test predicate.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertHeader(<js>"Content-Type"</js>).passes(x -&gt; x.equals(<js>"application/json"</js>));
+	 *
+	 * 	<jc>// Validates the content type is JSON by just checking for substring.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertHeader(<js>"Content-Type"</js>).contains(<js>"json"</js>);
+	 *
+	 * 	<jc>// Validates the content type is JSON using regular expression.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertHeader(<js>"Content-Type"</js>).matches(<js>".*json.*"</js>);
+	 *
+	 * 	<jc>// Validates the content type is JSON using case-insensitive regular expression.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertHeader(<js>"Content-Type"</js>).matches(<js>".*json.*"</js>, <jsf>CASE_INSENSITIVE</jsf>);
+	 * </p>
+	 *
+	 * <p>
+	 * The assertion test returns the original response object allowing you to chain multiple requests like so:
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the Content-Type header exists and is JSON.</jc>
+	 * 	MediaType mediaType = client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertHeader(<js>"Content-Type"</js>).exists()
+	 * 		.assertHeader(<js>"Content-Type"</js>).matches(<js>".*json.*"</js>);
+	 * </p>
+	 *
+	 * @return A new fluent assertion object.
+	 * @throws IOException If REST call failed.
+	 */
+	public FluentStringAssertion<MockServletResponse> assertThat() throws IOException {
+		return new FluentStringAssertion<>(asString(), response);
+	}
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on an integer response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response age is greater than 1.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertIntHeader(<js>"Age"</js>).isGreaterThan(1);
+	 * </p>
+	 *
+	 * @return A new fluent assertion object.
+	 * @throws IOException If REST call failed.
+	 */
+	public FluentIntegerAssertion<MockServletResponse> assertThatInt() throws IOException {
+		BasicIntegerHeader h = asIntegerHeader();
+		return new FluentIntegerAssertion<>(h == null ? -1 : h.asInt(), response);
+	}
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on a long response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response length is not too long.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertLongHeader(<js>"Length"</js>).isLessThan(100000);
+	 * </p>
+	 *
+	 * @return A new fluent assertion object.
+	 * @throws IOException If REST call failed.
+	 */
+	public FluentLongAssertion<MockServletResponse> assertThatLong() throws IOException {
+		BasicLongHeader h = asLongHeader();
+		return new FluentLongAssertion<>(h == null ? -1 : h.asLong(), response);
+	}
+
+	/**
+	 * Provides the ability to perform fluent-style assertions on a date response header.
+	 *
+	 * <h5 class='section'>Examples:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Validates that the response content is not expired.</jc>
+	 * 	client
+	 * 		.get(<jsf>URL</jsf>)
+	 * 		.run()
+	 * 		.assertDateHeader(<js>"Expires"</js>).isBefore(<jk>new</jk> Date());
+	 * </p>
+	 *
+	 * @return A new fluent assertion object.
+	 * @throws IOException If REST call failed.
+	 */
+	public FluentDateAssertion<MockServletResponse> assertThatDate() throws IOException {
+		BasicDateHeader h = asDateHeader();
+		return new FluentDateAssertion<>(h == null ? null : h.asDate(), response);
+	}
+
+	/**
+	 * Gets the name of this pair.
+	 *
+	 * @return The name of this pair, never <jk>null</jk>.
+	 */
+	public String getName() {
+		return name;
+	}
+
+	@Override /* Object */
+	public String toString() {
+		return getName() + ": " + asString();
+	}
+}
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseHeaderAssertion.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseHeaderAssertion.java
deleted file mode 100644
index 669eb73..0000000
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseHeaderAssertion.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.mock2;
-
-import org.apache.juneau.utils.*;
-
-/**
- * Allows for fluent-style assertions on the HTTP response header.
- */
-public class MockServletResponseHeaderAssertion extends FluentStringAssertion<MockServletResponse> {
-
-	/**
-	 * Constructor
-	 *
-	 * @param text The HTTP header value, or <jk>null</jk> if header not found.
-	 * @param returns The fluent return object.
-	 */
-	public MockServletResponseHeaderAssertion(String text, MockServletResponse returns) {
-		super(text, returns);
-	}
-}
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseStatusCodeAssertion.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseStatusCodeAssertion.java
deleted file mode 100644
index 9da68a6..0000000
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponseStatusCodeAssertion.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.mock2;
-
-import org.apache.juneau.utils.*;
-
-/**
- * Allows for fluent-style assertions on the HTTP response status code.
- */
-public class MockServletResponseStatusCodeAssertion extends FluentIntAssertion<MockServletResponse> {
-
-	/**
-	 * Constructor.
-	 *
-	 * @param value Status code.
-	 * @param returns Fluent-style return object.
-	 */
-	public MockServletResponseStatusCodeAssertion(int value, MockServletResponse returns) {
-		super(value, returns);
-	}
-}
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
index 7eafc9e..51e6499 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
@@ -2341,7 +2341,7 @@ public class BasicRestInfoProviderTest {
 
 	@Test
 	public void p01_bodyWithReadOnlyProperty() throws Exception {
-		Swagger s = JsonParser.DEFAULT.parse(p.options("/").accept("application/json").run().getBodyAsString(), Swagger.class);
+		Swagger s = JsonParser.DEFAULT.parse(p.options("/").accept("application/json").run().getBody().asString(), Swagger.class);
 		Operation o = s.getOperation("/", "get");
 		ParameterInfo pi = o.getParameter("body", null);
 		assertEquals("{\n\tf1: 1,\n\tf2: 2\n}", pi.getExamples().get("application/json+simple"));
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/DebugModeTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/DebugModeTest.java
index a4e2070..ac62cde 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/DebugModeTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/DebugModeTest.java
@@ -119,39 +119,39 @@ public class DebugModeTest {
 	@Test
 	public void a01_debugDefault() throws Exception {
 
-		assertEquals("false", a1.get("/a01").run().getBodyAsString());
+		a1.get("/a01").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a1d.get("/a01").run().getBodyAsString());
+		a1d.get("/a01").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("false", a1.get("/a02").run().getBodyAsString());
+		a1.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a1d.get("/a02").run().getBodyAsString());
+		a1d.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", a1.get("/a03").run().getBodyAsString());
+		a1.get("/a03").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a03");
-		assertEquals("true", a1d.get("/a03").run().getBodyAsString());
+		a1d.get("/a03").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a03");
 
-		assertEquals("false", a1.get("/a04").run().getBodyAsString());
+		a1.get("/a04").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", a1d.get("/a04").run().getBodyAsString());
+		a1d.get("/a04").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a04");
 
-		assertEquals("false", a1.get("/a05").run().getBodyAsString());
+		a1.get("/a05").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a1d.get("/a05").run().getBodyAsString());
+		a1d.get("/a05").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", a1.get("/a06").run().getBodyAsString());
+		a1.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", a1d.get("/a06").run().getBodyAsString());
+		a1d.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", a1.get("/a07").run().getBodyAsString());
+		a1.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a1d.get("/a07").run().getBodyAsString());
+		a1d.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
 	}
 
@@ -194,39 +194,39 @@ public class DebugModeTest {
 	@Test
 	public void a01a_debugDefault() throws Exception {
 
-		assertEquals("false", a1a.get("/a01").run().getBodyAsString());
+		a1a.get("/a01").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a1ad.get("/a01").run().getBodyAsString());
+		a1ad.get("/a01").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("false", a1a.get("/a02").run().getBodyAsString());
+		a1a.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a1ad.get("/a02").run().getBodyAsString());
+		a1ad.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", a1a.get("/a03").run().getBodyAsString());
+		a1a.get("/a03").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a03");
-		assertEquals("true", a1ad.get("/a03").run().getBodyAsString());
+		a1ad.get("/a03").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a03");
 
-		assertEquals("false", a1a.get("/a04").run().getBodyAsString());
+		a1a.get("/a04").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", a1ad.get("/a04").run().getBodyAsString());
+		a1ad.get("/a04").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a04");
 
-		assertEquals("false", a1a.get("/a05").run().getBodyAsString());
+		a1a.get("/a05").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a1ad.get("/a05").run().getBodyAsString());
+		a1ad.get("/a05").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", a1a.get("/a06").run().getBodyAsString());
+		a1a.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", a1ad.get("/a06").run().getBodyAsString());
+		a1ad.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", a1a.get("/a07").run().getBodyAsString());
+		a1a.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a1ad.get("/a07").run().getBodyAsString());
+		a1ad.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
 	}
 
@@ -273,39 +273,39 @@ public class DebugModeTest {
 	@Test
 	public void a02_debugTrue() throws Exception {
 
-		assertEquals("true", a2.get("/a01").run().getBodyAsString());
+		a2.get("/a01").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", a2d.get("/a01").run().getBodyAsString());
+		a2d.get("/a01").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", a2.get("/a02").run().getBodyAsString());
+		a2.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a2d.get("/a02").run().getBodyAsString());
+		a2d.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", a2.get("/a03").run().getBodyAsString());
+		a2.get("/a03").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", a2d.get("/a03").run().getBodyAsString());
+		a2d.get("/a03").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", a2.get("/a04").run().getBodyAsString());
+		a2.get("/a04").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", a2d.get("/a04").run().getBodyAsString());
+		a2d.get("/a04").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("true", a2.get("/a05").run().getBodyAsString());
+		a2.get("/a05").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", a2d.get("/a05").run().getBodyAsString());
+		a2d.get("/a05").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("true", a2.get("/a06").run().getBodyAsString());
+		a2.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", a2d.get("/a06").run().getBodyAsString());
+		a2d.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", a2.get("/a07").run().getBodyAsString());
+		a2.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a2d.get("/a07").run().getBodyAsString());
+		a2d.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
 	}
 
@@ -352,39 +352,39 @@ public class DebugModeTest {
 	@Test
 	public void a03_restDebugFalse() throws Exception {
 
-		assertEquals("false", a3.get("/a01").run().getBodyAsString());
+		a3.get("/a01").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a3d.get("/a01").run().getBodyAsString());
+		a3d.get("/a01").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("false", a3.get("/a02").run().getBodyAsString());
+		a3.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a3d.get("/a02").run().getBodyAsString());
+		a3d.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", a3.get("/a03").run().getBodyAsString());
+		a3.get("/a03").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a03");
-		assertEquals("true", a3d.get("/a03").run().getBodyAsString());
+		a3d.get("/a03").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a03");
 
-		assertEquals("false", a3.get("/a04").run().getBodyAsString());
+		a3.get("/a04").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", a3d.get("/a04").run().getBodyAsString());
+		a3d.get("/a04").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a04");
 
-		assertEquals("false", a3.get("/a05").run().getBodyAsString());
+		a3.get("/a05").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a3d.get("/a05").run().getBodyAsString());
+		a3d.get("/a05").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", a3.get("/a06").run().getBodyAsString());
+		a3.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", a3d.get("/a06").run().getBodyAsString());
+		a3d.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", a3.get("/a07").run().getBodyAsString());
+		a3.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a3d.get("/a07").run().getBodyAsString());
+		a3d.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
 	}
 
@@ -431,39 +431,39 @@ public class DebugModeTest {
 	@Test
 	public void a04_debugPerRequest() throws Exception {
 
-		assertEquals("false", a4.get("/a01").run().getBodyAsString());
+		a4.get("/a01").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", a4d.get("/a01").run().getBodyAsString());
+		a4d.get("/a01").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", a4.get("/a02").run().getBodyAsString());
+		a4.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a4d.get("/a02").run().getBodyAsString());
+		a4d.get("/a02").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", a4.get("/a03").run().getBodyAsString());
+		a4.get("/a03").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a03");
-		assertEquals("true", a4d.get("/a03").run().getBodyAsString());
+		a4d.get("/a03").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a03");
 
-		assertEquals("false", a4.get("/a04").run().getBodyAsString());
+		a4.get("/a04").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", a4d.get("/a04").run().getBodyAsString());
+		a4d.get("/a04").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /a04");
 
-		assertEquals("false", a4.get("/a05").run().getBodyAsString());
+		a4.get("/a05").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", a4d.get("/a05").run().getBodyAsString());
+		a4d.get("/a05").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("true", a4.get("/a06").run().getBodyAsString());
+		a4.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", a4d.get("/a06").run().getBodyAsString());
+		a4d.get("/a06").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", a4.get("/a07").run().getBodyAsString());
+		a4.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", a4d.get("/a07").run().getBodyAsString());
+		a4d.get("/a07").run().assertBody().is("false");
 		assertLogged(false);
 	}
 
@@ -491,9 +491,9 @@ public class DebugModeTest {
 	@Test
 	public void b01_debugDefault() throws Exception {
 
-		assertEquals("false", b1.get("/b01").run().getBodyAsString());
+		b1.get("/b01").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", b1.get("/b02").run().getBodyAsString());
+		b1.get("/b02").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /b02");
 	}
 
@@ -517,9 +517,9 @@ public class DebugModeTest {
 	@Test
 	public void b02_debugDefault() throws Exception {
 
-		assertEquals("false", b2.get("/b01").run().getBodyAsString());
+		b2.get("/b01").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", b2.get("/b02").run().getBodyAsString());
+		b2.get("/b02").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /b02");
 	}
 
@@ -706,155 +706,155 @@ public class DebugModeTest {
 	@Test
 	public void c01_debugDefault() throws Exception {
 
-		assertEquals("false", c1.get("/c01a").run().getBodyAsString());
+		c1.get("/c01a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c01a").run().getBodyAsString());
+		c1d.get("/c01a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c01b").run().getBodyAsString());
+		c1.get("/c01b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c01b").run().getBodyAsString());
+		c1d.get("/c01b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c1.get("/c01c").run().getBodyAsString());
+		c1.get("/c01c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c1d.get("/c01c").run().getBodyAsString());
+		c1d.get("/c01c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("false", c1.get("/c01d").run().getBodyAsString());
+		c1.get("/c01d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c1d.get("/c01d").run().getBodyAsString());
+		c1d.get("/c01d").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", c1.get("/c02a").run().getBodyAsString());
+		c1.get("/c02a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c02a").run().getBodyAsString());
+		c1d.get("/c02a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c02b").run().getBodyAsString());
+		c1.get("/c02b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c02b").run().getBodyAsString());
+		c1d.get("/c02b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c02c").run().getBodyAsString());
+		c1.get("/c02c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c02c").run().getBodyAsString());
+		c1d.get("/c02c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c02d").run().getBodyAsString());
+		c1.get("/c02d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c02d").run().getBodyAsString());
+		c1d.get("/c02d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c02e").run().getBodyAsString());
+		c1.get("/c02e").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c02e").run().getBodyAsString());
+		c1d.get("/c02e").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c02f").run().getBodyAsString());
+		c1.get("/c02f").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c02f").run().getBodyAsString());
+		c1d.get("/c02f").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", c1.get("/c03a").run().getBodyAsString());
+		c1.get("/c03a").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03a");
-		assertEquals("true", c1d.get("/c03a").run().getBodyAsString());
+		c1d.get("/c03a").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03a");
-		assertEquals("true", c1.get("/c03b").run().getBodyAsString());
+		c1.get("/c03b").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03b");
-		assertEquals("true", c1d.get("/c03b").run().getBodyAsString());
+		c1d.get("/c03b").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03b");
-		assertEquals("true", c1.get("/c03c").run().getBodyAsString());
+		c1.get("/c03c").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03c");
-		assertEquals("true", c1d.get("/c03c").run().getBodyAsString());
+		c1d.get("/c03c").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03c");
-		assertEquals("true", c1.get("/c03d").run().getBodyAsString());
+		c1.get("/c03d").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03d");
-		assertEquals("true", c1d.get("/c03d").run().getBodyAsString());
+		c1d.get("/c03d").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03d");
-		assertEquals("true", c1.get("/c03e").run().getBodyAsString());
+		c1.get("/c03e").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03e");
-		assertEquals("true", c1d.get("/c03e").run().getBodyAsString());
+		c1d.get("/c03e").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03e");
-		assertEquals("true", c1.get("/c03f").run().getBodyAsString());
+		c1.get("/c03f").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03f");
-		assertEquals("true", c1d.get("/c03f").run().getBodyAsString());
+		c1d.get("/c03f").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03f");
 
-		assertEquals("false", c1.get("/c04a").run().getBodyAsString());
+		c1.get("/c04a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c1d.get("/c04a").run().getBodyAsString());
+		c1d.get("/c04a").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04a");
-		assertEquals("false", c1.get("/c04b").run().getBodyAsString());
+		c1.get("/c04b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c1d.get("/c04b").run().getBodyAsString());
+		c1d.get("/c04b").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04b");
-		assertEquals("false", c1.get("/c04c").run().getBodyAsString());
+		c1.get("/c04c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c1d.get("/c04c").run().getBodyAsString());
+		c1d.get("/c04c").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04c");
-		assertEquals("false", c1.get("/c04d").run().getBodyAsString());
+		c1.get("/c04d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c1d.get("/c04d").run().getBodyAsString());
+		c1d.get("/c04d").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04d");
-		assertEquals("false", c1.get("/c04e").run().getBodyAsString());
+		c1.get("/c04e").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c1d.get("/c04e").run().getBodyAsString());
+		c1d.get("/c04e").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04e");
-		assertEquals("false", c1.get("/c04f").run().getBodyAsString());
+		c1.get("/c04f").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c1d.get("/c04f").run().getBodyAsString());
+		c1d.get("/c04f").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04f");
 
-		assertEquals("false", c1.get("/c05a").run().getBodyAsString());
+		c1.get("/c05a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c05a").run().getBodyAsString());
+		c1d.get("/c05a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c05b").run().getBodyAsString());
+		c1.get("/c05b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c05b").run().getBodyAsString());
+		c1d.get("/c05b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c05c").run().getBodyAsString());
+		c1.get("/c05c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c05c").run().getBodyAsString());
+		c1d.get("/c05c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c05d").run().getBodyAsString());
+		c1.get("/c05d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c05d").run().getBodyAsString());
+		c1d.get("/c05d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c05e").run().getBodyAsString());
+		c1.get("/c05e").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c05e").run().getBodyAsString());
+		c1d.get("/c05e").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c05f").run().getBodyAsString());
+		c1.get("/c05f").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c05f").run().getBodyAsString());
+		c1d.get("/c05f").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", c1.get("/c06a").run().getBodyAsString());
+		c1.get("/c06a").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c1d.get("/c06a").run().getBodyAsString());
+		c1d.get("/c06a").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c1.get("/c06b").run().getBodyAsString());
+		c1.get("/c06b").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c1d.get("/c06b").run().getBodyAsString());
+		c1d.get("/c06b").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c1.get("/c06c").run().getBodyAsString());
+		c1.get("/c06c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c1d.get("/c06c").run().getBodyAsString());
+		c1d.get("/c06c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c1.get("/c06d").run().getBodyAsString());
+		c1.get("/c06d").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c1d.get("/c06d").run().getBodyAsString());
+		c1d.get("/c06d").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", c1.get("/c07a").run().getBodyAsString());
+		c1.get("/c07a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c07a").run().getBodyAsString());
+		c1d.get("/c07a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c07b").run().getBodyAsString());
+		c1.get("/c07b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c07b").run().getBodyAsString());
+		c1d.get("/c07b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c07c").run().getBodyAsString());
+		c1.get("/c07c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c07c").run().getBodyAsString());
+		c1d.get("/c07c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1.get("/c07d").run().getBodyAsString());
+		c1.get("/c07d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c1d.get("/c07d").run().getBodyAsString());
+		c1d.get("/c07d").run().assertBody().is("false");
 		assertLogged(false);
 	}
 
@@ -1040,155 +1040,155 @@ public class DebugModeTest {
 	@Test
 	public void c02_debugTrue() throws Exception {
 
-		assertEquals("true", c2.get("/c01a").run().getBodyAsString());
+		c2.get("/c01a").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c01a").run().getBodyAsString());
+		c2d.get("/c01a").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("false", c2.get("/c01b").run().getBodyAsString());
+		c2.get("/c01b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c01b").run().getBodyAsString());
+		c2d.get("/c01b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c2.get("/c01c").run().getBodyAsString());
+		c2.get("/c01c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c01c").run().getBodyAsString());
+		c2d.get("/c01c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("false", c2.get("/c01d").run().getBodyAsString());
+		c2.get("/c01d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c2d.get("/c01d").run().getBodyAsString());
+		c2d.get("/c01d").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", c2.get("/c02a").run().getBodyAsString());
+		c2.get("/c02a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c02a").run().getBodyAsString());
+		c2d.get("/c02a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2.get("/c02b").run().getBodyAsString());
+		c2.get("/c02b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c02b").run().getBodyAsString());
+		c2d.get("/c02b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2.get("/c02c").run().getBodyAsString());
+		c2.get("/c02c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c02c").run().getBodyAsString());
+		c2d.get("/c02c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2.get("/c02d").run().getBodyAsString());
+		c2.get("/c02d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c02d").run().getBodyAsString());
+		c2d.get("/c02d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2.get("/c02e").run().getBodyAsString());
+		c2.get("/c02e").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c02e").run().getBodyAsString());
+		c2d.get("/c02e").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2.get("/c02f").run().getBodyAsString());
+		c2.get("/c02f").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c02f").run().getBodyAsString());
+		c2d.get("/c02f").run().assertBody().is("false");
 		assertLogged(false);
 
-		assertEquals("true", c2.get("/c03a").run().getBodyAsString());
+		c2.get("/c03a").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03a");
-		assertEquals("true", c2d.get("/c03a").run().getBodyAsString());
+		c2d.get("/c03a").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03a");
-		assertEquals("true", c2.get("/c03b").run().getBodyAsString());
+		c2.get("/c03b").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03b");
-		assertEquals("true", c2d.get("/c03b").run().getBodyAsString());
+		c2d.get("/c03b").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03b");
-		assertEquals("true", c2.get("/c03c").run().getBodyAsString());
+		c2.get("/c03c").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03c");
-		assertEquals("true", c2d.get("/c03c").run().getBodyAsString());
+		c2d.get("/c03c").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03c");
-		assertEquals("true", c2.get("/c03d").run().getBodyAsString());
+		c2.get("/c03d").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03d");
-		assertEquals("true", c2d.get("/c03d").run().getBodyAsString());
+		c2d.get("/c03d").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03d");
-		assertEquals("true", c2.get("/c03e").run().getBodyAsString());
+		c2.get("/c03e").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03e");
-		assertEquals("true", c2d.get("/c03e").run().getBodyAsString());
+		c2d.get("/c03e").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03e");
-		assertEquals("true", c2.get("/c03f").run().getBodyAsString());
+		c2.get("/c03f").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03f");
-		assertEquals("true", c2d.get("/c03f").run().getBodyAsString());
+		c2d.get("/c03f").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c03f");
 
-		assertEquals("false", c2.get("/c04a").run().getBodyAsString());
+		c2.get("/c04a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c2d.get("/c04a").run().getBodyAsString());
+		c2d.get("/c04a").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04a");
-		assertEquals("false", c2.get("/c04b").run().getBodyAsString());
+		c2.get("/c04b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c2d.get("/c04b").run().getBodyAsString());
+		c2d.get("/c04b").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04b");
-		assertEquals("false", c2.get("/c04c").run().getBodyAsString());
+		c2.get("/c04c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c2d.get("/c04c").run().getBodyAsString());
+		c2d.get("/c04c").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04c");
-		assertEquals("false", c2.get("/c04d").run().getBodyAsString());
+		c2.get("/c04d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c2d.get("/c04d").run().getBodyAsString());
+		c2d.get("/c04d").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04d");
-		assertEquals("false", c2.get("/c04e").run().getBodyAsString());
+		c2.get("/c04e").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c2d.get("/c04e").run().getBodyAsString());
+		c2d.get("/c04e").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04e");
-		assertEquals("false", c2.get("/c04f").run().getBodyAsString());
+		c2.get("/c04f").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("true", c2d.get("/c04f").run().getBodyAsString());
+		c2d.get("/c04f").run().assertBody().is("true");
 		assertLoggedContains("[200] HTTP GET /c04f");
 
-		assertEquals("true", c2.get("/c05a").run().getBodyAsString());
+		c2.get("/c05a").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c05a").run().getBodyAsString());
+		c2d.get("/c05a").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2.get("/c05b").run().getBodyAsString());
+		c2.get("/c05b").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c05b").run().getBodyAsString());
+		c2d.get("/c05b").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2.get("/c05c").run().getBodyAsString());
+		c2.get("/c05c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c05c").run().getBodyAsString());
+		c2d.get("/c05c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2.get("/c05d").run().getBodyAsString());
+		c2.get("/c05d").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c05d").run().getBodyAsString());
+		c2d.get("/c05d").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2.get("/c05e").run().getBodyAsString());
+		c2.get("/c05e").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c05e").run().getBodyAsString());
+		c2d.get("/c05e").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2.get("/c05f").run().getBodyAsString());
+		c2.get("/c05f").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c05f").run().getBodyAsString());
+		c2d.get("/c05f").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("true", c2.get("/c06a").run().getBodyAsString());
+		c2.get("/c06a").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c06a").run().getBodyAsString());
+		c2d.get("/c06a").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2.get("/c06b").run().getBodyAsString());
+		c2.get("/c06b").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c06b").run().getBodyAsString());
+		c2d.get("/c06b").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2.get("/c06c").run().getBodyAsString());
+		c2.get("/c06c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c06c").run().getBodyAsString());
+		c2d.get("/c06c").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2.get("/c06d").run().getBodyAsString());
+		c2.get("/c06d").run().assertBody().is("true");
 		assertLogged(true);
-		assertEquals("true", c2d.get("/c06d").run().getBodyAsString());
+		c2d.get("/c06d").run().assertBody().is("true");
 		assertLogged(true);
 
-		assertEquals("false", c2.get("/c07a").run().getBodyAsString());
+		c2.get("/c07a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c07a").run().getBodyAsString());
+		c2d.get("/c07a").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2.get("/c07b").run().getBodyAsString());
+		c2.get("/c07b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c07b").run().getBodyAsString());
+		c2d.get("/c07b").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2.get("/c07c").run().getBodyAsString());
+		c2.get("/c07c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c07c").run().getBodyAsString());
+		c2d.get("/c07c").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2.get("/c07d").run().getBodyAsString());
+		c2.get("/c07d").run().assertBody().is("false");
 		assertLogged(false);
-		assertEquals("false", c2d.get("/c07d").run().getBodyAsString());
+		c2d.get("/c07d").run().assertBody().is("false");
 		assertLogged(false);
 	}
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StatusCodesTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StatusCodesTest.java
index 32830d0..9d779ce 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StatusCodesTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StatusCodesTest.java
@@ -43,7 +43,9 @@ public class StatusCodesTest {
 
 	@Test
 	public void a01a_OK() throws Exception {
-		a.put("/a01", "foo").run().assertStatus().equals(200);
+		a.put("/a01", "foo")
+			.run()
+			.assertStatus().is(200);
 	}
 
 	//=================================================================================================================
@@ -108,80 +110,101 @@ public class StatusCodesTest {
 
 	@Test
 	public void b01a_nonExistentBeanProperties() throws Exception {
-		b.put("/nonExistentBeanProperties?noTrace=true", "{f2:'foo'}").json().run()
-			.assertStatus().equals(400)
+		b.put("/nonExistentBeanProperties?noTrace=true", "{f2:'foo'}")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"Unknown property 'f2' encountered while trying to parse into class 'org.apache.juneau.rest.StatusCodesTest$B$B01'"
 			);
 	}
 	@Test
 	public void b01b_nonExistentBeanProperties() throws Exception {
-		b.put("/nonExistentBeanProperties?noTrace=true", "{f1:'foo', f2:'foo'}").json().run()
-			.assertStatus().equals(400)
+		b.put("/nonExistentBeanProperties?noTrace=true", "{f1:'foo', f2:'foo'}")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"Unknown property 'f2' encountered while trying to parse into class 'org.apache.juneau.rest.StatusCodesTest$B$B01'"
 			);
 	}
 	@Test
 	public void b02_wrongDataType() throws Exception {
-		b.put("/wrongDataType?noTrace=true", "{f1:'foo'}").json().run()
-			.assertStatus().equals(400)
+		b.put("/wrongDataType?noTrace=true", "{f1:'foo'}")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"Invalid number"
 			);
 	}
 	@Test
 	public void b03_parseIntoNonConstructableBean() throws Exception {
-		b.put("/parseIntoNonConstructableBean?noTrace=true", "{f1:1}").json().run()
-			.assertStatus().equals(400)
+		b.put("/parseIntoNonConstructableBean?noTrace=true", "{f1:1}")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"could not be instantiated"
 			);
 	}
 	@Test
 	public void b04_parseIntoNonStaticInnerClass() throws Exception {
-		b.put("/parseIntoNonStaticInnerClass?noTrace=true", "{f1:1}").json().run()
-			.assertStatus().equals(400)
+		b.put("/parseIntoNonStaticInnerClass?noTrace=true", "{f1:1}")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"could not be instantiated"
 			);
 	}
 	@Test
 	public void b05_parseIntoNonStaticInnerClass() throws Exception {
-		b.put("/parseIntoNonPublicInnerClass?noTrace=true", "{f1:1}").json().run()
-			.assertStatus().equals(400)
+		b.put("/parseIntoNonPublicInnerClass?noTrace=true", "{f1:1}")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"Class is not public"
 			);
 	}
 	@Test
 	public void b06_thrownConstructorException() throws Exception {
-		b.put("/thrownConstructorException?noTrace=true", "'foo'").json().run()
-			.assertStatus().equals(400)
+		b.put("/thrownConstructorException?noTrace=true", "'foo'")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"Test error"
 			);
 	}
 	@Test
 	public void b07a_setParameterToInvalidTypes_Query() throws Exception {
-		b.put("/setParameterToInvalidTypes/123?noTrace=true&p1=foo", "'foo'").json().run()
-			.assertStatus().equals(400)
+		b.put("/setParameterToInvalidTypes/123?noTrace=true&p1=foo", "'foo'")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"Could not parse query parameter 'p1'."
 			);
 	}
 	@Test
 	public void b07a_setParameterToInvalidTypes_Path() throws Exception {
-		b.put("/setParameterToInvalidTypes/foo?noTrace=true&p1=1", "'foo'").json().run()
-			.assertStatus().equals(400)
+		b.put("/setParameterToInvalidTypes/foo?noTrace=true&p1=1", "'foo'")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"Could not parse path parameter 'a1'."
 			);
 	}
 	@Test
 	public void b07a_setParameterToInvalidTypes_Header() throws Exception {
-		b.put("/setParameterToInvalidTypes/123?noTrace=true&p1=1", "'foo'").header("h1", "foo").json().run()
-			.assertStatus().equals(400)
+		b.put("/setParameterToInvalidTypes/123?noTrace=true&p1=1", "'foo'")
+			.header("h1", "foo")
+			.json()
+			.run()
+			.assertStatus().is(400)
 			.assertBody().contains(
 				"Could not parse header 'h1'."
 			);
@@ -202,15 +225,17 @@ public class StatusCodesTest {
 
 	@Test
 	public void c01_badPath() throws Exception {
-		c.get("/bad?noTrace=true").run()
-			.assertStatus().equals(404)
+		c.get("/bad?noTrace=true")
+			.run()
+			.assertStatus().is(404)
 			.assertBody().contains(
 				"Method 'GET' not found on resource with matching pattern on path '/bad'"
 			);
 	}
 	public void c02_badMethod() throws Exception {
-		c.put("?noTrace=true", null).run()
-			.assertStatus().equals(405)
+		c.put("?noTrace=true", null)
+			.run()
+			.assertStatus().is(405)
 			.assertBody().contains(
 				"Method 'PUT' not found on resource."
 			);
@@ -237,8 +262,9 @@ public class StatusCodesTest {
 
 	@Test
 	public void d01() throws Exception {
-		d.get("/d?noTrace=true").run()
-			.assertStatus().equals(412)
+		d.get("/d?noTrace=true")
+			.run()
+			.assertStatus().is(412)
 			.assertBody().contains(
 				"Method 'GET' not found on resource on path '/d' with matching matcher."
 			);
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java
index 93b73ec..a6de55e 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java
@@ -55,15 +55,24 @@ public class ResponseHeaderAnnotationTest {
 
 	@Test
 	public void a01_valueOnParameterPojo() throws Exception {
-		a.get("/a01").run().assertStatus().equals(200).assertHeader("Foo").is("foo");
+		a.get("/a01")
+			.run()
+			.assertStatus().is(200)
+			.assertHeader("Foo").is("foo");
 	}
 	@Test
 	public void a02_valueOnParameterString() throws Exception {
-		a.get("/a02").run().assertStatus().equals(200).assertHeader("Foo").is("foo");
+		a.get("/a02")
+			.run()
+			.assertStatus().is(200)
+			.assertHeader("Foo").is("foo");
 	}
 	@Test
 	public void a03_valueOnParameterOverrideName() throws Exception {
-		a.get("/a03").run().assertStatus().equals(200).assertHeader("Bar").is("foo");
+		a.get("/a03")
+			.run()
+			.assertStatus().is(200)
+			.assertHeader("Bar").is("foo");
 	}
 
 	//=================================================================================================================
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java
index fae55be..41d1905 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java
@@ -38,6 +38,8 @@ public class ResponseStatusAnnotationTest {
 
 	@Test
 	public void a01() throws Exception {
-		a.get("/a01").run().assertStatus().equals(100);
+		a.get("/a01")
+			.run()
+			.assertStatus().is(100);
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java
index 4c7d63f..456ae20 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java
@@ -52,15 +52,31 @@ public class RestMethodGuardsTest {
 
 	@Test
 	public void a01_overlappingOneGuard() throws Exception {
-		a.get("/a01?t1=1").run().assertBody().is("OK1");
-		a.get("/a01?noTrace=true").run().assertStatus().equals(403).assertBody().contains("Access denied by guard");
+		a.get("/a01?t1=1")
+			.run()
+			.assertBody().is("OK1");
+		a.get("/a01?noTrace=true")
+			.run()
+			.assertStatus().is(403)
+			.assertBody().contains("Access denied by guard");
 	}
 
 	@Test
 	public void a02_overlappingTwoGuards() throws Exception {
-		a.get("/a02?noTrace=true").run().assertStatus().equals(403).assertBody().contains("Access denied by guard");
-		a.get("/a02?noTrace=true&t1=1").run().assertStatus().equals(403).assertBody().contains("Access denied by guard");
-		a.get("/a02?noTrace=true&t2=2").run().assertStatus().equals(403).assertBody().contains("Access denied by guard");
-		a.get("/a02?t1=1&t2=2").run().assertBody().is("OK2");
+		a.get("/a02?noTrace=true")
+			.run()
+			.assertStatus().is(403)
+			.assertBody().contains("Access denied by guard");
+		a.get("/a02?noTrace=true&t1=1")
+			.run()
+			.assertStatus().is(403)
+			.assertBody().contains("Access denied by guard");
+		a.get("/a02?noTrace=true&t2=2")
+			.run()
+			.assertStatus().is(403)
+			.assertBody().contains("Access denied by guard");
+		a.get("/a02?t1=1&t2=2")
+			.run()
+			.assertBody().is("OK2");
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceLoggingTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceLoggingTest.java
index 0bc69e2..d31c4b9 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceLoggingTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceLoggingTest.java
@@ -673,7 +673,13 @@ public class RestResourceLoggingTest {
 
 	@Test
 	public void test() throws Exception {
-		MY_REST.post("/foo?foo=bar", "Foo").header("Foo", "bar").run().assertStatus().equals(500);
-		MY_REST.post("/foo?foo=bar", "Foo").header("Foo", "bar").run().assertStatus().equals(500);
+		MY_REST.post("/foo?foo=bar", "Foo")
+			.header("Foo", "bar")
+			.run()
+			.assertStatus().is(500);
+		MY_REST.post("/foo?foo=bar", "Foo")
+			.header("Foo", "bar")
+			.run()
+			.assertStatus().is(500);
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java
index a0138ac..0e452a6 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java
@@ -121,9 +121,14 @@ public class RestResourceSerializersTest {
 
 	@Test
 	public void a01_serializerOnClass() throws Exception {
-		a.get("/a01").accept("text/a").run().assertBody().is("text/a - test1");
-		a.get("/a01?noTrace=true").accept("text/b").run()
-			.assertStatus().equals(406)
+		a.get("/a01")
+			.accept("text/a")
+			.run()
+			.assertBody().is("text/a - test1");
+		a.get("/a01?noTrace=true")
+			.accept("text/b")
+			.run()
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Accept': 'text/b'",
 				"Supported media-types: ['text/a'"
@@ -131,8 +136,10 @@ public class RestResourceSerializersTest {
 	}
 	@Test
 	public void a02_serializerOnMethod() throws Exception {
-		a.get("/a02?noTrace=true").accept("text/a").run()
-			.assertStatus().equals(406)
+		a.get("/a02?noTrace=true")
+			.accept("text/a")
+			.run()
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Accept': 'text/a'",
 				"Supported media-types: ['text/b']"
@@ -140,18 +147,32 @@ public class RestResourceSerializersTest {
 	}
 	@Test
 	public void a03_serializerOverriddenOnMethod() throws Exception {
-		a.get("/a03").accept("text/a").run().assertBody().is("text/c - test3");
-		a.get("/a03").accept("text/b").run().assertBody().is("text/b - test3");
+		a.get("/a03")
+			.accept("text/a")
+			.run()
+			.assertBody().is("text/c - test3");
+		a.get("/a03")
+			.accept("text/b")
+			.run()
+			.assertBody().is("text/b - test3");
 	}
 	@Test
 	public void a04_serializerWithDifferentMediaTypes() throws Exception {
-		a.get("/a04").accept("text/a").run().assertBody().is("text/d - test4");
-		a.get("/a04").accept("text/d").run().assertBody().is("text/d - test4");
+		a.get("/a04")
+			.accept("text/a")
+			.run()
+			.assertBody().is("text/d - test4");
+		a.get("/a04")
+			.accept("text/d")
+			.run()
+			.assertBody().is("text/d - test4");
 	}
 	@Test
 	public void a05_validErrorResponse() throws Exception {
-		a.get("/a05?noTrace=true").accept("text/bad").run()
-			.assertStatus().equals(406)
+		a.get("/a05?noTrace=true")
+			.accept("text/bad")
+			.run()
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Accept': 'text/bad'",
 				"Supported media-types: ['text/a"
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
index 57bbe15..4c8443f 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
@@ -35,13 +35,21 @@ public class RestResourceStaticFilesTest {
 
 	@Test
 	public void a01a() throws Exception {
-		a1.get("/xdocs/test.txt").run().assertBody().contains("OK-1");
-		a1.get("/xdocs/xsubdocs/test.txt").run().assertBody().contains("OK-2");
+		a1.get("/xdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-1");
+		a1.get("/xdocs/xsubdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-2");
 	}
 	@Test
 	public void a01b_preventPathTraversals() throws Exception {
-		a1.get("/xdocs/xsubdocs/../test.txt?noTrace=true").run().assertStatus().equals(404);
-		a1.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true").run().assertStatus().equals(404);
+		a1.get("/xdocs/xsubdocs/../test.txt?noTrace=true")
+			.run()
+			.assertStatus().is(404);
+		a1.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Rest(staticFiles={"xdocs2:xdocs2:{Foo:'Bar',Baz:'Qux'},xdocs:xdocs"})
@@ -55,13 +63,21 @@ public class RestResourceStaticFilesTest {
 
 	@Test
 	public void a02a() throws Exception {
-		a1.get("/xdocs/test.txt").run().assertBody().contains("OK-1");
-		a1.get("/xdocs/xsubdocs/test.txt").run().assertBody().contains("OK-2");
+		a1.get("/xdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-1");
+		a1.get("/xdocs/xsubdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-2");
 	}
 	@Test
 	public void a02b_preventPathTraversals() throws Exception {
-		a1.get("/xdocs/xsubdocs/../test.txt?noTrace=true").run().assertStatus().equals(404);
-		a1.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true").run().assertStatus().equals(404);
+		a1.get("/xdocs/xsubdocs/../test.txt?noTrace=true")
+			.run()
+			.assertStatus().is(404);
+		a1.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -79,7 +95,11 @@ public class RestResourceStaticFilesTest {
 
 	@Test
 	public void b01() throws Exception {
-		b.get("/xdocs/test.txt").run().assertHeader("Foo").is("Bar").assertHeader("Baz").is("Qux").assertBody().contains("OK-1");
+		b.get("/xdocs/test.txt")
+			.run()
+			.assertHeader("Foo").is("Bar")
+			.assertHeader("Baz").is("Qux")
+			.assertBody().contains("OK-1");
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -108,18 +128,34 @@ public class RestResourceStaticFilesTest {
 	@Test
 	public void c01() throws Exception {
 		// Should resolve to relative xdocs folder.
-		c1.get("/xdocs/test.txt").run().assertBody().contains("OK-1");
-		c1.get("/xdocs/xsubdocs/test.txt").run().assertBody().contains("OK-2");
+		c1.get("/xdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-1");
+		c1.get("/xdocs/xsubdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-2");
 
 		// Should be overridden to absolute xdocs folder.
-		c2.get("/xdocs/test.txt").run().assertBody().contains("OK-3");
-		c2.get("/xdocs/xsubdocs/test.txt").run().assertBody().contains("OK-4");
+		c2.get("/xdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-3");
+		c2.get("/xdocs/xsubdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-4");
 
 		// Should pick up from file system.
-		c1.get("/xdocs/test2.txt").run().assertBody().contains("OK-5");
-		c2.get("/xdocs/test2.txt").run().assertBody().contains("OK-5");
-		c1.get("/xdocs/xsubdocs/test2.txt").run().assertBody().contains("OK-6");
-		c2.get("/xdocs/xsubdocs/test2.txt").run().assertBody().contains("OK-6");
+		c1.get("/xdocs/test2.txt")
+			.run()
+			.assertBody().contains("OK-5");
+		c2.get("/xdocs/test2.txt")
+			.run()
+			.assertBody().contains("OK-5");
+		c1.get("/xdocs/xsubdocs/test2.txt")
+			.run()
+			.assertBody().contains("OK-6");
+		c2.get("/xdocs/xsubdocs/test2.txt")
+			.run()
+			.assertBody().contains("OK-6");
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -139,12 +175,20 @@ public class RestResourceStaticFilesTest {
 	@Test
 	public void d01() throws Exception {
 		// Should be overridden to absolute xdocs folder.
-		d.get("/xdocs/test.txt").run().assertBody().contains("OK-3");
-		d.get("/xdocs/xsubdocs/test.txt").run().assertBody().contains("OK-4");
+		d.get("/xdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-3");
+		d.get("/xdocs/xsubdocs/test.txt")
+			.run()
+			.assertBody().contains("OK-4");
 
 		// Should pick up from file system.
-		d.get("/xdocs/test2.txt").run().assertBody().contains("OK-5");
-		d.get("/xdocs/xsubdocs/test2.txt").run().assertBody().contains("OK-6");
+		d.get("/xdocs/test2.txt")
+			.run()
+			.assertBody().contains("OK-5");
+		d.get("/xdocs/xsubdocs/test2.txt")
+			.run()
+			.assertBody().contains("OK-6");
 	}
 
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
index 03c13eb..02d2427 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
@@ -131,139 +131,203 @@ public class BodyAnnotationTest {
 
 	@Test
 	public void a01a_onParameter_String() throws Exception {
-		a.put("/String", "'foo'").json().run().assertBody().is("'foo'");
+		a.put("/String", "'foo'").json()
+			.run()
+			.assertBody().is("'foo'");
 	}
 	@Test
 	public void a01b_onParameter_String_noContentType() throws Exception {
 		// If no Content-Type specified, should be treated as plain-text.
-		a.put("/String", "'foo'").run().assertBody().is("'\\'foo\\''");
+		a.put("/String", "'foo'")
+			.run()
+			.assertBody().is("'\\'foo\\''");
 	}
 	@Test
 	public void a01c_onParameter_String_noContentType_other() throws Exception {
 		// If Content-Type not matched, should be treated as plain-text.
-		a.put("/String", "'foo'").contentType("").run().assertBody().is("'\\'foo\\''");
-		a.put("/String", "'foo'").contentType("text/plain").run().assertBody().is("'\\'foo\\''");
+		a.put("/String", "'foo'").contentType("")
+			.run()
+			.assertBody().is("'\\'foo\\''");
+		a.put("/String", "'foo'").contentType("text/plain")
+			.run()
+			.assertBody().is("'\\'foo\\''");
 	}
 	@Test
 	public void a02a_onParameter_Integer() throws Exception {
-		a.put("/Integer", "123").json().run().assertBody().is("123");
+		a.put("/Integer", "123").json()
+			.run()
+			.assertBody().is("123");
 	}
 	@Test
 	public void a02b_onParameter_Integer_noContentType() throws Exception {
 		// Integer takes in a String arg, so it can be parsed without Content-Type.
-		a.put("/Integer", "123").run().assertBody().is("123");
+		a.put("/Integer", "123")
+			.run()
+			.assertBody().is("123");
 	}
 	@Test
 	public void a03a_onParameter_int() throws Exception {
-		a.put("/int", "123").json().run().assertBody().is("123");
+		a.put("/int", "123").json()
+			.run()
+			.assertBody().is("123");
 	}
 	@Test
 	public void a03b_onParameter_int_noContentType() throws Exception {
-		a.put("/int", "123").run().assertBody().is("123"); // Uses part parser.
+		a.put("/int", "123")
+			.run()
+			.assertBody().is("123"); // Uses part parser.
 	}
 	@Test
 	public void a04a_onParameter_Boolean() throws Exception {
-		a.put("/Boolean", "true").json().run().assertBody().is("true");
+		a.put("/Boolean", "true").json()
+			.run()
+			.assertBody().is("true");
 	}
 	@Test
 	public void a04b_onParameter_Boolean_noContentType() throws Exception {
 		// Boolean takes in a String arg, so it can be parsed without Content-Type.
-		a.put("/Boolean", "true").run().assertBody().is("true");
+		a.put("/Boolean", "true")
+			.run()
+			.assertBody().is("true");
 	}
 	@Test
 	public void a05a_onParameter_boolean() throws Exception {
-		a.put("/boolean", "true").json().run().assertBody().is("true");
+		a.put("/boolean", "true").json()
+			.run()
+			.assertBody().is("true");
 	}
 	@Test
 	public void a05b_onParameter_boolean_noContentType() throws Exception {
-		a.put("/boolean", "true").run().assertBody().is("true"); // Uses part parser.
+		a.put("/boolean", "true")
+			.run()
+			.assertBody().is("true"); // Uses part parser.
 	}
 	@Test
 	public void a06a_onParameter_float() throws Exception {
-		a.put("/float", "1.23").json().run().assertBody().is("1.23");
+		a.put("/float", "1.23").json()
+			.run()
+			.assertBody().is("1.23");
 	}
 	@Test
 	public void a06b_onParameter_float_noContentType() throws Exception {
-		a.put("/float", "1.23").run().assertBody().is("1.23");  // Uses part parser.
+		a.put("/float", "1.23")
+			.run()
+			.assertBody().is("1.23");  // Uses part parser.
 	}
 	@Test
 	public void a07a_onParameter_Float() throws Exception {
-		a.put("/Float", "1.23").json().run().assertBody().is("1.23");
+		a.put("/Float", "1.23").json()
+			.run()
+			.assertBody().is("1.23");
 	}
 	@Test
 	public void a07b_onParameter_Float_noContentType() throws Exception {
 		// Float takes in a String arg, so it can be parsed without Content-Type.
-		a.put("/Float", "1.23").run().assertBody().is("1.23");
+		a.put("/Float", "1.23")
+			.run()
+			.assertBody().is("1.23");
 	}
 	@Test
 	public void a08a_onParameter_Map() throws Exception {
-		a.put("/Map", "{foo:123}").json().run().assertBody().is("{foo:123}");
+		a.put("/Map", "{foo:123}").json()
+			.run()
+			.assertBody().is("{foo:123}");
 	}
 	@Test
 	public void a08b_onParameter_Map_noContentType() throws Exception {
-		a.put("/Map", "(foo=123)").run().assertStatus().equals(415);
+		a.put("/Map", "(foo=123)")
+			.run()
+			.assertStatus().is(415);
 	}
 	@Test
 	public void a09a_onParameter_enum() throws Exception {
-		a.put("/enum", "'ONE'").json().run().assertBody().is("'ONE'");
+		a.put("/enum", "'ONE'").json()
+			.run()
+			.assertBody().is("'ONE'");
 	}
 	@Test
 	public void a09b_onParameter_enum_noContentType() throws Exception {
-		a.put("/enum", "ONE").run().assertBody().is("'ONE'");
+		a.put("/enum", "ONE")
+			.run()
+			.assertBody().is("'ONE'");
 	}
 	@Test
 	public void a11a_onParameter_Bean() throws Exception {
-		a.put("/Bean", "{f1:'a'}").json().run().assertBody().is("{f1:'a'}");
+		a.put("/Bean", "{f1:'a'}").json()
+			.run()
+			.assertBody().is("{f1:'a'}");
 	}
 	@Test
 	public void a11b_onParameter_Bean_noContentType() throws Exception {
-		a.put("/Bean", "(f1=a)").run().assertStatus().equals(415);
+		a.put("/Bean", "(f1=a)")
+			.run()
+			.assertStatus().is(415);
 	}
 	@Test
 	public void a12a_onParameter_InputStream() throws Exception {
 		// Content-Type should always be ignored.
-		a.put("/InputStream", "'a'").json().run().assertBody().is("'\\'a\\''");
+		a.put("/InputStream", "'a'").json()
+			.run()
+			.assertBody().is("'\\'a\\''");
 	}
 	@Test
 	public void a12b_onParameter_InputStream_noContentType() throws Exception {
-		a.put("/InputStream", "'a'").run().assertBody().is("'\\'a\\''");
+		a.put("/InputStream", "'a'")
+			.run()
+			.assertBody().is("'\\'a\\''");
 	}
 	@Test
 	public void a13a_onParameter_Reader() throws Exception {
 		// Content-Type should always be ignored.
-		a.put("/Reader", "'a'").json().run().assertBody().is("'\\'a\\''");
+		a.put("/Reader", "'a'").json()
+			.run()
+			.assertBody().is("'\\'a\\''");
 	}
 	@Test
 	public void a13b_onParameter_Reader_noContentType() throws Exception {
-		a.put("/Reader", "'a'").run().assertBody().is("'\\'a\\''");
+		a.put("/Reader", "'a'")
+			.run()
+			.assertBody().is("'\\'a\\''");
 	}
 	@Test
 	public void a14a_onParameter_InputStreamTransform() throws Exception {
 		// Input stream transform requests must not specify Content-Type or else gets resolved as POJO.
-		a.put("/InputStreamTransform?noTrace=true", "'a'").json().run().assertBody().contains("Bad Request");
+		a.put("/InputStreamTransform?noTrace=true", "'a'").json()
+			.run()
+			.assertBody().contains("Bad Request");
 	}
 	@Test
 	public void a14b_onParameter_InputStreamTransform_noContentType() throws Exception {
-		a.put("/InputStreamTransform", "'a'").run().assertBody().is("'\\'a\\''");
+		a.put("/InputStreamTransform", "'a'")
+			.run()
+			.assertBody().is("'\\'a\\''");
 	}
 	@Test
 	public void a15a_onParameter_ReaderTransform() throws Exception {
 		// Reader transform requests must not specify Content-Type or else gets resolved as POJO.
-		a.put("/ReaderTransform?noTrace=true", "'a'").json().run().assertBody().contains("Bad Request");
+		a.put("/ReaderTransform?noTrace=true", "'a'").json()
+			.run()
+			.assertBody().contains("Bad Request");
 	}
 	@Test
 	public void a15b_onParameter_ReaderTransform_noContentType() throws Exception {
-		a.put("/ReaderTransform", "'a'").run().assertBody().is("'\\'a\\''");
+		a.put("/ReaderTransform", "'a'")
+			.run()
+			.assertBody().is("'\\'a\\''");
 	}
 	@Test
 	public void a16a_onParameter_StringTransform() throws Exception {
 		// When Content-Type specified and matched, treated as a parsed POJO.
-		a.put("/StringTransform", "'a'").json().run().assertBody().is("'a'");
+		a.put("/StringTransform", "'a'").json()
+			.run()
+			.assertBody().is("'a'");
 	}
 	@Test
 	public void a16b_onParameter_StringTransform_noContentType() throws Exception {
 		// When Content-Type not matched, treated as plain text.
-		a.put("/StringTransform", "'a'").run().assertBody().is("'\\'a\\''");
+		a.put("/StringTransform", "'a'")
+			.run()
+			.assertBody().is("'\\'a\\''");
 	}
 
 	//=================================================================================================================
@@ -322,46 +386,66 @@ public class BodyAnnotationTest {
 
 	@Test
 	public void b01a_onPojo_StringTransform() throws Exception {
-		b.put("/StringTransform", "'foo'").json().run().assertBody().is("'foo'");
+		b.put("/StringTransform", "'foo'").json()
+			.run()
+			.assertBody().is("'foo'");
 	}
 	@Test
 	public void b01b_onPojo_StringTransform_noContentType() throws Exception {
 		// When Content-Type not matched, treated as plain text.
-		b.put("/StringTransform", "'foo'").run().assertBody().is("'\\'foo\\''");
+		b.put("/StringTransform", "'foo'")
+			.run()
+			.assertBody().is("'\\'foo\\''");
 	}
 	@Test
 	public void b02a_onPojo_Bean() throws Exception {
-		b.put("/Bean", "{f1:'a'}").json().run().assertBody().is("{f1:'a'}");
+		b.put("/Bean", "{f1:'a'}").json()
+			.run()
+			.assertBody().is("{f1:'a'}");
 	}
 	@Test
 	public void b02b_onPojo_Bean_noContentType() throws Exception {
-		b.put("/Bean", "(f1=a)").run().assertStatus().equals(415);
+		b.put("/Bean", "(f1=a)")
+			.run()
+			.assertStatus().is(415);
 	}
 	@Test
 	public void b03a_onPojo_BeanList() throws Exception {
-		b.put("/BeanList", "[{f1:'a'}]").json().run().assertBody().is("[{f1:'a'}]");
+		b.put("/BeanList", "[{f1:'a'}]").json()
+			.run()
+			.assertBody().is("[{f1:'a'}]");
 	}
 	@Test
 	public void b03b_onPojo_BeanList_noContentType() throws Exception {
-		b.put("/BeanList", "(f1=a)").run().assertStatus().equals(415);
+		b.put("/BeanList", "(f1=a)")
+			.run()
+			.assertStatus().is(415);
 	}
 	@Test
 	public void b04a_onPojo_InputStreamTransform() throws Exception {
-		b.put("/InputStreamTransform", "a").run().assertBody().is("'a'");
+		b.put("/InputStreamTransform", "a")
+			.run()
+			.assertBody().is("'a'");
 	}
 	@Test
 	public void b04b_onPojo_InputStreamTransform_withContentType() throws Exception {
 		// When Content-Type matched, treated as parsed POJO.
-		b.put("/InputStreamTransform?noTrace=true", "a").json().run().assertBody().contains("Bad Request");
+		b.put("/InputStreamTransform?noTrace=true", "a").json()
+			.run()
+			.assertBody().contains("Bad Request");
 	}
 	@Test
 	public void b05a_onPojo_ReaderTransform() throws Exception {
-		b.put("/ReaderTransform", "a").run().assertBody().is("'a'");
+		b.put("/ReaderTransform", "a")
+			.run()
+			.assertBody().is("'a'");
 	}
 	@Test
 	public void b05b_onPojo_ReaderTransform_withContentType() throws Exception {
 		// When Content-Type matched, treated as parsed POJO.
-		b.put("/ReaderTransform?noTrace=true", "a").json().run().assertBody().contains("Bad Request");
+		b.put("/ReaderTransform?noTrace=true", "a").json()
+			.run()
+			.assertBody().contains("Bad Request");
 	}
 
 	//=================================================================================================================
@@ -369,93 +453,201 @@ public class BodyAnnotationTest {
 	//=================================================================================================================
 
 	public void c01_bodyParam_String() throws Exception {
-		a.put("/String?body=foo", null).run().assertBody().is("'foo'");
-		a.put("/String?body=null", null).run().assertBody().is("null");
-		a.put("/String?body=", null).run().assertBody().is("''");
+		a.put("/String?body=foo", null)
+			.run()
+			.assertBody().is("'foo'");
+		a.put("/String?body=null", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/String?body=", null)
+			.run()
+			.assertBody().is("''");
 	}
 	@Test
 	public void c02_bodyParam_Integer() throws Exception {
-		a.put("/Integer?body=123", null).run().assertBody().is("123");
-		a.put("/Integer?body=-123", null).run().assertBody().is("-123");
-		a.put("/Integer?body=null", null).run().assertBody().is("null");
-		a.put("/Integer?body=", null).run().assertBody().is("null");
-		a.put("/Integer?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/Integer?body=123", null)
+			.run()
+			.assertBody().is("123");
+		a.put("/Integer?body=-123", null)
+			.run()
+			.assertBody().is("-123");
+		a.put("/Integer?body=null", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Integer?body=", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Integer?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c03_bodyParam_int() throws Exception {
-		a.put("/int?body=123", null).run().assertBody().is("123");
-		a.put("/int?body=-123", null).run().assertBody().is("-123");
-		a.put("/int?body=null", null).run().assertBody().is("0");
-		a.put("/int?body=", null).run().assertBody().is("0");
-		a.put("/int?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/int?body=123", null)
+			.run()
+			.assertBody().is("123");
+		a.put("/int?body=-123", null)
+			.run()
+			.assertBody().is("-123");
+		a.put("/int?body=null", null)
+			.run()
+			.assertBody().is("0");
+		a.put("/int?body=", null)
+			.run()
+			.assertBody().is("0");
+		a.put("/int?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c04_bodyParam_Boolean() throws Exception {
-		a.put("/Boolean?body=true", null).run().assertBody().is("true");
-		a.put("/Boolean?body=false", null).run().assertBody().is("false");
-		a.put("/Boolean?body=null", null).run().assertBody().is("null");
-		a.put("/Boolean?body=", null).run().assertBody().is("null");
-		a.put("/Boolean?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/Boolean?body=true", null)
+			.run()
+			.assertBody().is("true");
+		a.put("/Boolean?body=false", null)
+			.run()
+			.assertBody().is("false");
+		a.put("/Boolean?body=null", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Boolean?body=", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Boolean?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c05_bodyParam_boolean() throws Exception {
-		a.put("/boolean?body=true", null).run().assertBody().is("true");
-		a.put("/boolean?body=false", null).run().assertBody().is("false");
-		a.put("/boolean?body=null", null).run().assertBody().is("false");
-		a.put("/boolean?body=", null).run().assertBody().is("false");
-		a.put("/boolean?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/boolean?body=true", null)
+			.run()
+			.assertBody().is("true");
+		a.put("/boolean?body=false", null)
+			.run()
+			.assertBody().is("false");
+		a.put("/boolean?body=null", null)
+			.run()
+			.assertBody().is("false");
+		a.put("/boolean?body=", null)
+			.run()
+			.assertBody().is("false");
+		a.put("/boolean?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c06_bodyParam_Float() throws Exception {
-		a.put("/Float?body=1.23", null).run().assertBody().is("1.23");
-		a.put("/Float?body=-1.23", null).run().assertBody().is("-1.23");
-		a.put("/Float?body=null", null).run().assertBody().is("null");
-		a.put("/Float?body=", null).run().assertBody().is("null");
-		a.put("/Float?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/Float?body=1.23", null)
+			.run()
+			.assertBody().is("1.23");
+		a.put("/Float?body=-1.23", null)
+			.run()
+			.assertBody().is("-1.23");
+		a.put("/Float?body=null", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Float?body=", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Float?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c07_bodyParam_float() throws Exception {
-		a.put("/float?body=1.23", null).run().assertBody().is("1.23");
-		a.put("/float?body=-1.23", null).run().assertBody().is("-1.23");
-		a.put("/float?body=null", null).run().assertBody().is("0.0");
-		a.put("/float?body=", null).run().assertBody().is("0.0");
-		a.put("/float?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/float?body=1.23", null)
+			.run()
+			.assertBody().is("1.23");
+		a.put("/float?body=-1.23", null)
+			.run()
+			.assertBody().is("-1.23");
+		a.put("/float?body=null", null)
+			.run()
+			.assertBody().is("0.0");
+		a.put("/float?body=", null)
+			.run()
+			.assertBody().is("0.0");
+		a.put("/float?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c08_bodyParam_Map() throws Exception {
-		a.put("/Map?body=(foo=123)", null).run().assertBody().is("{foo:123}");
-		a.put("/Map?body=()", null).run().assertBody().is("{}");
-		a.put("/Map?body=null", null).run().assertBody().is("null");
-		a.put("/Map?body=", null).run().assertBody().is("null");
-		a.put("/Map?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/Map?body=(foo=123)", null)
+			.run()
+			.assertBody().is("{foo:123}");
+		a.put("/Map?body=()", null)
+			.run()
+			.assertBody().is("{}");
+		a.put("/Map?body=null", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Map?body=", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Map?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c09_bodyParam_enum() throws Exception {
-		a.put("/enum?body=ONE", null).run().assertBody().is("'ONE'");
-		a.put("/enum?body=TWO", null).run().assertBody().is("'TWO'");
-		a.put("/enum?body=null", null).run().assertBody().is("null");
-		a.put("/enum?body=", null).run().assertBody().is("null");
-		a.put("/enum?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/enum?body=ONE", null)
+			.run()
+			.assertBody().is("'ONE'");
+		a.put("/enum?body=TWO", null)
+			.run()
+			.assertBody().is("'TWO'");
+		a.put("/enum?body=null", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/enum?body=", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/enum?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c11_bodyParam_Bean() throws Exception {
-		a.put("/Bean?body=(f1=a)", null).run().assertBody().is("{f1:'a'}");
-		a.put("/Bean?body=()", null).run().assertBody().is("{}");
-		a.put("/Bean?body=null", null).run().assertBody().is("null");
-		a.put("/Bean?body=", null).run().assertBody().is("null");
-		a.put("/Bean?body=bad&noTrace=true", null).run().assertStatus().equals(400);
+		a.put("/Bean?body=(f1=a)", null)
+			.run()
+			.assertBody().is("{f1:'a'}");
+		a.put("/Bean?body=()", null)
+			.run()
+			.assertBody().is("{}");
+		a.put("/Bean?body=null", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Bean?body=", null)
+			.run()
+			.assertBody().is("null");
+		a.put("/Bean?body=bad&noTrace=true", null)
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c12_bodyParam_InputStream() throws Exception {
-		a.put("/InputStream?body=a", null).run().assertBody().is("'a'");
-		a.put("/InputStream?body=null", null).run().assertBody().is("'null'");
-		a.put("/InputStream?body=", null).run().assertBody().is("''");
+		a.put("/InputStream?body=a", null)
+			.run()
+			.assertBody().is("'a'");
+		a.put("/InputStream?body=null", null)
+			.run()
+			.assertBody().is("'null'");
+		a.put("/InputStream?body=", null)
+			.run()
+			.assertBody().is("''");
 	}
 	@Test
 	public void c13_bodyParam_Reader() throws Exception {
-		a.put("/Reader?body=a", null).run().assertBody().is("'a'");
-		a.put("/Reader?body=null", null).run().assertBody().is("'null'");
-		a.put("/Reader?body=", null).run().assertBody().is("''");
+		a.put("/Reader?body=a", null)
+			.run()
+			.assertBody().is("'a'");
+		a.put("/Reader?body=null", null)
+			.run()
+			.assertBody().is("'null'");
+		a.put("/Reader?body=", null)
+			.run()
+			.assertBody().is("''");
 	}
 
 	// It's not currently possible to pass in a &body parameter for InputStream/Reader transforms.
@@ -541,75 +733,111 @@ public class BodyAnnotationTest {
 
 	@Test
 	public void d01a_noMediaTypes_String() throws Exception {
-		d.put("/String", "a").run().assertBody().is("a");
+		d.put("/String", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d01b_noMediaTypes_String_withContentType() throws Exception {
-		d.put("/String", "a").json().run().assertBody().is("a");
+		d.put("/String", "a").json()
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d02a_noMediaTypes_InputStream() throws Exception {
-		d.put("/InputStream", "a").run().assertBody().is("a");
+		d.put("/InputStream", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d02b_noMediaTypes_InputStream_withContentType() throws Exception {
-		d.put("/InputStream", "a").json().run().assertBody().is("a");
+		d.put("/InputStream", "a").json()
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d03a_noMediaTypes_Reader() throws Exception {
-		d.put("/Reader", "a").run().assertBody().is("a");
+		d.put("/Reader", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d03b_noMediaTypes_Reader_withContentType() throws Exception {
-		d.put("/Reader", "a").json().run().assertBody().is("a");
+		d.put("/Reader", "a").json()
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d04a_noMediaTypes_StringTransform() throws Exception {
-		d.put("/StringTransform", "a").run().assertBody().is("a");
+		d.put("/StringTransform", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d04b_noMediaTypes_StringTransform_withContentType() throws Exception {
-		d.put("/StringTransform?noTrace=true", "a").json().run().assertStatus().equals(415);
+		d.put("/StringTransform?noTrace=true", "a").json()
+			.run()
+			.assertStatus().is(415);
 	}
 	@Test
 	public void d05a_noMediaTypes_InputStreamTransform() throws Exception {
-		d.put("/InputStreamTransform", "a").run().assertBody().is("a");
+		d.put("/InputStreamTransform", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d05b_noMediaTypes_InputStreamTransform_withContentType() throws Exception {
-		d.put("/InputStreamTransform", "a").json().run().assertBody().is("a");
+		d.put("/InputStreamTransform", "a").json()
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d06a_noMediaTypes_ReaderTransform() throws Exception {
-		d.put("/ReaderTransform", "a").run().assertBody().is("a");
+		d.put("/ReaderTransform", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d06b_noMediaTypes_ReaderTransform_withContentType() throws Exception {
-		d.put("/ReaderTransform", "a").json().run().assertBody().is("a");
+		d.put("/ReaderTransform", "a").json()
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d07a_noMediaTypes_StringTransformBodyOnPojo() throws Exception {
-		d.put("/StringTransformBodyOnPojo", "a").run().assertBody().is("a");
+		d.put("/StringTransformBodyOnPojo", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d07b_noMediaTypes_StringTransformBodyOnPojo_withContentType() throws Exception {
-		d.put("/StringTransformBodyOnPojo?noTrace=true", "a").json().run().assertStatus().equals(415);
+		d.put("/StringTransformBodyOnPojo?noTrace=true", "a").json()
+			.run()
+			.assertStatus().is(415);
 	}
 	@Test
 	public void d08a_noMediaTypes_InputStreamTransformBodyOnPojo() throws Exception {
-		d.put("/InputStreamTransformBodyOnPojo", "a").run().assertBody().is("a");
+		d.put("/InputStreamTransformBodyOnPojo", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d08b_noMediaTypes_InputStreamTransformBodyOnPojo_withContentType() throws Exception {
-		d.put("/InputStreamTransformBodyOnPojo", "a").json().run().assertBody().is("a");
+		d.put("/InputStreamTransformBodyOnPojo", "a").json()
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d09a_noMediaTypes_ReaderTransformBodyOnPojo() throws Exception {
-		d.put("/ReaderTransformBodyOnPojo", "a").run().assertBody().is("a");
+		d.put("/ReaderTransformBodyOnPojo", "a")
+			.run()
+			.assertBody().is("a");
 	}
 	@Test
 	public void d09b_noMediaTypes_ReaderTransformBodyOnPojo_withContentType() throws Exception {
-		d.put("/ReaderTransformBodyOnPojo", "a").json().run().assertBody().is("a");
+		d.put("/ReaderTransformBodyOnPojo", "a").json()
+			.run()
+			.assertBody().is("a");
 	}
 
 	//=================================================================================================================
@@ -632,22 +860,30 @@ public class BodyAnnotationTest {
 	@Test
 	public void e01_complexPojos_B_body() throws Exception {
 		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true} [...]
-		e.put("/B", SimpleJsonSerializer.DEFAULT.toString(DTOs.B.INSTANCE)).json().run().assertBody().is(expected);
+		e.put("/B", SimpleJsonSerializer.DEFAULT.toString(DTOs.B.INSTANCE)).json()
+			.run()
+			.assertBody().is(expected);
 	}
 	@Test
 	public void e02_complexPojos_B_bodyParam() throws Exception {
 		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true} [...]
-		e.put("/B?body=" + UonSerializer.DEFAULT.serialize(DTOs.B.INSTANCE), "a").run().assertBody().is(expected);
+		e.put("/B?body=" + UonSerializer.DEFAULT.serialize(DTOs.B.INSTANCE), "a")
+			.run()
+			.assertBody().is(expected);
 	}
 	@Test
 	public void e03_complexPojos_C_body() throws Exception {
 		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true} [...]
-		e.put("/C", SimpleJsonSerializer.DEFAULT.toString(DTOs.B.INSTANCE)).json().run().assertBody().is(expected);
+		e.put("/C", SimpleJsonSerializer.DEFAULT.toString(DTOs.B.INSTANCE)).json()
+			.run()
+			.assertBody().is(expected);
 	}
 	@Test
 	public void e04_complexPojos_C_bodyParam() throws Exception {
 		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true} [...]
-		e.put("/C?body=" + UonSerializer.DEFAULT.serialize(DTOs.B.INSTANCE), "a").run().assertBody().is(expected);
+		e.put("/C?body=" + UonSerializer.DEFAULT.serialize(DTOs.B.INSTANCE), "a")
+			.run()
+			.assertBody().is(expected);
 	}
 
 	@Rest(serializers=SimpleJsonSerializer.class, parsers=JsonParser.class, defaultAccept="application/json")
@@ -668,22 +904,30 @@ public class BodyAnnotationTest {
 	@Test
 	public void e05_complexPojos_B_body() throws Exception {
 		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true} [...]
-		e2.put("/B", SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().toString(DTOs2.B.INSTANCE)).json().run().assertBody().is(expected);
+		e2.put("/B", SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().toString(DTOs2.B.INSTANCE)).json()
+			.run()
+			.assertBody().is(expected);
 	}
 	@Test
 	public void e06_complexPojos_B_bodyParam() throws Exception {
 		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true} [...]
-		e2.put("/B?body=" + UonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().serialize(DTOs2.B.INSTANCE), "a").run().assertBody().is(expected);
+		e2.put("/B?body=" + UonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().serialize(DTOs2.B.INSTANCE), "a")
+			.run()
+			.assertBody().is(expected);
 	}
 	@Test
 	public void e07_complexPojos_C_body() throws Exception {
 		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true} [...]
-		e2.put("/C", SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().toString(DTOs2.B.INSTANCE)).json().run().assertBody().is(expected);
+		e2.put("/C", SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().toString(DTOs2.B.INSTANCE)).json()
+			.run()
+			.assertBody().is(expected);
 	}
 	@Test
 	public void e08_complexPojos_C_bodyParam() throws Exception {
 		String expected = "{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true} [...]
-		e2.put("/C?body=" + UonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().serialize(DTOs2.B.INSTANCE), "a").run().assertBody().is(expected);
+		e2.put("/C?body=" + UonSerializer.DEFAULT.builder().applyAnnotations(DTOs2.Annotations.class).build().serialize(DTOs2.B.INSTANCE), "a")
+			.run()
+			.assertBody().is(expected);
 	}
 
 	//=================================================================================================================
@@ -708,10 +952,18 @@ public class BodyAnnotationTest {
 
 	@Test
 	public void f01_formPostAsContent() throws Exception {
-		f.post("/", "{p1:'p1',p2:2}").json().run().assertBody().is("bean=[{p1:'p1',p2:2}],qp1=[null],qp2=[0],hqp1=[false],hqp2=[false]");
-		f.post("/", "{}").json().run().assertBody().is("bean=[{p2:0}],qp1=[null],qp2=[0],hqp1=[false],hqp2=[false]");
-		f.post("?p1=p3&p2=4", "{p1:'p1',p2:2}").json().run().assertBody().is("bean=[{p1:'p1',p2:2}],qp1=[p3],qp2=[4],hqp1=[true],hqp2=[true]");
-		f.post("?p1=p3&p2=4", "{}").json().run().assertBody().is("bean=[{p2:0}],qp1=[p3],qp2=[4],hqp1=[true],hqp2=[true]");
+		f.post("/", "{p1:'p1',p2:2}").json()
+			.run()
+			.assertBody().is("bean=[{p1:'p1',p2:2}],qp1=[null],qp2=[0],hqp1=[false],hqp2=[false]");
+		f.post("/", "{}").json()
+			.run()
+			.assertBody().is("bean=[{p2:0}],qp1=[null],qp2=[0],hqp1=[false],hqp2=[false]");
+		f.post("?p1=p3&p2=4", "{p1:'p1',p2:2}").json()
+			.run()
+			.assertBody().is("bean=[{p1:'p1',p2:2}],qp1=[p3],qp2=[4],hqp1=[true],hqp2=[true]");
+		f.post("?p1=p3&p2=4", "{}").json()
+			.run()
+			.assertBody().is("bean=[{p2:0}],qp1=[p3],qp2=[4],hqp1=[true],hqp2=[true]");
 	}
 
 	//=================================================================================================================
@@ -752,7 +1004,9 @@ public class BodyAnnotationTest {
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
 			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
 			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
-		g.post("/", in).urlEnc().run().assertBody().is(in);
+		g.post("/", in).urlEnc()
+			.run()
+			.assertBody().is(in);
 	}
 
 	//=================================================================================================================
@@ -798,7 +1052,9 @@ public class BodyAnnotationTest {
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
 			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
 			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
-		h.post("/", in).urlEnc().run().assertBody().is(in);
+		h.post("/", in).urlEnc()
+			.run()
+			.assertBody().is(in);
 	}
 
 	@Rest(serializers=UrlEncodingSerializer.class,parsers=UrlEncodingParser.class)
@@ -840,7 +1096,9 @@ public class BodyAnnotationTest {
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
 			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
 			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
-		h2.post("/", in).urlEnc().run().assertBody().is(in);
+		h2.post("/", in).urlEnc()
+			.run()
+			.assertBody().is(in);
 	}
 
 	//=================================================================================================================
@@ -858,8 +1116,13 @@ public class BodyAnnotationTest {
 
 	@Test
 	public void i01() throws Exception {
-		i.post("/", "").json().run().assertStatus().equals(400).assertBody().contains("Required value not provided.");
-		i.post("/", "{}").json().run().assertStatus().equals(200);
+		i.post("/", "").json()
+			.run()
+			.assertStatus().is(400)
+			.assertBody().contains("Required value not provided.");
+		i.post("/", "{}").json()
+			.run()
+			.assertStatus().is(200);
 	}
 
 	@Rest(serializers=JsonSerializer.class,parsers=JsonParser.class)
@@ -875,8 +1138,13 @@ public class BodyAnnotationTest {
 
 	@Test
 	public void i02() throws Exception {
-		i2.post("/", "").json().run().assertStatus().equals(400).assertBody().contains("Required value not provided.");
-		i2.post("/", "{}").json().run().assertStatus().equals(200);
+		i2.post("/", "").json()
+			.run()
+			.assertStatus().is(400)
+			.assertBody().contains("Required value not provided.");
+		i2.post("/", "{}").json()
+			.run()
+			.assertStatus().is(200);
 	}
 
 	//=================================================================================================================
@@ -909,28 +1177,52 @@ public class BodyAnnotationTest {
 
 	@Test
 	public void j01_optionalParam_integer() throws Exception {
-		j.post("/a", "123").run().assertStatus().equals(200).assertBody().is("123");
-		j.post("/a", "null").run().assertStatus().equals(200).assertBody().is("null");
+		j.post("/a", "123")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("123");
+		j.post("/a", "null")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void j02_optionalParam_bean() throws Exception {
-		j.post("/b", new ABean().init()).run().assertStatus().equals(200).assertBody().is("{a:1,b:'foo'}");
-		j.post("/b", "null").run().assertStatus().equals(200).assertBody().is("null");
+		j.post("/b", new ABean().init())
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("{a:1,b:'foo'}");
+		j.post("/b", "null")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void j03_optionalParam_listOfBeans() throws Exception {
 		String body = SimpleJson.DEFAULT.toString(AList.of(new ABean().init()));
-		j.post("/c", body).run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
-		j.post("/c", "null").run().assertStatus().equals(200).assertBody().is("null");
+		j.post("/c", body)
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
+		j.post("/c", "null")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void j04_optionalParam_listOfOptionals() throws Exception {
 		String body = SimpleJson.DEFAULT.toString(AList.of(Optional.of(new ABean().init())));
-		j.post("/d", body).run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
-		j.post("/d", "null").run().assertStatus().equals(200).assertBody().is("null");
+		j.post("/d", body)
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
+		j.post("/d", "null")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	//=================================================================================================================
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
index f475c8c..c6c37c2 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
@@ -184,26 +184,50 @@ public class FormDataAnnotationTest {
 
 	@Test
 	public void d01_optionalParam_integer() throws Exception {
-		d.post("/a", "f1=123").run().assertStatus().equals(200).assertBody().is("123");
-		d.post("/a", "null").run().assertStatus().equals(200).assertBody().is("null");
+		d.post("/a", "f1=123")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("123");
+		d.post("/a", "null")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void d02_optionalParam_bean() throws Exception {
-		d.post("/b", "f1=a=1,b=foo").run().assertStatus().equals(200).assertBody().is("{a:1,b:'foo'}");
-		d.post("/b", "null").run().assertStatus().equals(200).assertBody().is("null");
+		d.post("/b", "f1=a=1,b=foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("{a:1,b:'foo'}");
+		d.post("/b", "null")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void d03_optionalParam_listOfBeans() throws Exception {
-		d.post("/c", "f1=@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
-		d.post("/c", "null").run().assertStatus().equals(200).assertBody().is("null");
+		d.post("/c", "f1=@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
+		d.post("/c", "null")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void d04_optionalParam_listOfOptionals() throws Exception {
-		d.post("/d", "f1=@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
-		d.post("/d", "null").run().assertStatus().equals(200).assertBody().is("null");
+		d.post("/d", "f1=@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
+		d.post("/d", "null")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
index 4cf14ad..1cbba10 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
@@ -60,26 +60,53 @@ public class HeaderAnnotationTest {
 
 	@Test
 	public void a01_optionalParam_integer() throws Exception {
-		a.get("/a").header("f1", 123).run().assertStatus().equals(200).assertBody().is("123");
-		a.get("/a").run().assertStatus().equals(200).assertBody().is("null");
+		a.get("/a").header("f1", 123)
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("123");
+		a.get("/a")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void a02_optionalParam_bean() throws Exception {
-		a.get("/b").header("f1", "a=1,b=foo").run().assertStatus().equals(200).assertBody().is("{a:1,b:'foo'}");
-		a.get("/b").run().assertStatus().equals(200).assertBody().is("null");
+		a.get("/b")
+			.header("f1", "a=1,b=foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("{a:1,b:'foo'}");
+		a.get("/b")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void a03_optionalParam_listOfBeans() throws Exception {
-		a.get("/c").header("f1", "@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
-		a.get("/c").run().assertStatus().equals(200).assertBody().is("null");
+		a.get("/c")
+			.header("f1", "@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
+		a.get("/c")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void a04_optionalParam_listOfOptionals() throws Exception {
-		a.get("/d").header("f1", "@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
-		a.get("/d").run().assertStatus().equals(200).assertBody().is("null");
+		a.get("/d")
+			.header("f1", "@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
+		a.get("/d")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
index d1b02d5..e96fce6 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
@@ -64,28 +64,42 @@ public class PathAnnotationTest {
 
 	@Test
 	public void a00_nonExistentPath() throws Exception {
-		a.get("/bad?noTrace=true").run().assertStatus().equals(404);
+		a.get("/bad?noTrace=true")
+			.run()
+			.assertStatus().is(404);
 	}
 	@Test
 	public void a01_noPath() throws Exception {
-		a.get(null).run().assertBody().is("GET");
-		a.get().run().assertBody().is("GET");
+		a.get(null)
+			.run()
+			.assertBody().is("GET");
+		a.get()
+			.run()
+			.assertBody().is("GET");
 	}
 	@Test
 	public void a02_simplePath() throws Exception {
-		a.get("/a").run().assertBody().is("GET /a");
+		a.get("/a")
+			.run()
+			.assertBody().is("GET /a");
 	}
 	@Test
 	public void a03_simplePathOneVar() throws Exception {
-		a.get("/a/foo").run().assertBody().is("GET /a foo");
+		a.get("/a/foo")
+			.run()
+			.assertBody().is("GET /a foo");
 	}
 	@Test
 	public void a04_simplePathTwoVars() throws Exception {
-		a.get("/a/foo/bar").run().assertBody().is("GET /a foo,bar");
+		a.get("/a/foo/bar")
+			.run()
+			.assertBody().is("GET /a foo,bar");
 	}
 	@Test
 	public void a05_simplePathWithRemainder() throws Exception {
-		a.get("/a/foo/123/baz").run().assertBody().is("GET /a foo,123,r=baz");
+		a.get("/a/foo/123/baz")
+			.run()
+			.assertBody().is("GET /a foo,123,r=baz");
 	}
 	@Test
 	public void a06_urlEncodedPathPart() throws Exception {
@@ -93,8 +107,12 @@ public class PathAnnotationTest {
 		// This should match /get1/{foo} and not /get1/{foo}/{bar}
 		// NOTE:  When testing on Tomcat, must specify the following system property:
 		// -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-		a.get("/a/x%2Fy").run().assertBody().is("GET /a x/y");
-		a.get("/a/x%2Fy/x%2Fy").run().assertBody().is("GET /a x/y,x/y");
+		a.get("/a/x%2Fy")
+			.run()
+			.assertBody().is("GET /a x/y");
+		a.get("/a/x%2Fy/x%2Fy")
+			.run()
+			.assertBody().is("GET /a x/y,x/y");
 	}
 
 	//=================================================================================================================
@@ -140,43 +158,75 @@ public class PathAnnotationTest {
 
 	@Test
 	public void b01_int() throws Exception {
-		b.get("/int/123/foo").run().assertBody().is("123");
-		b.get("/int/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		b.get("/int/123/foo")
+			.run()
+			.assertBody().is("123");
+		b.get("/int/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void b02_short() throws Exception {
-		b.get("/short/123/foo").run().assertBody().is("123");
-		b.get("/short/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		b.get("/short/123/foo")
+			.run()
+			.assertBody().is("123");
+		b.get("/short/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void b03_long() throws Exception {
-		b.get("/long/123/foo").run().assertBody().is("123");
-		b.get("/long/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		b.get("/long/123/foo")
+			.run()
+			.assertBody().is("123");
+		b.get("/long/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void b04_char() throws Exception {
-		b.get("/char/c/foo").run().assertBody().is("c");
-		b.get("/char/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		b.get("/char/c/foo")
+			.run()
+			.assertBody().is("c");
+		b.get("/char/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void b05_float() throws Exception {
-		b.get("/float/1.23/foo").run().assertBody().is("1.23");
-		b.get("/float/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		b.get("/float/1.23/foo")
+			.run()
+			.assertBody().is("1.23");
+		b.get("/float/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void b06_double() throws Exception {
-		b.get("/double/1.23/foo").run().assertBody().is("1.23");
-		b.get("/double/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		b.get("/double/1.23/foo")
+			.run()
+			.assertBody().is("1.23");
+		b.get("/double/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void b07_byte() throws Exception {
-		b.get("/byte/123/foo").run().assertBody().is("123");
-		b.get("/byte/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		b.get("/byte/123/foo")
+			.run()
+			.assertBody().is("123");
+		b.get("/byte/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void b08_boolean() throws Exception {
-		b.get("/boolean/true/foo").run().assertBody().is("true");
-		b.get("/boolean/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		b.get("/boolean/true/foo")
+			.run()
+			.assertBody().is("true");
+		b.get("/boolean/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 
 	//=================================================================================================================
@@ -222,43 +272,75 @@ public class PathAnnotationTest {
 
 	@Test
 	public void c01_Integer() throws Exception {
-		c.get("/Integer/123/foo").run().assertBody().is("123");
-		c.get("/Integer/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		c.get("/Integer/123/foo")
+			.run()
+			.assertBody().is("123");
+		c.get("/Integer/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c02_Short() throws Exception {
-		c.get("/Short/123/foo").run().assertBody().is("123");
-		c.get("/Short/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		c.get("/Short/123/foo")
+			.run()
+			.assertBody().is("123");
+		c.get("/Short/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c03_Long() throws Exception {
-		c.get("/Long/123/foo").run().assertBody().is("123");
-		c.get("/Long/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		c.get("/Long/123/foo")
+			.run()
+			.assertBody().is("123");
+		c.get("/Long/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c04_Char() throws Exception {
-		c.get("/Character/c/foo").run().assertBody().is("c");
-		c.get("/Character/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		c.get("/Character/c/foo")
+			.run()
+			.assertBody().is("c");
+		c.get("/Character/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c05_Float() throws Exception {
-		c.get("/Float/1.23/foo").run().assertBody().is("1.23");
-		c.get("/Float/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		c.get("/Float/1.23/foo")
+			.run()
+			.assertBody().is("1.23");
+		c.get("/Float/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c06_Double() throws Exception {
-		c.get("/Double/1.23/foo").run().assertBody().is("1.23");
-		c.get("/Double/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		c.get("/Double/1.23/foo")
+			.run()
+			.assertBody().is("1.23");
+		c.get("/Double/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c07_Byte() throws Exception {
-		c.get("/Byte/123/foo").run().assertBody().is("123");
-		c.get("/Byte/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		c.get("/Byte/123/foo")
+			.run()
+			.assertBody().is("123");
+		c.get("/Byte/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 	@Test
 	public void c08_Boolean() throws Exception {
-		c.get("/Boolean/true/foo").run().assertBody().is("true");
-		c.get("/Boolean/bad/foo?noTrace=true").run().assertStatus().equals(400);
+		c.get("/Boolean/true/foo")
+			.run()
+			.assertBody().is("true");
+		c.get("/Boolean/bad/foo?noTrace=true")
+			.run()
+			.assertStatus().is(400);
 	}
 
 	//=================================================================================================================
@@ -278,7 +360,9 @@ public class PathAnnotationTest {
 	@Test
 	public void d01_uuid() throws Exception {
 		UUID uuid = UUID.randomUUID();
-		d.get("/uuid/" + uuid).run().assertBody().is(uuid.toString());
+		d.get("/uuid/" + uuid)
+			.run()
+			.assertBody().is(uuid.toString());
 	}
 
 	//=================================================================================================================
@@ -312,23 +396,33 @@ public class PathAnnotationTest {
 
 	@Test
 	public void e01_normal1() throws Exception {
-		e.get("/x/x1/x2").run().assertBody().is("{m:'normal1',foo:'x1',bar:'x2'}");
+		e.get("/x/x1/x2")
+			.run()
+			.assertBody().is("{m:'normal1',foo:'x1',bar:'x2'}");
 	}
 	@Test
 	public void e02_normal2() throws Exception {
-		e.get("/x/x1/x/x2/x").run().assertBody().is("{m:'normal2',foo:'x1',bar:'x2'}");
+		e.get("/x/x1/x/x2/x")
+			.run()
+			.assertBody().is("{m:'normal2',foo:'x1',bar:'x2'}");
 	}
 	@Test
 	public void e03_numbers1() throws Exception {
-		e.get("/y/y1/y2").run().assertBody().is("{m:'numbers1','0':'y1','1':'y2'}");
+		e.get("/y/y1/y2")
+			.run()
+			.assertBody().is("{m:'numbers1','0':'y1','1':'y2'}");
 	}
 	@Test
 	public void e04_numbers2() throws Exception {
-		e.get("/y/y1/y/y2/y").run().assertBody().is("{m:'numbers2','0':'y1','1':'y2'}");
+		e.get("/y/y1/y/y2/y")
+			.run()
+			.assertBody().is("{m:'numbers2','0':'y1','1':'y2'}");
 	}
 	@Test
 	public void e05_numbers3() throws Exception {
-		e.get("/z/z1/z/z2/z").run().assertBody().is("{m:'numbers3','0':'z2','1':'z1'}");
+		e.get("/z/z1/z/z2/z")
+			.run()
+			.assertBody().is("{m:'numbers3','0':'z2','1':'z1'}");
 	}
 
 	//=================================================================================================================
@@ -369,78 +463,126 @@ public class PathAnnotationTest {
 
 	@Test
 	public void f01a_noPath() throws Exception {
-		f.get("/f/x1/x2").run().assertBody().is("noPath: {a:'x1',b:'x2'}");
+		f.get("/f/x1/x2")
+			.run()
+			.assertBody().is("noPath: {a:'x1',b:'x2'}");
 	}
 
 	@Test
 	public void f01b_incompletePath() throws Exception {
-		f.get("/f/x1").run().assertStatus().equals(404);
-		f.get("/f").run().assertStatus().equals(404);
+		f.get("/f/x1")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void f01c_noPath_blanks() throws Exception {
-		f.get("/f//").run().assertStatus().equals(404);
-		f.get("/f/x/").run().assertStatus().equals(404);
-		f.get("/f//x").run().assertStatus().equals(404);
+		f.get("/f//")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f/x/")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f//x")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void f02a_noPath2() throws Exception {
-		f.get("/f/x1/x2/foo").run().assertBody().is("noPath2: {'/*':'foo','/**':'foo',a:'x1',b:'x2'}");
+		f.get("/f/x1/x2/foo")
+			.run()
+			.assertBody().is("noPath2: {'/*':'foo','/**':'foo',a:'x1',b:'x2'}");
 	}
 
 	@Test
 	public void f02b_noPath2_blanks() throws Exception {
-		f.get("/f///foo").run().assertStatus().equals(404);
-		f.get("/f/x1//foo").run().assertStatus().equals(404);
-		f.get("/f//x2/foo").run().assertStatus().equals(404);
+		f.get("/f///foo")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f/x1//foo")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f//x2/foo")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void f03a_noVars() throws Exception {
-		f.get("/f/x1/x2/a").run().assertBody().is("noVars: {a:'x1',b:'x2'}");
+		f.get("/f/x1/x2/a")
+			.run()
+			.assertBody().is("noVars: {a:'x1',b:'x2'}");
 	}
 
 	@Test
 	public void f03b_noVars_blanks() throws Exception {
-		f.get("/f///a").run().assertStatus().equals(404);
-		f.get("/f/x1//a").run().assertStatus().equals(404);
-		f.get("/f//x2/a").run().assertStatus().equals(404);
+		f.get("/f///a")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f/x1//a")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f//x2/a")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void f04a_twoVars() throws Exception {
-		f.get("/f/x1/x2/b/x3/x4").run().assertBody().is("twoVars: {a:'x1',b:'x2',c:'x3',d:'x4'}");
+		f.get("/f/x1/x2/b/x3/x4")
+			.run()
+			.assertBody().is("twoVars: {a:'x1',b:'x2',c:'x3',d:'x4'}");
 	}
 
 	@Test
 	public void f04b_twoVars_blanks() throws Exception {
-		f.get("/f//x2/b/x3/x4").run().assertStatus().equals(404);
-		f.get("/f/x1//b/x3/x4").run().assertStatus().equals(404);
-		f.get("/f/x1/x2/b//x4").run().assertStatus().equals(200);
-		f.get("/f/x1/x2/b/x3/").run().assertStatus().equals(200);
-		f.get("/f///b//").run().assertStatus().equals(404);
+		f.get("/f//x2/b/x3/x4")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f/x1//b/x3/x4")
+			.run()
+			.assertStatus().is(404);
+		f.get("/f/x1/x2/b//x4")
+			.run()
+			.assertStatus().is(200);
+		f.get("/f/x1/x2/b/x3/")
+			.run()
+			.assertStatus().is(200);
+		f.get("/f///b//")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void f05_twoVarsOverlapping() throws Exception {
-		f.get("/f/x1/x2/c/x3/x4").run().assertBody().is("twoVarsOverlapping: {a:'x3',b:'x4'}");
+		f.get("/f/x1/x2/c/x3/x4")
+			.run()
+			.assertBody().is("twoVarsOverlapping: {a:'x3',b:'x4'}");
 	}
 
 	@Test
 	public void f06a_withRemainder() throws Exception {
-		f.get("/f/x1/x2/d/x3/x4").run().assertBody().is("withRemainder: {a:'x1',b:'x2',c:'x3',d:'x4'}");
+		f.get("/f/x1/x2/d/x3/x4")
+			.run()
+			.assertBody().is("withRemainder: {a:'x1',b:'x2',c:'x3',d:'x4'}");
 	}
 
 	@Test
 	public void f06b_withRemainder_lank() throws Exception {
-		f.get("/f/x1/x2/d/x3/x4/").run().assertBody().is("withRemainder: {'/*':'','/**':'',a:'x1',b:'x2',c:'x3',d:'x4'}");
+		f.get("/f/x1/x2/d/x3/x4/")
+			.run()
+			.assertBody().is("withRemainder: {'/*':'','/**':'',a:'x1',b:'x2',c:'x3',d:'x4'}");
 	}
 
 	@Test
 	public void f06c_withRemainderWithStuff() throws Exception {
-		f.get("/f/x1/x2/d/x3/x4/foo/bar").run().assertBody().is("withRemainder: {'/*':'foo/bar','/**':'foo/bar',a:'x1',b:'x2',c:'x3',d:'x4'}");
+		f.get("/f/x1/x2/d/x3/x4/foo/bar")
+			.run()
+			.assertBody().is("withRemainder: {'/*':'foo/bar','/**':'foo/bar',a:'x1',b:'x2',c:'x3',d:'x4'}");
 	}
 
 	//=================================================================================================================
@@ -454,66 +596,106 @@ public class PathAnnotationTest {
 
 	@Test
 	public void g01a_noPath() throws Exception {
-		g.get("/f/x1/x2").run().assertBody().is("noPath: {a:'x1',b:'x2'}");
+		g.get("/f/x1/x2")
+			.run()
+			.assertBody().is("noPath: {a:'x1',b:'x2'}");
 	}
 
 	@Test
 	public void g01b_incompletePath() throws Exception {
-		g.get("/f/x1").run().assertStatus().equals(404);
-		g.get("/f").run().assertStatus().equals(404);
+		g.get("/f/x1")
+			.run()
+			.assertStatus().is(404);
+		g.get("/f")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void g01c_noPath_blanks() throws Exception {
-		g.get("/f//").run().assertStatus().equals(404);
-		g.get("/f/x1/").run().assertStatus().equals(404);
-		g.get("/f//x2").run().assertStatus().equals(404);
+		g.get("/f//")
+			.run()
+			.assertStatus().is(404);
+		g.get("/f/x1/")
+			.run()
+			.assertStatus().is(404);
+		g.get("/f//x2")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void g02a_noVars() throws Exception {
-		g.get("/f/x1/x2/a").run().assertBody().is("noVars: {a:'x1',b:'x2'}");
+		g.get("/f/x1/x2/a")
+			.run()
+			.assertBody().is("noVars: {a:'x1',b:'x2'}");
 	}
 
 	@Test
 	public void g02b_noVars_blanks() throws Exception {
-		g.get("/f///a").run().assertStatus().equals(404);
-		g.get("/f/x1//a").run().assertStatus().equals(404);
-		g.get("/f//x2/a").run().assertStatus().equals(404);
+		g.get("/f///a")
+			.run()
+			.assertStatus().is(404);
+		g.get("/f/x1//a")
+			.run()
+			.assertStatus().is(404);
+		g.get("/f//x2/a")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void g03a_twoVars() throws Exception {
-		g.get("/f/x1/x2/b/x3/x4").run().assertBody().is("twoVars: {a:'x1',b:'x2',c:'x3',d:'x4'}");
+		g.get("/f/x1/x2/b/x3/x4")
+			.run()
+			.assertBody().is("twoVars: {a:'x1',b:'x2',c:'x3',d:'x4'}");
 	}
 
 	@Test
 	public void g03b_twoVars_blanks() throws Exception {
-		g.get("/f//x2/b/x3/x4").run().assertStatus().equals(404);
-		g.get("/f/x1//b/x3/x4").run().assertStatus().equals(404);
-		g.get("/f/x1/x2/b//x4").run().assertStatus().equals(200);
-		g.get("/f/x1/x2/b/x3/").run().assertStatus().equals(200);
-		g.get("/f///b//").run().assertStatus().equals(404);
+		g.get("/f//x2/b/x3/x4")
+			.run()
+			.assertStatus().is(404);
+		g.get("/f/x1//b/x3/x4")
+			.run()
+			.assertStatus().is(404);
+		g.get("/f/x1/x2/b//x4")
+			.run()
+			.assertStatus().is(200);
+		g.get("/f/x1/x2/b/x3/")
+			.run()
+			.assertStatus().is(200);
+		g.get("/f///b//")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void g04_twoVarsOverlapping() throws Exception {
-		g.get("/f/x1/x2/c/x3/x4").run().assertBody().is("twoVarsOverlapping: {a:'x3',b:'x4'}");
+		g.get("/f/x1/x2/c/x3/x4")
+			.run()
+			.assertBody().is("twoVarsOverlapping: {a:'x3',b:'x4'}");
 	}
 
 	@Test
 	public void g05a_withRemainder() throws Exception {
-		g.get("/f/x1/x2/d/x3/x4").run().assertBody().is("withRemainder: {a:'x1',b:'x2',c:'x3',d:'x4'}");
+		g.get("/f/x1/x2/d/x3/x4")
+			.run()
+			.assertBody().is("withRemainder: {a:'x1',b:'x2',c:'x3',d:'x4'}");
 	}
 
 	@Test
 	public void g05b_withRemainderBlank() throws Exception {
-		g.get("/f/x1/x2/d/x3/x4/").run().assertBody().is("withRemainder: {'/*':'','/**':'',a:'x1',b:'x2',c:'x3',d:'x4'}");
+		g.get("/f/x1/x2/d/x3/x4/")
+			.run()
+			.assertBody().is("withRemainder: {'/*':'','/**':'',a:'x1',b:'x2',c:'x3',d:'x4'}");
 	}
 
 	@Test
 	public void g05c_withRemainderWithStuff() throws Exception {
-		g.get("/f/x1/x2/d/x3/x4/foo/bar").run().assertBody().is("withRemainder: {'/*':'foo/bar','/**':'foo/bar',a:'x1',b:'x2',c:'x3',d:'x4'}");
+		g.get("/f/x1/x2/d/x3/x4/foo/bar")
+			.run()
+			.assertBody().is("withRemainder: {'/*':'foo/bar','/**':'foo/bar',a:'x1',b:'x2',c:'x3',d:'x4'}");
 	}
 
 	//=================================================================================================================
@@ -527,79 +709,135 @@ public class PathAnnotationTest {
 
 	@Test
 	public void h01a_noPath() throws Exception {
-		h.get("/h/ha1/hb1/f/x1/x2").run().assertBody().is("noPath: {a:'x1',b:'x2',ha:'ha1',hb:'hb1'}");
+		h.get("/h/ha1/hb1/f/x1/x2")
+			.run()
+			.assertBody().is("noPath: {a:'x1',b:'x2',ha:'ha1',hb:'hb1'}");
 	}
 
 	@Test
 	public void h01b_incompletePath() throws Exception {
 		// These are 405 instead of 404 because when children don't match, we try to find a matching Java method.
-		h.get("/h/ha1/hb1/f/x1").run().assertStatus().equals(404);
-		h.get("/h/ha1/hb1/f").run().assertStatus().equals(404);
-		h.get("/h/ha1/hb1").run().assertStatus().equals(404);
-		h.get("/h/ha1").run().assertStatus().equals(404);
-		h.get("/h").run().assertStatus().equals(404);
+		h.get("/h/ha1/hb1/f/x1")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1/hb1/f")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1/hb1")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void h01c_noPath_blanks() throws Exception {
-		h.get("/h//hb1/f/x1/x2").run().assertStatus().equals(404);
-		h.get("/h/ha1//f/x1/x2").run().assertStatus().equals(404);
-		h.get("/h/ha1/hb1/f//x2").run().assertStatus().equals(404);
-		h.get("/h/ha1/hb1/f/x1/").run().assertStatus().equals(404);
-		h.get("/h///f//").run().assertStatus().equals(404);
+		h.get("/h//hb1/f/x1/x2")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1//f/x1/x2")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1/hb1/f//x2")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1/hb1/f/x1/")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h///f//")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void h02a_noPath2() throws Exception {
-		h.get("/h/ha1/hb1/f/x1/x2/foo").run().assertBody().is("noPath2: {'/*':'foo','/**':'foo',a:'x1',b:'x2',ha:'ha1',hb:'hb1'}");
+		h.get("/h/ha1/hb1/f/x1/x2/foo")
+			.run()
+			.assertBody().is("noPath2: {'/*':'foo','/**':'foo',a:'x1',b:'x2',ha:'ha1',hb:'hb1'}");
 	}
 
 	@Test
 	public void h02b_noPath2_blanks() throws Exception {
-		h.get("/h//hb1/f/x1/x2/foo").run().assertStatus().equals(404);
-		h.get("/h/ha1//f/x1/x2/foo").run().assertStatus().equals(404);
-		h.get("/h/ha1/hb1/f//x2/foo").run().assertStatus().equals(404);
-		h.get("/h/ha1/hb1/f/x1//foo").run().assertStatus().equals(404);
-		h.get("/h///f///foo").run().assertStatus().equals(404);
+		h.get("/h//hb1/f/x1/x2/foo")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1//f/x1/x2/foo")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1/hb1/f//x2/foo")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1/hb1/f/x1//foo")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h///f///foo")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void h03a_noVars() throws Exception {
-		h.get("/h/ha1/hb1/f/x1/x2/a").run().assertBody().is("noVars: {a:'x1',b:'x2',ha:'ha1',hb:'hb1'}");
+		h.get("/h/ha1/hb1/f/x1/x2/a")
+			.run()
+			.assertBody().is("noVars: {a:'x1',b:'x2',ha:'ha1',hb:'hb1'}");
 	}
 
 	@Test
 	public void h03b_noVars_blanks() throws Exception {
-		h.get("/h//hb1/f/x1/x2/a").run().assertStatus().equals(404);
-		h.get("/h/ha1//f/x1/x2/a").run().assertStatus().equals(404);
-		h.get("/h/ha1/hb1/f//x2/a").run().assertStatus().equals(404);
-		h.get("/h/ha1/hb1/f/x1//a").run().assertStatus().equals(404);
-		h.get("/h///f///a").run().assertStatus().equals(404);
+		h.get("/h//hb1/f/x1/x2/a")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1//f/x1/x2/a")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1/hb1/f//x2/a")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h/ha1/hb1/f/x1//a")
+			.run()
+			.assertStatus().is(404);
+		h.get("/h///f///a")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void h04_twoVars() throws Exception {
-		h.get("/h/ha1/hb1/f/x1/x2/b/x3/x4").run().assertBody().is("twoVars: {a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1'}");
+		h.get("/h/ha1/hb1/f/x1/x2/b/x3/x4")
+			.run()
+			.assertBody().is("twoVars: {a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1'}");
 	}
 
 	@Test
 	public void h05_twoVarsOverlapping() throws Exception {
-		h.get("/h/ha1/hb1/f/x1/x2/c/x3/x4").run().assertBody().is("twoVarsOverlapping: {a:'x3',b:'x4',ha:'ha1',hb:'hb1'}");
+		h.get("/h/ha1/hb1/f/x1/x2/c/x3/x4")
+			.run()
+			.assertBody().is("twoVarsOverlapping: {a:'x3',b:'x4',ha:'ha1',hb:'hb1'}");
 	}
 
 	@Test
 	public void h06a_withRemainder() throws Exception {
-		h.get("/h/ha1/hb1/f/x1/x2/d/x3/x4").run().assertBody().is("withRemainder: {a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1'}");
+		h.get("/h/ha1/hb1/f/x1/x2/d/x3/x4")
+			.run()
+			.assertBody().is("withRemainder: {a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1'}");
 	}
 
 	@Test
 	public void h06b_withRemainderBlank() throws Exception {
-		h.get("/h/ha1/hb1/f/x1/x2/d/x3/x4/").run().assertBody().is("withRemainder: {'/*':'','/**':'',a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1'}");
+		h.get("/h/ha1/hb1/f/x1/x2/d/x3/x4/")
+			.run()
+			.assertBody().is("withRemainder: {'/*':'','/**':'',a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1'}");
 	}
 
 	@Test
 	public void h06c_withRemainderWithStuff() throws Exception {
-		h.get("/h/ha1/hb1/f/x1/x2/d/x3/x4/foo/bar").run().assertBody().is("withRemainder: {'/*':'foo/bar','/**':'foo/bar',a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1'}");
+		h.get("/h/ha1/hb1/f/x1/x2/d/x3/x4/foo/bar")
+			.run()
+			.assertBody().is("withRemainder: {'/*':'foo/bar','/**':'foo/bar',a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1'}");
 	}
 
 	//=================================================================================================================
@@ -613,65 +851,111 @@ public class PathAnnotationTest {
 
 	@Test
 	public void i01a_noPath() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2").run().assertBody().is("noPath: {a:'x1',b:'x2',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2")
+			.run()
+			.assertBody().is("noPath: {a:'x1',b:'x2',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
 	}
 
 	@Test
 	public void i01b_incompletePath() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1/h/ha1/hb1/f").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1/h/ha1/hb1").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1/h/ha1").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1/h").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1").run().assertStatus().equals(404);
-		i.get("/i/ia1").run().assertStatus().equals(404);
-		i.get("/i").run().assertStatus().equals(404);
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1/h/ha1/hb1/f")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1/h/ha1/hb1")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1/h/ha1")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1/h")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void i01c_noPath_blanks() throws Exception {
-		i.get("/i//ib1/h/ha1/hb1/f/x1/x2").run().assertStatus().equals(404);
-		i.get("/i/ia1//h/ha1/hb1/f/x1/x2").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1/h//hb1/f/x1/x2").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1/h/ha1//f/x1/x2").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1/h/ha1/hb1/f//x2").run().assertStatus().equals(404);
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/").run().assertStatus().equals(404);
-		i.get("/i///h///f//").run().assertStatus().equals(404);
+		i.get("/i//ib1/h/ha1/hb1/f/x1/x2")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1//h/ha1/hb1/f/x1/x2")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1/h//hb1/f/x1/x2")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1/h/ha1//f/x1/x2")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1/h/ha1/hb1/f//x2")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/")
+			.run()
+			.assertStatus().is(404);
+		i.get("/i///h///f//")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	@Test
 	public void i02_noPath2() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/foo").run().assertBody().is("noPath2: {'/*':'foo','/**':'foo',a:'x1',b:'x2',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/foo")
+			.run()
+			.assertBody().is("noPath2: {'/*':'foo','/**':'foo',a:'x1',b:'x2',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
 	}
 
 	@Test
 	public void i03_noVars() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/a").run().assertBody().is("noVars: {a:'x1',b:'x2',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/a")
+			.run()
+			.assertBody().is("noVars: {a:'x1',b:'x2',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
 	}
 
 	@Test
 	public void i04_twoVars() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/b/x3/x4").run().assertBody().is("twoVars: {a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/b/x3/x4")
+			.run()
+			.assertBody().is("twoVars: {a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
 	}
 
 	@Test
 	public void i05_twoVarsOverlapping() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/c/x3/x4").run().assertBody().is("twoVarsOverlapping: {a:'x3',b:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/c/x3/x4")
+			.run()
+			.assertBody().is("twoVarsOverlapping: {a:'x3',b:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
 	}
 
 	@Test
 	public void i06a_withRemainder() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/d/x3/x4").run().assertBody().is("withRemainder: {a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/d/x3/x4")
+			.run()
+			.assertBody().is("withRemainder: {a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
 	}
 
 	@Test
 	public void i06b_withRemainderBlank() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/d/x3/x4/").run().assertBody().is("withRemainder: {'/*':'','/**':'',a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/d/x3/x4/")
+			.run()
+			.assertBody().is("withRemainder: {'/*':'','/**':'',a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
 	}
 
 	@Test
 	public void i06c_withRemainderWithStuff() throws Exception {
-		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/d/x3/x4/foo/bar").run().assertBody().is("withRemainder: {'/*':'foo/bar','/**':'foo/bar',a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
+		i.get("/i/ia1/ib1/h/ha1/hb1/f/x1/x2/d/x3/x4/foo/bar")
+			.run()
+			.assertBody().is("withRemainder: {'/*':'foo/bar','/**':'foo/bar',a:'x1',b:'x2',c:'x3',d:'x4',ha:'ha1',hb:'hb1',ia:'ia1',ib:'ib1'}");
 	}
 
 	//=================================================================================================================
@@ -704,22 +988,34 @@ public class PathAnnotationTest {
 
 	@Test
 	public void j01_optionalParam_integer() throws Exception {
-		j.get("/a/123").run().assertStatus().equals(200).assertBody().is("123");
+		j.get("/a/123")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("123");
 	}
 
 	@Test
 	public void j02_optionalParam_bean() throws Exception {
-		j.get("/b/a=1,b=foo").run().assertStatus().equals(200).assertBody().is("{a:1,b:'foo'}");
+		j.get("/b/a=1,b=foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("{a:1,b:'foo'}");
 	}
 
 	@Test
 	public void j03_optionalParam_listOfBeans() throws Exception {
-		j.get("/c/@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
+		j.get("/c/@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
 	}
 
 	@Test
 	public void j04_optionalParam_listOfOptionals() throws Exception {
-		j.get("/d/@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
+		j.get("/d/@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
 	}
 
 
@@ -1125,10 +1421,22 @@ public class PathAnnotationTest {
 
 	@Test
 	public void u01_nonRequiredPath() throws Exception {
-		u1.get("/u1/foo/u2").run().assertStatus().equals(200).assertBody().is("foo");
-		u1.get("/u1/foo/u2/foo/xxx").run().assertStatus().equals(200).assertBody().is("foo,xxx");
-		u2.get("/").run().assertStatus().equals(200).assertBody().is("nil");
-		u2.get("/foo/xxx").run().assertStatus().equals(200).assertBody().is("nil,xxx");
+		u1.get("/u1/foo/u2")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
+		u1.get("/u1/foo/u2/foo/xxx")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo,xxx");
+		u2.get("/")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("nil");
+		u2.get("/foo/xxx")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("nil,xxx");
 	}
 
 	//=================================================================================================================
@@ -1155,13 +1463,37 @@ public class PathAnnotationTest {
 
 	@Test
 	public void v01_multiplePaths() throws Exception {
-		v1.get("/v1/v1foo/v2").run().assertStatus().equals(200).assertBody().is("1,v1foo,nil");
-		v1.get("/v1/v1foo/v2/v2foo").run().assertStatus().equals(200).assertBody().is("1,v1foo,v2foo");
-		v1.get("/v1/v1foo/v2/foo").run().assertStatus().equals(200).assertBody().is("2,v1foo,nil");
-		v1.get("/v1/v1foo/v2/foo/v2foo").run().assertStatus().equals(200).assertBody().is("2,v1foo,v2foo");
-		v2.get("/v2").run().assertStatus().equals(200).assertBody().is("1,nil,nil");
-		v2.get("/v2/v2foo").run().assertStatus().equals(200).assertBody().is("1,nil,v2foo");
-		v2.get("/v2/foo").run().assertStatus().equals(200).assertBody().is("2,nil,nil");
-		v2.get("/v2/foo/v2foo").run().assertStatus().equals(200).assertBody().is("2,nil,v2foo");
+		v1.get("/v1/v1foo/v2")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("1,v1foo,nil");
+		v1.get("/v1/v1foo/v2/v2foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("1,v1foo,v2foo");
+		v1.get("/v1/v1foo/v2/foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("2,v1foo,nil");
+		v1.get("/v1/v1foo/v2/foo/v2foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("2,v1foo,v2foo");
+		v2.get("/v2")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("1,nil,nil");
+		v2.get("/v2/v2foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("1,nil,v2foo");
+		v2.get("/v2/foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("2,nil,nil");
+		v2.get("/v2/foo/v2foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("2,nil,v2foo");
 	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
index f50c575..5d24ff8 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
@@ -84,21 +84,33 @@ public class PathRemainderAnnotationTest {
 
 	@Test
 	public void b01_optionalParam_integer() throws Exception {
-		b.get("/a/123").run().assertStatus().equals(200).assertBody().is("123");
+		b.get("/a/123")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("123");
 	}
 
 	@Test
 	public void b02_optionalParam_bean() throws Exception {
-		b.get("/b/a=1,b=foo").run().assertStatus().equals(200).assertBody().is("{a:1,b:'foo'}");
+		b.get("/b/a=1,b=foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("{a:1,b:'foo'}");
 	}
 
 	@Test
 	public void b03_optionalParam_listOfBeans() throws Exception {
-		b.get("/c/@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
+		b.get("/c/@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
 	}
 
 	@Test
 	public void b04_optionalParam_listOfOptionals() throws Exception {
-		b.get("/d/@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
+		b.get("/d/@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
index 85cec3a..a4d63bc 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
@@ -294,26 +294,50 @@ public class QueryAnnotationTest {
 
 	@Test
 	public void e01_optionalParam_integer() throws Exception {
-		e.get("/a?f1=123").run().assertStatus().equals(200).assertBody().is("123");
-		e.get("/a").run().assertStatus().equals(200).assertBody().is("null");
+		e.get("/a?f1=123")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("123");
+		e.get("/a")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void e02_optionalParam_bean() throws Exception {
-		e.get("/b?f1=a=1,b=foo").run().assertStatus().equals(200).assertBody().is("{a:1,b:'foo'}");
-		e.get("/b").run().assertStatus().equals(200).assertBody().is("null");
+		e.get("/b?f1=a=1,b=foo")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("{a:1,b:'foo'}");
+		e.get("/b")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void e03_optionalParam_listOfBeans() throws Exception {
-		e.get("/c?f1=@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
-		e.get("/c").run().assertStatus().equals(200).assertBody().is("null");
+		e.get("/c?f1=@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
+		e.get("/c")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 	@Test
 	public void e04_optionalParam_listOfOptionals() throws Exception {
-		e.get("/d?f1=@((a=1,b=foo))").run().assertStatus().equals(200).assertBody().is("[{a:1,b:'foo'}]");
-		e.get("/d").run().assertStatus().equals(200).assertBody().is("null");
+		e.get("/d?f1=@((a=1,b=foo))")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[{a:1,b:'foo'}]");
+		e.get("/d")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("null");
 	}
 
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java
index ca98b1f..5ce7271 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java
@@ -71,11 +71,16 @@ public class ResponseAnnotationTest {
 
 	@Test
 	public void a01_codeOnClass() throws Exception {
-		a.get("/a01").run().assertStatus().equals(201).assertBody().is("foo");
+		a.get("/a01")
+			.run()
+			.assertStatus().is(201)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void a02_codeOnThrown() throws Exception {
-		a.get("/a02").run().assertStatus().equals(501);
+		a.get("/a02")
+			.run()
+			.assertStatus().is(501);
 	}
 
 	//=================================================================================================================
@@ -124,19 +129,31 @@ public class ResponseAnnotationTest {
 
 	@Test
 	public void b01_useOnMethod() throws Exception {
-		b.get("/b01").run().assertStatus().equals(200).assertBody().is("foo");
+		b.get("/b01")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void b03_useOnClass() throws Exception {
-		b.get("/b03").run().assertStatus().equals(200).assertBody().is("foo");
+		b.get("/b03")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void b05_useOnThrown() throws Exception {
-		b.get("/b05").run().assertStatus().equals(500).assertBody().is("foo");
+		b.get("/b05")
+			.run()
+			.assertStatus().is(500)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void b07_useOnParameter() throws Exception {
-		b.get("/b07").run().assertStatus().equals(200).assertBody().is("foo");
+		b.get("/b07")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
 	}
 
 
@@ -215,35 +232,59 @@ public class ResponseAnnotationTest {
 
 	@Test
 	public void d01_useOnMethod() throws Exception {
-		d.get("/d01").run().assertStatus().equals(200).assertBody().is("foo|bar");
+		d.get("/d01")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo|bar");
 	}
 	@Test
 	public void d02_useOnClass() throws Exception {
-		d.get("/d02").run().assertStatus().equals(200).assertBody().is("foo|bar");
+		d.get("/d02")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo|bar");
 	}
 	@Test
 	public void d03_useOnThrown() throws Exception {
-		d.get("/d03").run().assertStatus().equals(500).assertBody().is("foo|bar");
+		d.get("/d03")
+			.run()
+			.assertStatus().is(500)
+			.assertBody().is("foo|bar");
 	}
 	@Test
 	public void d04_useOnParameter() throws Exception {
-		d.get("/d04").run().assertStatus().equals(200).assertBody().is("foo|bar");
+		d.get("/d04")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo|bar");
 	}
 	@Test
 	public void d05_useOnMethodBytes() throws Exception {
-		d.get("/d05").run().assertStatus().equals(200).assertBody().is("Zm9v");
+		d.get("/d05")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("Zm9v");
 	}
 	@Test
 	public void d06_useOnClassBytes() throws Exception {
-		d.get("/d06").run().assertStatus().equals(200).assertBody().is("Zm9v");
+		d.get("/d06")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("Zm9v");
 	}
 	@Test
 	public void d07_useOnThrownBytes() throws Exception {
-		d.get("/d07").run().assertStatus().equals(500).assertBody().is("Zm9v");
+		d.get("/d07")
+			.run()
+			.assertStatus().is(500)
+			.assertBody().is("Zm9v");
 	}
 	@Test
 	public void d08_useOnParameterBytes() throws Exception {
-		d.get("/d08").run().assertStatus().equals(200).assertBody().is("Zm9v");
+		d.get("/d08")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("Zm9v");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -286,19 +327,31 @@ public class ResponseAnnotationTest {
 
 	@Test
 	public void e01_basic_onParameter() throws Exception {
-		e.get("/e01").run().assertStatus().equals(200).assertBody().is("foo");
+		e.get("/e01")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void e02_basic_onType() throws Exception {
-		e.get("/e02").run().assertStatus().equals(200).assertBody().is("foo");
+		e.get("/e02")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void e03_basic_onMethod() throws Exception {
-		e.get("/e03").run().assertStatus().equals(200).assertBody().is("foo");
+		e.get("/e03")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void e04_basic_onReturnedType() throws Exception {
-		e.get("/e04").run().assertStatus().equals(200).assertBody().is("foo");
+		e.get("/e04")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -339,7 +392,10 @@ public class ResponseAnnotationTest {
 
 	@Test
 	public void f01a_basic_onParameter() throws Exception {
-		f.get("/f01").run().assertStatus().equals(200).assertBody().is("1|2");
+		f.get("/f01")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("1|2");
 	}
 	@Test
 	public void f01b_basic_onParameter_swagger() throws Exception {
@@ -348,7 +404,10 @@ public class ResponseAnnotationTest {
 	}
 	@Test
 	public void f02a_basic_onType() throws Exception {
-		f.get("/f02").run().assertStatus().equals(200).assertBody().is("1|2");
+		f.get("/f02")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("1|2");
 	}
 	@Test
 	public void f02b_basic_onParameter_swagger() throws Exception {
@@ -357,7 +416,10 @@ public class ResponseAnnotationTest {
 	}
 	@Test
 	public void f03a_basic_onMethod() throws Exception {
-		f.get("/f03").run().assertStatus().equals(200).assertBody().is("1|2");
+		f.get("/f03")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("1|2");
 	}
 	@Test
 	public void f03b_basic_onParameter_swagger() throws Exception {
@@ -366,7 +428,10 @@ public class ResponseAnnotationTest {
 	}
 	@Test
 	public void f04a_basic_onReturnedType() throws Exception {
-		f.get("/f04").run().assertStatus().equals(200).assertBody().is("1|2");
+		f.get("/f04")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("1|2");
 	}
 	@Test
 	public void f04b_basic_onParameter_swagger() throws Exception {
@@ -412,7 +477,10 @@ public class ResponseAnnotationTest {
 
 	@Test
 	public void g01a_basic_onParameter() throws Exception {
-		g.get("/g01").json().run().assertStatus().equals(200).assertBody().is("[1,2]");
+		g.get("/g01").json()
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[1,2]");
 	}
 	@Test
 	public void g01b_basic_onParameter_swagger() throws Exception {
@@ -421,7 +489,10 @@ public class ResponseAnnotationTest {
 	}
 	@Test
 	public void g02a_basic_onType() throws Exception {
-		g.get("/g02").json().run().assertStatus().equals(200).assertBody().is("[1,2]");
+		g.get("/g02").json()
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[1,2]");
 	}
 	@Test
 	public void g02b_basic_onParameter_swagger() throws Exception {
@@ -430,7 +501,10 @@ public class ResponseAnnotationTest {
 	}
 	@Test
 	public void g03a_basic_onMethod() throws Exception {
-		g.get("/g03").json().run().assertStatus().equals(200).assertBody().is("[1,2]");
+		g.get("/g03").json()
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[1,2]");
 	}
 	@Test
 	public void g03b_basic_onParameter_swagger() throws Exception {
@@ -439,7 +513,10 @@ public class ResponseAnnotationTest {
 	}
 	@Test
 	public void g04a_basic_onReturnedType() throws Exception {
-		g.get("/g04").json().run().assertStatus().equals(200).assertBody().is("[1,2]");
+		g.get("/g04").json()
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("[1,2]");
 	}
 	@Test
 	public void g04b_basic_onParameter_swagger() throws Exception {
@@ -468,7 +545,11 @@ public class ResponseAnnotationTest {
 
 	@Test
 	public void j01a_basic() throws Exception {
-		j.post("/j01", "foo").accept("text/plain").run().assertStatus().equals(200).assertBody().is("foo").assertHeader("Content-Type").is("text/plain");
+		j.post("/j01", "foo").accept("text/plain")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo")
+			.assertHeader("Content-Type").is("text/plain");
 	}
 
 
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java
index 4428a24..8c936e2 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java
@@ -128,9 +128,14 @@ public class RestResourceParsersTest {
 
 	@Test
 	public void a01_parserOnClass() throws Exception {
-		a.put("/parserOnClass", "test1").contentType("text/a").run().assertBody().is("text/a - test1");
-		a.put("/parserOnClass?noTrace=true", "test1").contentType("text/b").run()
-			.assertStatus().equals(415)
+		a.put("/parserOnClass", "test1")
+			.contentType("text/a")
+			.run()
+			.assertBody().is("text/a - test1");
+		a.put("/parserOnClass?noTrace=true", "test1")
+			.contentType("text/b")
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/b'",
 				"Supported media-types: ['text/a"
@@ -138,9 +143,14 @@ public class RestResourceParsersTest {
 	}
 	@Test
 	public void a02_parserOnMethod() throws Exception {
-		a.put("/parserOnMethod", "test2").contentType("text/b").run().assertBody().is("text/b - test2");
-		a.put("/parserOnMethod?noTrace=true", "test2").contentType("text/a").run()
-			.assertStatus().equals(415)
+		a.put("/parserOnMethod", "test2")
+			.contentType("text/b")
+			.run()
+			.assertBody().is("text/b - test2");
+		a.put("/parserOnMethod?noTrace=true", "test2")
+			.contentType("text/a")
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/a'",
 				"Supported media-types: ['text/b']"
@@ -148,18 +158,32 @@ public class RestResourceParsersTest {
 	}
 	@Test
 	public void a03_parserOverriddenOnMethod() throws Exception {
-		a.put("/parserOverriddenOnMethod", "test3").contentType("text/a").run().assertBody().is("text/a - test3");
-		a.put("/parserOverriddenOnMethod", "test3").contentType("text/b").run().assertBody().is("text/b - test3");
+		a.put("/parserOverriddenOnMethod", "test3")
+			.contentType("text/a")
+			.run()
+			.assertBody().is("text/a - test3");
+		a.put("/parserOverriddenOnMethod", "test3")
+			.contentType("text/b")
+			.run()
+			.assertBody().is("text/b - test3");
 	}
 	@Test
 	public void a04_parserWithDifferentMediaTypes() throws Exception {
-		a.put("/parserWithDifferentMediaTypes", "test4").contentType("text/a").run().assertBody().is("text/a - test4");
-		a.put("/parserWithDifferentMediaTypes", "test4").contentType("text/d").run().assertBody().is("text/d - test4");
+		a.put("/parserWithDifferentMediaTypes", "test4")
+			.contentType("text/a")
+			.run()
+			.assertBody().is("text/a - test4");
+		a.put("/parserWithDifferentMediaTypes", "test4")
+			.contentType("text/d")
+			.run()
+			.assertBody().is("text/d - test4");
 	}
 	@Test
 	public void a05_validErrorResponse() throws Exception {
-		a.put("/validErrorResponse?noTrace=true", "test1").contentType("text/bad").run()
-			.assertStatus().equals(415)
+		a.put("/validErrorResponse?noTrace=true", "test1")
+			.contentType("text/bad")
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/bad'",
 				"Supported media-types: ['text/a"
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/RoleGuardTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/RoleGuardTest.java
index 0ec9f34..d388fd4 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/RoleGuardTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation2/RoleGuardTest.java
@@ -36,16 +36,16 @@ public class RoleGuardTest {
 
 	@Test
 	public void a01a_onClass_simple_pass() throws Exception {
-		a1.get().roles("foo").run().assertStatus().equals(200);
-		a1.get().roles("foo","bar").run().assertStatus().equals(200);
-		a1.get().roles("bar","foo").run().assertStatus().equals(200);
+		a1.get().roles("foo").run().assertStatus().is(200);
+		a1.get().roles("foo","bar").run().assertStatus().is(200);
+		a1.get().roles("bar","foo").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void a01b_onClass_simple_fail() throws Exception {
-		a1.get().run().assertStatus().equals(403);
-		a1.get().roles("foo2").run().assertStatus().equals(403);
-		a1.get().roles("foo2","bar").run().assertStatus().equals(403);
+		a1.get().run().assertStatus().is(403);
+		a1.get().roles("foo2").run().assertStatus().is(403);
+		a1.get().roles("foo2","bar").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -63,16 +63,16 @@ public class RoleGuardTest {
 
 	@Test
 	public void a02a_onMethod_simple_pass() throws Exception {
-		a2.get().roles("foo").run().assertStatus().equals(200);
-		a2.get().roles("foo","bar").run().assertStatus().equals(200);
-		a2.get().roles("bar","foo").run().assertStatus().equals(200);
+		a2.get().roles("foo").run().assertStatus().is(200);
+		a2.get().roles("foo","bar").run().assertStatus().is(200);
+		a2.get().roles("bar","foo").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void a02b_onMethod_simple_fail() throws Exception {
-		a2.get().run().assertStatus().equals(403);
-		a2.get().roles("foo2").run().assertStatus().equals(403);
-		a2.get().roles("foo2","bar").run().assertStatus().equals(403);
+		a2.get().run().assertStatus().is(403);
+		a2.get().roles("foo2").run().assertStatus().is(403);
+		a2.get().roles("foo2","bar").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -90,18 +90,18 @@ public class RoleGuardTest {
 
 	@Test
 	public void a03a_onBoth_simple_pass() throws Exception {
-		a3.get().roles("foo","bar").run().assertStatus().equals(200);
-		a3.get().roles("bar","foo").run().assertStatus().equals(200);
-		a3.get().roles("bar","foo","baz").run().assertStatus().equals(200);
+		a3.get().roles("foo","bar").run().assertStatus().is(200);
+		a3.get().roles("bar","foo").run().assertStatus().is(200);
+		a3.get().roles("bar","foo","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void a03b_onBoth_simple_fail() throws Exception {
-		a3.get().run().assertStatus().equals(403);
-		a3.get().roles("foo").run().assertStatus().equals(403);
-		a3.get().roles("bar").run().assertStatus().equals(403);
-		a3.get().roles("foo2").run().assertStatus().equals(403);
-		a3.get().roles("foo2","bar").run().assertStatus().equals(403);
+		a3.get().run().assertStatus().is(403);
+		a3.get().roles("foo").run().assertStatus().is(403);
+		a3.get().roles("bar").run().assertStatus().is(403);
+		a3.get().roles("foo2").run().assertStatus().is(403);
+		a3.get().roles("foo2","bar").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -129,21 +129,21 @@ public class RoleGuardTest {
 
 	@Test
 	public void a04a_inheritence_simple_pass() throws Exception {
-		a4.get().roles("foo","bar","baz","qux").run().assertStatus().equals(200);
-		a4.get().roles("foo","bar","baz","qux","quux").run().assertStatus().equals(200);
+		a4.get().roles("foo","bar","baz","qux").run().assertStatus().is(200);
+		a4.get().roles("foo","bar","baz","qux","quux").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void a04b_inheritence_simple_fail() throws Exception {
-		a3.get().run().assertStatus().equals(403);
-		a3.get().roles("foo").run().assertStatus().equals(403);
-		a3.get().roles("bar").run().assertStatus().equals(403);
-		a3.get().roles("baz").run().assertStatus().equals(403);
-		a3.get().roles("qux").run().assertStatus().equals(403);
-		a4.get().roles("foo","bar","baz").run().assertStatus().equals(403);
-		a4.get().roles("foo","bar","qux").run().assertStatus().equals(403);
-		a4.get().roles("foo","baz","qux").run().assertStatus().equals(403);
-		a4.get().roles("bar","baz","qux").run().assertStatus().equals(403);
+		a3.get().run().assertStatus().is(403);
+		a3.get().roles("foo").run().assertStatus().is(403);
+		a3.get().roles("bar").run().assertStatus().is(403);
+		a3.get().roles("baz").run().assertStatus().is(403);
+		a3.get().roles("qux").run().assertStatus().is(403);
+		a4.get().roles("foo","bar","baz").run().assertStatus().is(403);
+		a4.get().roles("foo","bar","qux").run().assertStatus().is(403);
+		a4.get().roles("foo","baz","qux").run().assertStatus().is(403);
+		a4.get().roles("bar","baz","qux").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -194,130 +194,130 @@ public class RoleGuardTest {
 	@Test
 	public void b01a_orsWithComma_pass() throws Exception {
 		// @Rest(roleGuard="foo,bar")
-		b1a.get().roles("foo").run().assertStatus().equals(200);
-		b1a.get().roles("bar").run().assertStatus().equals(200);
-		b1a.get().roles("foo","bar").run().assertStatus().equals(200);
-		b1a.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b1a.get().roles("foo").run().assertStatus().is(200);
+		b1a.get().roles("bar").run().assertStatus().is(200);
+		b1a.get().roles("foo","bar").run().assertStatus().is(200);
+		b1a.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b01b_orsWithComma_fail() throws Exception {
 		// @Rest(roleGuard="foo,bar")
-		b1a.get().roles().run().assertStatus().equals(403);
-		b1a.get().roles("baz").run().assertStatus().equals(403);
+		b1a.get().roles().run().assertStatus().is(403);
+		b1a.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b01c_orsWithSinglePipe_pass() throws Exception {
 		// @Rest(roleGuard="foo | bar")
-		b1b.get().roles("foo").run().assertStatus().equals(200);
-		b1b.get().roles("bar").run().assertStatus().equals(200);
-		b1b.get().roles("foo","bar").run().assertStatus().equals(200);
-		b1b.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b1b.get().roles("foo").run().assertStatus().is(200);
+		b1b.get().roles("bar").run().assertStatus().is(200);
+		b1b.get().roles("foo","bar").run().assertStatus().is(200);
+		b1b.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b01d_orsWithSinglePipe_fail() throws Exception {
 		// @Rest(roleGuard="foo | bar")
-		b1b.get().roles().run().assertStatus().equals(403);
-		b1b.get().roles("baz").run().assertStatus().equals(403);
+		b1b.get().roles().run().assertStatus().is(403);
+		b1b.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b01e_orsWithDoublePipe_pass() throws Exception {
 		// @Rest(roleGuard="foo || bar")
-		b1c.get().roles("foo").run().assertStatus().equals(200);
-		b1c.get().roles("bar").run().assertStatus().equals(200);
-		b1c.get().roles("foo","bar").run().assertStatus().equals(200);
-		b1c.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b1c.get().roles("foo").run().assertStatus().is(200);
+		b1c.get().roles("bar").run().assertStatus().is(200);
+		b1c.get().roles("foo","bar").run().assertStatus().is(200);
+		b1c.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b01f_orsWithDoublePipe_fail() throws Exception {
 		// @Rest(roleGuard="foo || bar")
-		b1c.get().roles().run().assertStatus().equals(403);
-		b1c.get().roles("baz").run().assertStatus().equals(403);
+		b1c.get().roles().run().assertStatus().is(403);
+		b1c.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b01g_andsWithSingleAmp_pass() throws Exception {
 		// @Rest(roleGuard="foo & bar")
-		b1d.get().roles("foo","bar").run().assertStatus().equals(200);
-		b1d.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b1d.get().roles("foo","bar").run().assertStatus().is(200);
+		b1d.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b01h_andsWithSingleAmp_fail() throws Exception {
 		// @Rest(roleGuard="foo & bar")
-		b1d.get().roles().run().assertStatus().equals(403);
-		b1d.get().roles("foo").run().assertStatus().equals(403);
-		b1d.get().roles("bar").run().assertStatus().equals(403);
-		b1d.get().roles("baz").run().assertStatus().equals(403);
+		b1d.get().roles().run().assertStatus().is(403);
+		b1d.get().roles("foo").run().assertStatus().is(403);
+		b1d.get().roles("bar").run().assertStatus().is(403);
+		b1d.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b01i_andsWithDoubleAmp_pass() throws Exception {
 		// @Rest(roleGuard="foo && bar")
-		b1e.get().roles("foo","bar").run().assertStatus().equals(200);
-		b1e.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b1e.get().roles("foo","bar").run().assertStatus().is(200);
+		b1e.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b01j_andsWithDoubleAmp_fail() throws Exception {
 		// @Rest(roleGuard="foo && bar")
-		b1e.get().roles().run().assertStatus().equals(403);
-		b1e.get().roles("foo").run().assertStatus().equals(403);
-		b1e.get().roles("bar").run().assertStatus().equals(403);
-		b1e.get().roles("baz").run().assertStatus().equals(403);
+		b1e.get().roles().run().assertStatus().is(403);
+		b1e.get().roles("foo").run().assertStatus().is(403);
+		b1e.get().roles("bar").run().assertStatus().is(403);
+		b1e.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b01k_andsWithDoubleAmpAndParens_pass() throws Exception {
 		// @Rest(roleGuard="(foo) && (bar)")
-		b1f.get().roles("foo","bar").run().assertStatus().equals(200);
-		b1f.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b1f.get().roles("foo","bar").run().assertStatus().is(200);
+		b1f.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b01l_andsWithDoubleAmpAndParens_fail() throws Exception {
 		// @Rest(roleGuard="(foo) && (bar)")
-		b1f.get().roles().run().assertStatus().equals(403);
-		b1f.get().roles("foo").run().assertStatus().equals(403);
-		b1f.get().roles("bar").run().assertStatus().equals(403);
-		b1f.get().roles("baz").run().assertStatus().equals(403);
+		b1f.get().roles().run().assertStatus().is(403);
+		b1f.get().roles("foo").run().assertStatus().is(403);
+		b1f.get().roles("bar").run().assertStatus().is(403);
+		b1f.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b01m_complex_pass() throws Exception {
 		// @Rest(roleGuard="foo && (bar || baz)")
-		b1g.get().roles("foo","bar").run().assertStatus().equals(200);
-		b1g.get().roles("foo","baz").run().assertStatus().equals(200);
-		b1g.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b1g.get().roles("foo","bar").run().assertStatus().is(200);
+		b1g.get().roles("foo","baz").run().assertStatus().is(200);
+		b1g.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b01n_complex_fail() throws Exception {
 		// @Rest(roleGuard="foo && (bar || baz)")
-		b1g.get().roles().run().assertStatus().equals(403);
-		b1g.get().roles("foo").run().assertStatus().equals(403);
-		b1g.get().roles("bar","baz").run().assertStatus().equals(403);
-		b1g.get().roles("baz").run().assertStatus().equals(403);
+		b1g.get().roles().run().assertStatus().is(403);
+		b1g.get().roles("foo").run().assertStatus().is(403);
+		b1g.get().roles("bar","baz").run().assertStatus().is(403);
+		b1g.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b01o_complex_pass() throws Exception {
 		// @Rest(roleGuard="foo || (bar && baz)")
-		b1h.get().roles("foo").run().assertStatus().equals(200);
-		b1h.get().roles("bar","baz").run().assertStatus().equals(200);
-		b1h.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b1h.get().roles("foo").run().assertStatus().is(200);
+		b1h.get().roles("bar","baz").run().assertStatus().is(200);
+		b1h.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b01p_complex_fail() throws Exception {
 		// @Rest(roleGuard="foo || (bar && baz)")
-		b1h.get().roles().run().assertStatus().equals(403);
-		b1h.get().roles("bar").run().assertStatus().equals(403);
-		b1h.get().roles("baz").run().assertStatus().equals(403);
+		b1h.get().roles().run().assertStatus().is(403);
+		b1h.get().roles("bar").run().assertStatus().is(403);
+		b1h.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -400,130 +400,130 @@ public class RoleGuardTest {
 	@Test
 	public void b02a_orsWithComma_pass() throws Exception {
 		// @RestMethod(roleGuard="foo,bar")
-		b2a.get().roles("foo").run().assertStatus().equals(200);
-		b2a.get().roles("bar").run().assertStatus().equals(200);
-		b2a.get().roles("foo","bar").run().assertStatus().equals(200);
-		b2a.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b2a.get().roles("foo").run().assertStatus().is(200);
+		b2a.get().roles("bar").run().assertStatus().is(200);
+		b2a.get().roles("foo","bar").run().assertStatus().is(200);
+		b2a.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b02b_orsWithComma_fail() throws Exception {
 		// @RestMethod(roleGuard="foo,bar")
-		b2a.get().roles().run().assertStatus().equals(403);
-		b2a.get().roles("baz").run().assertStatus().equals(403);
+		b2a.get().roles().run().assertStatus().is(403);
+		b2a.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b02c_orsWithSinglePipe_pass() throws Exception {
 		// @RestMethod(roleGuard="foo | bar")
-		b2b.get().roles("foo").run().assertStatus().equals(200);
-		b2b.get().roles("bar").run().assertStatus().equals(200);
-		b2b.get().roles("foo","bar").run().assertStatus().equals(200);
-		b2b.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b2b.get().roles("foo").run().assertStatus().is(200);
+		b2b.get().roles("bar").run().assertStatus().is(200);
+		b2b.get().roles("foo","bar").run().assertStatus().is(200);
+		b2b.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b02d_orsWithSinglePipe_fail() throws Exception {
 		// @RestMethod(roleGuard="foo | bar")
-		b2b.get().roles().run().assertStatus().equals(403);
-		b2b.get().roles("baz").run().assertStatus().equals(403);
+		b2b.get().roles().run().assertStatus().is(403);
+		b2b.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b02e_orsWithDoublePipe_pass() throws Exception {
 		// @RestMethod(roleGuard="foo || bar")
-		b2c.get().roles("foo").run().assertStatus().equals(200);
-		b2c.get().roles("bar").run().assertStatus().equals(200);
-		b2c.get().roles("foo","bar").run().assertStatus().equals(200);
-		b2c.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b2c.get().roles("foo").run().assertStatus().is(200);
+		b2c.get().roles("bar").run().assertStatus().is(200);
+		b2c.get().roles("foo","bar").run().assertStatus().is(200);
+		b2c.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b02f_orsWithDoublePipe_fail() throws Exception {
 		// @RestMethod(roleGuard="foo || bar")
-		b2c.get().roles().run().assertStatus().equals(403);
-		b2c.get().roles("baz").run().assertStatus().equals(403);
+		b2c.get().roles().run().assertStatus().is(403);
+		b2c.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b02g_andsWithSingleAmp_pass() throws Exception {
 		// @RestMethod(roleGuard="foo & bar")
-		b2d.get().roles("foo","bar").run().assertStatus().equals(200);
-		b2d.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b2d.get().roles("foo","bar").run().assertStatus().is(200);
+		b2d.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b02h_andsWithSingleAmp_fail() throws Exception {
 		// @RestMethod(roleGuard="foo & bar")
-		b2d.get().roles().run().assertStatus().equals(403);
-		b2d.get().roles("foo").run().assertStatus().equals(403);
-		b2d.get().roles("bar").run().assertStatus().equals(403);
-		b2d.get().roles("baz").run().assertStatus().equals(403);
+		b2d.get().roles().run().assertStatus().is(403);
+		b2d.get().roles("foo").run().assertStatus().is(403);
+		b2d.get().roles("bar").run().assertStatus().is(403);
+		b2d.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b02i_andsWithDoubleAmp_pass() throws Exception {
 		// @RestMethod(roleGuard="foo && bar")
-		b2e.get().roles("foo","bar").run().assertStatus().equals(200);
-		b2e.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b2e.get().roles("foo","bar").run().assertStatus().is(200);
+		b2e.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b02j_andsWithDoubleAmp_fail() throws Exception {
 		// @RestMethod(roleGuard="foo && bar")
-		b2e.get().roles().run().assertStatus().equals(403);
-		b2e.get().roles("foo").run().assertStatus().equals(403);
-		b2e.get().roles("bar").run().assertStatus().equals(403);
-		b2e.get().roles("baz").run().assertStatus().equals(403);
+		b2e.get().roles().run().assertStatus().is(403);
+		b2e.get().roles("foo").run().assertStatus().is(403);
+		b2e.get().roles("bar").run().assertStatus().is(403);
+		b2e.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b02k_andsWithDoubleAmpAndParens_pass() throws Exception {
 		// @RestMethod(roleGuard="(foo) && (bar)")
-		b2f.get().roles("foo","bar").run().assertStatus().equals(200);
-		b2f.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b2f.get().roles("foo","bar").run().assertStatus().is(200);
+		b2f.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b02l_andsWithDoubleAmpAndParens_fail() throws Exception {
 		// @RestMethod(roleGuard="(foo) && (bar)")
-		b2f.get().roles().run().assertStatus().equals(403);
-		b2f.get().roles("foo").run().assertStatus().equals(403);
-		b2f.get().roles("bar").run().assertStatus().equals(403);
-		b2f.get().roles("baz").run().assertStatus().equals(403);
+		b2f.get().roles().run().assertStatus().is(403);
+		b2f.get().roles("foo").run().assertStatus().is(403);
+		b2f.get().roles("bar").run().assertStatus().is(403);
+		b2f.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b02m_complex_pass() throws Exception {
 		// @RestMethod(roleGuard="foo && (bar || baz)")
-		b2g.get().roles("foo","bar").run().assertStatus().equals(200);
-		b2g.get().roles("foo","baz").run().assertStatus().equals(200);
-		b2g.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b2g.get().roles("foo","bar").run().assertStatus().is(200);
+		b2g.get().roles("foo","baz").run().assertStatus().is(200);
+		b2g.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b02n_complex_fail() throws Exception {
 		// @RestMethod(roleGuard="foo && (bar || baz)")
-		b2g.get().roles().run().assertStatus().equals(403);
-		b2g.get().roles("foo").run().assertStatus().equals(403);
-		b2g.get().roles("bar","baz").run().assertStatus().equals(403);
-		b2g.get().roles("baz").run().assertStatus().equals(403);
+		b2g.get().roles().run().assertStatus().is(403);
+		b2g.get().roles("foo").run().assertStatus().is(403);
+		b2g.get().roles("bar","baz").run().assertStatus().is(403);
+		b2g.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void b02o_complex_pass() throws Exception {
 		// @RestMethod(roleGuard="foo || (bar && baz)")
-		b2h.get().roles("foo").run().assertStatus().equals(200);
-		b2h.get().roles("bar","baz").run().assertStatus().equals(200);
-		b2h.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		b2h.get().roles("foo").run().assertStatus().is(200);
+		b2h.get().roles("bar","baz").run().assertStatus().is(200);
+		b2h.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void b02p_complex_fail() throws Exception {
 		// @RestMethod(roleGuard="foo || (bar && baz)")
-		b2h.get().roles().run().assertStatus().equals(403);
-		b2h.get().roles("bar").run().assertStatus().equals(403);
-		b2h.get().roles("baz").run().assertStatus().equals(403);
+		b2h.get().roles().run().assertStatus().is(403);
+		b2h.get().roles("bar").run().assertStatus().is(403);
+		b2h.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -574,130 +574,130 @@ public class RoleGuardTest {
 	@Test
 	public void c01a_orPatternsWithComma_pass() throws Exception {
 		// @Rest(roleGuard="fo*,*ar")
-		c1a.get().roles("foo").run().assertStatus().equals(200);
-		c1a.get().roles("bar").run().assertStatus().equals(200);
-		c1a.get().roles("foo","bar").run().assertStatus().equals(200);
-		c1a.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c1a.get().roles("foo").run().assertStatus().is(200);
+		c1a.get().roles("bar").run().assertStatus().is(200);
+		c1a.get().roles("foo","bar").run().assertStatus().is(200);
+		c1a.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c01b_orPatternsWithComma_fail() throws Exception {
 		// @Rest(roleGuard="fo*,*ar")
-		c1a.get().roles().run().assertStatus().equals(403);
-		c1a.get().roles("baz").run().assertStatus().equals(403);
+		c1a.get().roles().run().assertStatus().is(403);
+		c1a.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c01c_orPatternsWithSinglePipe_pass() throws Exception {
 		// @Rest(roleGuard="fo* | *ar")
-		c1b.get().roles("foo").run().assertStatus().equals(200);
-		c1b.get().roles("bar").run().assertStatus().equals(200);
-		c1b.get().roles("foo","bar").run().assertStatus().equals(200);
-		c1b.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c1b.get().roles("foo").run().assertStatus().is(200);
+		c1b.get().roles("bar").run().assertStatus().is(200);
+		c1b.get().roles("foo","bar").run().assertStatus().is(200);
+		c1b.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c01d_orPatternsWithSinglePipe_fail() throws Exception {
 		// @Rest(roleGuard="fo* | *ar")
-		c1b.get().roles().run().assertStatus().equals(403);
-		c1b.get().roles("baz").run().assertStatus().equals(403);
+		c1b.get().roles().run().assertStatus().is(403);
+		c1b.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c01e_orPatternsWithDoublePipe_pass() throws Exception {
 		// @Rest(roleGuard="fo* || *ar")
-		c1c.get().roles("foo").run().assertStatus().equals(200);
-		c1c.get().roles("bar").run().assertStatus().equals(200);
-		c1c.get().roles("foo","bar").run().assertStatus().equals(200);
-		c1c.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c1c.get().roles("foo").run().assertStatus().is(200);
+		c1c.get().roles("bar").run().assertStatus().is(200);
+		c1c.get().roles("foo","bar").run().assertStatus().is(200);
+		c1c.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c01f_orPatternsWithDoublePipe_fail() throws Exception {
 		// @Rest(roleGuard="fo* || *ar")
-		c1c.get().roles().run().assertStatus().equals(403);
-		c1c.get().roles("baz").run().assertStatus().equals(403);
+		c1c.get().roles().run().assertStatus().is(403);
+		c1c.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c01g_andPatternsWithSingleAmp_pass() throws Exception {
 		// @Rest(roleGuard="fo* & *ar")
-		c1d.get().roles("foo","bar").run().assertStatus().equals(200);
-		c1d.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c1d.get().roles("foo","bar").run().assertStatus().is(200);
+		c1d.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c01h_andPatternsWithSingleAmp_fail() throws Exception {
 		// @Rest(roleGuard="fo* & *ar")
-		c1d.get().roles().run().assertStatus().equals(403);
-		c1d.get().roles("foo").run().assertStatus().equals(403);
-		c1d.get().roles("bar").run().assertStatus().equals(403);
-		c1d.get().roles("baz").run().assertStatus().equals(403);
+		c1d.get().roles().run().assertStatus().is(403);
+		c1d.get().roles("foo").run().assertStatus().is(403);
+		c1d.get().roles("bar").run().assertStatus().is(403);
+		c1d.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c01i_andPatternsWithDoubleAmp_pass() throws Exception {
 		// @Rest(roleGuard="fo* && *ar")
-		c1e.get().roles("foo","bar").run().assertStatus().equals(200);
-		c1e.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c1e.get().roles("foo","bar").run().assertStatus().is(200);
+		c1e.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c01j_andPatternsWithDoubleAmp_fail() throws Exception {
 		// @Rest(roleGuard="fo* && *ar")
-		c1e.get().roles().run().assertStatus().equals(403);
-		c1e.get().roles("foo").run().assertStatus().equals(403);
-		c1e.get().roles("bar").run().assertStatus().equals(403);
-		c1e.get().roles("baz").run().assertStatus().equals(403);
+		c1e.get().roles().run().assertStatus().is(403);
+		c1e.get().roles("foo").run().assertStatus().is(403);
+		c1e.get().roles("bar").run().assertStatus().is(403);
+		c1e.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c01k_andPatternsWithDoubleAmpAndParens_pass() throws Exception {
 		// @Rest(roleGuard="(fo*) && (*ar)")
-		c1f.get().roles("foo","bar").run().assertStatus().equals(200);
-		c1f.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c1f.get().roles("foo","bar").run().assertStatus().is(200);
+		c1f.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c01l_andPatternsWithDoubleAmpAndParens_fail() throws Exception {
 		// @Rest(roleGuard="(fo*) && (*ar)")
-		c1f.get().roles().run().assertStatus().equals(403);
-		c1f.get().roles("foo").run().assertStatus().equals(403);
-		c1f.get().roles("bar").run().assertStatus().equals(403);
-		c1f.get().roles("baz").run().assertStatus().equals(403);
+		c1f.get().roles().run().assertStatus().is(403);
+		c1f.get().roles("foo").run().assertStatus().is(403);
+		c1f.get().roles("bar").run().assertStatus().is(403);
+		c1f.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c01m_complexPatterns_pass() throws Exception {
 		// @Rest(roleGuard="fo* && (*ar || *az)")
-		c1g.get().roles("foo","bar").run().assertStatus().equals(200);
-		c1g.get().roles("foo","baz").run().assertStatus().equals(200);
-		c1g.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c1g.get().roles("foo","bar").run().assertStatus().is(200);
+		c1g.get().roles("foo","baz").run().assertStatus().is(200);
+		c1g.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c01n_complexPatterns_fail() throws Exception {
 		// @Rest(roleGuard="fo* && (*ar || *az)")
-		c1g.get().roles().run().assertStatus().equals(403);
-		c1g.get().roles("foo").run().assertStatus().equals(403);
-		c1g.get().roles("bar","baz").run().assertStatus().equals(403);
-		c1g.get().roles("baz").run().assertStatus().equals(403);
+		c1g.get().roles().run().assertStatus().is(403);
+		c1g.get().roles("foo").run().assertStatus().is(403);
+		c1g.get().roles("bar","baz").run().assertStatus().is(403);
+		c1g.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c01o_complexPatterns_pass() throws Exception {
 		// @Rest(roleGuard="fo* || (*ar && *az)")
-		c1h.get().roles("foo").run().assertStatus().equals(200);
-		c1h.get().roles("bar","baz").run().assertStatus().equals(200);
-		c1h.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c1h.get().roles("foo").run().assertStatus().is(200);
+		c1h.get().roles("bar","baz").run().assertStatus().is(200);
+		c1h.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c01p_complexPatterns_fail() throws Exception {
 		// @Rest(roleGuard="fo* || (*ar && *az)")
-		c1h.get().roles().run().assertStatus().equals(403);
-		c1h.get().roles("bar").run().assertStatus().equals(403);
-		c1h.get().roles("baz").run().assertStatus().equals(403);
+		c1h.get().roles().run().assertStatus().is(403);
+		c1h.get().roles("bar").run().assertStatus().is(403);
+		c1h.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -780,130 +780,130 @@ public class RoleGuardTest {
 	@Test
 	public void c02a_orPatternsWithComma_pass() throws Exception {
 		// @RestMethod(roleGuard="fo*,*ar")
-		c2a.get().roles("foo").run().assertStatus().equals(200);
-		c2a.get().roles("bar").run().assertStatus().equals(200);
-		c2a.get().roles("foo","bar").run().assertStatus().equals(200);
-		c2a.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c2a.get().roles("foo").run().assertStatus().is(200);
+		c2a.get().roles("bar").run().assertStatus().is(200);
+		c2a.get().roles("foo","bar").run().assertStatus().is(200);
+		c2a.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c02b_orPatternsWithComma_fail() throws Exception {
 		// @RestMethod(roleGuard="fo*,*ar")
-		c2a.get().roles().run().assertStatus().equals(403);
-		c2a.get().roles("baz").run().assertStatus().equals(403);
+		c2a.get().roles().run().assertStatus().is(403);
+		c2a.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c02c_orPatternsWithSinglePipe_pass() throws Exception {
 		// @RestMethod(roleGuard="fo* | *ar")
-		c2b.get().roles("foo").run().assertStatus().equals(200);
-		c2b.get().roles("bar").run().assertStatus().equals(200);
-		c2b.get().roles("foo","bar").run().assertStatus().equals(200);
-		c2b.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c2b.get().roles("foo").run().assertStatus().is(200);
+		c2b.get().roles("bar").run().assertStatus().is(200);
+		c2b.get().roles("foo","bar").run().assertStatus().is(200);
+		c2b.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c02d_orPatternsWithSinglePipe_fail() throws Exception {
 		// @RestMethod(roleGuard="fo* | *ar")
-		c2b.get().roles().run().assertStatus().equals(403);
-		c2b.get().roles("baz").run().assertStatus().equals(403);
+		c2b.get().roles().run().assertStatus().is(403);
+		c2b.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c02e_orPatternsWithDoublePipe_pass() throws Exception {
 		// @RestMethod(roleGuard="fo* || *ar")
-		c2c.get().roles("foo").run().assertStatus().equals(200);
-		c2c.get().roles("bar").run().assertStatus().equals(200);
-		c2c.get().roles("foo","bar").run().assertStatus().equals(200);
-		c2c.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c2c.get().roles("foo").run().assertStatus().is(200);
+		c2c.get().roles("bar").run().assertStatus().is(200);
+		c2c.get().roles("foo","bar").run().assertStatus().is(200);
+		c2c.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c02f_orPatternsWithDoublePipe_fail() throws Exception {
 		// @RestMethod(roleGuard="foo || bar")
-		c2c.get().roles().run().assertStatus().equals(403);
-		c2c.get().roles("baz").run().assertStatus().equals(403);
+		c2c.get().roles().run().assertStatus().is(403);
+		c2c.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c02g_andPatternsWithSingleAmp_pass() throws Exception {
 		// @RestMethod(roleGuard="fo* & *ar")
-		c2d.get().roles("foo","bar").run().assertStatus().equals(200);
-		c2d.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c2d.get().roles("foo","bar").run().assertStatus().is(200);
+		c2d.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c02h_andPatternsWithSingleAmp_fail() throws Exception {
 		// @RestMethod(roleGuard="fo* & *ar")
-		c2d.get().roles().run().assertStatus().equals(403);
-		c2d.get().roles("foo").run().assertStatus().equals(403);
-		c2d.get().roles("bar").run().assertStatus().equals(403);
-		c2d.get().roles("baz").run().assertStatus().equals(403);
+		c2d.get().roles().run().assertStatus().is(403);
+		c2d.get().roles("foo").run().assertStatus().is(403);
+		c2d.get().roles("bar").run().assertStatus().is(403);
+		c2d.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c02i_andPatternsWithDoubleAmp_pass() throws Exception {
 		// @RestMethod(roleGuard="fo* && *ar")
-		c2e.get().roles("foo","bar").run().assertStatus().equals(200);
-		c2e.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c2e.get().roles("foo","bar").run().assertStatus().is(200);
+		c2e.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c02j_andPatternsWithDoubleAmp_fail() throws Exception {
 		// @RestMethod(roleGuard="fo* && *ar")
-		c2e.get().roles().run().assertStatus().equals(403);
-		c2e.get().roles("foo").run().assertStatus().equals(403);
-		c2e.get().roles("bar").run().assertStatus().equals(403);
-		c2e.get().roles("baz").run().assertStatus().equals(403);
+		c2e.get().roles().run().assertStatus().is(403);
+		c2e.get().roles("foo").run().assertStatus().is(403);
+		c2e.get().roles("bar").run().assertStatus().is(403);
+		c2e.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c02k_andPatternsWithDoubleAmpAndParens_pass() throws Exception {
 		// @RestMethod(roleGuard="(fo*) && (*ar)")
-		c2f.get().roles("foo","bar").run().assertStatus().equals(200);
-		c2f.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c2f.get().roles("foo","bar").run().assertStatus().is(200);
+		c2f.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c02l_andPatternsWithDoubleAmpAndParens_fail() throws Exception {
 		// @RestMethod(roleGuard="(fo*) && (*ar)")
-		c2f.get().roles().run().assertStatus().equals(403);
-		c2f.get().roles("foo").run().assertStatus().equals(403);
-		c2f.get().roles("bar").run().assertStatus().equals(403);
-		c2f.get().roles("baz").run().assertStatus().equals(403);
+		c2f.get().roles().run().assertStatus().is(403);
+		c2f.get().roles("foo").run().assertStatus().is(403);
+		c2f.get().roles("bar").run().assertStatus().is(403);
+		c2f.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c02m_complexPatterns_pass() throws Exception {
 		// @RestMethod(roleGuard="fo* && (*ar || *az)")
-		c2g.get().roles("foo","bar").run().assertStatus().equals(200);
-		c2g.get().roles("foo","baz").run().assertStatus().equals(200);
-		c2g.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c2g.get().roles("foo","bar").run().assertStatus().is(200);
+		c2g.get().roles("foo","baz").run().assertStatus().is(200);
+		c2g.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c02n_complexPatterns_fail() throws Exception {
 		// @RestMethod(roleGuard="fo* && (*ar || *az)")
-		c2g.get().roles().run().assertStatus().equals(403);
-		c2g.get().roles("foo").run().assertStatus().equals(403);
-		c2g.get().roles("bar","baz").run().assertStatus().equals(403);
-		c2g.get().roles("baz").run().assertStatus().equals(403);
+		c2g.get().roles().run().assertStatus().is(403);
+		c2g.get().roles("foo").run().assertStatus().is(403);
+		c2g.get().roles("bar","baz").run().assertStatus().is(403);
+		c2g.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	@Test
 	public void c02o_complexPatterns_pass() throws Exception {
 		// @RestMethod(roleGuard="fo* || (*ar && *az)")
-		c2h.get().roles("foo").run().assertStatus().equals(200);
-		c2h.get().roles("bar","baz").run().assertStatus().equals(200);
-		c2h.get().roles("foo","bar","baz").run().assertStatus().equals(200);
+		c2h.get().roles("foo").run().assertStatus().is(200);
+		c2h.get().roles("bar","baz").run().assertStatus().is(200);
+		c2h.get().roles("foo","bar","baz").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void c02p_complexPatterns_fail() throws Exception {
 		// @RestMethod(roleGuard="fo* || (*ar && *az)")
-		c2h.get().roles().run().assertStatus().equals(403);
-		c2h.get().roles("bar").run().assertStatus().equals(403);
-		c2h.get().roles("baz").run().assertStatus().equals(403);
+		c2h.get().roles().run().assertStatus().is(403);
+		c2h.get().roles("bar").run().assertStatus().is(403);
+		c2h.get().roles("baz").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -923,11 +923,11 @@ public class RoleGuardTest {
 	@Test
 	public void d01_patternsWithoutRoles_fail() throws Exception {
 		// @RestMethod(roleGuard="fo*,*bar")
-		d.get().roles().run().assertStatus().equals(403);
-		d.get().roles("foo").run().assertStatus().equals(403);
-		d.get().roles("bar").run().assertStatus().equals(403);
-		d.get().roles("baz").run().assertStatus().equals(403);
-		d.get().roles("foo","bar").run().assertStatus().equals(403);
+		d.get().roles().run().assertStatus().is(403);
+		d.get().roles("foo").run().assertStatus().is(403);
+		d.get().roles("bar").run().assertStatus().is(403);
+		d.get().roles("baz").run().assertStatus().is(403);
+		d.get().roles("foo","bar").run().assertStatus().is(403);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -947,15 +947,15 @@ public class RoleGuardTest {
 	@Test
 	public void e01_anyRole_pass() throws Exception {
 		// @RestMethod(roleGuard="*")
-		e.get().roles("foo").run().assertStatus().equals(200);
-		e.get().roles("bar").run().assertStatus().equals(200);
-		e.get().roles("baz").run().assertStatus().equals(200);
-		e.get().roles("foo","bar").run().assertStatus().equals(200);
+		e.get().roles("foo").run().assertStatus().is(200);
+		e.get().roles("bar").run().assertStatus().is(200);
+		e.get().roles("baz").run().assertStatus().is(200);
+		e.get().roles("foo","bar").run().assertStatus().is(200);
 	}
 
 	@Test
 	public void e02_anyRole_fail() throws Exception {
 		// @RestMethod(roleGuard="*")
-		e.get().roles().run().assertStatus().equals(403);
+		e.get().roles().run().assertStatus().is(403);
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exceptions/BasicTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exceptions/BasicTest.java
index 92872ad..e7fd1fb 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exceptions/BasicTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/exceptions/BasicTest.java
@@ -73,135 +73,234 @@ public class BasicTest {
 
 	@Test
 	public void a01_badRequest() throws Exception {
-		a.get("/badRequest").run().assertStatus().equals(400).assertBody().is("Bad Request");
+		a.get("/badRequest")
+			.run()
+			.assertStatus().is(400)
+			.assertBody().is("Bad Request");
 	}
 	@Test
 	public void a02_conflict() throws Exception {
-		a.get("/conflict").run().assertStatus().equals(409).assertBody().is("Conflict");
+		a.get("/conflict")
+			.run()
+			.assertStatus().is(409)
+			.assertBody().is("Conflict");
 	}
 	@Test
 	public void a03_expectationFailed() throws Exception {
-		a.get("/expectationFailed").run().assertStatus().equals(417).assertBody().is("Expectation Failed");
+		a.get("/expectationFailed")
+			.run()
+			.assertStatus().is(417)
+			.assertBody().is("Expectation Failed");
 	}
 	@Test
 	public void a04_failedDependency() throws Exception {
-		a.get("/failedDependency").run().assertStatus().equals(424).assertBody().is("Failed Dependency");
+		a.get("/failedDependency")
+			.run()
+			.assertStatus().is(424)
+			.assertBody().is("Failed Dependency");
 	}
 	@Test
 	public void a05_forbidden() throws Exception {
-		a.get("/forbidden").run().assertStatus().equals(403).assertBody().is("Forbidden");
+		a.get("/forbidden")
+			.run()
+			.assertStatus().is(403)
+			.assertBody().is("Forbidden");
 	}
 	@Test
 	public void a06_gone() throws Exception {
-		a.get("/gone").run().assertStatus().equals(410).assertBody().is("Gone");
+		a.get("/gone")
+			.run()
+			.assertStatus().is(410)
+			.assertBody().is("Gone");
 	}
 	@Test
 	public void a07_httpVersionNotSupported() throws Exception {
-		a.get("/httpVersionNotSupported").run().assertStatus().equals(505).assertBody().is("HTTP Version Not Supported");
+		a.get("/httpVersionNotSupported")
+			.run()
+			.assertStatus().is(505)
+			.assertBody().is("HTTP Version Not Supported");
 	}
 	@Test
 	public void a08_insufficientStorage() throws Exception {
-		a.get("/insufficientStorage").run().assertStatus().equals(507).assertBody().is("Insufficient Storage");
+		a.get("/insufficientStorage")
+			.run()
+			.assertStatus().is(507)
+			.assertBody().is("Insufficient Storage");
 	}
 	@Test
 	public void a09_internalServerError() throws Exception {
-		a.get("/internalServerError").run().assertStatus().equals(500).assertBody().is("Internal Server Error");
+		a.get("/internalServerError")
+			.run()
+			.assertStatus().is(500)
+			.assertBody().is("Internal Server Error");
 	}
 	@Test
 	public void a10_lengthRequired() throws Exception {
-		a.get("/lengthRequired").run().assertStatus().equals(411).assertBody().is("Length Required");
+		a.get("/lengthRequired")
+			.run()
+			.assertStatus().is(411)
+			.assertBody().is("Length Required");
 	}
 	@Test
 	public void a11_locked() throws Exception {
-		a.get("/locked").run().assertStatus().equals(423).assertBody().is("Locked");
+		a.get("/locked")
+			.run()
+			.assertStatus().is(423)
+			.assertBody().is("Locked");
 	}
 	@Test
 	public void a12_loopDetected() throws Exception {
-		a.get("/loopDetected").run().assertStatus().equals(508).assertBody().is("Loop Detected");
+		a.get("/loopDetected")
+			.run()
+			.assertStatus().is(508)
+			.assertBody().is("Loop Detected");
 	}
 	@Test
 	public void a13_methodNotAllowed() throws Exception {
-		a.get("/methodNotAllowed").run().assertStatus().equals(405).assertBody().is("Method Not Allowed");
+		a.get("/methodNotAllowed")
+			.run()
+			.assertStatus().is(405)
+			.assertBody().is("Method Not Allowed");
 	}
 	@Test
 	public void a14_misdirectedRequest() throws Exception {
-		a.get("/misdirectedRequest").run().assertStatus().equals(421).assertBody().is("Misdirected Request");
+		a.get("/misdirectedRequest")
+			.run()
+			.assertStatus().is(421)
+			.assertBody().is("Misdirected Request");
 	}
 	@Test
 	public void a15_networkAuthenticationRequired() throws Exception {
-		a.get("/networkAuthenticationRequired").run().assertStatus().equals(511).assertBody().is("Network Authentication Required");
+		a.get("/networkAuthenticationRequired")
+			.run()
+			.assertStatus().is(511)
+			.assertBody().is("Network Authentication Required");
 	}
 	@Test
 	public void a16_notAcceptable() throws Exception {
-		a.get("/notAcceptable").run().assertStatus().equals(406).assertBody().is("Not Acceptable");
+		a.get("/notAcceptable")
+			.run()
+			.assertStatus().is(406)
+			.assertBody().is("Not Acceptable");
 	}
 	@Test
 	public void a17_notExtended() throws Exception {
-		a.get("/notExtended").run().assertStatus().equals(510).assertBody().is("Not Extended");
+		a.get("/notExtended")
+			.run()
+			.assertStatus().is(510)
+			.assertBody().is("Not Extended");
 	}
 	@Test
 	public void a18_notFound() throws Exception {
-		a.get("/notFound").run().assertStatus().equals(404).assertBody().is("Not Found");
+		a.get("/notFound")
+			.run()
+			.assertStatus().is(404)
+			.assertBody().is("Not Found");
 	}
 	@Test
 	public void a19_notImplemented() throws Exception {
-		a.get("/notImplemented").run().assertStatus().equals(501).assertBody().is("Not Implemented");
+		a.get("/notImplemented")
+			.run()
+			.assertStatus().is(501)
+			.assertBody().is("Not Implemented");
 	}
 	@Test
 	public void a20_payloadTooLarge() throws Exception {
-		a.get("/payloadTooLarge").run().assertStatus().equals(413).assertBody().is("Payload Too Large");
+		a.get("/payloadTooLarge")
+			.run()
+			.assertStatus().is(413)
+			.assertBody().is("Payload Too Large");
 	}
 	@Test
 	public void a21_preconditionFailed() throws Exception {
-		a.get("/preconditionFailed").run().assertStatus().equals(412).assertBody().is("Precondition Failed");
+		a.get("/preconditionFailed")
+			.run()
+			.assertStatus().is(412)
+			.assertBody().is("Precondition Failed");
 	}
 	@Test
 	public void a22_preconditionRequired() throws Exception {
-		a.get("/preconditionRequired").run().assertStatus().equals(428).assertBody().is("Precondition Required");
+		a.get("/preconditionRequired")
+			.run()
+			.assertStatus().is(428)
+			.assertBody().is("Precondition Required");
 	}
 	@Test
 	public void a23_rangeNotSatisfiable() throws Exception {
-		a.get("/rangeNotSatisfiable").run().assertStatus().equals(416).assertBody().is("Range Not Satisfiable");
+		a.get("/rangeNotSatisfiable")
+			.run()
+			.assertStatus().is(416)
+			.assertBody().is("Range Not Satisfiable");
 	}
 	@Test
 	public void a24_requestHeaderFieldsTooLarge() throws Exception {
-		a.get("/requestHeaderFieldsTooLarge").run().assertStatus().equals(431).assertBody().is("Request Header Fields Too Large");
+		a.get("/requestHeaderFieldsTooLarge")
+			.run()
+			.assertStatus().is(431)
+			.assertBody().is("Request Header Fields Too Large");
 	}
 	@Test
 	public void a25_serviceUnavailable() throws Exception {
-		a.get("/serviceUnavailable").run().assertStatus().equals(503).assertBody().is("Service Unavailable");
+		a.get("/serviceUnavailable")
+			.run()
+			.assertStatus().is(503)
+			.assertBody().is("Service Unavailable");
 	}
 	@Test
 	public void a26_tooManyRequests() throws Exception {
-		a.get("/tooManyRequests").run().assertStatus().equals(429).assertBody().is("Too Many Requests");
+		a.get("/tooManyRequests")
+			.run()
+			.assertStatus().is(429)
+			.assertBody().is("Too Many Requests");
 	}
 	@Test
 	public void a27_unauthorized() throws Exception {
-		a.get("/unauthorized").run().assertStatus().equals(401).assertBody().is("Unauthorized");
+		a.get("/unauthorized")
+			.run()
+			.assertStatus().is(401)
+			.assertBody().is("Unauthorized");
 	}
 	@Test
 	public void a28_unavailableForLegalReasons() throws Exception {
-		a.get("/unavailableForLegalReasons").run().assertStatus().equals(451).assertBody().is("Unavailable For Legal Reasons");
+		a.get("/unavailableForLegalReasons")
+			.run()
+			.assertStatus().is(451)
+			.assertBody().is("Unavailable For Legal Reasons");
 	}
 	@Test
 	public void a29_unprocessableEntity() throws Exception {
-		a.get("/unprocessableEntity").run().assertStatus().equals(422).assertBody().is("Unprocessable Entity");
+		a.get("/unprocessableEntity")
+			.run()
+			.assertStatus().is(422)
+			.assertBody().is("Unprocessable Entity");
 	}
 	@Test
 	public void a30_unsupportedMediaType() throws Exception {
-		a.get("/unsupportedMediaType").run().assertStatus().equals(415).assertBody().is("Unsupported Media Type");
+		a.get("/unsupportedMediaType")
+			.run()
+			.assertStatus().is(415)
+			.assertBody().is("Unsupported Media Type");
 	}
 	@Test
 	public void a31_upgradeRequired() throws Exception {
-		a.get("/upgradeRequired").run().assertStatus().equals(426).assertBody().is("Upgrade Required");
+		a.get("/upgradeRequired")
+			.run()
+			.assertStatus().is(426)
+			.assertBody().is("Upgrade Required");
 	}
 	@Test
 	public void a32_uriTooLong() throws Exception {
-		a.get("/uriTooLong").run().assertStatus().equals(414).assertBody().is("URI Too Long");
+		a.get("/uriTooLong")
+			.run()
+			.assertStatus().is(414)
+			.assertBody().is("URI Too Long");
 	}
 	@Test
 	public void a33_variantAlsoNegotiates() throws Exception {
-		a.get("/variantAlsoNegotiates").run().assertStatus().equals(506).assertBody().is("Variant Also Negotiates");
+		a.get("/variantAlsoNegotiates")
+			.run()
+			.assertStatus().is(506)
+			.assertBody().is("Variant Also Negotiates");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -249,135 +348,234 @@ public class BasicTest {
 
 	@Test
 	public void b01_badRequest() throws Exception {
-		b.get("/badRequest").run().assertStatus().equals(400).assertBody().is("foo bar");
+		b.get("/badRequest")
+			.run()
+			.assertStatus().is(400)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b02_conflict() throws Exception {
-		b.get("/conflict").run().assertStatus().equals(409).assertBody().is("foo bar");
+		b.get("/conflict")
+			.run()
+			.assertStatus().is(409)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b03_expectationFailed() throws Exception {
-		b.get("/expectationFailed").run().assertStatus().equals(417).assertBody().is("foo bar");
+		b.get("/expectationFailed")
+			.run()
+			.assertStatus().is(417)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b04_failedDependency() throws Exception {
-		b.get("/failedDependency").run().assertStatus().equals(424).assertBody().is("foo bar");
+		b.get("/failedDependency")
+			.run()
+			.assertStatus().is(424)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b05_forbidden() throws Exception {
-		b.get("/forbidden").run().assertStatus().equals(403).assertBody().is("foo bar");
+		b.get("/forbidden")
+			.run()
+			.assertStatus().is(403)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b06_gone() throws Exception {
-		b.get("/gone").run().assertStatus().equals(410).assertBody().is("foo bar");
+		b.get("/gone")
+			.run()
+			.assertStatus().is(410)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b07_httpVersionNotSupported() throws Exception {
-		b.get("/httpVersionNotSupported").run().assertStatus().equals(505).assertBody().is("foo bar");
+		b.get("/httpVersionNotSupported")
+			.run()
+			.assertStatus().is(505)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b08_insufficientStorage() throws Exception {
-		b.get("/insufficientStorage").run().assertStatus().equals(507).assertBody().is("foo bar");
+		b.get("/insufficientStorage")
+			.run()
+			.assertStatus().is(507)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b09_internalServerError() throws Exception {
-		b.get("/internalServerError").run().assertStatus().equals(500).assertBody().is("foo bar");
+		b.get("/internalServerError")
+			.run()
+			.assertStatus().is(500)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b10_lengthRequired() throws Exception {
-		b.get("/lengthRequired").run().assertStatus().equals(411).assertBody().is("foo bar");
+		b.get("/lengthRequired")
+			.run()
+			.assertStatus().is(411)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b11_locked() throws Exception {
-		b.get("/locked").run().assertStatus().equals(423).assertBody().is("foo bar");
+		b.get("/locked")
+			.run()
+			.assertStatus().is(423)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b12_loopDetected() throws Exception {
-		b.get("/loopDetected").run().assertStatus().equals(508).assertBody().is("foo bar");
+		b.get("/loopDetected")
+			.run()
+			.assertStatus().is(508)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b13_methodNotAllowed() throws Exception {
-		b.get("/methodNotAllowed").run().assertStatus().equals(405).assertBody().is("foo bar");
+		b.get("/methodNotAllowed")
+			.run()
+			.assertStatus().is(405)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b14_misdirectedRequest() throws Exception {
-		b.get("/misdirectedRequest").run().assertStatus().equals(421).assertBody().is("foo bar");
+		b.get("/misdirectedRequest")
+			.run()
+			.assertStatus().is(421)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b15_networkAuthenticationRequired() throws Exception {
-		b.get("/networkAuthenticationRequired").run().assertStatus().equals(511).assertBody().is("foo bar");
+		b.get("/networkAuthenticationRequired")
+			.run()
+			.assertStatus().is(511)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b16_notAcceptable() throws Exception {
-		b.get("/notAcceptable").run().assertStatus().equals(406).assertBody().is("foo bar");
+		b.get("/notAcceptable")
+			.run()
+			.assertStatus().is(406)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b17_notExtended() throws Exception {
-		b.get("/notExtended").run().assertStatus().equals(510).assertBody().is("foo bar");
+		b.get("/notExtended")
+			.run()
+			.assertStatus().is(510)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b18_notFound() throws Exception {
-		b.get("/notFound").run().assertStatus().equals(404).assertBody().is("foo bar");
+		b.get("/notFound")
+			.run()
+			.assertStatus().is(404)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b19_notImplemented() throws Exception {
-		b.get("/notImplemented").run().assertStatus().equals(501).assertBody().is("foo bar");
+		b.get("/notImplemented")
+			.run()
+			.assertStatus().is(501)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b20_payloadTooLarge() throws Exception {
-		b.get("/payloadTooLarge").run().assertStatus().equals(413).assertBody().is("foo bar");
+		b.get("/payloadTooLarge")
+			.run()
+			.assertStatus().is(413)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b21_preconditionFailed() throws Exception {
-		b.get("/preconditionFailed").run().assertStatus().equals(412).assertBody().is("foo bar");
+		b.get("/preconditionFailed")
+			.run()
+			.assertStatus().is(412)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b22_preconditionRequired() throws Exception {
-		b.get("/preconditionRequired").run().assertStatus().equals(428).assertBody().is("foo bar");
+		b.get("/preconditionRequired")
+			.run()
+			.assertStatus().is(428)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b23_rangeNotSatisfiable() throws Exception {
-		b.get("/rangeNotSatisfiable").run().assertStatus().equals(416).assertBody().is("foo bar");
+		b.get("/rangeNotSatisfiable")
+			.run()
+			.assertStatus().is(416)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b24_requestHeaderFieldsTooLarge() throws Exception {
-		b.get("/requestHeaderFieldsTooLarge").run().assertStatus().equals(431).assertBody().is("foo bar");
+		b.get("/requestHeaderFieldsTooLarge")
+			.run()
+			.assertStatus().is(431)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b25_serviceUnavailable() throws Exception {
-		b.get("/serviceUnavailable").run().assertStatus().equals(503).assertBody().is("foo bar");
+		b.get("/serviceUnavailable")
+			.run()
+			.assertStatus().is(503)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b26_tooManyRequests() throws Exception {
-		b.get("/tooManyRequests").run().assertStatus().equals(429).assertBody().is("foo bar");
+		b.get("/tooManyRequests")
+			.run()
+			.assertStatus().is(429)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b27_unauthorized() throws Exception {
-		b.get("/unauthorized").run().assertStatus().equals(401).assertBody().is("foo bar");
+		b.get("/unauthorized")
+			.run()
+			.assertStatus().is(401)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b28_unavailableForLegalReasons() throws Exception {
-		b.get("/unavailableForLegalReasons").run().assertStatus().equals(451).assertBody().is("foo bar");
+		b.get("/unavailableForLegalReasons")
+			.run()
+			.assertStatus().is(451)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b29_unprocessableEntity() throws Exception {
-		b.get("/unprocessableEntity").run().assertStatus().equals(422).assertBody().is("foo bar");
+		b.get("/unprocessableEntity")
+			.run()
+			.assertStatus().is(422)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b30_unsupportedMediaType() throws Exception {
-		b.get("/unsupportedMediaType").run().assertStatus().equals(415).assertBody().is("foo bar");
+		b.get("/unsupportedMediaType")
+			.run()
+			.assertStatus().is(415)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b31_upgradeRequired() throws Exception {
-		b.get("/upgradeRequired").run().assertStatus().equals(426).assertBody().is("foo bar");
+		b.get("/upgradeRequired")
+			.run()
+			.assertStatus().is(426)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b32_uriTooLong() throws Exception {
-		b.get("/uriTooLong").run().assertStatus().equals(414).assertBody().is("foo bar");
+		b.get("/uriTooLong")
+			.run()
+			.assertStatus().is(414)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void b33_variantAlsoNegotiates() throws Exception {
-		b.get("/variantAlsoNegotiates").run().assertStatus().equals(506).assertBody().is("foo bar");
+		b.get("/variantAlsoNegotiates")
+			.run()
+			.assertStatus().is(506)
+			.assertBody().is("foo bar");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -427,135 +625,234 @@ public class BasicTest {
 
 	@Test
 	public void c01_badRequest() throws Exception {
-		c.get("/badRequest").run().assertStatus().equals(400).assertBody().is("foo");
+		c.get("/badRequest")
+			.run()
+			.assertStatus().is(400)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c02_conflict() throws Exception {
-		c.get("/conflict").run().assertStatus().equals(409).assertBody().is("foo");
+		c.get("/conflict")
+			.run()
+			.assertStatus().is(409)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c03_expectationFailed() throws Exception {
-		c.get("/expectationFailed").run().assertStatus().equals(417).assertBody().is("foo");
+		c.get("/expectationFailed")
+			.run()
+			.assertStatus().is(417)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c04_failedDependency() throws Exception {
-		c.get("/failedDependency").run().assertStatus().equals(424).assertBody().is("foo");
+		c.get("/failedDependency")
+			.run()
+			.assertStatus().is(424)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c05_forbidden() throws Exception {
-		c.get("/forbidden").run().assertStatus().equals(403).assertBody().is("foo");
+		c.get("/forbidden")
+			.run()
+			.assertStatus().is(403)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c06_gone() throws Exception {
-		c.get("/gone").run().assertStatus().equals(410).assertBody().is("foo");
+		c.get("/gone")
+			.run()
+			.assertStatus().is(410)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c07_httpVersionNotSupported() throws Exception {
-		c.get("/httpVersionNotSupported").run().assertStatus().equals(505).assertBody().is("foo");
+		c.get("/httpVersionNotSupported")
+			.run()
+			.assertStatus().is(505)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c08_insufficientStorage() throws Exception {
-		c.get("/insufficientStorage").run().assertStatus().equals(507).assertBody().is("foo");
+		c.get("/insufficientStorage")
+			.run()
+			.assertStatus().is(507)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c09_internalServerError() throws Exception {
-		c.get("/internalServerError").run().assertStatus().equals(500).assertBody().is("foo");
+		c.get("/internalServerError")
+			.run()
+			.assertStatus().is(500)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c10_lengthRequired() throws Exception {
-		c.get("/lengthRequired").run().assertStatus().equals(411).assertBody().is("foo");
+		c.get("/lengthRequired")
+			.run()
+			.assertStatus().is(411)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c11_locked() throws Exception {
-		c.get("/locked").run().assertStatus().equals(423).assertBody().is("foo");
+		c.get("/locked")
+			.run()
+			.assertStatus().is(423)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c12_loopDetected() throws Exception {
-		c.get("/loopDetected").run().assertStatus().equals(508).assertBody().is("foo");
+		c.get("/loopDetected")
+			.run()
+			.assertStatus().is(508)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c13_methodNotAllowed() throws Exception {
-		c.get("/methodNotAllowed").run().assertStatus().equals(405).assertBody().is("foo");
+		c.get("/methodNotAllowed")
+			.run()
+			.assertStatus().is(405)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c14_misdirectedRequest() throws Exception {
-		c.get("/misdirectedRequest").run().assertStatus().equals(421).assertBody().is("foo");
+		c.get("/misdirectedRequest")
+			.run()
+			.assertStatus().is(421)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c15_networkAuthenticationRequired() throws Exception {
-		c.get("/networkAuthenticationRequired").run().assertStatus().equals(511).assertBody().is("foo");
+		c.get("/networkAuthenticationRequired")
+			.run()
+			.assertStatus().is(511)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c16_notAcceptable() throws Exception {
-		c.get("/notAcceptable").run().assertStatus().equals(406).assertBody().is("foo");
+		c.get("/notAcceptable")
+			.run()
+			.assertStatus().is(406)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c17_notExtended() throws Exception {
-		c.get("/notExtended").run().assertStatus().equals(510).assertBody().is("foo");
+		c.get("/notExtended")
+			.run()
+			.assertStatus().is(510)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c18_notFound() throws Exception {
-		c.get("/notFound").run().assertStatus().equals(404).assertBody().is("foo");
+		c.get("/notFound")
+			.run()
+			.assertStatus().is(404)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c19_notImplemented() throws Exception {
-		c.get("/notImplemented").run().assertStatus().equals(501).assertBody().is("foo");
+		c.get("/notImplemented")
+			.run()
+			.assertStatus().is(501)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c20_payloadTooLarge() throws Exception {
-		c.get("/payloadTooLarge").run().assertStatus().equals(413).assertBody().is("foo");
+		c.get("/payloadTooLarge")
+			.run()
+			.assertStatus().is(413)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c21_preconditionFailed() throws Exception {
-		c.get("/preconditionFailed").run().assertStatus().equals(412).assertBody().is("foo");
+		c.get("/preconditionFailed").
+			run()
+			.assertStatus().is(412)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c22_preconditionRequired() throws Exception {
-		c.get("/preconditionRequired").run().assertStatus().equals(428).assertBody().is("foo");
+		c.get("/preconditionRequired")
+			.run()
+			.assertStatus().is(428)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c23_rangeNotSatisfiable() throws Exception {
-		c.get("/rangeNotSatisfiable").run().assertStatus().equals(416).assertBody().is("foo");
+		c.get("/rangeNotSatisfiable")
+			.run()
+			.assertStatus().is(416)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c24_requestHeaderFieldsTooLarge() throws Exception {
-		c.get("/requestHeaderFieldsTooLarge").run().assertStatus().equals(431).assertBody().is("foo");
+		c.get("/requestHeaderFieldsTooLarge")
+			.run()
+			.assertStatus().is(431)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c25_serviceUnavailable() throws Exception {
-		c.get("/serviceUnavailable").run().assertStatus().equals(503).assertBody().is("foo");
+		c.get("/serviceUnavailable")
+			.run()
+			.assertStatus().is(503)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c26_tooManyRequests() throws Exception {
-		c.get("/tooManyRequests").run().assertStatus().equals(429).assertBody().is("foo");
+		c.get("/tooManyRequests")
+			.run()
+			.assertStatus().is(429)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c27_unauthorized() throws Exception {
-		c.get("/unauthorized").run().assertStatus().equals(401).assertBody().is("foo");
+		c.get("/unauthorized")
+			.run()
+			.assertStatus().is(401)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c28_unavailableForLegalReasons() throws Exception {
-		c.get("/unavailableForLegalReasons").run().assertStatus().equals(451).assertBody().is("foo");
+		c.get("/unavailableForLegalReasons")
+			.run()
+			.assertStatus().is(451)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c29_unprocessableEntity() throws Exception {
-		c.get("/unprocessableEntity").run().assertStatus().equals(422).assertBody().is("foo");
+		c.get("/unprocessableEntity")
+			.run()
+			.assertStatus().is(422)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c30_unsupportedMediaType() throws Exception {
-		c.get("/unsupportedMediaType").run().assertStatus().equals(415).assertBody().is("foo");
+		c.get("/unsupportedMediaType")
+			.run()
+			.assertStatus().is(415)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c31_upgradeRequired() throws Exception {
-		c.get("/upgradeRequired").run().assertStatus().equals(426).assertBody().is("foo");
+		c.get("/upgradeRequired")
+			.run()
+			.assertStatus().is(426)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c32_uriTooLong() throws Exception {
-		c.get("/uriTooLong").run().assertStatus().equals(414).assertBody().is("foo");
+		c.get("/uriTooLong")
+			.run()
+			.assertStatus().is(414)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c33_variantAlsoNegotiates() throws Exception {
-		c.get("/variantAlsoNegotiates").run().assertStatus().equals(506).assertBody().is("foo");
+		c.get("/variantAlsoNegotiates")
+			.run()
+			.assertStatus().is(506)
+			.assertBody().is("foo");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -603,135 +900,234 @@ public class BasicTest {
 
 	@Test
 	public void d01_badRequest() throws Exception {
-		d.get("/badRequest").run().assertStatus().equals(400).assertBody().is("foo bar");
+		d.get("/badRequest")
+			.run()
+			.assertStatus().is(400)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d02_conflict() throws Exception {
-		d.get("/conflict").run().assertStatus().equals(409).assertBody().is("foo bar");
+		d.get("/conflict")
+			.run()
+			.assertStatus().is(409)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d03_expectationFailed() throws Exception {
-		d.get("/expectationFailed").run().assertStatus().equals(417).assertBody().is("foo bar");
+		d.get("/expectationFailed")
+			.run()
+			.assertStatus().is(417)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d04_failedDependency() throws Exception {
-		d.get("/failedDependency").run().assertStatus().equals(424).assertBody().is("foo bar");
+		d.get("/failedDependency")
+			.run()
+			.assertStatus().is(424)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d05_forbidden() throws Exception {
-		d.get("/forbidden").run().assertStatus().equals(403).assertBody().is("foo bar");
+		d.get("/forbidden")
+			.run()
+			.assertStatus().is(403)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d06_gone() throws Exception {
-		d.get("/gone").run().assertStatus().equals(410).assertBody().is("foo bar");
+		d.get("/gone")
+			.run()
+			.assertStatus().is(410)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d07_httpVersionNotSupported() throws Exception {
-		d.get("/httpVersionNotSupported").run().assertStatus().equals(505).assertBody().is("foo bar");
+		d.get("/httpVersionNotSupported")
+			.run()
+			.assertStatus().is(505)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d08_insufficientStorage() throws Exception {
-		d.get("/insufficientStorage").run().assertStatus().equals(507).assertBody().is("foo bar");
+		d.get("/insufficientStorage")
+			.run()
+			.assertStatus().is(507)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d09_internalServerError() throws Exception {
-		d.get("/internalServerError").run().assertStatus().equals(500).assertBody().is("foo bar");
+		d.get("/internalServerError")
+			.run()
+			.assertStatus().is(500)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d10_lengthRequired() throws Exception {
-		d.get("/lengthRequired").run().assertStatus().equals(411).assertBody().is("foo bar");
+		d.get("/lengthRequired")
+			.run()
+			.assertStatus().is(411)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d11_locked() throws Exception {
-		d.get("/locked").run().assertStatus().equals(423).assertBody().is("foo bar");
+		d.get("/locked")
+			.run()
+			.assertStatus().is(423)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d12_loopDetected() throws Exception {
-		d.get("/loopDetected").run().assertStatus().equals(508).assertBody().is("foo bar");
+		d.get("/loopDetected")
+			.run()
+			.assertStatus().is(508)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d13_methodNotAllowed() throws Exception {
-		d.get("/methodNotAllowed").run().assertStatus().equals(405).assertBody().is("foo bar");
+		d.get("/methodNotAllowed")
+			.run()
+			.assertStatus().is(405)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d14_misdirectedRequest() throws Exception {
-		d.get("/misdirectedRequest").run().assertStatus().equals(421).assertBody().is("foo bar");
+		d.get("/misdirectedRequest")
+			.run()
+			.assertStatus().is(421)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d15_networkAuthenticationRequired() throws Exception {
-		d.get("/networkAuthenticationRequired").run().assertStatus().equals(511).assertBody().is("foo bar");
+		d.get("/networkAuthenticationRequired")
+			.run()
+			.assertStatus().is(511)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d16_notAcceptable() throws Exception {
-		d.get("/notAcceptable").run().assertStatus().equals(406).assertBody().is("foo bar");
+		d.get("/notAcceptable")
+			.run()
+			.assertStatus().is(406)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d17_notExtended() throws Exception {
-		d.get("/notExtended").run().assertStatus().equals(510).assertBody().is("foo bar");
+		d.get("/notExtended")
+			.run()
+			.assertStatus().is(510)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d18_notFound() throws Exception {
-		d.get("/notFound").run().assertStatus().equals(404).assertBody().is("foo bar");
+		d.get("/notFound")
+			.run()
+			.assertStatus().is(404)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d19_notImplemented() throws Exception {
-		d.get("/notImplemented").run().assertStatus().equals(501).assertBody().is("foo bar");
+		d.get("/notImplemented")
+			.run()
+			.assertStatus().is(501)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d20_payloadTooLarge() throws Exception {
-		d.get("/payloadTooLarge").run().assertStatus().equals(413).assertBody().is("foo bar");
+		d.get("/payloadTooLarge")
+			.run()
+			.assertStatus().is(413)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d21_preconditionFailed() throws Exception {
-		d.get("/preconditionFailed").run().assertStatus().equals(412).assertBody().is("foo bar");
+		d.get("/preconditionFailed")
+			.run()
+			.assertStatus().is(412)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d22_preconditionRequired() throws Exception {
-		d.get("/preconditionRequired").run().assertStatus().equals(428).assertBody().is("foo bar");
+		d.get("/preconditionRequired")
+			.run()
+			.assertStatus().is(428)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d23_rangeNotSatisfiable() throws Exception {
-		d.get("/rangeNotSatisfiable").run().assertStatus().equals(416).assertBody().is("foo bar");
+		d.get("/rangeNotSatisfiable")
+			.run()
+			.assertStatus().is(416)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d24_requestHeaderFieldsTooLarge() throws Exception {
-		d.get("/requestHeaderFieldsTooLarge").run().assertStatus().equals(431).assertBody().is("foo bar");
+		d.get("/requestHeaderFieldsTooLarge")
+			.run()
+			.assertStatus().is(431)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d25_serviceUnavailable() throws Exception {
-		d.get("/serviceUnavailable").run().assertStatus().equals(503).assertBody().is("foo bar");
+		d.get("/serviceUnavailable")
+			.run()
+			.assertStatus().is(503)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d26_tooManyRequests() throws Exception {
-		d.get("/tooManyRequests").run().assertStatus().equals(429).assertBody().is("foo bar");
+		d.get("/tooManyRequests")
+			.run()
+			.assertStatus().is(429)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d27_unauthorized() throws Exception {
-		d.get("/unauthorized").run().assertStatus().equals(401).assertBody().is("foo bar");
+		d.get("/unauthorized")
+			.run()
+			.assertStatus().is(401)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d28_unavailableForLegalReasons() throws Exception {
-		d.get("/unavailableForLegalReasons").run().assertStatus().equals(451).assertBody().is("foo bar");
+		d.get("/unavailableForLegalReasons")
+			.run()
+			.assertStatus().is(451)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d29_unprocessableEntity() throws Exception {
-		d.get("/unprocessableEntity").run().assertStatus().equals(422).assertBody().is("foo bar");
+		d.get("/unprocessableEntity")
+			.run()
+			.assertStatus().is(422)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d30_unsupportedMediaType() throws Exception {
-		d.get("/unsupportedMediaType").run().assertStatus().equals(415).assertBody().is("foo bar");
+		d.get("/unsupportedMediaType")
+			.run()
+			.assertStatus().is(415)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d31_upgradeRequired() throws Exception {
-		d.get("/upgradeRequired").run().assertStatus().equals(426).assertBody().is("foo bar");
+		d.get("/upgradeRequired")
+			.run()
+			.assertStatus().is(426)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d32_uriTooLong() throws Exception {
-		d.get("/uriTooLong").run().assertStatus().equals(414).assertBody().is("foo bar");
+		d.get("/uriTooLong")
+			.run()
+			.assertStatus().is(414)
+			.assertBody().is("foo bar");
 	}
 	@Test
 	public void d33_variantAlsoNegotiates() throws Exception {
-		d.get("/variantAlsoNegotiates").run().assertStatus().equals(506).assertBody().is("foo bar");
+		d.get("/variantAlsoNegotiates")
+			.run()
+			.assertStatus().is(506)
+			.assertBody().is("foo bar");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -747,7 +1143,11 @@ public class BasicTest {
 
 	@Test
 	public void e01_badRequest() throws Exception {
-		e.get("/badRequest").json().run().assertStatus().equals(400).assertBody().is("'foo bar'");
+		e.get("/badRequest")
+			.json()
+			.run()
+			.assertStatus().is(400)
+			.assertBody().is("'foo bar'");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -973,7 +1373,9 @@ public class BasicTest {
 
 	@Test
 	public void g01_thrownObjectDoesntMatchReturnType() throws Exception {
-		g.get("/thrownObjectDoesntMatchReturnType").run().assertStatus().equals(404);
+		g.get("/thrownObjectDoesntMatchReturnType")
+			.run()
+			.assertStatus().is(404);
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -992,6 +1394,8 @@ public class BasicTest {
 
 	@Test
 	public void h01_parseExceptionCausesBadRequest() throws Exception {
-		h.get("/foo").run().assertStatus().equals(400);
+		h.get("/foo")
+			.run()
+			.assertStatus().is(400);
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java
index ed6d254..401fdd0 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java
@@ -109,7 +109,7 @@ public class AcceptCharsetTest {
 	public void b01_testCharsetOnResponse() throws Exception {
 		b.put("/charsetOnResponse", null).plainText().run().assertBody().is("UTF-8/UTF-8");
 		b.put("/charsetOnResponse", null).plainText().acceptCharset("Shift_JIS").run().assertBody().is("UTF-8/Shift_JIS");
-		b.put("/charsetOnResponse?noTrace=true", null).plainText().acceptCharset("BAD").run().assertStatus().equals(406).assertBody().contains("No supported charsets in header 'Accept-Charset': 'BAD'");
+		b.put("/charsetOnResponse?noTrace=true", null).plainText().acceptCharset("BAD").run().assertStatus().is(406).assertBody().contains("No supported charsets in header 'Accept-Charset': 'BAD'");
 		b.put("/charsetOnResponse", null).plainText().acceptCharset("UTF-8").run().assertBody().is("UTF-8/UTF-8");
 		b.put("/charsetOnResponse", null).plainText().acceptCharset("bad,iso-8859-1").run().assertBody().is("UTF-8/ISO-8859-1");
 		b.put("/charsetOnResponse", null).plainText().acceptCharset("bad;q=0.9,iso-8859-1;q=0.1").run().assertBody().is("UTF-8/ISO-8859-1");
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java
index 1a99733..193bb91 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java
@@ -72,37 +72,37 @@ public class AcceptEncodingTest {
 	@Test
 	public void a03_noCompression_nomatch() throws Exception {
 		a.get("?noTrace=true").acceptEncoding("mycoding,identity;q=0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': 'mycoding,identity;q=0'",
 				"Supported codings: ['identity']"
 			);
 		a.get("?noTrace=true").acceptEncoding("mycoding,*;q=0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': 'mycoding,*;q=0'",
 				"Supported codings: ['identity']"
 			);
 		a.get("?noTrace=true").acceptEncoding("identity;q=0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': 'identity;q=0'",
 				"Supported codings: ['identity']"
 			);
 		a.get("?noTrace=true").acceptEncoding("identity;q=0.0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': 'identity;q=0.0'",
 				"Supported codings: ['identity']"
 			);
 		a.get("?noTrace=true").acceptEncoding("*;q=0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': '*;q=0'",
 				"Supported codings: ['identity']"
 			);
 		a.get("?noTrace=true").acceptEncoding("*;q=0.0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': '*;q=0.0'",
 				"Supported codings: ['identity']"
@@ -134,38 +134,38 @@ public class AcceptEncodingTest {
 	}
 	@Test
 	public void b03_withCompression_gzip() throws Exception {
-		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("*").run().getBody()));
-		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding").run().getBody()));
+		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("*").run().getBody().asBytes()));
+		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding").run().getBody().asBytes()));
 	}
 	@Test
 	public void b04_withCompression_gzip_qValues() throws Exception {
-		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding,identity;q=0").run().getBody()));
-		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding,*;q=0").run().getBody()));
-		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding;q=0.8,identity;q=0.6").run().getBody()));
-		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding;q=0.8,*;q=0.6").run().getBody()));
+		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding,identity;q=0").run().getBody().asBytes()));
+		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding,*;q=0").run().getBody().asBytes()));
+		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding;q=0.8,identity;q=0.6").run().getBody().asBytes()));
+		assertEquals("foo", decompress(b.get("/b01").acceptEncoding("mycoding;q=0.8,*;q=0.6").run().getBody().asBytes()));
 	}
 	@Test
 	public void b05_withCompression_nomatch() throws Exception {
 		b.get("/b01?noTrace=true").acceptEncoding("identity;q=0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': 'identity;q=0'",
 				"Supported codings: ['mycoding','identity']"
 			);
 		b.get("/b01?noTrace=true").acceptEncoding("identity;q=0.0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': 'identity;q=0.0'",
 				"Supported codings: ['mycoding','identity']"
 			);
 		b.get("/b01?noTrace=true").acceptEncoding("*;q=0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': '*;q=0'",
 				"Supported codings: ['mycoding','identity']"
 			);
 		b.get("/b01?noTrace=true").acceptEncoding("*;q=0.0").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Accept-Encoding': '*;q=0.0'",
 				"Supported codings: ['mycoding','identity']"
@@ -240,11 +240,11 @@ public class AcceptEncodingTest {
 		byte[] body;
 		body = c.get("/c03").acceptEncoding("mycoding").run()
 			.assertHeader("Content-Encoding").doesNotExist() // Should not be set
-			.getBody();
+			.getBody().asBytes();
 		assertEquals("foo", decompress(body));
 		body = c.get("/c03").acceptEncoding("*").run()
 			.assertHeader("Content-Encoding").doesNotExist() // Should not be set
-			.getBody();
+			.getBody().asBytes();
 		assertEquals("foo", decompress(body));
 	}
 	@Test
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java
index bffde85..fa83287 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java
@@ -71,14 +71,26 @@ public class AcceptTest {
 
 	@Test
 	public void a01_defaultHeadersOnServletAnnotation_valid() throws Exception {
-		a.put("/a01", null).run().assertBody().is("s2");
-		a.put("/a01", null).accept("text/s1").run().assertBody().is("s1");
-		a.put("/a01", null).accept("text/s2").run().assertBody().is("s2");
+		a.put("/a01", null)
+			.run()
+			.assertBody().is("s2");
+		a.put("/a01", null)
+			.accept("text/s1")
+			.run()
+			.assertBody().is("s1");
+		a.put("/a01", null)
+			.accept("text/s2")
+			.run()
+			.assertBody().is("s2");
 	}
 
 	@Test
 	public void a02_defaultHeadersOnServletAnnotation_invalid() throws Exception {
-		a.put("/a01?noTrace=true", null).accept("text/s3").run().assertStatus().equals(406).assertBody().contains("Unsupported media-type in request header 'Accept': 'text/s3'");
+		a.put("/a01?noTrace=true", null)
+			.accept("text/s3")
+			.run()
+			.assertStatus().is(406)
+			.assertBody().contains("Unsupported media-type in request header 'Accept': 'text/s3'");
 	}
 
 	//=================================================================================================================
@@ -105,8 +117,10 @@ public class AcceptTest {
 
 	@Test
 	public void b02_restMethodWithParsersSerializers_invalid() throws Exception {
-		b.put("/b?noTrace=true", null).accept("text/s4").run()
-			.assertStatus().equals(406)
+		b.put("/b?noTrace=true", null)
+			.accept("text/s4")
+			.run()
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Accept': 'text/s4'",
 				"Supported media-types: ['text/s3']"
@@ -132,16 +146,29 @@ public class AcceptTest {
 
 	@Test
 	public void c01_restMethodAddParsersSerializersInherit() throws Exception {
-		c.put("/c", null).run().assertBody().is("s2");
-		c.put("/c", null).accept("text/s1").run().assertBody().is("s1");
-		c.put("/c", null).accept("text/s2").run().assertBody().is("s2");
-		c.put("/c", null).accept("text/s3").run().assertBody().is("s3");
+		c.put("/c", null)
+			.run()
+			.assertBody().is("s2");
+		c.put("/c", null)
+			.accept("text/s1")
+			.run()
+			.assertBody().is("s1");
+		c.put("/c", null)
+			.accept("text/s2")
+			.run()
+			.assertBody().is("s2");
+		c.put("/c", null)
+			.accept("text/s3")
+			.run()
+			.assertBody().is("s3");
 	}
 
 	@Test
 	public void c02_restMethodAddParsersSerializersInherit_invalid() throws Exception {
-		c.put("/c?noTrace=true", null).accept("text/s4").run()
-			.assertStatus().equals(406)
+		c.put("/c?noTrace=true", null)
+			.accept("text/s4")
+			.run()
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Accept': 'text/s4'",
 				"Supported media-types: ['text/s3','text/s1','text/s2']"
@@ -177,8 +204,10 @@ public class AcceptTest {
 	}
 	@Test
 	public void d02_accept_invalid() throws Exception {
-		d.put("/d?noTrace=true", null).accept("bad/*").run()
-			.assertStatus().equals(406)
+		d.put("/d?noTrace=true", null)
+			.accept("bad/*")
+			.run()
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Accept': 'bad/*'",
 				"Supported media-types: ['text/s1','text/s2']"
@@ -209,14 +238,16 @@ public class AcceptTest {
 	}
 	@Test
 	public void e02_restMethodParserSerializerAnnotations_invalid() throws Exception {
-		e.put("/d?noTrace=true", null).accept("text/s1").run()
-			.assertStatus().equals(406)
+		e.put("/d?noTrace=true", null)
+			.accept("text/s1")
+			.run()
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Accept': 'text/s1'",
 				"Supported media-types: ['text/s3']"
 			);
 		e.put("/d?noTrace=true", null).accept("text/s2").run()
-			.assertStatus().equals(406)
+			.assertStatus().is(406)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Accept': 'text/s2'",
 				"Supported media-types: ['text/s3']"
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java
index dc729b2..541c6e2 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java
@@ -58,7 +58,7 @@ public class ContentEncodingTest {
 	@Test
 	public void a02_noCompression_invalid() throws Exception {
 		a.put("?noTrace=true", compress("foo")).contentEncoding("mycoding").run()
-			.assertStatus().equals(415)
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported encoding in request header 'Content-Encoding': 'mycoding'",
 				"Supported codings: ['identity']"
@@ -80,13 +80,24 @@ public class ContentEncodingTest {
 
 	@Test
 	public void b01_withCompression_identity() throws Exception {
-		b.put("/", "foo").run().assertBody().is("foo");
-		b.put("/", "foo").contentEncoding("").run().assertBody().is("foo");
-		b.put("/", "foo").contentEncoding("identity").run().assertBody().is("foo");
+		b.put("/", "foo")
+			.run()
+			.assertBody().is("foo");
+		b.put("/", "foo")
+			.contentEncoding("")
+			.run()
+			.assertBody().is("foo");
+		b.put("/", "foo")
+			.contentEncoding("identity")
+			.run()
+			.assertBody().is("foo");
 	}
 	@Test
 	@Ignore
 	public void b02_withCompression_gzip() throws Exception {
-		b.put("/", compress("foo")).contentEncoding("mycoding").run().assertBody().is("foo");
+		b.put("/", compress("foo"))
+			.contentEncoding("mycoding")
+			.run()
+			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java
index 89a3c6b..e7916ea 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java
@@ -72,14 +72,24 @@ public class ContentTypeTest {
 
 	@Test
 	public void a01_defaultHeadersOnServletAnnotation_valid() throws Exception {
-		a.put("/a01", null).run().assertBody().is("p2");
-		a.put("/a01", null).contentType("text/p1").run().assertBody().is("p1");
-		a.put("/a01", null).contentType("text/p2").run().assertBody().is("p2");
+		a.put("/a01", null)
+			.run()
+			.assertBody().is("p2");
+		a.put("/a01", null).contentType("text/p1")
+			.run()
+			.assertBody().is("p1");
+		a.put("/a01", null).contentType("text/p2")
+			.run()
+			.assertBody().is("p2");
 	}
 
 	@Test
 	public void a02_defaultHeadersOnServletAnnotation_invalid() throws Exception {
-		a.put("/a01?noTrace=true", null).contentType("text/p3").run().assertStatus().equals(415).assertBody().contains("Unsupported media-type in request header 'Content-Type': 'text/p3'");
+		a.put("/a01?noTrace=true", null)
+			.contentType("text/p3")
+			.run()
+			.assertStatus().is(415)
+			.assertBody().contains("Unsupported media-type in request header 'Content-Type': 'text/p3'");
 	}
 
 	//=================================================================================================================
@@ -106,20 +116,23 @@ public class ContentTypeTest {
 
 	@Test
 	public void b02_restMethodWithParsersSerializers_invalid() throws Exception {
-		b.put("/b?noTrace=true", null).run()
-			.assertStatus().equals(415)
+		b.put("/b?noTrace=true", null)
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/p2'",
 				"Supported media-types: ['text/p3']"
 			);
-		b.put("/b?noTrace=true", null).contentType("text/p1").run()
-			.assertStatus().equals(415)
+		b.put("/b?noTrace=true", null).contentType("text/p1")
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/p1'",
 				"Supported media-types: ['text/p3']"
 			);
-		b.put("/b?noTrace=true", null).contentType("text/p2").run()
-			.assertStatus().equals(415)
+		b.put("/b?noTrace=true", null).contentType("text/p2")
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/p2'",
 				"Supported media-types: ['text/p3']"
@@ -153,8 +166,9 @@ public class ContentTypeTest {
 
 	@Test
 	public void c02_restMethodAddParsersSerializersInherit_invalid() throws Exception {
-		c.put("/c?noTrace=true", null).contentType("text/p4").run()
-			.assertStatus().equals(415)
+		c.put("/c?noTrace=true", null).contentType("text/p4")
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/p4'",
 				"Supported media-types: ['text/p3','text/p1','text/p2']"
@@ -180,19 +194,28 @@ public class ContentTypeTest {
 
 	@Test
 	public void e01_restMethodParserSerializerAnnotations_valid() throws Exception {
-		e.put("/e", null).run().assertBody().is("p3");
-		e.put("/e", null).contentType("text/p3").run().assertBody().is("p3");
+		e.put("/e", null)
+			.run()
+			.assertBody().is("p3");
+		e.put("/e", null)
+			.contentType("text/p3")
+			.run()
+			.assertBody().is("p3");
 	}
 	@Test
 	public void e02_restMethodParserSerializerAnnotations_invalid() throws Exception {
-		e.put("/e?noTrace=true", null).contentType("text/p1").run()
-			.assertStatus().equals(415)
+		e.put("/e?noTrace=true", null)
+			.contentType("text/p1")
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/p1'",
 				"Supported media-types: ['text/p3']"
 			);
-		e.put("/e?noTrace=true", null).contentType("text/p2").run()
-			.assertStatus().equals(415)
+		e.put("/e?noTrace=true", null)
+			.contentType("text/p2")
+			.run()
+			.assertStatus().is(415)
 			.assertBody().contains(
 				"Unsupported media-type in request header 'Content-Type': 'text/p2'",
 				"Supported media-types: ['text/p3']"
@@ -219,9 +242,20 @@ public class ContentTypeTest {
 
 	@Test
 	public void f01_restMethodAddParsersSerializersAnnotations_valid() throws Exception {
-		f.put("/f", null).run().assertBody().is("p3");
-		f.put("/f", null).contentType("text/p1").run().assertBody().is("p1");
-		f.put("/f", null).contentType("text/p2").run().assertBody().is("p2");
-		f.put("/f", null).contentType("text/p3").run().assertBody().is("p3");
+		f.put("/f", null)
+			.run()
+			.assertBody().is("p3");
+		f.put("/f", null)
+			.contentType("text/p1")
+			.run()
+			.assertBody().is("p1");
+		f.put("/f", null)
+			.contentType("text/p2")
+			.run()
+			.assertBody().is("p2");
+		f.put("/f", null)
+			.contentType("text/p3")
+			.run()
+			.assertBody().is("p3");
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/HyperlinkTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/HyperlinkTest.java
index b5b10e9..e494d81 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/HyperlinkTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/HyperlinkTest.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.helper;
 
-import static org.junit.Assert.*;
 import static org.junit.runners.MethodSorters.*;
 
 import java.util.*;
@@ -49,16 +48,25 @@ public class HyperlinkTest {
 
 	@Test
 	public void a01_basic() throws Exception {
-		assertEquals("<a href=\"/foo\">bar</a>", a.get("/a01").accept("text/html+stripped").run().getBodyAsString());
+		a.get("/a01")
+			.accept("text/html+stripped")
+			.run()
+			.assertBody().is("<a href=\"/foo\">bar</a>");
 	}
 
 	@Test
 	public void a02_array() throws Exception {
-		assertEquals("<ul><li><a href=\"/foo\">bar</a></li><li><a href=\"/foo\">bar</a></li></ul>", a.get("/a02").accept("text/html+stripped").run().getBodyAsString());
+		a.get("/a02")
+			.accept("text/html+stripped")
+			.run()
+			.assertBody().is("<ul><li><a href=\"/foo\">bar</a></li><li><a href=\"/foo\">bar</a></li></ul>");
 	}
 
 	@Test
 	public void a03_collection() throws Exception {
-		assertEquals("<ul><li><a href=\"/foo\">bar</a></li><li><a href=\"/foo\">bar</a></li></ul>", a.get("/a03").accept("text/html+stripped").run().getBodyAsString());
+		a.get("/a03")
+			.accept("text/html+stripped")
+			.run()
+			.assertBody().is("<ul><li><a href=\"/foo\">bar</a></li><li><a href=\"/foo\">bar</a></li></ul>");
 	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
index 844f74d..81373e7 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.helper;
 
-import static org.junit.Assert.*;
 import static org.junit.runners.MethodSorters.*;
 
 import java.io.*;
@@ -70,36 +69,50 @@ public class ReaderResourceTest {
 
 	@Test
 	public void a01_basic() throws Exception {
-		assertEquals("foo", a.get("/a01").run().getBodyAsString());
+		a.get("/a01")
+			.run()
+			.assertBody().is("foo");
 	}
 
 	@Test
 	public void a02_headers() throws Exception {
-		assertEquals("Bar", a.get("/a02").run().getHeader("Foo"));
+		a.get("/a02")
+			.run()
+			.assertHeader("Foo").is("Bar");
 	}
 
 	@Test
 	public void a03_contentType() throws Exception {
-		assertEquals("application/json", a.get("/a03").run().getHeader("Content-Type"));
+		a.get("/a03")
+			.run()
+			.assertHeader("Content-Type").is("application/json");
 	}
 
 	@Test
 	public void a04_withVars() throws Exception {
-		assertEquals("bar", a.get("/a04?foo=bar").run().getBodyAsString());
+		a.get("/a04?foo=bar")
+			.run()
+			.assertBody().is("bar");
 	}
 
 	@Test
 	public void a05_inputStream() throws Exception {
-		assertEquals("foo", a.get("/a05").run().getBodyAsString());
+		a.get("/a05")
+			.run()
+			.assertBody().is("foo");
 	}
 
 	@Test
 	public void a06_reader() throws Exception {
-		assertEquals("foo", a.get("/a06").run().getBodyAsString());
+		a.get("/a06")
+			.run()
+			.assertBody().is("foo");
 	}
 
 	@Test
 	public void a07_charSequence() throws Exception {
-		assertEquals("foo", a.get("/a07").run().getBodyAsString());
+		a.get("/a07")
+			.run()
+			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
index e0b1cf2..5667daf 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.helper;
 
-import static org.junit.Assert.*;
 import static org.junit.runners.MethodSorters.*;
 
 import java.io.*;
@@ -69,36 +68,50 @@ public class StreamResourceTest {
 
 	@Test
 	public void a01_basic() throws Exception {
-		assertEquals("foo", a.get("/a01").run().getBodyAsString());
+		a.get("/a01")
+			.run()
+			.assertBody().is("foo");
 	}
 
 	@Test
 	public void a02_headers() throws Exception {
-		assertEquals("Bar", a.get("/a02").run().getHeader("Foo"));
+		a.get("/a02")
+			.run()
+			.assertHeader("Foo").is("Bar");
 	}
 
 	@Test
 	public void a03_contentType() throws Exception {
-		assertEquals("application/json", a.get("/a03").run().getHeader("Content-Type"));
+		a.get("/a03")
+			.run()
+			.assertHeader("Content-Type").is("application/json");
 	}
 
 	@Test
 	public void a04_byteArray() throws Exception {
-		assertEquals("foo", a.get("/a04").run().getBodyAsString());
+		a.get("/a04")
+			.run()
+			.assertBody().is("foo");
 	}
 
 	@Test
 	public void a05_inputStream() throws Exception {
-		assertEquals("foo", a.get("/a05").run().getBodyAsString());
+		a.get("/a05")
+			.run()
+			.assertBody().is("foo");
 	}
 
 	@Test
 	public void a06_reader() throws Exception {
-		assertEquals("foo", a.get("/a06").run().getBodyAsString());
+		a.get("/a06")
+			.run()
+			.assertBody().is("foo");
 	}
 
 	@Test
 	public void a07_charSequence() throws Exception {
-		assertEquals("foo", a.get("/a07").run().getBodyAsString());
+		a.get("/a07")
+			.run()
+			.assertBody().is("foo");
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/responses/BasicTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/responses/BasicTest.java
index 77341d4..04ed8c6 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/responses/BasicTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/responses/BasicTest.java
@@ -63,91 +63,157 @@ public class BasicTest {
 
 	@Test
 	public void a01_accepted() throws Exception {
-		a.get("/accepted").run().assertStatus().equals(202).assertBody().is("Accepted");
+		a.get("/accepted")
+			.run()
+			.assertStatus().is(202)
+			.assertBody().is("Accepted");
 	}
 	@Test
 	public void a02_alreadyReported() throws Exception {
-		a.get("/alreadyReported").run().assertStatus().equals(208).assertBody().is("Already Reported");
+		a.get("/alreadyReported")
+			.run()
+			.assertStatus().is(208)
+			.assertBody().is("Already Reported");
 	}
 	@Test
 	public void a03_continue() throws Exception {
-		a.get("/continue").run().assertStatus().equals(100).assertBody().is("Continue");
+		a.get("/continue")
+			.run()
+			.assertStatus().is(100)
+			.assertBody().is("Continue");
 	}
 	@Test
 	public void a04_created() throws Exception {
-		a.get("/created").run().assertStatus().equals(201).assertBody().is("Created");
+		a.get("/created")
+			.run()
+			.assertStatus().is(201)
+			.assertBody().is("Created");
 	}
 	@Test
 	public void a05_earlyHints() throws Exception {
-		a.get("/earlyHints").run().assertStatus().equals(103).assertBody().is("Early Hints");
+		a.get("/earlyHints")
+			.run()
+			.assertStatus().is(103)
+			.assertBody().is("Early Hints");
 	}
 	@Test
 	public void a06_found() throws Exception {
-		a.get("/found").run().assertStatus().equals(302).assertBody().is("Found");
+		a.get("/found")
+			.run()
+			.assertStatus().is(302)
+			.assertBody().is("Found");
 	}
 	@Test
 	public void a07_imUsed() throws Exception {
-		a.get("/imUsed").run().assertStatus().equals(226).assertBody().is("IM Used");
+		a.get("/imUsed")
+			.run()
+			.assertStatus().is(226)
+			.assertBody().is("IM Used");
 	}
 	@Test
 	public void a08_movedPermanently() throws Exception {
-		a.get("/movedPermanently").run().assertStatus().equals(301).assertBody().is("Moved Permanently");
+		a.get("/movedPermanently")
+			.run()
+			.assertStatus().is(301)
+			.assertBody().is("Moved Permanently");
 	}
 	@Test
 	public void a09_multipleChoices() throws Exception {
-		a.get("/multipleChoices").run().assertStatus().equals(300).assertBody().is("Multiple Choices");
+		a.get("/multipleChoices")
+			.run()
+			.assertStatus().is(300)
+			.assertBody().is("Multiple Choices");
 	}
 	@Test
 	public void a10_multiStatus() throws Exception {
-		a.get("/multiStatus").run().assertStatus().equals(207).assertBody().is("Multi-Status");
+		a.get("/multiStatus")
+			.run()
+			.assertStatus().is(207)
+			.assertBody().is("Multi-Status");
 	}
 	@Test
 	public void a11_noContent() throws Exception {
-		a.get("/noContent").run().assertStatus().equals(204).assertBody().is("No Content");
+		a.get("/noContent")
+			.run()
+			.assertStatus().is(204)
+			.assertBody().is("No Content");
 	}
 	@Test
 	public void a12_nonAuthoritiveInformation() throws Exception {
-		a.get("/nonAuthoritiveInformation").run().assertStatus().equals(203).assertBody().is("Non-Authoritative Information");
+		a.get("/nonAuthoritiveInformation")
+			.run()
+			.assertStatus().is(203)
+			.assertBody().is("Non-Authoritative Information");
 	}
 	@Test
 	public void a13_notModified() throws Exception {
-		a.get("/notModified").run().assertStatus().equals(304).assertBody().is("Not Modified");
+		a.get("/notModified")
+			.run()
+			.assertStatus().is(304)
+			.assertBody().is("Not Modified");
 	}
 	@Test
 	public void a14_ok() throws Exception {
-		a.get("/ok").run().assertStatus().equals(200).assertBody().is("OK");
+		a.get("/ok")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("OK");
 	}
 	@Test
 	public void a15_partialContent() throws Exception {
-		a.get("/partialContent").run().assertStatus().equals(206).assertBody().is("Partial Content");
+		a.get("/partialContent")
+			.run()
+			.assertStatus().is(206)
+			.assertBody().is("Partial Content");
 	}
 	@Test
 	public void a16_permanentRedirect() throws Exception {
-		a.get("/permanentRedirect").run().assertStatus().equals(308).assertBody().is("Permanent Redirect");
+		a.get("/permanentRedirect")
+			.run()
+			.assertStatus().is(308)
+			.assertBody().is("Permanent Redirect");
 	}
 	@Test
 	public void a17_processing() throws Exception {
-		a.get("/processing").run().assertStatus().equals(102).assertBody().is("Processing");
+		a.get("/processing")
+			.run()
+			.assertStatus().is(102)
+			.assertBody().is("Processing");
 	}
 	@Test
 	public void a18_resetContent() throws Exception {
-		a.get("/resetContent").run().assertStatus().equals(205).assertBody().is("Reset Content");
+		a.get("/resetContent")
+			.run()
+			.assertStatus().is(205)
+			.assertBody().is("Reset Content");
 	}
 	@Test
 	public void a19_seeOther() throws Exception {
-		a.get("/seeOther").run().assertStatus().equals(303).assertBody().is("See Other");
+		a.get("/seeOther")
+			.run()
+			.assertStatus().is(303)
+			.assertBody().is("See Other");
 	}
 	@Test
 	public void a20_switchingProtocols() throws Exception {
-		a.get("/switchingProtocols").run().assertStatus().equals(101).assertBody().is("Switching Protocols");
+		a.get("/switchingProtocols")
+			.run()
+			.assertStatus().is(101)
+			.assertBody().is("Switching Protocols");
 	}
 	@Test
 	public void a21_temporaryRedirect() throws Exception {
-		a.get("/temporaryRedirect").run().assertStatus().equals(307).assertBody().is("Temporary Redirect");
+		a.get("/temporaryRedirect")
+			.run()
+			.assertStatus().is(307)
+			.assertBody().is("Temporary Redirect");
 	}
 	@Test
 	public void a22_useProxy() throws Exception {
-		a.get("/useProxy").run().assertStatus().equals(305).assertBody().is("Use Proxy");
+		a.get("/useProxy")
+			.run()
+			.assertStatus().is(305)
+			.assertBody().is("Use Proxy");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -166,19 +232,31 @@ public class BasicTest {
 
 	@Test
 	public void b01_movedPermanently() throws Exception {
-		b.get("/movedPermanently").run().assertStatus().equals(301).assertBody().is("Moved Permanently").assertHeader("Location").is("/foo");
+		b.get("/movedPermanently")
+			.run()
+			.assertStatus().is(301)
+			.assertBody().is("Moved Permanently").assertHeader("Location").is("/foo");
 	}
 	@Test
 	public void b02_permanentRedirect() throws Exception {
-		b.get("/permanentRedirect").run().assertStatus().equals(308).assertBody().is("Permanent Redirect").assertHeader("Location").is("/foo");
+		b.get("/permanentRedirect")
+			.run()
+			.assertStatus().is(308)
+			.assertBody().is("Permanent Redirect").assertHeader("Location").is("/foo");
 	}
 	@Test
 	public void b03_seeOther() throws Exception {
-		b.get("/seeOther").run().assertStatus().equals(303).assertBody().is("See Other").assertHeader("Location").is("/foo");
+		b.get("/seeOther")
+			.run()
+			.assertStatus().is(303)
+			.assertBody().is("See Other").assertHeader("Location").is("/foo");
 	}
 	@Test
 	public void b04_temporaryRedirect() throws Exception {
-		b.get("/temporaryRedirect").run().assertStatus().equals(307).assertBody().is("Temporary Redirect").assertHeader("Location").is("/foo");
+		b.get("/temporaryRedirect")
+			.run()
+			.assertStatus().is(307)
+			.assertBody().is("Temporary Redirect").assertHeader("Location").is("/foo");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -215,91 +293,157 @@ public class BasicTest {
 
 	@Test
 	public void c01_accepted() throws Exception {
-		c.get("/accepted").run().assertStatus().equals(202).assertBody().is("foo");
+		c.get("/accepted")
+			.run()
+			.assertStatus().is(202)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c02_alreadyReported() throws Exception {
-		c.get("/alreadyReported").run().assertStatus().equals(208).assertBody().is("foo");
+		c.get("/alreadyReported")
+			.run()
+			.assertStatus().is(208)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c03_continue() throws Exception {
-		c.get("/continue").run().assertStatus().equals(100).assertBody().is("foo");
+		c.get("/continue")
+			.run()
+			.assertStatus().is(100)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c04_created() throws Exception {
-		c.get("/created").run().assertStatus().equals(201).assertBody().is("foo");
+		c.get("/created")
+			.run()
+			.assertStatus().is(201)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c05_earlyHints() throws Exception {
-		c.get("/earlyHints").run().assertStatus().equals(103).assertBody().is("foo");
+		c.get("/earlyHints")
+			.run()
+			.assertStatus().is(103)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c06_found() throws Exception {
-		c.get("/found").run().assertStatus().equals(302).assertBody().is("foo");
+		c.get("/found")
+			.run()
+			.assertStatus().is(302)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c07_imUsed() throws Exception {
-		c.get("/imUsed").run().assertStatus().equals(226).assertBody().is("foo");
+		c.get("/imUsed")
+			.run()
+			.assertStatus().is(226)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c08_movedPermanently() throws Exception {
-		c.get("/movedPermanently").run().assertStatus().equals(301).assertBody().is("foo");
+		c.get("/movedPermanently")
+			.run()
+			.assertStatus().is(301)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c09_multipleChoices() throws Exception {
-		c.get("/multipleChoices").run().assertStatus().equals(300).assertBody().is("foo");
+		c.get("/multipleChoices")
+			.run()
+			.assertStatus().is(300)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c10_multiStatus() throws Exception {
-		c.get("/multiStatus").run().assertStatus().equals(207).assertBody().is("foo");
+		c.get("/multiStatus")
+			.run()
+			.assertStatus().is(207)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c11_noContent() throws Exception {
-		c.get("/noContent").run().assertStatus().equals(204).assertBody().is("foo");
+		c.get("/noContent")
+			.run()
+			.assertStatus().is(204)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c12_nonAuthoritiveInformation() throws Exception {
-		c.get("/nonAuthoritiveInformation").run().assertStatus().equals(203).assertBody().is("foo");
+		c.get("/nonAuthoritiveInformation")
+			.run()
+			.assertStatus().is(203)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c13_notModified() throws Exception {
-		c.get("/notModified").run().assertStatus().equals(304).assertBody().is("foo");
+		c.get("/notModified")
+			.run()
+			.assertStatus().is(304)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c14_ok() throws Exception {
-		c.get("/ok").run().assertStatus().equals(200).assertBody().is("foo");
+		c.get("/ok")
+			.run()
+			.assertStatus().is(200)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c15_partialContent() throws Exception {
-		c.get("/partialContent").run().assertStatus().equals(206).assertBody().is("foo");
+		c.get("/partialContent")
+			.run()
+			.assertStatus().is(206)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c16_permanentRedirect() throws Exception {
-		c.get("/permanentRedirect").run().assertStatus().equals(308).assertBody().is("foo");
+		c.get("/permanentRedirect")
+			.run()
+			.assertStatus().is(308)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c17_processing() throws Exception {
-		c.get("/processing").run().assertStatus().equals(102).assertBody().is("foo");
+		c.get("/processing")
+			.run()
+			.assertStatus().is(102)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c18_resetContent() throws Exception {
-		c.get("/resetContent").run().assertStatus().equals(205).assertBody().is("foo");
+		c.get("/resetContent")
+			.run()
+			.assertStatus().is(205)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c19_seeOther() throws Exception {
-		c.get("/seeOther").run().assertStatus().equals(303).assertBody().is("foo");
+		c.get("/seeOther")
+			.run()
+			.assertStatus().is(303)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c20_switchingProtocols() throws Exception {
-		c.get("/switchingProtocols").run().assertStatus().equals(101).assertBody().is("foo");
+		c.get("/switchingProtocols")
+			.run()
+			.assertStatus().is(101)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c21_temporaryRedirect() throws Exception {
-		c.get("/temporaryRedirect").run().assertStatus().equals(307).assertBody().is("foo");
+		c.get("/temporaryRedirect")
+			.run()
+			.assertStatus().is(307)
+			.assertBody().is("foo");
 	}
 	@Test
 	public void c22_useProxy() throws Exception {
-		c.get("/useProxy").run().assertStatus().equals(305).assertBody().is("foo");
+		c.get("/useProxy")
+			.run()
+			.assertStatus().is(305)
+			.assertBody().is("foo");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -315,7 +459,10 @@ public class BasicTest {
 
 	@Test
 	public void d01_accepted() throws Exception {
-		d.get("/accepted").json().run().assertStatus().equals(202).assertBody().is("'foo'");
+		d.get("/accepted").json()
+			.run()
+			.assertStatus().is(202)
+			.assertBody().is("'foo'");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------