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 2019/03/09 21:56:55 UTC

[juneau] branch master updated: Add new juneau-rest-mock project.

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 f44b3d5  Add new juneau-rest-mock project.
f44b3d5 is described below

commit f44b3d53554026b5eb7d98e11e8d96a646f501f6
Author: JamesBognar <ja...@apache.org>
AuthorDate: Sat Mar 9 16:56:25 2019 -0500

    Add new juneau-rest-mock project.
---
 .../juneau-microservice-test/pom.xml               |  23 +-
 .../org/apache/juneau/rest/test/MockRestTest.java  |   9 +-
 .../rest/test/client/CallbackStringsTest.java      |   4 +-
 .../juneau/rest/test/client/ClientFuturesTest.java |   4 +-
 .../juneau/rest/test/client/FormDataTest.java      |   7 +-
 .../rest/test/client/InterfaceProxyTest.java       |   5 +-
 .../rest/test/client/RequestBeanProxyTest.java     |  78 +++---
 juneau-rest/.DS_Store                              | Bin 6148 -> 6148 bytes
 .../.classpath                                     |   6 -
 juneau-rest/juneau-rest-client-test/.gitignore     |   2 +
 juneau-rest/juneau-rest-client-test/.project       |  26 ++
 .../juneau-rest-client-test}/pom.xml               | 156 ++++++++----
 .../rest/client/remote/BodyAnnotationTest.java     |   2 +-
 .../rest/client/remote/EndToEndInterfaceTest.java  |   9 +-
 .../rest/client/remote/FormDataAnnotationTest.java |   2 +-
 .../rest/client/remote/HeaderAnnotationTest.java   |   2 +-
 .../rest/client/remote/PathAnnotationTest.java     |   2 +-
 .../rest/client/remote/QueryAnnotationTest.java    |   2 +-
 .../client/remote/RemoteMethodAnnotationTest.java  |   2 +-
 .../remote/RemoteResourceAnnotationTest.java       |  14 +-
 .../rest/client/remote/RequestAnnotationTest.java  |   2 +-
 .../rest/client/remote/ResponseAnnotationTest.java |   2 +-
 juneau-rest/juneau-rest-client/.classpath          |   6 -
 .../.settings/org.eclipse.core.resources.prefs     |   1 -
 .../juneau/rest/client/RestClientBuilder.java      |  29 ++-
 .../juneau/rest/client/mock/package-info.java      |  18 --
 .../.classpath                                     |  16 +-
 juneau-rest/juneau-rest-mock/.gitignore            |   1 +
 juneau-rest/juneau-rest-mock/.project              |  26 ++
 juneau-rest/juneau-rest-mock/pom.xml               | 179 ++++++++++++++
 .../rest/mock2}/MockHttpClientConnection.java      |   2 +-
 .../mock2}/MockHttpClientConnectionManager.java    |   2 +-
 .../apache/juneau/rest/mock2}/MockHttpSession.java |   2 +-
 .../juneau/rest/mock2}/MockRemoteResource.java     | 163 ++++++-------
 .../org/apache/juneau/rest/mock2}/MockRest.java    | 240 +++++++++---------
 .../apache/juneau/rest/mock2/MockRestClient.java   | 268 +++++++++++++++++++++
 .../juneau/rest/mock2}/MockServletRequest.java     |   2 +-
 .../juneau/rest/mock2}/MockServletResponse.java    |   4 +-
 .../apache/juneau/rest/mock2}/package-info.java    |   2 +-
 .../org/apache/juneau/rest/testutils/ABean.java    |   0
 .../apache/juneau/rest/testutils/Constants.java    |   0
 .../org/apache/juneau/rest/testutils/DTOs.java     |   0
 .../juneau/rest/testutils/ImplicitSwappedPojo.java |   0
 .../apache/juneau/rest/testutils/SwappedPojo.java  |   0
 .../juneau/rest/testutils/SwappedPojoSwap.java     |   0
 .../org/apache/juneau/rest/testutils/TestEnum.java |   0
 .../apache/juneau/rest/testutils/TestUtils.java    |   2 +-
 .../apache/juneau/rest/testutils/TypedBean.java    |   0
 .../juneau/rest/testutils/TypedBeanImpl.java       |   0
 .../juneau/rest/testutils/XPartSerializer.java     |   0
 .../.classpath                                     |   5 -
 juneau-rest/juneau-rest-server-test/.gitignore     |   2 +
 juneau-rest/juneau-rest-server-test/.project       |  26 ++
 juneau-rest/juneau-rest-server-test/pom.xml        | 197 +++++++++++++++
 .../jueau/rest/helper/ReaderResourceTest.java      |   2 +-
 .../jueau/rest/helper/StreamResourceTest.java      |   2 +-
 .../juneau/rest/BasicRestInfoProviderTest.java     |   2 +-
 .../juneau/rest/BeanContextPropertiesTest.java     |   2 +-
 .../test/java/org/apache/juneau/rest/NlsTest.java  |   2 +-
 .../java/org/apache/juneau/rest/PathsTest.java     |   2 +-
 .../org/apache/juneau/rest/RestParamsTest.java     |   2 +-
 .../org/apache/juneau/rest/StatusCodesTest.java    |   2 +-
 .../apache/juneau/rest/ThreadLocalObjectsTest.java |   2 +-
 .../juneau/rest/annotation/HtmlDocAsideTest.java   |   2 +-
 .../juneau/rest/annotation/HtmlDocFooterTest.java  |   2 +-
 .../juneau/rest/annotation/HtmlDocHeaderTest.java  |   2 +-
 .../juneau/rest/annotation/HtmlDocNavTest.java     |   2 +-
 .../rest/annotation/HtmlDocNavlinksTest.java       |   2 +-
 .../juneau/rest/annotation/HtmlDocScriptTest.java  |   2 +-
 .../juneau/rest/annotation/HtmlDocStyleTest.java   |   2 +-
 .../annotation/ResponseBodyAnnotationTest.java     |   0
 .../annotation/ResponseHeaderAnnotationTest.java   |   2 +-
 .../annotation/ResponseStatusAnnotationTest.java   |   2 +-
 .../juneau/rest/annotation/RestMethodBpiTest.java  |   2 +-
 .../rest/annotation/RestMethodGuardsTest.java      |   2 +-
 .../rest/annotation/RestMethodMatchersTest.java    |   2 +-
 .../juneau/rest/annotation/RestMethodPathTest.java |   2 +-
 .../rest/annotation/RestResourceMessagesTest.java  |   2 +-
 .../rest/annotation/RestResourcePathTest.java      |   2 +-
 .../annotation/RestResourcePropertiesTest.java     |   2 +-
 .../annotation/RestResourceSerializersTest.java    |   2 +-
 .../annotation/RestResourceStaticFilesTest.java    |   2 +-
 .../annotation2/AnnotationInheritanceTest.java     |   2 +-
 .../rest/annotation2/BodyAnnotationTest.java       |   2 +-
 .../rest/annotation2/FormDataAnnotationTest.java   |   2 +-
 .../annotation2/HasFormDataAnnotationTest.java     |   2 +-
 .../rest/annotation2/HasQueryAnnotationTest.java   |   2 +-
 .../rest/annotation2/HeaderAnnotationTest.java     |   0
 .../rest/annotation2/PathAnnotationTest.java       |   2 +-
 .../annotation2/PathRemainderAnnotationTest.java   |   2 +-
 .../rest/annotation2/QueryAnnotationTest.java      |   2 +-
 .../rest/annotation2/ResponseAnnotationTest.java   |   2 +-
 .../juneau/rest/annotation2/RestHookTest.java      |   2 +-
 .../rest/annotation2/RestMethodInheritTest.java    |   2 +-
 .../rest/annotation2/RestResourceParsersTest.java  |   2 +-
 .../annotation2/RestResourcePojoSwapsTest.java     |   2 +-
 .../apache/juneau/rest/exception/BasicTest.java    |   2 +-
 .../juneau/rest/headers/AcceptCharsetTest.java     |   2 +-
 .../juneau/rest/headers/AcceptEncodingTest.java    |   2 +-
 .../org/apache/juneau/rest/headers/AcceptTest.java |   4 +-
 .../juneau/rest/headers/ClientVersionTest.java     |   2 +-
 .../juneau/rest/headers/ContentEncodingTest.java   |   2 +-
 .../juneau/rest/headers/ContentTypeTest.java       |   2 +-
 .../apache/juneau/rest/headers/HeadersTest.java    |   2 +-
 .../juneau/rest/mock/MockServletRequestTest.java   |   1 +
 .../org/apache/juneau/rest/response/BasicTest.java |   2 +-
 .../org/apache/juneau/rest/util/RestUtilsTest.java |   0
 .../juneau/rest/util/UrlPathPatternTest.java       |   0
 .../rest/BasicRestInfoProviderTest.properties      |   0
 .../rest/BasicRestInfoProviderTest_swagger.json    |   0
 .../org/apache/juneau/rest/NlsTest.properties      |   0
 .../apache/juneau/rest/RestParamsTest.properties   |   0
 .../juneau/rest/RestParamsTest_ja_JP.properties    |   0
 .../RestResourceMessagesTest1.properties           |   0
 .../RestResourceMessagesTest2.properties           |   0
 .../apache/juneau/rest/annotation/xdocs/test.txt   |   0
 .../juneau/rest/annotation/xdocs/xsubdocs/test.txt |   0
 juneau-rest/juneau-rest-server/.classpath          |  11 -
 .../.settings/org.eclipse.core.resources.prefs     |   2 -
 juneau-rest/pom.xml                                |   3 +
 120 files changed, 1206 insertions(+), 463 deletions(-)

diff --git a/juneau-microservice/juneau-microservice-test/pom.xml b/juneau-microservice/juneau-microservice-test/pom.xml
index 03c6f1b..cc1e5f5 100644
--- a/juneau-microservice/juneau-microservice-test/pom.xml
+++ b/juneau-microservice/juneau-microservice-test/pom.xml
@@ -43,19 +43,12 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-core-test</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-rest-server</artifactId>
+			<artifactId>juneau-rest-server-jaxrs</artifactId>
 			<version>${project.version}</version>
-			<type>test-jar</type>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-rest-server-jaxrs</artifactId>
+			<artifactId>juneau-rest-mock</artifactId>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
@@ -84,6 +77,18 @@
 			<groupId>com.sun.activation</groupId>
 			<artifactId>javax.activation</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-core-test</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-rest-mock</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+		</dependency>
 	</dependencies>
 	
 	<build>
diff --git a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/MockRestTest.java b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/MockRestTest.java
index ac56130..ad50ecc 100644
--- a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/MockRestTest.java
+++ b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/MockRestTest.java
@@ -17,9 +17,10 @@ import static org.junit.Assert.*;
 
 import org.apache.juneau.http.annotation.Body;
 import org.apache.juneau.json.*;
+import org.apache.juneau.marshall.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -45,15 +46,13 @@ public class MockRestTest {
 
 	@Test
 	public void a01() throws Exception {
-		MockRest a = MockRest.build(A.class, null);
-		RestClient rc = RestClient.create().mockHttpConnection(a).build();
+		RestClient rc = MockRestClient.build(A.class, null);
 		assertEquals("OK", rc.doPut("/a01", "OK").getResponseAsString());
 	}
 
 	@Test
 	public void a02() throws Exception {
-		MockRest a = MockRest.build(A.class);
-		RestClient rc = RestClient.create().json().mockHttpConnection(a).build();
+		RestClient rc = MockRestClient.build(A.class, Json.DEFAULT);
 		assertEquals("OK", rc.doPut("/a02", "OK").getResponse(String.class));
 	}
 }
diff --git a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/CallbackStringsTest.java b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/CallbackStringsTest.java
index 679cf84..45db140 100644
--- a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/CallbackStringsTest.java
+++ b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/CallbackStringsTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -50,7 +50,7 @@ public class CallbackStringsTest {
 			return m;
 		}
 	}
-	static RestClient a = RestClient.create().mockHttpConnection(MockRest.build(A.class, null)).build();
+	static RestClient a = MockRestClient.build(A.class, null);
 
 	@Test
 	public void a01() throws Exception {
diff --git a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/ClientFuturesTest.java b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/ClientFuturesTest.java
index 53ce031..ec548e1 100644
--- a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/ClientFuturesTest.java
+++ b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/ClientFuturesTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -39,7 +39,7 @@ public class ClientFuturesTest {
 			return new ObjectMap().append("foo","bar");
 		}
 	}
-	static RestClient a = RestClient.create().mockHttpConnection(MockRest.build(A.class, null)).build();
+	static RestClient a = MockRestClient.build(A.class, null);
 
 	@Test
 	public void a01() throws Exception {
diff --git a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/FormDataTest.java b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/FormDataTest.java
index b34642a..89e2b38 100644
--- a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/FormDataTest.java
+++ b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/FormDataTest.java
@@ -18,10 +18,11 @@ import static org.junit.Assert.*;
 import java.io.*;
 import java.util.*;
 
+import org.apache.juneau.marshall.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.test.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
@@ -41,7 +42,7 @@ public class FormDataTest extends RestTestcase {
 			return new StringReader("Content-Type=["+req.getContentType()+"], contents=["+read(req.getReader())+"]");
 		}
 	}
-	static RestClient a = RestClient.create().mockHttpConnection(MockRest.build(A.class)).build();
+	static RestClient a = MockRestClient.build(A.class, SimpleJson.DEFAULT);
 
 	@Test
 	public void a01_formDataMethod() throws Exception {
@@ -61,7 +62,7 @@ public class FormDataTest extends RestTestcase {
 
 	@Test
 	public void a03_plainTextParams() throws Exception {
-		RestClient c = RestClient.create().mockHttpConnection(MockRest.build(A.class)).urlEnc().paramFormatPlain().build();
+		RestClient c = MockRestClient.create(A.class, UrlEncoding.DEFAULT).paramFormatPlain().build();
 		try {
 			String r;
 
diff --git a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/InterfaceProxyTest.java b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/InterfaceProxyTest.java
index c1b0a3f..be97827 100644
--- a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/InterfaceProxyTest.java
+++ b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/InterfaceProxyTest.java
@@ -29,8 +29,7 @@ import org.apache.juneau.parser.*;
 import org.apache.juneau.remote.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.uon.*;
@@ -944,7 +943,7 @@ public class InterfaceProxyTest {
 	public InterfaceProxyTest(String label, Serializer serializer, Parser parser) {
 		proxy = cache.get(label);
 		if (proxy == null) {
-			proxy = RestClient.create().mockHttpConnection(interfaceProxyResource).serializer(serializer).parser(parser).build().getRrpcInterface(InterfaceProxy.class, "/proxy");
+			proxy = MockRestClient.create(InterfaceProxyResource.class, serializer, parser).build().getRrpcInterface(InterfaceProxy.class, "/proxy");
 			cache.put(label, proxy);
 		}
 	}
diff --git a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/RequestBeanProxyTest.java b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/RequestBeanProxyTest.java
index d3ac26b..fe65ba2 100644
--- a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/RequestBeanProxyTest.java
+++ b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/client/RequestBeanProxyTest.java
@@ -30,7 +30,7 @@ import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
 import org.apache.juneau.rest.client.remote.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.uon.*;
 import org.apache.juneau.urlencoding.*;
@@ -52,7 +52,6 @@ public class RequestBeanProxyTest {
 			return req.getQuery().toString(true);
 		}
 	}
-	static MockRest a = MockRest.build(A.class, null);
 
 	//=================================================================================================================
 	// @Query - Simple values
@@ -88,8 +87,8 @@ public class RequestBeanProxyTest {
 		@Override public String getX7() { return "123"; }
 	}
 
-	static A01_RemoteResource a01a = RestClient.create().mockHttpConnection(a).build().getRemoteResource(A01_RemoteResource.class, null);
-	static A01_RemoteResource a01b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(a).build().getRemoteResource(A01_RemoteResource.class, null);
+	static A01_RemoteResource a01a = MockRemoteResource.build(A01_RemoteResource.class, A.class, null);
+	static A01_RemoteResource a01b = MockRestClient.create(A.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(A01_RemoteResource.class);
 
 	@Test
 	public void a01a_query_simpleVals_plainText() throws Exception {
@@ -137,8 +136,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static A02_RemoteResource a02a = RestClient.create().mockHttpConnection(a).build().getRemoteResource(A02_RemoteResource.class, null);
-	static A02_RemoteResource a02b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(a).build().getRemoteResource(A02_RemoteResource.class, null);
+	static A02_RemoteResource a02a = MockRemoteResource.build(A02_RemoteResource.class, A.class, null);
+	static A02_RemoteResource a02b = MockRestClient.create(A.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(A02_RemoteResource.class);
 
 	@Test
 	public void a02a_query_maps_plainText() throws Exception {
@@ -189,8 +188,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static A03_RemoteResource a03a = RestClient.create().mockHttpConnection(a).build().getRemoteResource(A03_RemoteResource.class, null);
-	static A03_RemoteResource a03b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(a).build().getRemoteResource(A03_RemoteResource.class, null);
+	static A03_RemoteResource a03a = MockRemoteResource.build(A03_RemoteResource.class, A.class, null);
+	static A03_RemoteResource a03b = MockRestClient.create(A.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(A03_RemoteResource.class);
 
 	@Test
 	public void a03a_query_nameValuePairs_plainText() throws Exception {
@@ -225,7 +224,7 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static A04_RemoteResource a04a = RestClient.create().mockHttpConnection(a).build().getRemoteResource(A04_RemoteResource.class, null);
+	static A04_RemoteResource a04a = MockRemoteResource.build(A04_RemoteResource.class, A.class, null);
 
 	@Test
 	public void a04a_query_charSequence() throws Exception {
@@ -250,7 +249,7 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static A05_RemoteResource a05a = RestClient.create().mockHttpConnection(a).build().getRemoteResource(A05_RemoteResource.class, null);
+	static A05_RemoteResource a05a = MockRemoteResource.build(A05_RemoteResource.class, A.class, null);
 
 	@Test
 	public void a05a_query_reader() throws Exception {
@@ -311,8 +310,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static A06_RemoteResource a06a = RestClient.create().mockHttpConnection(a).build().getRemoteResource(A06_RemoteResource.class, null);
-	static A06_RemoteResource a06b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(a).build().getRemoteResource(A06_RemoteResource.class, null);
+	static A06_RemoteResource a06a = MockRemoteResource.build(A06_RemoteResource.class, A.class, null);
+	static A06_RemoteResource a06b = MockRestClient.create(A.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(A06_RemoteResource.class);
 
 	@Test
 	public void a06a_query_collections_plainText() throws Exception {
@@ -341,7 +340,6 @@ public class RequestBeanProxyTest {
 			return req.getFormData().toString(true);
 		}
 	}
-	static MockRest c = MockRest.build(C.class, null);
 
 	//=================================================================================================================
 	// @FormData, Simple values
@@ -388,8 +386,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static C01_RemoteResource c01a = RestClient.create().mockHttpConnection(c).build().getRemoteResource(C01_RemoteResource.class, null);
-	static C01_RemoteResource c01b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(c).build().getRemoteResource(C01_RemoteResource.class, null);
+	static C01_RemoteResource c01a = MockRemoteResource.build(C01_RemoteResource.class, C.class, null);
+	static C01_RemoteResource c01b = MockRestClient.create(C.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(C01_RemoteResource.class);
 
 	@Test
 	public void c01a_formData_simpleVals_plainText() throws Exception {
@@ -440,8 +438,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static C02_RemoteResource c02a = RestClient.create().mockHttpConnection(c).build().getRemoteResource(C02_RemoteResource.class, null);
-	static C02_RemoteResource c02b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(c).build().getRemoteResource(C02_RemoteResource.class, null);
+	static C02_RemoteResource c02a = MockRemoteResource.build(C02_RemoteResource.class, C.class, null);
+	static C02_RemoteResource c02b = MockRestClient.create(C.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(C02_RemoteResource.class);
 
 	@Test
 	public void c02a_formData_maps_plainText() throws Exception {
@@ -492,8 +490,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static C03_RemoteResource c03a = RestClient.create().mockHttpConnection(c).build().getRemoteResource(C03_RemoteResource.class, null);
-	static C03_RemoteResource c03b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(c).build().getRemoteResource(C03_RemoteResource.class, null);
+	static C03_RemoteResource c03a = MockRemoteResource.build(C03_RemoteResource.class, C.class, null);
+	static C03_RemoteResource c03b = MockRestClient.create(C.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(C03_RemoteResource.class);
 
 	@Test
 	public void c03a_formData_nameValuePairs_plainText() throws Exception {
@@ -528,7 +526,7 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static C04_RemoteResource c04a = RestClient.create().mockHttpConnection(c).build().getRemoteResource(C04_RemoteResource.class, null);
+	static C04_RemoteResource c04a = MockRemoteResource.build(C04_RemoteResource.class, C.class, null);
 
 	@Test
 	public void c04a_formDataCharSequence() throws Exception {
@@ -553,7 +551,7 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static C05_RemoteResource c05a = RestClient.create().mockHttpConnection(c).build().getRemoteResource(C05_RemoteResource.class, null);
+	static C05_RemoteResource c05a = MockRemoteResource.build(C05_RemoteResource.class, C.class, null);
 
 	@Test
 	public void c05a_formDataReader() throws Exception {
@@ -614,8 +612,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static C06_RemoteResource c06a = RestClient.create().mockHttpConnection(c).build().getRemoteResource(C06_RemoteResource.class, null);
-	static C06_RemoteResource c06b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(c).build().getRemoteResource(C06_RemoteResource.class, null);
+	static C06_RemoteResource c06a = MockRemoteResource.build(C06_RemoteResource.class, C.class, null);
+	static C06_RemoteResource c06b = MockRestClient.create(C.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(C06_RemoteResource.class);
 
 	@Test
 	public void c06a_formData_collections_plainText() throws Exception {
@@ -645,7 +643,6 @@ public class RequestBeanProxyTest {
 			return req.getHeaders().subset("a,b,c,d,e,f,g,h,i,a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4").toString(true);
 		}
 	}
-	static MockRest e = MockRest.build(E.class, null);
 
 	//=================================================================================================================
 	// @Header, Simple values
@@ -692,8 +689,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static E01_RemoteResource e01a = RestClient.create().mockHttpConnection(e).build().getRemoteResource(E01_RemoteResource.class, null);
-	static E01_RemoteResource e01b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(e).build().getRemoteResource(E01_RemoteResource.class, null);
+	static E01_RemoteResource e01a = MockRemoteResource.build(E01_RemoteResource.class, E.class, null);
+	static E01_RemoteResource e01b = MockRestClient.create(E.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(E01_RemoteResource.class);
 
 	@Test
 	public void e01a_headerSimpleValsPlainText() throws Exception {
@@ -744,8 +741,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static E02_RemoteResource e02a = RestClient.create().mockHttpConnection(e).build().getRemoteResource(E02_RemoteResource.class, null);
-	static E02_RemoteResource e02b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(e).build().getRemoteResource(E02_RemoteResource.class, null);
+	static E02_RemoteResource e02a = MockRemoteResource.build(E02_RemoteResource.class, E.class, null);
+	static E02_RemoteResource e02b = MockRestClient.create(E.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(E02_RemoteResource.class);
 
 	@Test
 	public void e02a_header_maps_plainText() throws Exception {
@@ -796,8 +793,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static E03_RemoteResource e03a = RestClient.create().mockHttpConnection(e).build().getRemoteResource(E03_RemoteResource.class, null);
-	static E03_RemoteResource e03b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(e).build().getRemoteResource(E03_RemoteResource.class, null);
+	static E03_RemoteResource e03a = MockRemoteResource.build(E03_RemoteResource.class, E.class, null);
+	static E03_RemoteResource e03b = MockRestClient.create(E.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(E03_RemoteResource.class);
 
 	@Test
 	public void e03a_header_nameValuePairs_plainText() throws Exception {
@@ -868,8 +865,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static E04_RemoteResource e04a = RestClient.create().mockHttpConnection(e).build().getRemoteResource(E04_RemoteResource.class, null);
-	static E04_RemoteResource e04b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(e).build().getRemoteResource(E04_RemoteResource.class, null);
+	static E04_RemoteResource e04a = MockRemoteResource.build(E04_RemoteResource.class, E.class, null);
+	static E04_RemoteResource e04b = MockRestClient.create(E.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(E04_RemoteResource.class);
 
 	@Test
 	public void e04a_header_collections_plainText() throws Exception {
@@ -898,7 +895,6 @@ public class RequestBeanProxyTest {
 			return req.getPathMatch().getRemainder();
 		}
 	}
-	static MockRest g = MockRest.build(G.class, null);
 
 	//=================================================================================================================
 	// @Path, Simple values
@@ -941,8 +937,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static G01_RemoteResource g01a = RestClient.create().mockHttpConnection(g).build().getRemoteResource(G01_RemoteResource.class, null);
-	static G01_RemoteResource g01b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(g).build().getRemoteResource(G01_RemoteResource.class, null);
+	static G01_RemoteResource g01a = MockRemoteResource.build(G01_RemoteResource.class, G.class, null);
+	static G01_RemoteResource g01b = MockRestClient.create(G.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(G01_RemoteResource.class);
 
 	@Test
 	public void g01a_pathSimpleValsPlainText() throws Exception {
@@ -993,8 +989,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static G02_RemoteResource g02a = RestClient.create().mockHttpConnection(g).build().getRemoteResource(G02_RemoteResource.class, null);
-	static G02_RemoteResource g02b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(g).build().getRemoteResource(G02_RemoteResource.class, null);
+	static G02_RemoteResource g02a = MockRemoteResource.build(G02_RemoteResource.class, G.class, null);
+	static G02_RemoteResource g02b = MockRestClient.create(G.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(G02_RemoteResource.class);
 
 	@Test
 	public void g02a_path_maps_plainText() throws Exception {
@@ -1045,8 +1041,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static G03_RemoteResource g03a = RestClient.create().mockHttpConnection(g).build().getRemoteResource(G03_RemoteResource.class, null);
-	static G03_RemoteResource g03b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(g).build().getRemoteResource(G03_RemoteResource.class, null);
+	static G03_RemoteResource g03a = MockRemoteResource.build(G03_RemoteResource.class, G.class, null);
+	static G03_RemoteResource g03b = MockRestClient.create(G.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(G03_RemoteResource.class);
 
 	@Test
 	public void g03a_path_nameValuePairs_plainText() throws Exception {
@@ -1109,8 +1105,8 @@ public class RequestBeanProxyTest {
 		}
 	}
 
-	static G04_RemoteResource g04a = RestClient.create().mockHttpConnection(g).build().getRemoteResource(G04_RemoteResource.class, null);
-	static G04_RemoteResource g04b = RestClient.create().partSerializer(UonSerializer.class).mockHttpConnection(g).build().getRemoteResource(G04_RemoteResource.class, null);
+	static G04_RemoteResource g04a = MockRemoteResource.build(G04_RemoteResource.class, G.class, null);
+	static G04_RemoteResource g04b = MockRestClient.create(G.class, null).partSerializer(UonSerializer.class).build().getRemoteResource(G04_RemoteResource.class);
 
 	@Test
 	public void g04a_path_collections_plainText() throws Exception {
diff --git a/juneau-rest/.DS_Store b/juneau-rest/.DS_Store
index 82f59f7..739516e 100644
Binary files a/juneau-rest/.DS_Store and b/juneau-rest/.DS_Store differ
diff --git a/juneau-rest/juneau-rest-client/.classpath b/juneau-rest/juneau-rest-client-test/.classpath
similarity index 77%
copy from juneau-rest/juneau-rest-client/.classpath
copy to juneau-rest/juneau-rest-client-test/.classpath
index 3759907..0959e17 100644
--- a/juneau-rest/juneau-rest-client/.classpath
+++ b/juneau-rest/juneau-rest-client-test/.classpath
@@ -6,12 +6,6 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="src" output="target/classes" path="src/main/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
diff --git a/juneau-rest/juneau-rest-client-test/.gitignore b/juneau-rest/juneau-rest-client-test/.gitignore
new file mode 100644
index 0000000..22d1e37
--- /dev/null
+++ b/juneau-rest/juneau-rest-client-test/.gitignore
@@ -0,0 +1,2 @@
+/target/
+**/.DS_Store
diff --git a/juneau-rest/juneau-rest-client-test/.project b/juneau-rest/juneau-rest-client-test/.project
new file mode 100644
index 0000000..768df6c
--- /dev/null
+++ b/juneau-rest/juneau-rest-client-test/.project
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>juneau-rest-client</name>
+    <buildSpec>
+        <buildCommand>
+            <name>org.eclipse.jdt.core.javabuilder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+        <buildCommand>
+            <name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+        <buildCommand>
+            <name>org.eclipse.m2e.core.maven2Builder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+    </buildSpec>
+    <natures>
+        <nature>org.eclipse.m2e.core.maven2Nature</nature>
+        <nature>org.eclipse.jdt.core.javanature</nature>
+        <nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature>
+    </natures>
+</projectDescription>
diff --git a/juneau-microservice/juneau-microservice-test/pom.xml b/juneau-rest/juneau-rest-client-test/pom.xml
similarity index 51%
copy from juneau-microservice/juneau-microservice-test/pom.xml
copy to juneau-rest/juneau-rest-client-test/pom.xml
index 03c6f1b..95fd757 100644
--- a/juneau-microservice/juneau-microservice-test/pom.xml
+++ b/juneau-rest/juneau-rest-client-test/pom.xml
@@ -19,86 +19,158 @@
 
 	<parent>
 		<groupId>org.apache.juneau</groupId>
-		<artifactId>juneau-microservice</artifactId>
+		<artifactId>juneau-rest</artifactId>
 		<version>8.0.1-SNAPSHOT</version>
 	</parent>
 
-	<artifactId>juneau-microservice-test</artifactId>
-	<name>Apache Juneau Microservice Tests</name>
-	<description>Tests for Juneau Client/Server/Microservice.</description>
-
-	<properties>
-		<maven.javadoc.skip>true</maven.javadoc.skip>
-		
-		<!-- Java 8 required because Jetty requires it. -->
-		<maven.compiler.source>1.8</maven.compiler.source>
-		<maven.compiler.target>1.8</maven.compiler.target>
-	</properties>
+	<artifactId>juneau-rest-client-test</artifactId>
+	<name>Apache Juneau REST Client API - Tests</name>
+	<description>REST client API - Tests</description>
+	<packaging>bundle</packaging>
 
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-examples-rest</artifactId>
+			<artifactId>juneau-marshall</artifactId>
 			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-core-test</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-rest-server</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-rest-server-jaxrs</artifactId>
-			<version>${project.version}</version>
+			<groupId>javax.activation</groupId>
+			<artifactId>javax.activation-api</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.juneau</groupId>
-			<artifactId>juneau-marshall-rdf</artifactId>
-			<version>${project.version}</version>
+			<groupId>com.sun.activation</groupId>
+			<artifactId>javax.activation</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
-			<scope>compile</scope>
+			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>javax.ws.rs</groupId>
-			<artifactId>jsr311-api</artifactId>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-rest-mock</artifactId>
+			<version>${project.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>javax.servlet-api</artifactId>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-core-test</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>javax.activation</groupId>
-			<artifactId>javax.activation-api</artifactId>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-rest-mock</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>com.sun.activation</groupId>
-			<artifactId>javax.activation</artifactId>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+			<scope>test</scope>
 		</dependency>
 	</dependencies>
-	
+
+	<properties>
+		<!-- Skip javadoc generation since we generate them in the aggregate pom -->
+		<maven.javadoc.skip>true</maven.javadoc.skip>
+		
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+	</properties>
+
 	<build>
 		<plugins>
 			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<version>3.2.0</version>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Automatic-Module-Name>org.apache.juneau.rest.client</Automatic-Module-Name>
+					</instructions>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<phase>verify</phase>
+						<goals>
+							<goal>jar-no-fork</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-surefire-plugin</artifactId>
 				<configuration>
 					<includes>
-						<include>
-							**/_TestSuite.java
-						</include>
+						<include>**/*Test.class</include>
 					</includes>
 				</configuration>
 			</plugin>
+			<!--plugin>
+				<groupId>com.github.siom79.japicmp</groupId>
+				<artifactId>japicmp-maven-plugin</artifactId>
+				<version>0.13.0</version>
+				<configuration>
+					<oldVersion>
+						<dependency>
+							<groupId>org.apache.juneau</groupId>
+							<artifactId>${project.artifactId}</artifactId>
+							<version>${juneau.compare.version}</version>
+							<type>jar</type>
+						</dependency>
+					</oldVersion>
+					<newVersion>
+						<file>
+							<path>${project.build.directory}/${project.artifactId}-${project.version}.jar</path>
+						</file>
+					</newVersion>
+					<parameter>
+						<onlyModified>true</onlyModified>
+						<accessModifier>public</accessModifier>
+						<excludes>
+						</excludes>
+						<ignoreMissingClasses>true</ignoreMissingClasses>
+						<onlyBinaryIncompatible>true</onlyBinaryIncompatible>
+						<breakBuildOnBinaryIncompatibleModifications>true</breakBuildOnBinaryIncompatibleModifications>
+						<breakBuildIfCausedByExclusion>false</breakBuildIfCausedByExclusion>
+						<breakBuildBasedOnSemanticVersioning>true</breakBuildBasedOnSemanticVersioning>
+						<overrideCompatibilityChangeParameters>
+							<overrideCompatibilityChangeParameter>
+								<binaryCompatible>true</binaryCompatible>
+								<compatibilityChange>SUPERCLASS_REMOVED</compatibilityChange>
+								<sourceCompatible>true</sourceCompatible>
+							</overrideCompatibilityChangeParameter>
+							<overrideCompatibilityChangeParameter>
+								<binaryCompatible>true</binaryCompatible>
+								<compatibilityChange>FIELD_REMOVED_IN_SUPERCLASS</compatibilityChange>
+								<sourceCompatible>true</sourceCompatible>
+							</overrideCompatibilityChangeParameter>
+						</overrideCompatibilityChangeParameters>
+					</parameter>
+				</configuration>
+				<executions>
+					<execution>
+						<phase>verify</phase>
+						<goals>
+							<goal>cmp</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin-->
 		</plugins>
 	</build>
 </project>
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java
index 4946425..e5d5837 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/BodyAnnotationTest.java
@@ -27,7 +27,7 @@ import org.apache.juneau.marshall.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java
index 4428c6d..2246a93 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/EndToEndInterfaceTest.java
@@ -26,11 +26,10 @@ import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.marshall.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.exception.*;
 import org.apache.juneau.rest.helper.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.MockRemoteResource;
 import org.apache.juneau.rest.response.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
@@ -207,7 +206,7 @@ public class EndToEndInterfaceTest {
 		@Override public UseProxy useProxy() { return UseProxy.INSTANCE; }
 	}
 
-	private static IC ic = RestClient.create().json().disableRedirectHandling().mockHttpConnection(MockRest.create(C.class).build()).build().getRemoteResource(IC.class);
+	private static IC ic = MockRestClient.create(C.class).json().disableRedirectHandling().build().getRemoteResource(IC.class);
 
 	@Test
 	public void c01_standardResponses_Ok() throws Exception {
@@ -1635,7 +1634,7 @@ public class EndToEndInterfaceTest {
 		}
 	}
 
-	private static IH ih = RestClient.create().json().disableRedirectHandling().mockHttpConnection(MockRest.create(H.class).build()).build().getRemoteResource(IH.class);
+	private static IH ih = MockRestClient.create(H.class).json().disableRedirectHandling().build().getRemoteResource(IH.class);
 
 	@Test
 	public void h01_seeOtherRoot() throws Exception {
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java
index e131d74..159e65d 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/FormDataAnnotationTest.java
@@ -27,7 +27,7 @@ import org.apache.juneau.http.annotation.Header;
 import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java
index 4fbc731..5ec37a3 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/HeaderAnnotationTest.java
@@ -25,7 +25,7 @@ import org.apache.juneau.http.annotation.Header;
 import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java
index 2fe42f2..9f878b7 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/PathAnnotationTest.java
@@ -25,7 +25,7 @@ import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java
index 61697f4..56c686b 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/QueryAnnotationTest.java
@@ -27,7 +27,7 @@ import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java
index ea44020..81f74d9 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RemoteMethodAnnotationTest.java
@@ -24,7 +24,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.marshall.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java
similarity index 92%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java
index 8d0b2e7..0646468 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RemoteResourceAnnotationTest.java
@@ -16,8 +16,8 @@ import static org.junit.Assert.*;
 
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.client.mock.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
+import org.apache.juneau.rest.mock2.MockRemoteResource;
 import org.junit.*;
 import org.junit.runners.*;
 
@@ -50,7 +50,6 @@ public class RemoteResourceAnnotationTest {
 			return "foo";
 		}
 	}
-	private static MockRest a = MockRest.build(A.class, null);
 
 	@RemoteResource
 	public static interface A01a {
@@ -118,7 +117,7 @@ public class RemoteResourceAnnotationTest {
 
 	@Test
 	public void a02c_pathOnClient() throws Exception {
-		try (RestClient rc = RestClient.create().mockHttpConnection(a).rootUrl("http://localhost/A").build()) {
+		try (RestClient rc = MockRestClient.create(A.class, null).rootUrl("http://localhost/A").build()) {
 			A02c t = rc.getRemoteResource(A02c.class);
 			assertEquals("foo", t.a02());
 			assertEquals("foo", t.a02a());
@@ -174,7 +173,7 @@ public class RemoteResourceAnnotationTest {
 
 	@Test
 	public void a03c_partialPath() throws Exception {
-		try (RestClient rc = RestClient.create().mockHttpConnection(a).rootUrl("http://localhost/A").build()) {
+		try (RestClient rc = MockRestClient.create(A.class, null).rootUrl("http://localhost/A").build()) {
 			A03c t = rc.getRemoteResource(A03c.class);
 			assertEquals("foo", t.a03());
 			assertEquals("foo", t.a03a());
@@ -194,7 +193,7 @@ public class RemoteResourceAnnotationTest {
 
 	@Test
 	public void a03d_partialPathExtraSlashes() throws Exception {
-		try (RestClient rc = RestClient.create().mockHttpConnection(a).rootUrl("http://localhost/A/").build()) {
+		try (RestClient rc = MockRestClient.create(A.class, null).rootUrl("http://localhost/A/").build()) {
 			A03d t = rc.getRemoteResource(A03d.class);
 			assertEquals("foo", t.a03());
 			assertEquals("foo", t.a03a());
@@ -224,8 +223,7 @@ public class RemoteResourceAnnotationTest {
 			return "foo";
 		}
 	}
-	private static MockRest b = MockRest.build(B.class, null);
-	private static RestClient rb = RestClient.create().mockHttpConnection(b).rootUrl("http://localhost/B").build();
+	private static RestClient rb = MockRestClient.create(B.class, null).rootUrl("http://localhost/B").build();
 
 	@RemoteResource
 	public static interface B01 {
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java
index 3d83abe..a20b1b9 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/RequestAnnotationTest.java
@@ -24,7 +24,7 @@ import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.http.annotation.Query;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java
rename to juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java
index 61b6dff..50561a9 100644
--- a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java
+++ b/juneau-rest/juneau-rest-client-test/src/test/java/org/apache/juneau/rest/client/remote/ResponseAnnotationTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.http.annotation.Response;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.client.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-client/.classpath b/juneau-rest/juneau-rest-client/.classpath
index 3759907..3ad59e4 100644
--- a/juneau-rest/juneau-rest-client/.classpath
+++ b/juneau-rest/juneau-rest-client/.classpath
@@ -1,11 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry kind="src" output="target/classes" path="src/main/java">
 		<attributes>
 			<attribute name="optional" value="true"/>
diff --git a/juneau-rest/juneau-rest-client/.settings/org.eclipse.core.resources.prefs b/juneau-rest/juneau-rest-client/.settings/org.eclipse.core.resources.prefs
index f9fe345..e9441bb 100644
--- a/juneau-rest/juneau-rest-client/.settings/org.eclipse.core.resources.prefs
+++ b/juneau-rest/juneau-rest-client/.settings/org.eclipse.core.resources.prefs
@@ -1,4 +1,3 @@
 eclipse.preferences.version=1
 encoding//src/main/java=UTF-8
-encoding//src/test/java=UTF-8
 encoding/<project>=UTF-8
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
index 5ad6092..c18c58a 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
@@ -52,15 +52,14 @@ import org.apache.juneau.http.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
+import org.apache.juneau.marshall.*;
 import org.apache.juneau.msgpack.*;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.plaintext.*;
-import org.apache.juneau.rest.client.mock.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.uon.*;
 import org.apache.juneau.urlencoding.*;
-import org.apache.juneau.utils.*;
 import org.apache.juneau.xml.*;
 
 /**
@@ -583,10 +582,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * @param c The mock connection.
 	 * @return This object (for method chaining).
 	 */
-	public RestClientBuilder mockHttpConnection(MockHttpConnection c) {
-		rootUrl("http://localhost");
-		return httpClientConnectionManager(new MockHttpClientConnectionManager(c));
-	}
+//	public RestClientBuilder mockHttpConnection(MockHttpConnection c) {
+//		rootUrl("http://localhost");
+//		return httpClientConnectionManager(new MockHttpClientConnectionManager(c));
+//	}
 
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -1107,6 +1106,24 @@ public class RestClientBuilder extends BeanContextBuilder {
 	}
 
 	/**
+	 * Configuration property:  Marshall
+	 *
+	 * <p>
+	 * Shortcut for specifying the {@link RestClient#RESTCLIENT_serializer} and {@link RestClient#RESTCLIENT_parser}
+	 * using the serializer and parser defined in a marshall.
+	 *
+	 * @param value The values to add to this setting.
+	 * @return This object (for method chaining).
+	 */
+	public RestClientBuilder marshall(Marshall value) {
+		if (value == null)
+			serializer((Serializer)null).parser((Parser)null);
+		else
+			serializer(value.getSerializer()).parser(value.getParser());
+		return this;
+	}
+
+	/**
 	 * Configuration property:  Parser.
 	 *
 	 * <p>
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/package-info.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/package-info.java
deleted file mode 100644
index a991250..0000000
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/***************************************************************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations under the License.
- *
- ***************************************************************************************************************************/
-
-/**
- * REST Client Mock API
- */
-package org.apache.juneau.rest.client.mock;
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-client/.classpath b/juneau-rest/juneau-rest-mock/.classpath
similarity index 55%
copy from juneau-rest/juneau-rest-client/.classpath
copy to juneau-rest/juneau-rest-mock/.classpath
index 3759907..a47b97f 100644
--- a/juneau-rest/juneau-rest-client/.classpath
+++ b/juneau-rest/juneau-rest-mock/.classpath
@@ -1,14 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="src" output="target/classes" path="src/main/java">
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry kind="src" path="src/test/java"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
 		<attributes>
-			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
@@ -17,10 +12,5 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/juneau-rest/juneau-rest-mock/.gitignore b/juneau-rest/juneau-rest-mock/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/juneau-rest/juneau-rest-mock/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/juneau-rest/juneau-rest-mock/.project b/juneau-rest/juneau-rest-mock/.project
new file mode 100644
index 0000000..aee194a
--- /dev/null
+++ b/juneau-rest/juneau-rest-mock/.project
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>juneau-rest-mock</name>
+    <buildSpec>
+        <buildCommand>
+            <name>org.eclipse.jdt.core.javabuilder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+        <buildCommand>
+            <name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+        <buildCommand>
+            <name>org.eclipse.m2e.core.maven2Builder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+    </buildSpec>
+    <natures>
+        <nature>org.eclipse.m2e.core.maven2Nature</nature>
+        <nature>org.eclipse.jdt.core.javanature</nature>
+        <nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature>
+    </natures>
+</projectDescription>
diff --git a/juneau-rest/juneau-rest-mock/pom.xml b/juneau-rest/juneau-rest-mock/pom.xml
new file mode 100644
index 0000000..bac5215
--- /dev/null
+++ b/juneau-rest/juneau-rest-mock/pom.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ***************************************************************************************************************************
+ * 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.                                              *
+ ***************************************************************************************************************************
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.juneau</groupId>
+		<artifactId>juneau-rest</artifactId>
+		<version>8.0.1-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>juneau-rest-mock</artifactId>
+	<name>Apache Juneau REST Mock API</name>
+	<description>REST mock API</description>
+	<packaging>bundle</packaging>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-rest-server</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-rest-client</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>javax.activation</groupId>
+			<artifactId>javax.activation-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.sun.activation</groupId>
+			<artifactId>javax.activation</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-core-test</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+		</dependency>
+	</dependencies>
+
+	<properties>
+		<!-- Skip javadoc generation since we generate them in the aggregate pom -->
+		<maven.javadoc.skip>true</maven.javadoc.skip>
+		
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+	</properties>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<version>3.2.0</version>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Automatic-Module-Name>org.apache.juneau.rest.client</Automatic-Module-Name>
+					</instructions>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<phase>verify</phase>
+						<goals>
+							<goal>jar-no-fork</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<includes>
+						<include>**/*Test.class</include>
+					</includes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<executions>
+					<execution>
+						<goals>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<!--plugin>
+				<groupId>com.github.siom79.japicmp</groupId>
+				<artifactId>japicmp-maven-plugin</artifactId>
+				<version>0.13.0</version>
+				<configuration>
+					<oldVersion>
+						<dependency>
+							<groupId>org.apache.juneau</groupId>
+							<artifactId>${project.artifactId}</artifactId>
+							<version>${juneau.compare.version}</version>
+							<type>jar</type>
+						</dependency>
+					</oldVersion>
+					<newVersion>
+						<file>
+							<path>${project.build.directory}/${project.artifactId}-${project.version}.jar</path>
+						</file>
+					</newVersion>
+					<parameter>
+						<onlyModified>true</onlyModified>
+						<accessModifier>public</accessModifier>
+						<excludes>
+						</excludes>
+						<ignoreMissingClasses>true</ignoreMissingClasses>
+						<onlyBinaryIncompatible>true</onlyBinaryIncompatible>
+						<breakBuildOnBinaryIncompatibleModifications>true</breakBuildOnBinaryIncompatibleModifications>
+						<breakBuildIfCausedByExclusion>false</breakBuildIfCausedByExclusion>
+						<breakBuildBasedOnSemanticVersioning>true</breakBuildBasedOnSemanticVersioning>
+						<overrideCompatibilityChangeParameters>
+							<overrideCompatibilityChangeParameter>
+								<binaryCompatible>true</binaryCompatible>
+								<compatibilityChange>SUPERCLASS_REMOVED</compatibilityChange>
+								<sourceCompatible>true</sourceCompatible>
+							</overrideCompatibilityChangeParameter>
+							<overrideCompatibilityChangeParameter>
+								<binaryCompatible>true</binaryCompatible>
+								<compatibilityChange>FIELD_REMOVED_IN_SUPERCLASS</compatibilityChange>
+								<sourceCompatible>true</sourceCompatible>
+							</overrideCompatibilityChangeParameter>
+						</overrideCompatibilityChangeParameters>
+					</parameter>
+				</configuration>
+				<executions>
+					<execution>
+						<phase>verify</phase>
+						<goals>
+							<goal>cmp</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin-->
+		</plugins>
+	</build>
+</project>
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockHttpClientConnection.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnection.java
similarity index 99%
rename from juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockHttpClientConnection.java
rename to juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnection.java
index f3ea773..1fa840f 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockHttpClientConnection.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnection.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.mock;
+package org.apache.juneau.rest.mock2;
 
 import java.io.*;
 import java.util.*;
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockHttpClientConnectionManager.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnectionManager.java
similarity index 98%
rename from juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockHttpClientConnectionManager.java
rename to juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnectionManager.java
index 9c77433..99ce6ab 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockHttpClientConnectionManager.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpClientConnectionManager.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.mock;
+package org.apache.juneau.rest.mock2;
 
 import java.io.*;
 import java.util.concurrent.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockHttpSession.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
similarity index 98%
rename from juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockHttpSession.java
rename to juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
index edbfae3..27dee34 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockHttpSession.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockHttpSession.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.mock;
+package org.apache.juneau.rest.mock2;
 
 import java.util.*;
 
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockRemoteResource.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRemoteResource.java
similarity index 76%
rename from juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockRemoteResource.java
rename to juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRemoteResource.java
index 4ae5170..938b7c4 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/mock/MockRemoteResource.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRemoteResource.java
@@ -10,15 +10,16 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.client.mock;
+package org.apache.juneau.rest.mock2;
 
 import java.util.*;
 
 import org.apache.juneau.json.*;
 import org.apache.juneau.marshall.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.client.remote.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -34,43 +35,59 @@ import org.apache.juneau.serializer.*;
  */
 public class MockRemoteResource<T> {
 
-	private MockRest.Builder mrb = MockRest.create();
+	private MockRest.Builder mrb;
+	private RestClientBuilder rcb = RestClient.create().json();
 	private final Class<T> intf;
-	private Serializer s = JsonSerializer.DEFAULT;
-	private Parser p = JsonParser.DEFAULT;
-	private boolean debug;
 
 	/**
 	 * Constructor.
 	 *
-	 * @param intf The remote interface.
-	 * @param impl The REST implementation class or bean.
+	 * @param intf
+	 * 	The remote interface annotated with {@link RemoteResource @RemoteResource}.
+	 * @param impl
+	 * 	The REST implementation bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
 	 */
 	protected MockRemoteResource(Class<T> intf, Object impl) {
 		this.intf = intf;
-		mrb.impl(impl);
+		mrb = MockRest.create(impl);
 	}
 
 	/**
-	 * Create a new builder using the specified remote resource interface and REST implementation class.
+	 * Create a new builder using the specified remote resource interface and REST implementation bean or bean class.
 	 *
-	 * @param intf The remote interface.
-	 * @param impl The REST implementation class.
+	 * <p>
+	 * Uses {@link JsonSerializer#DEFAULT} and {@link JsonParser#DEFAULT} for serializing and parsing by default.
+	 *
+	 *
+	 * @param intf
+	 * 	The remote interface annotated with {@link RemoteResource @RemoteResource}.
+	 * @param impl
+	 * 	The REST implementation bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
 	 * @return A new builder.
 	 */
-	public static <T> MockRemoteResource<T> create(Class<T> intf, Class<?> impl) {
+	public static <T> MockRemoteResource<T> create(Class<T> intf, Object impl) {
 		return new MockRemoteResource<>(intf, impl);
 	}
 
 	/**
-	 * Create a new builder using the specified remote resource interface and REST implementation bean.
+	 * Create a new builder using the specified remote resource interface and REST implementation bean or bean class.
 	 *
-	 * @param intf The remote interface.
-	 * @param impl The REST implementation bean.
+	 * <p>
+	 * Uses the serializer and parser defined on the specified marshall for serializing and parsing by default.
+	 *
+	 * @param intf
+	 * 	The remote interface annotated with {@link RemoteResource @RemoteResource}.
+	 * @param impl
+	 * 	The REST implementation bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 * @param m
+	 * 	The marshall to use for serializing and parsing the HTTP bodies.
 	 * @return A new builder.
 	 */
-	public static <T> MockRemoteResource<T> create(Class<T> intf, Object impl) {
-		return new MockRemoteResource<>(intf, impl);
+	public static <T> MockRemoteResource<T> create(Class<T> intf, Object impl, Marshall m) {
+		return new MockRemoteResource<>(intf, impl).marshall(m);
 	}
 
 	/**
@@ -80,26 +97,29 @@ public class MockRemoteResource<T> {
 	 */
 	public T build() {
 		MockRest mr = mrb.build();
-		return RestClient.create(s, p).debug(debug).mockHttpConnection(mr).headers(mr.getHeaders()).build().getRemoteResource(intf);
+		return rcb.httpClientConnectionManager(new MockHttpClientConnectionManager(mr)).rootUrl("http://localhost").headers(mr.getHeaders()).build().getRemoteResource(intf);
 	}
 
 	/**
 	 * Convenience method for getting a remote resource interface.
 	 *
 	 * <p>
+	 * Uses {@link JsonSerializer#DEFAULT} and {@link JsonParser#DEFAULT} for serializing and parsing by default.
+	 *
+	 * <p>
 	 * Equivalent to calling the following:
 	 * <p class='bcode w800'>
 	 * 	MockRemoteResource.<jsf>create</jsf>(intf, impl).build();
 	 * </p>
 	 *
-	 * <p>
-	 * Uses JSON serialization and parsing.
-	 *
-	 * @param intf The remote proxy interface class.
-	 * @param impl The REST implementation class.
+	 * @param intf
+	 * 	The remote interface annotated with {@link RemoteResource @RemoteResource}.
+	 * @param impl
+	 * 	The REST implementation bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
 	 * @return A new proxy interface.
 	 */
-	public static <T> T build(Class<T> intf, Class<?> impl) {
+	public static <T> T build(Class<T> intf, Object impl) {
 		return create(intf, impl).build();
 	}
 
@@ -107,27 +127,7 @@ public class MockRemoteResource<T> {
 	 * Convenience method for getting a remote resource interface.
 	 *
 	 * <p>
-	 * Equivalent to calling the following:
-	 * <p class='bcode w800'>
-	 * 	MockRemoteResource.<jsf>create</jsf>(intf, impl).serializer(s).parser(p).build();
-	 * </p>
-	 *
-	 * @param intf The remote proxy interface class.
-	 * @param impl The REST implementation class.
-	 * @param s
-	 * 	The serializer to use for serializing request bodies.
-	 * 	<br>Can be <jk>null</jk> to force no serializer to be used and no <code>Content-Type</code> header.
-	 * @param p
-	 * 	The parser to use for parsing response bodies.
-	 * 	<br>Can be <jk>null</jk> to force no parser to be used and no <code>Accept</code> header.
-	 * @return A new proxy interface.
-	 */
-	public static <T> T build(Class<T> intf, Class<?> impl, Serializer s, Parser p) {
-		return create(intf, impl).serializer(s).parser(p).build();
-	}
-
-	/**
-	 * Convenience method for getting a remote resource interface.
+	 * Uses the serializer and parser defined on the specified marshall for serializing and parsing by default.
 	 *
 	 * <p>
 	 * Equivalent to calling the following:
@@ -135,14 +135,17 @@ public class MockRemoteResource<T> {
 	 * 	MockRemoteResource.<jsf>create</jsf>(intf, impl).marshall(m).build();
 	 * </p>
 	 *
-	 * @param intf The remote proxy interface class.
-	 * @param impl The REST implementation class.
+	 * @param intf
+	 * 	The remote interface annotated with {@link RemoteResource @RemoteResource}.
+	 * @param impl
+	 * 	The REST implementation bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
 	 * @param m
 	 * 	The marshall to use for serializing request bodies and parsing response bodies.
 	 * 	<br>Can be <jk>null</jk> to force no serializer or parser to be used and no <code>Accept</code> or <code>Content-Type</code> header.
 	 * @return A new proxy interface.
 	 */
-	public static <T> T build(Class<T> intf, Class<?> impl, Marshall m) {
+	public static <T> T build(Class<T> intf, Object impl, Marshall m) {
 		return create(intf, impl).marshall(m).build();
 	}
 
@@ -150,24 +153,7 @@ public class MockRemoteResource<T> {
 	 * Convenience method for getting a remote resource interface.
 	 *
 	 * <p>
-	 * Equivalent to calling the following:
-	 * <p class='bcode w800'>
-	 * 	MockRemoteResource.<jsf>create</jsf>(intf, impl).build();
-	 * </p>
-	 *
-	 * <p>
-	 * Uses JSON serialization and parsing.
-	 *
-	 * @param intf The remote proxy interface class.
-	 * @param impl The REST implementation bean.
-	 * @return A new proxy interface.
-	 */
-	public static <T> T build(Class<T> intf, Object impl) {
-		return create(intf, impl).build();
-	}
-
-	/**
-	 * Convenience method for getting a remote resource interface.
+	 * Uses the specified serializer and parser for serializing and parsing by default.
 	 *
 	 * <p>
 	 * Equivalent to calling the following:
@@ -175,10 +161,17 @@ public class MockRemoteResource<T> {
 	 * 	MockRemoteResource.<jsf>create</jsf>(intf, impl).serializer(s).parser(p).build();
 	 * </p>
 	 *
-	 * @param intf The remote proxy interface class.
-	 * @param impl The REST implementation object.
-	 * @param s The serializer to use for serializing request bodies.
-	 * @param p The parser to use for parsing response bodies.
+	 * @param intf
+	 * 	The remote interface annotated with {@link RemoteResource @RemoteResource}.
+	 * @param impl
+	 * 	The REST implementation bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 * @param s
+	 * 	The serializer to use for serializing request bodies.
+	 * 	<br>Can be <jk>null</jk> to force no serializer to be used and no <code>Content-Type</code> header.
+	 * @param p
+	 * 	The parser to use for parsing response bodies.
+	 * 	<br>Can be <jk>null</jk> to force no parser to be used and no <code>Accept</code> header.
 	 * @return A new proxy interface.
 	 */
 	public static <T> T build(Class<T> intf, Object impl, Serializer s, Parser p) {
@@ -186,31 +179,13 @@ public class MockRemoteResource<T> {
 	}
 
 	/**
-	 * Convenience method for getting a remote resource interface.
-	 *
-	 * <p>
-	 * Equivalent to calling the following:
-	 * <p class='bcode w800'>
-	 * 	MockRemoteResource.<jsf>create</jsf>(intf, impl).marshall(m).build();
-	 * </p>
-	 *
-	 * @param intf The remote proxy interface class.
-	 * @param impl The REST implementation object.
-	 * @param m The marshall to use for serializing request bodies and parsing response bodies.
-	 * @return A new proxy interface.
-	 */
-	public static <T> T build(Class<T> intf, Object impl, Marshall m) {
-		return create(intf, impl).marshall(m).build();
-	}
-
-	/**
 	 * Enable debug mode.
 	 *
 	 * @return This object (for method chaining).
 	 */
 	public MockRemoteResource<T> debug() {
 		mrb.debug();
-		this.debug = true;
+		rcb.debug();
 		return this;
 	}
 
@@ -225,6 +200,7 @@ public class MockRemoteResource<T> {
 	 */
 	public MockRemoteResource<T> header(String name, Object value) {
 		mrb.header(name, value);
+		rcb.header(name, value);
 		return this;
 	}
 
@@ -239,6 +215,7 @@ public class MockRemoteResource<T> {
 	 */
 	public MockRemoteResource<T> headers(Map<String,Object> value) {
 		mrb.headers(value);
+		rcb.headers(value);
 		return this;
 	}
 
@@ -250,6 +227,7 @@ public class MockRemoteResource<T> {
 	 */
 	public MockRemoteResource<T> accept(String value) {
 		mrb.accept(value);
+		rcb.accept(value);
 		return this;
 	}
 
@@ -261,6 +239,7 @@ public class MockRemoteResource<T> {
 	 */
 	public MockRemoteResource<T> contentType(String value) {
 		mrb.contentType(value);
+		rcb.contentType(value);
 		return this;
 	}
 
@@ -383,7 +362,7 @@ public class MockRemoteResource<T> {
 	 * @return This object (for method chaining).
 	 */
 	public MockRemoteResource<T> serializer(Serializer value) {
-		this.s = value;
+		rcb.serializer(value);
 		contentType(value == null ? null : value.getPrimaryMediaType().toString());
 		return this;
 	}
@@ -397,7 +376,7 @@ public class MockRemoteResource<T> {
 	 * @return This object (for method chaining).
 	 */
 	public MockRemoteResource<T> parser(Parser value) {
-		this.p = value;
+		rcb.parser(value);
 		accept(value == null ? null : value.getPrimaryMediaType().toString());
 		return this;
 	}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockRest.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRest.java
similarity index 68%
rename from juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockRest.java
rename to juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRest.java
index 698caba..8a03e2b 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockRest.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRest.java
@@ -10,15 +10,18 @@
 // * "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.mock;
+package org.apache.juneau.rest.mock2;
 
 import java.io.*;
 import java.util.*;
 import java.util.concurrent.*;
 
 import org.apache.juneau.marshall.*;
+import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.*;
+import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.util.*;
+import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.*;
 
 /**
@@ -77,12 +80,10 @@ public class MockRest implements MockHttpConnection {
 	protected MockRest(Builder b) {
 		try {
 			debug = b.debug;
-			Class<?> c = b.implClass;
-			Object o = b.implObject;
+			Class<?> c = b.impl instanceof Class ? (Class<?>)b.impl : b.impl.getClass();
 			Map<Class<?>,RestContext> contexts = debug ? CONTEXTS_DEBUG : CONTEXTS_NORMAL;
 			if (! contexts.containsKey(c)) {
-				if (o == null)
-					o = c.newInstance();
+				Object o = b.impl instanceof Class ? ((Class<?>)b.impl).newInstance() : b.impl;
 				RestContext rc = RestContext.create(o).logger(b.debug ? BasicRestLogger.class : NoOpRestLogger.class).build();
 				if (o instanceof RestServlet) {
 					((RestServlet)o).setContext(rc);
@@ -100,45 +101,26 @@ public class MockRest implements MockHttpConnection {
 	}
 
 	/**
-	 * Creates a new builder with no REST implementation.
-	 *
-	 * @return A new builder.
-	 */
-	public static Builder create() {
-		return new Builder();
-	}
-
-	/**
-	 * Creates a new builder with the specified REST implementation class.
+	 * Creates a new builder with the specified REST implementation bean or bean class.
 	 *
 	 * <p>
-	 * Uses Simple-JSON as the protocol by default.
+	 * No <code>Accept</code> or <code>Content-Type</code> header is specified by default.
 	 *
 	 * @param impl
-	 * 	The REST bean class.
-	 * 	<br>Class must have a no-arg constructor.
-	 * 	<br>Use {@link #create(Object)} for already-instantiated REST classes.
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
 	 * @return A new builder.
 	 */
-	public static Builder create(Class<?> impl) {
-		return create().impl(impl);
+	public static Builder create(Object impl) {
+		return new Builder(impl);
 	}
 
 	/**
-	 * Creates a new builder with the specified REST implementation class.
+	 * Convenience method for creating a MockRest over the specified REST implementation bean or bean class.
 	 *
 	 * <p>
-	 * Uses Simple-JSON as the protocol by default.
-	 *
-	 * @param impl The REST bean.
-	 * @return A new builder.
-	 */
-	public static Builder create(Object impl) {
-		return create().impl(impl);
-	}
-
-	/**
-	 * Convenience method for creating a MockRest over the specified REST implementation.
+	 * <code>Accept</code> header is set to <code>"application/json+simple"</code> by default.
+	 * <code>Content-Type</code> header is set to <code>"application/json"</code> by default.
 	 *
 	 * <p>
 	 * Equivalent to calling:
@@ -146,107 +128,82 @@ public class MockRest implements MockHttpConnection {
 	 * 	MockRest.create(impl, SimpleJson.<jsf>DEFAULT</jsf>).build();
 	 * </p>
 	 *
-	 * @param impl The REST bean class.
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
 	 * @return A new {@link MockRest} object.
 	 */
-	public static MockRest build(Class<?> impl) {
+	public static MockRest build(Object impl) {
 		return build(impl, SimpleJson.DEFAULT);
 	}
 
 	/**
-	 * Convenience method for creating a MockRest over the specified REST implementation.
+	 * Convenience method for creating a MockRest over the specified REST implementation bean or bean class.
+	 *
+	 * <p>
+	 * <code>Accept</code> and <code>Content-Type</code> headers are set to the primary media types on the specified marshall.
+	 *
+	 * <p>
+	 * Note that the marshall itself is not involved in any serialization or parsing.
 	 *
 	 * <p>
 	 * Equivalent to calling:
 	 * <p class='bpcode w800'>
-	 * 	MockRest.create(impl, SimpleJson.<jsf>DEFAULT</jsf>).build();
+	 * 	MockRest.create(impl, SimpleJson.<jsf>DEFAULT</jsf>).marshall(m).build();
 	 * </p>
 	 *
-	 * @param impl The REST bean.
-	 * @return A new {@link MockRest} object.
-	 */
-	public static MockRest build(Object impl) {
-		return build(impl, SimpleJson.DEFAULT);
-	}
-
-	/**
-	 * Convenience method for creating a MockRest over the specified REST implementation.
-	 *
-	 * @param impl The REST bean class.
-	 * @param m
-	 * 	The marshall to use for serializing and parsing HTTP bodies.
-	 * 	<br>Can be <jk>null</jk>.
-	 * @return A new {@link MockRest} object.
-	 */
-	public static MockRest build(Class<?> impl, Marshall m) {
-		Builder b = create().impl(impl);
-		if (m != null)
-			b.accept(m.getParser().getPrimaryMediaType().toString()).contentType(m.getSerializer().getPrimaryMediaType().toString());
-		return b.build();
-	}
-
-	/**
-	 * Convenience method for creating a MockRest over the specified REST implementation.
-	 *
-	 * @param impl The REST bean object.
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
 	 * @param m
-	 * 	The marshall to use for serializing and parsing HTTP bodies.
-	 * 	<br>Can be <jk>null</jk>.
+	 * 	The marshall to use for specifying the <code>Accept</code> and <code>Content-Type</code> headers.
+	 * 	<br>If <jk>null</jk>, headers will be reset.
 	 * @return A new {@link MockRest} object.
 	 */
 	public static MockRest build(Object impl, Marshall m) {
-		Builder b = create().impl(impl);
-		if (m != null)
-			b.accept(m.getParser().getPrimaryMediaType().toString()).contentType(m.getSerializer().getPrimaryMediaType().toString());
-		return b.build();
+		return create(impl).marshall(m).build();
 	}
 
 	/**
-	 * Returns the headers that were defined in this class.
+	 * Convenience method for creating a MockRest over the specified REST implementation bean or bean class.
+	 *
+	 * <p>
+	 * <code>Accept</code> and <code>Content-Type</code> headers are set to the primary media types on the specified serializer and parser.
+	 *
+	 * <p>
+	 * Note that the marshall itself is not involved in any serialization or parsing.
+	 *
+	 * <p>
+	 * Equivalent to calling:
+	 * <p class='bpcode w800'>
+	 * 	MockRest.create(impl, SimpleJson.<jsf>DEFAULT</jsf>).serializer(s).parser(p).build();
+	 * </p>
 	 *
-	 * @return The headers that were defined in this class.  Never <jk>null</jk>.
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 * @param s
+	 * 	The serializer to use for specifying the <code>Content-Type</code> header.
+	 * 	<br>If <jk>null</jk>, header will be reset.
+	 * @param p
+	 * 	The parser to use for specifying the <code>Accept</code> header.
+	 * 	<br>If <jk>null</jk>, header will be reset.
+	 * @return A new {@link MockRest} object.
 	 */
-	public Map<String,Object> getHeaders() {
-		return headers;
+	public static MockRest build(Object impl, Serializer s, Parser p) {
+		return create(impl).serializer(s).parser(p).build();
 	}
 
 	/**
 	 * Builder class.
 	 */
 	public static class Builder {
-		Class<?> implClass;
-		Object implObject;
+		Object impl;
 		boolean debug;
 		Map<String,Object> headers = new LinkedHashMap<>();
 
-		/**
-		 * Specifies the REST implementation class.
-		 *
-		 * @param value
-		 * 	The REST implementation class.
-		 * 	<br>Class must have a no-arg constructor.
-		 * @return This object (for method chaining).
-		 */
-		public Builder impl(Class<?> value) {
-			this.implClass = value;
-			return this;
-		}
-
-		/**
-		 * Specifies the REST implementation bean.
-		 *
-		 * @param value
-		 * 	The REST implementation bean.
-		 * @return This object (for method chaining).
-		 */
-		public Builder impl(Object value) {
-			if (value instanceof Class) {
-				this.implClass = (Class<?>)value;
-			} else {
-				this.implObject = value;
-				this.implClass = value.getClass();
-			}
-			return this;
+		Builder(Object impl) {
+			this.impl = impl;
 		}
 
 		/**
@@ -291,7 +248,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Adds an <code>Accept</code> header to every request.
+		 * Specifies the <code>Accept</code> header to every request.
 		 *
 		 * @param value The <code>Accept/code> header value.
 		 * @return This object (for method chaining).
@@ -301,7 +258,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Adds a <code>Content-Type</code> header to every request.
+		 * Specifies the  <code>Content-Type</code> header to every request.
 		 *
 		 * @param value The <code>Content-Type</code> header value.
 		 * @return This object (for method chaining).
@@ -311,7 +268,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/json"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/json"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -320,7 +277,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/json+simple"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/json+simple"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -329,7 +286,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/xml"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/xml"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -338,7 +295,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/html"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/html"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -347,7 +304,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/plain"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/plain"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -356,7 +313,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"octal/msgpack"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"octal/msgpack"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -365,7 +322,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/uon"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/uon"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -374,7 +331,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/x-www-form-urlencoded"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/x-www-form-urlencoded"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -383,7 +340,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/yaml"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/yaml"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -392,7 +349,7 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
-		 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/openapi"</js>.
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/openapi"</js>.
 		 *
 		 * @return This object (for method chaining).
 		 */
@@ -401,6 +358,44 @@ public class MockRest implements MockHttpConnection {
 		}
 
 		/**
+		 * Convenience method for setting the <code>Content-Type</code> header to the primary media type on the specified serializer.
+		 *
+		 * @param value
+		 * 	The serializer to get the media type from.
+		 * 	<br>If <jk>null</jk>, header will be reset.
+		 * @return This object (for method chaining).
+		 */
+		public Builder serializer(Serializer value) {
+			return contentType(value == null ? null : value.getPrimaryMediaType().toString());
+		}
+
+		/**
+		 * Convenience method for setting the <code>Accept</code> header to the primary media type on the specified parser.
+		 *
+		 * @param value
+		 * 	The parser to get the media type from.
+		 * 	<br>If <jk>null</jk>, header will be reset.
+		 * @return This object (for method chaining).
+		 */
+		public Builder parser(Parser value) {
+			return accept(value == null ? null : value.getPrimaryMediaType().toString());
+		}
+
+		/**
+		 * Convenience method for setting the <code>Accept</code> and <code>Content-Type</code> headers to the primary media types on the specified marshall.
+		 *
+		 * @param value
+		 * 	The marshall to get the media types from.
+		 * 	<br>If <jk>null</jk>, headers will be reset.
+		 * @return This object (for method chaining).
+		 */
+		public Builder marshall(Marshall value) {
+			contentType(value == null ? null : value.getSerializer().getPrimaryMediaType().toString());
+			accept(value == null ? null : value.getParser().getPrimaryMediaType().toString());
+			return this;
+		}
+
+		/**
 		 * Create a new {@link MockRest} object based on the settings on this builder.
 		 *
 		 * @return A new {@link MockRest} object.
@@ -408,7 +403,6 @@ public class MockRest implements MockHttpConnection {
 		public MockRest build() {
 			return new MockRest(this);
 		}
-
 	}
 
 	/**
@@ -529,4 +523,16 @@ public class MockRest implements MockHttpConnection {
 	public MockServletRequest patch(String path, Object body) throws Exception {
 		return request("PATCH", path, null, body);
 	}
+
+	/**
+	 * Returns the headers that were defined in this class.
+	 *
+	 * @return
+	 * 	The headers that were defined in this class.
+	 * 	<br>Never <jk>null</jk>.
+	 */
+	public Map<String,Object> getHeaders() {
+		return headers;
+	}
+
 }
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java
new file mode 100644
index 0000000..7ebf139
--- /dev/null
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java
@@ -0,0 +1,268 @@
+// ***************************************************************************************************************************
+// * 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.marshall.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.rest.client.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * TODO
+ */
+public class MockRestClient extends RestClientBuilder {
+
+	private MockRest.Builder mrb;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 */
+	protected MockRestClient(Object impl) {
+		super(null, null);
+		mrb = MockRest.create(impl);
+		rootUrl("http://localhost");
+	}
+
+	/**
+	 * Creates a new RestClient builder configured with the specified REST implementation bean or bean class.
+	 *
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 * @return A new builder.
+	 */
+	public static MockRestClient create(Object impl) {
+		return new MockRestClient(impl);
+	}
+
+	/**
+	 * Creates a new RestClient builder configured with the specified REST implementation bean or bean class.
+	 *
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 * @param m
+	 * 	The marshall to use for serializing and parsing HTTP bodies.
+	 * 	<br>Can be <jk>null</jk> (will remove the existing serializer/parser).
+	 * @return A new builder.
+	 */
+	public static MockRestClient create(Object impl, Marshall m) {
+		return create(impl).marshall(m);
+	}
+
+	/**
+	 * Creates a new RestClient builder configured with the specified REST implementation bean or bean class.
+	 *
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 * @param s
+	 * 	The serializer to use for serializing HTTP bodies.
+	 * 	<br>Can be <jk>null</jk> (will remove the existing serializer).
+	 * @param p
+	 * 	The parser to use for parsing HTTP bodies.
+	 * 	<br>Can be <jk>null</jk> (will remove the existing parser).
+	 * @return A new builder.
+	 */
+	public static MockRestClient create(Object impl, Serializer s, Parser p) {
+		return create(impl).serializer(s).parser(p);
+	}
+
+	/**
+	 * Convenience method for creating a Restclient over the specified REST implementation bean or bean class.
+	 *
+	 * <p>
+	 * Equivalent to calling:
+	 * <p class='bpcode w800'>
+	 * 	MockRestClient.create(impl, m).build();
+	 * </p>
+	 *
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 * @param m
+	 * 	The marshall to use for specifying the <code>Accept</code> and <code>Content-Type</code> headers.
+	 * 	<br>If <jk>null</jk>, headers will be reset.
+	 * @return A new {@link MockRest} object.
+	 */
+	public static RestClient build(Object impl, Marshall m) {
+		return create(impl, m).build();
+	}
+
+	/**
+	 * Convenience method for creating a Restclient over the specified REST implementation bean or bean class.
+	 *
+	 * <p>
+	 * Equivalent to calling:
+	 * <p class='bpcode w800'>
+	 * 	MockRestClient.create(impl, s, p).build();
+	 * </p>
+	 *
+	 * @param impl
+	 * 	The REST bean or bean class annotated with {@link RestResource @RestResource}.
+	 * 	<br>If a class, it must have a no-arg constructor.
+	 * @param s
+	 * 	The serializer to use for serializing HTTP bodies.
+	 * 	<br>Can be <jk>null</jk> (will remove the existing serializer).
+	 * @param p
+	 * 	The parser to use for parsing HTTP bodies.
+	 * 	<br>Can be <jk>null</jk> (will remove the existing parser).
+	 * @return A new {@link MockRest} object.
+	 */
+	public static RestClient build(Object impl, Serializer s, Parser p) {
+		return create(impl, s, p).build();
+	}
+
+	@Override
+	public RestClient build() {
+		httpClientConnectionManager(new MockHttpClientConnectionManager(mrb.build()));
+		return super.build();
+	}
+
+	/**
+	 * Enable debug mode.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient debug() {
+		mrb.debug();
+		debug();
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/json"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient json() {
+		marshall(Json.DEFAULT);
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/json+simple"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient simpleJson() {
+		marshall(SimpleJson.DEFAULT);
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/xml"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient xml() {
+		marshall(Xml.DEFAULT);
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/html"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient html() {
+		marshall(Html.DEFAULT);
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/plain"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient plainText() {
+		marshall(PlainText.DEFAULT);
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"octal/msgpack"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient msgpack() {
+		marshall(MsgPack.DEFAULT);
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/uon"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient uon() {
+		marshall(Uon.DEFAULT);
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"application/x-www-form-urlencoded"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient urlEnc() {
+		marshall(UrlEncoding.DEFAULT);
+		return this;
+	}
+
+	/**
+	 * Convenience method for setting <code>Accept</code> and <code>Content-Type</code> headers to <js>"text/openapi"</js>.
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	public MockRestClient openapi() {
+		marshall(OpenApi.DEFAULT);
+		return this;
+	}
+
+	@Override
+	public MockRestClient marshall(Marshall value) {
+		super.marshall(value);
+		mrb.marshall(value);
+		return this;
+	}
+
+	@Override
+	public MockRestClient serializer(Serializer value) {
+		super.serializer(value);
+		mrb.serializer(value);
+		return this;
+	}
+
+	@Override
+	public MockRestClient parser(Parser value) {
+		super.parser(value);
+		mrb.parser(value);
+		return this;
+	}
+}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletRequest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
rename to juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletRequest.java
index 5a9b1fd..ffe98d7 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletRequest.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.mock;
+package org.apache.juneau.rest.mock2;
 
 import static org.apache.juneau.internal.StringUtils.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockServletResponse.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponse.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockServletResponse.java
rename to juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponse.java
index 2418911..93b0858 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/MockServletResponse.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockServletResponse.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.rest.mock;
+package org.apache.juneau.rest.mock2;
 
 import static org.apache.juneau.internal.StringUtils.*;
 
@@ -252,7 +252,7 @@ public class MockServletResponse implements HttpServletResponse, MockHttpRespons
 	@Override /* HttpServletResponse */
 	public Collection<String> getHeaders(String name) {
 		String[] s = headerMap.get(name);
-		return s == null ? Collections.EMPTY_LIST : Arrays.asList(s);
+		return s == null ? Collections.emptyList() : Arrays.asList(s);
 	}
 
 	@Override /* HttpServletResponse */
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/package-info.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/package-info.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/package-info.java
rename to juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/package-info.java
index ba27d99..11d7e56 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/mock/package-info.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/package-info.java
@@ -15,4 +15,4 @@
 /**
  * REST Server Mock API
  */
-package org.apache.juneau.rest.mock;
\ No newline at end of file
+package org.apache.juneau.rest.mock2;
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/ABean.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/ABean.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/ABean.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/ABean.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/Constants.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/Constants.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/Constants.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/Constants.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/DTOs.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/DTOs.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/DTOs.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/DTOs.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/ImplicitSwappedPojo.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/ImplicitSwappedPojo.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/ImplicitSwappedPojo.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/ImplicitSwappedPojo.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/SwappedPojo.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/SwappedPojo.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/SwappedPojo.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/SwappedPojo.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/SwappedPojoSwap.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/SwappedPojoSwap.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/SwappedPojoSwap.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/SwappedPojoSwap.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TestEnum.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TestEnum.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TestEnum.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TestEnum.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
index 377c3c8..14b4040 100755
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
+++ b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
@@ -20,7 +20,7 @@ import java.util.zip.*;
 
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 
 @SuppressWarnings({"javadoc"})
 public class TestUtils extends org.apache.juneau.testutils.TestUtils {
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TypedBean.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TypedBean.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TypedBean.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TypedBean.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TypedBeanImpl.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TypedBeanImpl.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/TypedBeanImpl.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/TypedBeanImpl.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/XPartSerializer.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/XPartSerializer.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/testutils/XPartSerializer.java
rename to juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/testutils/XPartSerializer.java
diff --git a/juneau-rest/juneau-rest-server/.classpath b/juneau-rest/juneau-rest-server-test/.classpath
similarity index 86%
copy from juneau-rest/juneau-rest-server/.classpath
copy to juneau-rest/juneau-rest-server-test/.classpath
index e4980db..64866cc 100644
--- a/juneau-rest/juneau-rest-server/.classpath
+++ b/juneau-rest/juneau-rest-server-test/.classpath
@@ -12,11 +12,6 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
diff --git a/juneau-rest/juneau-rest-server-test/.gitignore b/juneau-rest/juneau-rest-server-test/.gitignore
new file mode 100644
index 0000000..22d1e37
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-test/.gitignore
@@ -0,0 +1,2 @@
+/target/
+**/.DS_Store
diff --git a/juneau-rest/juneau-rest-server-test/.project b/juneau-rest/juneau-rest-server-test/.project
new file mode 100644
index 0000000..f0b1d1a
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-test/.project
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>juneau-rest-server</name>
+    <buildSpec>
+        <buildCommand>
+            <name>org.eclipse.jdt.core.javabuilder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+        <buildCommand>
+            <name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+        <buildCommand>
+            <name>org.eclipse.m2e.core.maven2Builder</name>
+            <arguments>
+            </arguments>
+        </buildCommand>
+    </buildSpec>
+    <natures>
+        <nature>org.eclipse.m2e.core.maven2Nature</nature>
+        <nature>org.eclipse.jdt.core.javanature</nature>
+        <nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature>
+    </natures>
+</projectDescription>
diff --git a/juneau-rest/juneau-rest-server-test/pom.xml b/juneau-rest/juneau-rest-server-test/pom.xml
new file mode 100644
index 0000000..b99c1f6
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-test/pom.xml
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ***************************************************************************************************************************
+ * 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.                                              *
+ ***************************************************************************************************************************
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.juneau</groupId>
+		<artifactId>juneau-rest</artifactId>
+		<version>8.0.1-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>juneau-rest-server-test</artifactId>
+	<name>Apache Juneau REST Servlet API - Tests</name>
+	<description>REST servlet API - Tests</description>
+	<packaging>bundle</packaging>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-rest-mock</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>javax.xml.bind</groupId>
+			<artifactId>jaxb-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>javax.activation</groupId>
+			<artifactId>javax.activation-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.sun.activation</groupId>
+			<artifactId>javax.activation</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-core-test</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.juneau</groupId>
+			<artifactId>juneau-rest-mock</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<properties>
+		<!-- Skip javadoc generation since we generate them in the aggregate pom -->
+		<maven.javadoc.skip>true</maven.javadoc.skip>
+		
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+	</properties>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<phase>verify</phase>
+						<goals>
+							<goal>jar-no-fork</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<version>3.2.0</version>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Automatic-Module-Name>org.apache.juneau.rest.server</Automatic-Module-Name>
+					</instructions>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<includes>
+						<include>**/*Test.class</include>
+					</includes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<executions>
+					<execution>
+						<goals>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<!--plugin>
+				<groupId>com.github.siom79.japicmp</groupId>
+				<artifactId>japicmp-maven-plugin</artifactId>
+				<version>0.13.0</version>
+				<configuration>
+					<skip>false</skip>
+					<oldVersion>
+						<dependency>
+							<groupId>org.apache.juneau</groupId>
+							<artifactId>${project.artifactId}</artifactId>
+							<version>${juneau.compare.version}</version>
+							<type>jar</type>
+						</dependency>
+					</oldVersion>
+					<newVersion>
+						<file>
+							<path>${project.build.directory}/${project.artifactId}-${project.version}.jar</path>
+						</file>
+					</newVersion>
+					<parameter>
+						<onlyModified>true</onlyModified>
+						<accessModifier>public</accessModifier>
+						<excludes>
+							<exclude>org.apache.juneau.rest.response.DefaultHandler</exclude>
+							<exclude>org.apache.juneau.rest.response.InputStreamHandler</exclude>
+							<exclude>org.apache.juneau.rest.response.ReaderHandler</exclude>
+							<exclude>org.apache.juneau.rest.response.RedirectHandler</exclude>
+							<exclude>org.apache.juneau.rest.response.StreamableHandler</exclude>
+							<exclude>org.apache.juneau.rest.response.WritableHandler</exclude>
+							<exclude>org.apache.juneau.rest.response.ZipFileListFileHandler</exclude>
+							<exclude>org.apache.juneau.rest.ResponseHandler</exclude>
+							<exclude>org.apache.juneau.rest.RestCallHandler</exclude>
+							<exclude>org.apache.juneau.rest.RestException</exclude>
+						</excludes>
+						<ignoreMissingClasses>true</ignoreMissingClasses>
+						<onlyBinaryIncompatible>true</onlyBinaryIncompatible>
+						<breakBuildOnBinaryIncompatibleModifications>true</breakBuildOnBinaryIncompatibleModifications>
+						<breakBuildIfCausedByExclusion>false</breakBuildIfCausedByExclusion>
+						<breakBuildBasedOnSemanticVersioning>true</breakBuildBasedOnSemanticVersioning>
+						<overrideCompatibilityChangeParameters>
+							<overrideCompatibilityChangeParameter>
+								<binaryCompatible>true</binaryCompatible>
+								<compatibilityChange>SUPERCLASS_REMOVED</compatibilityChange>
+								<sourceCompatible>true</sourceCompatible>
+							</overrideCompatibilityChangeParameter>
+							<overrideCompatibilityChangeParameter>
+								<binaryCompatible>true</binaryCompatible>
+								<compatibilityChange>FIELD_REMOVED_IN_SUPERCLASS</compatibilityChange>
+								<sourceCompatible>true</sourceCompatible>
+							</overrideCompatibilityChangeParameter>
+							<overrideCompatibilityChangeParameter>
+								<binaryCompatible>true</binaryCompatible>
+								<compatibilityChange>METHOD_RETURN_TYPE_CHANGED</compatibilityChange>
+								<sourceCompatible>true</sourceCompatible>
+							</overrideCompatibilityChangeParameter>
+						</overrideCompatibilityChangeParameters>
+					</parameter>
+				</configuration>
+				<executions>
+					<execution>
+						<phase>verify</phase>
+						<goals>
+							<goal>cmp</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin-->
+		</plugins>
+	</build>
+</project>
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
index 2db59fc..10ed8ca 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.http.ReaderResource;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.helper.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
index 38ad4af..01891f1 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
@@ -20,7 +20,7 @@ import org.apache.juneau.http.*;
 import org.apache.juneau.http.StreamResource;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
index c028638..65a804a 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/BasicRestInfoProviderTest.java
@@ -35,7 +35,7 @@ import org.apache.juneau.http.annotation.Query;
 import org.apache.juneau.http.annotation.Response;
 import org.apache.juneau.http.annotation.Tag;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BeanContextPropertiesTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/BeanContextPropertiesTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BeanContextPropertiesTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/BeanContextPropertiesTest.java
index 44b7bc1..ed99c60 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/BeanContextPropertiesTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/BeanContextPropertiesTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.http.annotation.Header;
 import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.http.annotation.Query;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.transforms.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/NlsTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/NlsTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/NlsTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/NlsTest.java
index c18aa55..23cd257 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/NlsTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/NlsTest.java
@@ -15,7 +15,7 @@ package org.apache.juneau.rest;
 import org.apache.juneau.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/PathsTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/PathsTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/PathsTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/PathsTest.java
index 69342e4..d4bc57b 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/PathsTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/PathsTest.java
@@ -17,7 +17,7 @@ import static org.apache.juneau.http.HttpMethodName.*;
 import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/RestParamsTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/RestParamsTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/RestParamsTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/RestParamsTest.java
index cecf860..3b02931 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/RestParamsTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/RestParamsTest.java
@@ -26,7 +26,7 @@ import org.apache.juneau.http.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/StatusCodesTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/StatusCodesTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/StatusCodesTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/StatusCodesTest.java
index cc76593..d326837 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/StatusCodesTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/StatusCodesTest.java
@@ -22,7 +22,7 @@ import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.http.annotation.Query;
 import org.apache.juneau.json.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/ThreadLocalObjectsTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/ThreadLocalObjectsTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/ThreadLocalObjectsTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/ThreadLocalObjectsTest.java
index bf66e81..29f4a3b 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/ThreadLocalObjectsTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/ThreadLocalObjectsTest.java
@@ -15,7 +15,7 @@ package org.apache.juneau.rest;
 import static org.junit.Assert.*;
 
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocAsideTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocAsideTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocAsideTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocAsideTest.java
index 4656c75..62735f9 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocAsideTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocAsideTest.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocFooterTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocFooterTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocFooterTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocFooterTest.java
index bd58daf..9a56fe8 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocFooterTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocFooterTest.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocHeaderTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocHeaderTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocHeaderTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocHeaderTest.java
index a3beaf8..593bc7b 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocHeaderTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocHeaderTest.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavTest.java
index 63ae137..60c3611 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavTest.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavlinksTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavlinksTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavlinksTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavlinksTest.java
index 36d8df6..68a4572 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavlinksTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocNavlinksTest.java
@@ -14,7 +14,7 @@ package org.apache.juneau.rest.annotation;
 
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocScriptTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocScriptTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocScriptTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocScriptTest.java
index 7922f1a..1cd1e05 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocScriptTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocScriptTest.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocStyleTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocStyleTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocStyleTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocStyleTest.java
index df8826d..3ef9c34 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/HtmlDocStyleTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/HtmlDocStyleTest.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/ResponseBodyAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/ResponseBodyAnnotationTest.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/ResponseBodyAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/ResponseBodyAnnotationTest.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java
index 64a7655..54ab805 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/ResponseHeaderAnnotationTest.java
@@ -18,7 +18,7 @@ import static org.junit.Assert.*;
 import org.apache.juneau.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java
index 9d76202..f1b4fee 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/ResponseStatusAnnotationTest.java
@@ -14,7 +14,7 @@ package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodBpiTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodBpiTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodBpiTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodBpiTest.java
index 4039a32..2d669a4 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodBpiTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodBpiTest.java
@@ -14,7 +14,7 @@ package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java
index 52a452d..89456eb 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodGuardsTest.java
@@ -13,7 +13,7 @@
 package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodMatchersTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodMatchersTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodMatchersTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodMatchersTest.java
index 8a1efef..d1a386e 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodMatchersTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodMatchersTest.java
@@ -15,7 +15,7 @@ package org.apache.juneau.rest.annotation;
 import static org.apache.juneau.http.HttpMethodName.*;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
index 7a676e1..836e95e 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
@@ -14,7 +14,7 @@ package org.apache.juneau.rest.annotation;
 
 import static org.apache.juneau.http.HttpMethodName.*;
 
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceMessagesTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceMessagesTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceMessagesTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceMessagesTest.java
index c184b05..591c113 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceMessagesTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceMessagesTest.java
@@ -15,7 +15,7 @@ package org.apache.juneau.rest.annotation;
 import java.util.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourcePathTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourcePathTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourcePathTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourcePathTest.java
index 8268242..4f6928f 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourcePathTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourcePathTest.java
@@ -15,7 +15,7 @@ package org.apache.juneau.rest.annotation;
 import static org.apache.juneau.http.HttpMethodName.*;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourcePropertiesTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourcePropertiesTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourcePropertiesTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourcePropertiesTest.java
index a85d8ab..a698488 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourcePropertiesTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourcePropertiesTest.java
@@ -17,7 +17,7 @@ import static org.apache.juneau.http.HttpMethodName.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java
index ee08149..bf49439 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceSerializersTest.java
@@ -14,7 +14,7 @@ package org.apache.juneau.rest.annotation;
 
 import org.apache.juneau.*;
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
index 95aa27e..cc34d43 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
@@ -12,7 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.annotation;
 
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/AnnotationInheritanceTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/AnnotationInheritanceTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/AnnotationInheritanceTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/AnnotationInheritanceTest.java
index 17ecb93..4f2ad49 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/AnnotationInheritanceTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/AnnotationInheritanceTest.java
@@ -19,7 +19,7 @@ import org.apache.juneau.http.annotation.Header;
 import org.apache.juneau.http.annotation.Query;
 import org.apache.juneau.json.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
index e1cbb2c..8bbc08d 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/BodyAnnotationTest.java
@@ -27,7 +27,7 @@ import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.annotation.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.rest.testutils.*;
 import org.apache.juneau.rest.testutils.DTOs;
 import org.apache.juneau.uon.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
index 9189877..9b7a3c1 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/FormDataAnnotationTest.java
@@ -23,7 +23,7 @@ import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.http.annotation.FormData;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.urlencoding.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/HasFormDataAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/HasFormDataAnnotationTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/HasFormDataAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/HasFormDataAnnotationTest.java
index 54df9aa..7285972 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/HasFormDataAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/HasFormDataAnnotationTest.java
@@ -15,7 +15,7 @@ package org.apache.juneau.rest.annotation2;
 import org.apache.juneau.http.annotation.HasFormData;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/HasQueryAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/HasQueryAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/HasQueryAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/HasQueryAnnotationTest.java
index 497d2d2..ddd12a0 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/HasQueryAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/HasQueryAnnotationTest.java
@@ -17,7 +17,7 @@ import static org.apache.juneau.http.HttpMethodName.*;
 import org.apache.juneau.http.annotation.HasQuery;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/HeaderAnnotationTest.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
index f9bea60..cd6b057 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/PathAnnotationTest.java
@@ -23,7 +23,7 @@ import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
index b3887f9..9f6463d 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/PathRemainderAnnotationTest.java
@@ -16,7 +16,7 @@ import static org.apache.juneau.http.HttpMethodName.*;
 
 import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
index 4da3c27..504dcce 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/QueryAnnotationTest.java
@@ -25,7 +25,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.annotation.Items;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java
index 7cd9519..b34962c 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/ResponseAnnotationTest.java
@@ -26,7 +26,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.jsonschema.annotation.Schema;
 import org.apache.juneau.oapi.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestHookTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestHookTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestHookTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestHookTest.java
index 1e8cb9c..4fe88bb 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestHookTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestHookTest.java
@@ -26,7 +26,7 @@ import org.apache.juneau.http.annotation.Body;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestMethodInheritTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestMethodInheritTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestMethodInheritTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestMethodInheritTest.java
index 002b04d..d031828 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestMethodInheritTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestMethodInheritTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java
index 6074e0d..1ac2f61 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestResourceParsersTest.java
@@ -20,7 +20,7 @@ import org.apache.juneau.http.annotation.Body;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestResourcePojoSwapsTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestResourcePojoSwapsTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestResourcePojoSwapsTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestResourcePojoSwapsTest.java
index b292c5e..ec4c6c4 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/annotation2/RestResourcePojoSwapsTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/annotation2/RestResourcePojoSwapsTest.java
@@ -20,7 +20,7 @@ import org.apache.juneau.http.annotation.Path;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
 import org.junit.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/exception/BasicTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/exception/BasicTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/exception/BasicTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/exception/BasicTest.java
index 902612e..da03dcc 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/exception/BasicTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/exception/BasicTest.java
@@ -18,7 +18,7 @@ import static org.apache.juneau.rest.testutils.TestUtils.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java
index b5cbcef..3605f0e 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptCharsetTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.http.annotation.Body;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.junit.*;
 import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java
index 09ad69e..69fe8ee 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptEncodingTest.java
@@ -20,7 +20,7 @@ import java.io.*;
 import org.apache.juneau.encoders.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java
index 0bb6fca..6d43320 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/AcceptTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.Body;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.apache.juneau.serializer.*;
 import org.junit.*;
 import org.junit.runners.*;
@@ -98,7 +98,7 @@ public class AcceptTest {
 			return in;
 		}
 	}
-	private static MockRest b = MockRest.create().impl(B.class).build();
+	private static MockRest b = MockRest.build(B.class, null);
 
 	@Test
 	public void b01_restMethodWithParsersSerializers_valid() throws Exception {
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ClientVersionTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ClientVersionTest.java
similarity index 96%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ClientVersionTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ClientVersionTest.java
index 028baf9..f575b07 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ClientVersionTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ClientVersionTest.java
@@ -15,7 +15,7 @@ package org.apache.juneau.rest.headers;
 import static org.apache.juneau.http.HttpMethodName.*;
 
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java
index 928ba50..751bdc9 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ContentEncodingTest.java
@@ -18,7 +18,7 @@ import static org.apache.juneau.rest.testutils.TestUtils.*;
 import org.apache.juneau.encoders.*;
 import org.apache.juneau.http.annotation.Body;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java
index c6a6b6b..f73d9fe 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/ContentTypeTest.java
@@ -19,7 +19,7 @@ import org.apache.juneau.http.annotation.Body;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/HeadersTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/HeadersTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/HeadersTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/HeadersTest.java
index 939d2b5..f15a46c 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/headers/HeadersTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/headers/HeadersTest.java
@@ -22,7 +22,7 @@ import org.apache.juneau.http.annotation.Header;
 import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/mock/MockServletRequestTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/mock/MockServletRequestTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/mock/MockServletRequestTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/mock/MockServletRequestTest.java
index 3dfd36c..6a0f310 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/mock/MockServletRequestTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/mock/MockServletRequestTest.java
@@ -15,6 +15,7 @@ package org.apache.juneau.rest.mock;
 import static org.apache.juneau.rest.testutils.TestUtils.*;
 import static org.junit.Assert.*;
 
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/response/BasicTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/response/BasicTest.java
similarity index 99%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/response/BasicTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/response/BasicTest.java
index 40df96e..3507b21 100644
--- a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/response/BasicTest.java
+++ b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/response/BasicTest.java
@@ -21,7 +21,7 @@ import java.net.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.mock.*;
+import org.apache.juneau.rest.mock2.*;
 import org.junit.*;
 import org.junit.runners.*;
 
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/util/RestUtilsTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/util/RestUtilsTest.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/util/RestUtilsTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/util/RestUtilsTest.java
diff --git a/juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/util/UrlPathPatternTest.java b/juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/util/UrlPathPatternTest.java
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/java/org/apache/juneau/rest/util/UrlPathPatternTest.java
rename to juneau-rest/juneau-rest-server-test/src/test/java/org/apache/juneau/rest/util/UrlPathPatternTest.java
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/BasicRestInfoProviderTest.properties b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/BasicRestInfoProviderTest.properties
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/BasicRestInfoProviderTest.properties
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/BasicRestInfoProviderTest.properties
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/BasicRestInfoProviderTest_swagger.json b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/BasicRestInfoProviderTest_swagger.json
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/BasicRestInfoProviderTest_swagger.json
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/BasicRestInfoProviderTest_swagger.json
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/NlsTest.properties b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/NlsTest.properties
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/NlsTest.properties
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/NlsTest.properties
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/RestParamsTest.properties b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/RestParamsTest.properties
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/RestParamsTest.properties
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/RestParamsTest.properties
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/RestParamsTest_ja_JP.properties b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/RestParamsTest_ja_JP.properties
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/RestParamsTest_ja_JP.properties
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/RestParamsTest_ja_JP.properties
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/annotation/RestResourceMessagesTest1.properties b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/annotation/RestResourceMessagesTest1.properties
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/annotation/RestResourceMessagesTest1.properties
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/annotation/RestResourceMessagesTest1.properties
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/annotation/RestResourceMessagesTest2.properties b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/annotation/RestResourceMessagesTest2.properties
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/annotation/RestResourceMessagesTest2.properties
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/annotation/RestResourceMessagesTest2.properties
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/annotation/xdocs/test.txt b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/annotation/xdocs/test.txt
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/annotation/xdocs/test.txt
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/annotation/xdocs/test.txt
diff --git a/juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/annotation/xdocs/xsubdocs/test.txt b/juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/annotation/xdocs/xsubdocs/test.txt
similarity index 100%
rename from juneau-rest/juneau-rest-server/src/test/resources/org/apache/juneau/rest/annotation/xdocs/xsubdocs/test.txt
rename to juneau-rest/juneau-rest-server-test/src/test/resources/org/apache/juneau/rest/annotation/xdocs/xsubdocs/test.txt
diff --git a/juneau-rest/juneau-rest-server/.classpath b/juneau-rest/juneau-rest-server/.classpath
index e4980db..c696e8f 100644
--- a/juneau-rest/juneau-rest-server/.classpath
+++ b/juneau-rest/juneau-rest-server/.classpath
@@ -1,11 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry kind="src" output="target/classes" path="src/main/java">
 		<attributes>
 			<attribute name="optional" value="true"/>
@@ -17,11 +11,6 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
diff --git a/juneau-rest/juneau-rest-server/.settings/org.eclipse.core.resources.prefs b/juneau-rest/juneau-rest-server/.settings/org.eclipse.core.resources.prefs
index 29abf99..abdea9a 100644
--- a/juneau-rest/juneau-rest-server/.settings/org.eclipse.core.resources.prefs
+++ b/juneau-rest/juneau-rest-server/.settings/org.eclipse.core.resources.prefs
@@ -1,6 +1,4 @@
 eclipse.preferences.version=1
 encoding//src/main/java=UTF-8
 encoding//src/main/resources=UTF-8
-encoding//src/test/java=UTF-8
-encoding//src/test/resources=UTF-8
 encoding/<project>=UTF-8
diff --git a/juneau-rest/pom.xml b/juneau-rest/pom.xml
index f6a2533..edabeee 100644
--- a/juneau-rest/pom.xml
+++ b/juneau-rest/pom.xml
@@ -34,6 +34,9 @@
 		<module>juneau-rest-server-rdf</module>
 		<module>juneau-rest-server-springboot</module>
 		<module>juneau-rest-client</module>
+		<module>juneau-rest-mock</module>
+		<module>juneau-rest-server-test</module>
+		<module>juneau-rest-client-test</module>
 	</modules>
 
 </project>