You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ke...@apache.org on 2024/04/27 06:30:44 UTC

(tinkerpop) branch http-remove-serializers updated (7e683b1b4c -> 2f7c34db0f)

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

kenhuuu pushed a change to branch http-remove-serializers
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


 discard 7e683b1b4c Create MessageSerializerV4s and remove MessageSerializer.
     new 2f7c34db0f Create MessageSerializerV4s and remove MessageSerializer.

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (7e683b1b4c)
            \
             N -- N -- N   refs/heads/http-remove-serializers (2f7c34db0f)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../console/jsr223/DriverGremlinPlugin.java        |  38 +++----
 .../gremlin/driver/SerializationBenchmark.java     |  41 ++++---
 .../ser/AbstractGraphSONMessageSerializerV4.java   |  34 ------
 .../util/ser/GraphBinaryMessageSerializerV4.java   | 125 ---------------------
 4 files changed, 36 insertions(+), 202 deletions(-)


(tinkerpop) 01/01: Create MessageSerializerV4s and remove MessageSerializer.

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kenhuuu pushed a commit to branch http-remove-serializers
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 2f7c34db0f38d6aa310321eeec55304c5bf647de
Author: Ken Hu <10...@users.noreply.github.com>
AuthorDate: Tue Apr 23 13:20:34 2024 -0700

    Create MessageSerializerV4s and remove MessageSerializer.
    
    This removes all the old MessageSerializers which includes
    GraphBinaryv1 and GraphSONv1-3.
---
 .../console/jsr223/DriverGremlinPlugin.java        |  38 +-
 .../graphson/GraphSONMapperEmbeddedTypeTest.java   |  57 +-
 .../GraphSONMapperPartialEmbeddedTypeTest.java     |   3 +
 .../structure/io/graphson/GraphSONMapperTest.java  |   7 +-
 .../src/main/java/examples/Connections.java        |   8 +-
 .../tinkerpop/gremlin/driver/Channelizer.java      |   4 +-
 .../apache/tinkerpop/gremlin/driver/Cluster.java   |  31 +-
 .../tinkerpop/gremlin/driver/RequestOptions.java   |   4 +-
 .../apache/tinkerpop/gremlin/driver/Settings.java  |   8 +-
 .../driver/handler/GremlinResponseHandler.java     |   8 +-
 .../driver/handler/HttpGremlinRequestEncoder.java  |  11 +-
 .../HttpGremlinResponseDebugStreamDecoder.java     |   8 +-
 .../handler/HttpGremlinResponseStreamDecoder.java  |  10 +-
 .../gremlin/driver/simple/AbstractClient.java      |  18 +-
 .../gremlin/driver/simple/SimpleClient.java        |  15 +-
 .../gremlin/driver/simple/SimpleHttpClient.java    |   4 +-
 .../gremlin/driver/util/ProfilingApplication.java  |   6 +-
 .../gremlin/driver/ClusterConfigTest.java          |  30 +-
 .../gremlin/driver/RequestMessageTest.java         |  56 --
 .../WebSocketClientBehaviorIntegrateTest.java      | 536 ------------------
 .../gremlin/server/AbstractChannelizer.java        |  35 +-
 .../tinkerpop/gremlin/server/GraphManager.java     |  14 +-
 .../apache/tinkerpop/gremlin/server/Settings.java  |  12 +-
 .../gremlin/server/auth/Authenticator.java         |   8 +-
 .../handler/HttpBasicAuthorizationHandler.java     |   6 -
 .../server/handler/HttpGremlinEndpointHandler.java |  25 +-
 .../gremlin/server/handler/HttpHandlerUtil.java    |  13 +-
 .../server/handler/HttpRequestIdHandler.java       |   4 +-
 .../server/handler/HttpRequestMessageDecoder.java  |  51 +-
 .../server/handler/SaslAuthenticationHandler.java  | 170 ------
 .../gremlin/server/handler/ServerSerializers.java  |  10 +-
 .../tinkerpop/gremlin/server/handler/StateKey.java |   8 +-
 .../gremlin/server/util/GremlinError.java          |   2 +-
 ...izer.java => TextPlainMessageSerializerV4.java} |  73 ++-
 .../driver/ClientConnectionIntegrateTest.java      |   2 -
 .../driver/remote/AbstractRemoteGraphProvider.java |   4 +-
 .../GraphBinaryRemoteGraphComputerProvider.java    |   4 +-
 .../remote/GraphBinaryRemoteGraphProvider.java     |   4 +-
 .../GraphSONRemoteGraphComputerProvider.java       |   4 +-
 .../driver/remote/GraphSONRemoteGraphProvider.java |   4 +-
 .../gremlin/driver/remote/RemoteWorld.java         |  12 +-
 .../gremlin/server/GremlinDriverIntegrateTest.java | 151 +----
 .../server/GremlinResultSetIntegrateTest.java      |  12 +-
 .../server/GremlinServerAuthIntegrateTest.java     |  15 +-
 .../server/GremlinServerAuthKrb5IntegrateTest.java |   8 +-
 .../server/GremlinServerHttpIntegrateTest.java     | 141 +++--
 .../gremlin/server/GremlinServerIntegrateTest.java |  18 +-
 .../GremlinServerSerializationIntegrateTest.java   |  16 +-
 .../handler/HttpRequestMessageDecoderTest.java     |  18 +-
 .../notifications/ProviderGraphManagerHelper.java  |  11 +-
 ....java => TextPlainMessageSerializerV4Test.java} |  20 +-
 .../gremlin/driver/SerializationBenchmark.java     |  41 +-
 .../gremlin/socket/server/SocketServerRunner.java  |   9 +-
 .../gremlin/socket/server/TestChannelizers.java    | 105 ----
 .../socket/server/TestWSGremlinInitializer.java    | 195 -------
 ...ageSerializer.java => MessageSerializerV4.java} |  52 +-
 .../org/apache/tinkerpop/gremlin/util/Tokens.java  |  17 +-
 .../gremlin/util/message/RequestMessage.java       | 180 ------
 .../gremlin/util/message/RequestMessageV4.java     |   2 +
 ...ResponseMessage.java => ResponseMessageV4.java} |  72 +--
 .../{ResponseStatus.java => ResponseStatusV4.java} |   6 +-
 .../AbstractGraphBinaryMessageSerializerV1.java    | 275 ---------
 .../ser/AbstractGraphSONMessageSerializerV1.java   | 229 --------
 .../ser/AbstractGraphSONMessageSerializerV2.java   | 306 ----------
 .../ser/AbstractGraphSONMessageSerializerV4.java   | 216 ++++---
 ...lizer.java => AbstractMessageSerializerV4.java} |   6 +-
 .../util/ser/GraphBinaryMessageSerializerV1.java   |  78 ---
 .../util/ser/GraphBinaryMessageSerializerV4.java   | 165 ++++--
 .../util/ser/GraphSONMessageSerializerV1.java      | 125 ----
 .../util/ser/GraphSONMessageSerializerV2.java      | 136 -----
 .../util/ser/GraphSONMessageSerializerV3.java      | 138 -----
 .../util/ser/GraphSONMessageSerializerV4.java      |  33 +-
 .../ser/GraphSONUntypedMessageSerializerV1.java    | 126 -----
 .../ser/GraphSONUntypedMessageSerializerV2.java    | 129 -----
 .../ser/GraphSONUntypedMessageSerializerV3.java    | 128 -----
 .../ser/GraphSONUntypedMessageSerializerV4.java    |  16 +-
 .../gremlin/util/ser/MessageTextSerializer.java    |  42 --
 .../gremlin/util/ser/MessageTextSerializerV4.java  |  66 ---
 .../util/ser/RequestMessageGryoSerializer.java     |  57 --
 .../util/ser/ResponseMessageGryoSerializer.java    |  67 ---
 .../ser/{Serializers.java => SerializersV4.java}   |  57 +-
 .../util/ser/binary/RequestMessageSerializer.java  |  83 ---
 .../ser/binary/RequestMessageSerializerV4.java     |  10 +-
 ...lizer.java => ResponseMessageSerializerV4.java} |  23 +-
 .../io/AbstractTypedCompatibilityTest.java         | 356 ++++++------
 .../io/AbstractUntypedCompatibilityTest.java       | 380 ++++++-------
 .../tinkerpop/gremlin/structure/io/Model.java      |  71 +--
 .../graphbinary/GraphBinaryCompatibilityTest.java  |   9 +-
 .../graphson/GraphSONTypedCompatibilityTest.java   |   6 +-
 .../graphson/GraphSONUntypedCompatibilityTest.java |   8 +-
 .../AbstractGraphSONMessageSerializerV1Test.java   |  53 --
 ...> AbstractGraphSONMessageSerializerV4Test.java} |   5 +-
 .../util/ser/GraphSONMessageSerializerV1Test.java  | 335 -----------
 .../util/ser/GraphSONMessageSerializerV2Test.java  | 627 ---------------------
 .../util/ser/GraphSONMessageSerializerV3Test.java  | 420 --------------
 ... GraphSONMessageSerializerV4RoundTripTest.java} |  20 +-
 .../util/ser/GraphSONMessageSerializerV4Test.java  | 137 ++++-
 .../GraphSONUntypedMessageSerializerV1Test.java    | 512 -----------------
 .../GraphSONUntypedMessageSerializerV2Test.java    | 471 ----------------
 .../GraphSONUntypedMessageSerializerV3Test.java    | 471 ----------------
 .../GraphSONUntypedMessageSerializerV4Test.java    |  28 +-
 .../binary/GraphBinaryMessageSerializerV1Test.java | 279 ---------
 .../binary/GraphBinaryMessageSerializerV4Test.java |  75 ++-
 .../util/ser/binary/MessageSerializerV4Test.java   | 154 +++++
 .../types/sample/SamplePersonSerializerTest.java   |  21 +-
 105 files changed, 1636 insertions(+), 7729 deletions(-)

diff --git a/gremlin-console/src/main/java/org/apache/tinkerpop/gremlin/console/jsr223/DriverGremlinPlugin.java b/gremlin-console/src/main/java/org/apache/tinkerpop/gremlin/console/jsr223/DriverGremlinPlugin.java
index f31f9a8318..81fd12154e 100644
--- a/gremlin-console/src/main/java/org/apache/tinkerpop/gremlin/console/jsr223/DriverGremlinPlugin.java
+++ b/gremlin-console/src/main/java/org/apache/tinkerpop/gremlin/console/jsr223/DriverGremlinPlugin.java
@@ -35,21 +35,18 @@ import org.apache.tinkerpop.gremlin.jsr223.ImportCustomizer;
 import org.apache.tinkerpop.gremlin.jsr223.console.ConsoleCustomizer;
 import org.apache.tinkerpop.gremlin.jsr223.console.GremlinShellEnvironment;
 import org.apache.tinkerpop.gremlin.jsr223.console.RemoteAcceptor;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.Tokens;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.apache.tinkerpop.gremlin.util.message.ResponseResult;
-import org.apache.tinkerpop.gremlin.util.message.ResponseStatus;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV2;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONUntypedMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializer;
+import org.apache.tinkerpop.gremlin.util.message.ResponseStatusV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphSONUntypedMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerTokens;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -64,24 +61,21 @@ public class DriverGremlinPlugin extends AbstractGremlinPlugin {
                     HttpResponseStatus.class,
                     Host.class,
                     LoadBalancingStrategy.class,
-                    MessageSerializer.class,
+                    MessageSerializerV4.class,
                     Result.class,
                     ResultSet.class,
                     Tokens.class,
                     ConnectionException.class,
                     ResponseException.class,
-                    RequestMessage.class,
-                    ResponseMessage.class,
+                    RequestMessageV4.class,
+                    ResponseMessageV4.class,
                     ResponseResult.class,
-                    ResponseStatus.class,
-                    GraphSONMessageSerializerV1.class,
-                    GraphSONUntypedMessageSerializerV1.class,
-                    GraphSONMessageSerializerV2.class,
-                    GraphSONMessageSerializerV3.class,
-                    GraphBinaryMessageSerializerV1.class,
-                    MessageTextSerializer.class,
+                    ResponseStatusV4.class,
+                    GraphSONMessageSerializerV4.class,
+                    GraphSONUntypedMessageSerializerV4.class,
+                    GraphBinaryMessageSerializerV4.class,
                     SerializationException.class,
-                    Serializers.class,
+                    SerializersV4.class,
                     SerTokens.class,
                     DriverRemoteConnection.class,
                     DriverRemoteTraversal.class).create();
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
index d96cac1fa0..82a0fda90b 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperEmbeddedTypeTest.java
@@ -78,6 +78,9 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
                         .addCustomModule(GraphSONXModuleV2.build())
                         .typeInfo(TypeInfo.PARTIAL_TYPES).create().createMapper()},
                 {"v3", GraphSONMapper.build().version(GraphSONVersion.V3_0)
+                        .addCustomModule(GraphSONXModuleV3.build())
+                        .typeInfo(TypeInfo.PARTIAL_TYPES).create().createMapper()},
+                {"v4", GraphSONMapper.build().version(GraphSONVersion.V4_0)
                         .addCustomModule(GraphSONXModuleV3.build())
                         .typeInfo(TypeInfo.PARTIAL_TYPES).create().createMapper()}
         });
@@ -92,7 +95,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleBoolean() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final boolean b = true;
         assertEquals(b, serializeDeserialize(mapper, b, Boolean.class));
@@ -100,7 +103,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleString() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final String s = "simple";
         assertEquals(s, serializeDeserialize(mapper, s, String.class));
@@ -117,7 +120,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleBulkSet() throws Exception {
-        // only supported on V3
+        // only supported on V3/V4
         assumeThat(version, not(anyOf(startsWith("v1"), startsWith("v2"))));
 
         final BulkSet<String> bs = new BulkSet<>();
@@ -143,7 +146,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleMap() throws Exception {
-        assumeThat(version, startsWith("v3"));
+        assumeThat(version, either(startsWith("v3")).or(startsWith("v4")));
 
         final Map<Object,Object> o = new LinkedHashMap<>();
         o.put("string key", "string value");
@@ -158,7 +161,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleList() throws Exception {
-        assumeThat(version, startsWith("v3"));
+        assumeThat(version, either(startsWith("v3")).or(startsWith("v4")));
 
         final List<Object> o = new ArrayList<>();
         o.add("test");
@@ -175,7 +178,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleSet() throws Exception {
-        assumeThat(version, startsWith("v3"));
+        assumeThat(version, either(startsWith("v3")).or(startsWith("v4")));
 
         final Set<Object> o = new LinkedHashSet<>();
         o.add("test");
@@ -193,7 +196,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleBiFunctionLambda() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final Lambda o = (Lambda) Lambda.biFunction("x,y -> 'test'");
         assertEquals(o, serializeDeserialize(mapper, o, Lambda.class));
@@ -201,7 +204,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleComparatorLambda() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final Lambda o = (Lambda) Lambda.comparator("x,y -> x <=> y");
         assertEquals(o, serializeDeserialize(mapper, o, Lambda.class));
@@ -209,7 +212,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleConsumerLambda() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final Lambda o = (Lambda) Lambda.consumer("x -> x");
         assertEquals(o, serializeDeserialize(mapper, o, Lambda.class));
@@ -217,7 +220,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleFunctionLambda() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final Lambda o = (Lambda) Lambda.function("x -> x");
         assertEquals(o, serializeDeserialize(mapper, o, Lambda.class));
@@ -225,7 +228,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandlePredicateLambda() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final Lambda o = (Lambda) Lambda.predicate("x -> true");
         assertEquals(o, serializeDeserialize(mapper, o, Lambda.class));
@@ -233,7 +236,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleSupplierLambda() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final Lambda o = (Lambda) Lambda.supplier("'test'");
         assertEquals(o, serializeDeserialize(mapper, o, Lambda.class));
@@ -241,7 +244,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleBytecodeBinding() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final Bytecode.Binding<String> o = new Bytecode.Binding<>("test", "testing");
         assertEquals(o, serializeDeserialize(mapper, o, Bytecode.Binding.class));
@@ -249,7 +252,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleTraverser() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final Traverser<String> o = new DefaultRemoteTraverser<>("test", 100);
         assertEquals(o, serializeDeserialize(mapper, o, Traverser.class));
@@ -335,7 +338,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleBigInteger() throws Exception  {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
         
         final BigInteger o = new BigInteger("123456789987654321123456789987654321");
         assertEquals(o, serializeDeserialize(mapper, o, BigInteger.class));
@@ -343,7 +346,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldReadBigIntegerAsString() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final BigInteger o = new BigInteger("123456789987654321123456789987654321");
         assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigInteger\", \"@value\": \"123456789987654321123456789987654321\"}", Object.class));
@@ -351,7 +354,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldReadBigIntegerAsNumber() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         // this was the original GraphSON 2.0/3.0 format published for BigInteger but jackson is flexible enough to
         // do it as a string. the string approach is probably better for most language variants so while this tests
@@ -363,7 +366,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandleBigDecimal() throws Exception  {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final BigDecimal o = new BigDecimal("123456789987654321123456789987654321");
         assertEquals(o, serializeDeserialize(mapper, o, BigDecimal.class));
@@ -371,7 +374,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandlePMultiValue() throws Exception  {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final P o = P.within(1,2,3,null);
         assertEquals(o, serializeDeserialize(mapper, o, P.class));
@@ -379,7 +382,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandlePSingleValue() throws Exception  {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final P o = P.within(1);
         assertEquals(o, serializeDeserialize(mapper, o, P.class));
@@ -387,7 +390,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandlePMultiValueAsList() throws Exception  {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final P o = P.within(Arrays.asList(1,2,3,null));
         assertEquals(o, serializeDeserialize(mapper, o, P.class));
@@ -395,7 +398,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandlePMultiValueAsSet() throws Exception  {
-        assumeThat(version, startsWith("v3"));
+        assumeThat(version, either(startsWith("v3")).or(startsWith("v4")));
 
         final P o = P.within(new HashSet<>(Arrays.asList(1,2,3)));
         assertEquals(o, serializeDeserialize(mapper, o, P.class));
@@ -403,7 +406,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandlePBetween() throws Exception  {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final P o = P.between(1, 100);
         assertEquals(o, serializeDeserialize(mapper, o, P.class));
@@ -413,7 +416,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
     public void shouldReadPWithJsonArray() throws Exception {
         // for some reason v3 is forgiving about the naked json array - leaving this here for backward compatibility,
         // but should be a g:List (i think)
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final P o = P.within(Arrays.asList(1,2,3));
         assertEquals(o, mapper.readValue("{\"@type\": \"g:P\", \"@value\": {\"predicate\": \"within\", \"value\": [{\"@type\": \"g:Int32\", \"@value\": 1},{\"@type\": \"g:Int32\", \"@value\": 2},{\"@type\": \"g:Int32\", \"@value\": 3}]}}", Object.class));
@@ -429,7 +432,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldReadBigDecimalAsString() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final BigDecimal o = new BigDecimal("123456789987654321123456789987654321");
         assertEquals(o, mapper.readValue("{\"@type\": \"gx:BigDecimal\", \"@value\": \"123456789987654321123456789987654321\"}", Object.class));
@@ -437,7 +440,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldReadBigDecimalAsNumber() throws Exception {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         // this was the original GraphSON 2.0/3.0 format published for BigDecimal but jackson is flexible enough to
         // do it as a string. the string approach is probably better for most language variants so while this tests
@@ -449,7 +452,7 @@ public class GraphSONMapperEmbeddedTypeTest extends AbstractGraphSONTest {
 
     @Test
     public void shouldHandlePExt() throws Exception  {
-        assumeThat(version, either(startsWith("v2")).or(startsWith("v3")));
+        assumeThat(version, not(startsWith("v1")));
 
         final P o = PExt.mix("bah");
         assertEquals(o, serializeDeserialize(mapper, o, P.class));
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java
index 4b07c95c67..afc57b2c9d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperPartialEmbeddedTypeTest.java
@@ -67,6 +67,9 @@ public class GraphSONMapperPartialEmbeddedTypeTest extends AbstractGraphSONTest
                         .addCustomModule(GraphSONXModuleV2.build())
                         .typeInfo(TypeInfo.PARTIAL_TYPES).create().createMapper()},
                 {"v3", GraphSONMapper.build().version(GraphSONVersion.V3_0)
+                        .addCustomModule(GraphSONXModuleV3.build())
+                        .typeInfo(TypeInfo.PARTIAL_TYPES).create().createMapper()},
+                {"v4", GraphSONMapper.build().version(GraphSONVersion.V4_0)
                         .addCustomModule(GraphSONXModuleV3.build())
                         .typeInfo(TypeInfo.PARTIAL_TYPES).create().createMapper()}
         });
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java
index 21089daba4..198e6899f3 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java
@@ -68,6 +68,7 @@ public class GraphSONMapperTest {
                 {"v2", GraphSONMapper.build().version(GraphSONVersion.V2_0).addCustomModule(GraphSONXModuleV2.build()).typeInfo(TypeInfo.NO_TYPES).create().createMapper()},
                 {"v2-default", GraphSONMapper.build().version(GraphSONVersion.V2_0).addDefaultXModule(true).typeInfo(TypeInfo.NO_TYPES).create().createMapper()}, // alternate construction of v2
                 {"v3", GraphSONMapper.build().version(GraphSONVersion.V3_0).addCustomModule(GraphSONXModuleV3.build()).typeInfo(TypeInfo.NO_TYPES).create().createMapper()},
+                {"v4", GraphSONMapper.build().version(GraphSONVersion.V4_0).addCustomModule(GraphSONXModuleV3.build()).typeInfo(TypeInfo.NO_TYPES).create().createMapper()},
         });
     }
 
@@ -87,7 +88,7 @@ public class GraphSONMapperTest {
         // v2 untyped seems to serialize the VertexProperty label. not changing that since it's already been
         // introduced a long while back. v3 dips back to v1 style - since it has never existed prior to 3.7.0
         // we can make this change
-        if (version.startsWith("v1") || version.startsWith("v3"))
+        if (version.startsWith("v1") || version.startsWith("v3") || version.startsWith("v4"))
             assertEquals("{\"id\":123,\"label\":\"person\",\"type\":\"vertex\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\"}],\"age\":[{\"id\":1,\"value\":\"31\"}]}}", json);
         else if (version.startsWith("v2"))
             assertEquals("{\"id\":123,\"label\":\"person\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\",\"label\":\"name\"}],\"age\":[{\"id\":1,\"value\":\"31\",\"label\":\"age\"}]}}", json);
@@ -105,7 +106,7 @@ public class GraphSONMapperTest {
         // v2 untyped seems to serialize the VertexProperty label. not changing that since it's already been
         // introduced a long while back. v3 dips back to v1 style - since it has never existed prior to 3.7.0
         // we can make this change
-        if (version.startsWith("v1") || version.startsWith("v3"))
+        if (version.startsWith("v1") || version.startsWith("v3") || version.startsWith("v4"))
             assertEquals("{\"id\":123,\"label\":\"knows\",\"type\":\"edge\",\"inVLabel\":\"person\",\"outVLabel\":\"person\",\"inV\":2,\"outV\":1,\"properties\":{\"weight\":0.5}}", json);
         else if (version.startsWith("v2"))
             assertEquals("{\"id\":123,\"label\":\"knows\",\"inVLabel\":\"person\",\"outVLabel\":\"person\",\"inV\":2,\"outV\":1,\"properties\":{\"weight\":{\"key\":\"weight\",\"value\":0.5}}}", json);
@@ -149,7 +150,7 @@ public class GraphSONMapperTest {
                 extend("alice", new HashSet<>(Collections.singletonList("c")));
         final String json = mapper.writeValueAsString(p);
 
-        if (version.startsWith("v1") || version.startsWith("v3"))
+        if (version.startsWith("v1") || version.startsWith("v3") || version.startsWith("v4"))
             assertEquals("{\"labels\":[[\"a\"],[\"b\"],[\"c\"]],\"objects\":[{\"id\":123,\"label\":\"person\",\"type\":\"vertex\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\"}],\"age\":[{\"id\":1,\"value\":\"31\"}]}},123,\"alice\"]}", json);
         else
             assertEquals("{\"labels\":[[\"a\"],[\"b\"],[\"c\"]],\"objects\":[{\"id\":123,\"label\":\"person\",\"properties\":{\"name\":[{\"id\":1,\"value\":\"alice\",\"label\":\"name\"}],\"age\":[{\"id\":1,\"value\":\"31\",\"label\":\"age\"}]}},123,\"alice\"]}", json);
diff --git a/gremlin-driver/src/main/java/examples/Connections.java b/gremlin-driver/src/main/java/examples/Connections.java
index f018533f0a..a096c9f3d5 100644
--- a/gremlin-driver/src/main/java/examples/Connections.java
+++ b/gremlin-driver/src/main/java/examples/Connections.java
@@ -29,8 +29,8 @@ import org.apache.tinkerpop.gremlin.structure.io.AbstractIoRegistry;
 import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
 import org.apache.tinkerpop.gremlin.structure.io.binary.TypeSerializerRegistry;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
 
 import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal;
 
@@ -81,7 +81,7 @@ public class Connections {
             maxConnectionPoolSize(8).
             path("/gremlin").
             port(8182).
-            serializer(new GraphBinaryMessageSerializerV1()).
+            serializer(new GraphBinaryMessageSerializerV4()).
             create();
         GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(cluster, "g"));
 
@@ -97,7 +97,7 @@ public class Connections {
     private static void withSerializer() throws Exception {
         IoRegistry registry = new FakeIoRegistry(); // an IoRegistry instance exposed by a specific graph provider
         TypeSerializerRegistry typeSerializerRegistry = TypeSerializerRegistry.build().addRegistry(registry).create();
-        MessageSerializer serializer = new GraphBinaryMessageSerializerV1(typeSerializerRegistry);
+        MessageSerializerV4 serializer = new GraphBinaryMessageSerializerV4(typeSerializerRegistry);
         Cluster cluster = Cluster.build("localhost").
             serializer(serializer).
             create();
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java
index 31c34d6a6e..e7b811929c 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Channelizer.java
@@ -29,7 +29,7 @@ import io.netty.handler.ssl.SslHandler;
 import org.apache.tinkerpop.gremlin.driver.handler.GremlinResponseHandler;
 import org.apache.tinkerpop.gremlin.driver.handler.HttpGremlinRequestEncoder;
 import org.apache.tinkerpop.gremlin.driver.handler.HttpGremlinResponseStreamDecoder;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializerV4;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 
 import java.util.Optional;
 import java.util.UUID;
@@ -154,7 +154,7 @@ public interface Channelizer extends ChannelHandler {
                 throw new IllegalStateException(String.format("Cannot use sessions or tx() with %s", HttpChannelizer.class.getSimpleName()));
 
             gremlinRequestEncoder = new HttpGremlinRequestEncoder(cluster.getSerializer(), cluster.getRequestInterceptor(), cluster.isUserAgentOnConnectEnabled());
-            gremlinResponseDecoder = new HttpGremlinResponseStreamDecoder((MessageTextSerializerV4<?>) cluster.getSerializer());
+            gremlinResponseDecoder = new HttpGremlinResponseStreamDecoder((MessageSerializerV4<?>) cluster.getSerializer());
         }
 
         @Override
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Cluster.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Cluster.java
index 407b4cefe5..8f99b0b1ac 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Cluster.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Cluster.java
@@ -27,10 +27,9 @@ import io.netty.handler.ssl.SslProvider;
 import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
 import io.netty.util.concurrent.Future;
 import org.apache.commons.configuration2.Configuration;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.Tokens;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.nio.NioEventLoopGroup;
 import org.apache.commons.lang3.concurrent.BasicThreadFactory;
@@ -324,7 +323,7 @@ public final class Cluster {
     }
 
     /**
-     * Get the {@link MessageSerializer} MIME types supported.
+     * Get the {@link MessageSerializerV4} MIME types supported.
      */
     public String[] getSerializers() {
         return getSerializer().mimeTypesSupported();
@@ -435,7 +434,7 @@ public final class Cluster {
         return manager.factory;
     }
 
-    MessageSerializer<?> getSerializer() {
+    MessageSerializerV4<?> getSerializer() {
         return manager.serializer;
     }
 
@@ -548,7 +547,7 @@ public final class Cluster {
         private List<InetAddress> addresses = new ArrayList<>();
         private int port = 8182;
         private String path = "/gremlin";
-        private MessageSerializer<?> serializer = null;
+        private MessageSerializerV4<?> serializer = null;
         private int nioPoolSize = Runtime.getRuntime().availableProcessors();
         private int workerPoolSize = Runtime.getRuntime().availableProcessors() * 2;
         private int minConnectionPoolSize = ConnectionPool.MIN_POOL_SIZE;
@@ -612,28 +611,28 @@ public final class Cluster {
         }
 
         /**
-         * Set the {@link MessageSerializer} to use given the exact name of a {@link Serializers} enum.  Note that
+         * Set the {@link MessageSerializerV4} to use given the exact name of a {@link SerializersV4} enum.  Note that
          * setting this value this way will not allow specific configuration of the serializer itself.  If specific
-         * configuration is required * please use {@link #serializer(MessageSerializer)}.
+         * configuration is required * please use {@link #serializer(MessageSerializerV4)}.
          */
         public Builder serializer(final String mimeType) {
-            serializer = Serializers.valueOf(mimeType).simpleInstance();
+            serializer = SerializersV4.valueOf(mimeType).simpleInstance();
             return this;
         }
 
         /**
-         * Set the {@link MessageSerializer} to use via the {@link Serializers} enum. If specific configuration is
-         * required please use {@link #serializer(MessageSerializer)}.
+         * Set the {@link MessageSerializerV4} to use via the {@link SerializersV4} enum. If specific configuration is
+         * required please use {@link #serializer(MessageSerializerV4)}.
          */
-        public Builder serializer(final Serializers mimeType) {
+        public Builder serializer(final SerializersV4 mimeType) {
             serializer = mimeType.simpleInstance();
             return this;
         }
 
         /**
-         * Sets the {@link MessageSerializer} to use.
+         * Sets the {@link MessageSerializerV4} to use.
          */
-        public Builder serializer(final MessageSerializer<?> serializer) {
+        public Builder serializer(final MessageSerializerV4<?> serializer) {
             this.serializer = serializer;
             return this;
         }
@@ -952,7 +951,7 @@ public final class Cluster {
 
         public Cluster create() {
             if (addresses.isEmpty()) addContactPoint("localhost");
-            if (null == serializer) serializer = Serializers.GRAPHBINARY_V4.simpleInstance();
+            if (null == serializer) serializer = SerializersV4.GRAPHBINARY_V4.simpleInstance();
             return new Cluster(this);
         }
     }
@@ -987,7 +986,7 @@ public final class Cluster {
         private boolean initialized;
         private final List<InetSocketAddress> contactPoints;
         private final Factory factory;
-        private final MessageSerializer<?> serializer;
+        private final MessageSerializerV4<?> serializer;
         private final Settings.ConnectionPoolSettings connectionPoolSettings;
         private final LoadBalancingStrategy loadBalancingStrategy;
         private final AuthProperties authProps;
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/RequestOptions.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/RequestOptions.java
index 63d7dad91a..cb8a37306b 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/RequestOptions.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/RequestOptions.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.driver;
 
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -132,7 +132,7 @@ public final class RequestOptions {
         /**
          * The per client request override for the client and server configured {@code resultIterationBatchSize}. If
          * this value is not set, then the configuration for the {@link Cluster} is used unless the
-         * {@link RequestMessage} is configured completely by the user.
+         * {@link RequestMessageV4} is configured completely by the user.
          */
         public Builder batchSize(final int batchSize) {
             this.batchSize = batchSize;
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Settings.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Settings.java
index 201b1cb3be..bb5bfd1f2e 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Settings.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Settings.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.driver;
 
 import org.apache.commons.configuration2.Configuration;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.yaml.snakeyaml.LoaderOptions;
@@ -378,7 +378,7 @@ final class Settings {
 
     public static class SerializerSettings {
         /**
-         * The fully qualified class name of the {@link MessageSerializer} that will be used to communicate with the
+         * The fully qualified class name of the {@link MessageSerializerV4} that will be used to communicate with the
          * server. Note that the serializer configured on the client should be supported by the server configuration.
          * By default the setting is configured to {@link GraphBinaryMessageSerializerV4}.
          */
@@ -389,9 +389,9 @@ final class Settings {
          */
         public Map<String, Object> config = null;
 
-        public MessageSerializer<?> create() throws Exception {
+        public MessageSerializerV4<?> create() throws Exception {
             final Class<?> clazz = Class.forName(className);
-            final MessageSerializer<?> serializer = (MessageSerializer<?>) clazz.newInstance();
+            final MessageSerializerV4<?> serializer = (MessageSerializerV4<?>) clazz.newInstance();
             Optional.ofNullable(config).ifPresent(c -> serializer.configure(c, null));
             return serializer;
         }
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/GremlinResponseHandler.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/GremlinResponseHandler.java
index 74a29cfa67..5853193761 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/GremlinResponseHandler.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/GremlinResponseHandler.java
@@ -28,7 +28,7 @@ import org.apache.tinkerpop.gremlin.driver.ResultQueue;
 import org.apache.tinkerpop.gremlin.driver.exception.ResponseException;
 import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,9 +43,9 @@ import static org.apache.tinkerpop.gremlin.driver.handler.HttpGremlinRequestEnco
 
 /**
  * Takes a map of requests pending responses and writes responses to the {@link ResultQueue} of a request
- * as the {@link ResponseMessage} objects are deserialized.
+ * as the {@link ResponseMessageV4} objects are deserialized.
  */
-public class GremlinResponseHandler extends SimpleChannelInboundHandler<ResponseMessage> {
+public class GremlinResponseHandler extends SimpleChannelInboundHandler<ResponseMessageV4> {
     private static final Logger logger = LoggerFactory.getLogger(GremlinResponseHandler.class);
     private final ConcurrentMap<UUID, ResultQueue> pending;
 
@@ -65,7 +65,7 @@ public class GremlinResponseHandler extends SimpleChannelInboundHandler<Response
     }
 
     @Override
-    protected void channelRead0(final ChannelHandlerContext channelHandlerContext, final ResponseMessage response) throws Exception {
+    protected void channelRead0(final ChannelHandlerContext channelHandlerContext, final ResponseMessageV4 response) throws Exception {
         final UUID requestId = ((AttributeMap) channelHandlerContext).attr(REQUEST_ID).get();
 
         final HttpResponseStatus statusCode = response.getStatus() == null ? HttpResponseStatus.PARTIAL_CONTENT : response.getStatus().getCode();
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinRequestEncoder.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinRequestEncoder.java
index 5e0467a368..c455893b03 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinRequestEncoder.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinRequestEncoder.java
@@ -34,9 +34,8 @@ import io.netty.util.AttributeMap;
 import org.apache.tinkerpop.gremlin.driver.UserAgent;
 import org.apache.tinkerpop.gremlin.driver.exception.ResponseException;
 import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerTokens;
 
 import java.util.List;
@@ -51,18 +50,18 @@ public final class HttpGremlinRequestEncoder extends MessageToMessageEncoder<Req
 
     //todo: move
     public static final AttributeKey<UUID> REQUEST_ID = AttributeKey.valueOf("requestId");
-    private final MessageSerializer<?> serializer;
+    private final MessageSerializerV4<?> serializer;
     private final boolean userAgentEnabled;
     private final UnaryOperator<FullHttpRequest> interceptor;
 
     @Deprecated
-    public HttpGremlinRequestEncoder(final MessageSerializer<?> serializer, final UnaryOperator<FullHttpRequest> interceptor) {
+    public HttpGremlinRequestEncoder(final MessageSerializerV4<?> serializer, final UnaryOperator<FullHttpRequest> interceptor) {
         this.serializer = serializer;
         this.interceptor = interceptor;
         this.userAgentEnabled = true;
     }
 
-    public HttpGremlinRequestEncoder(final MessageSerializer<?> serializer, final UnaryOperator<FullHttpRequest> interceptor, boolean userAgentEnabled) {
+    public HttpGremlinRequestEncoder(final MessageSerializerV4<?> serializer, final UnaryOperator<FullHttpRequest> interceptor, boolean userAgentEnabled) {
         this.serializer = serializer;
         this.interceptor = interceptor;
         this.userAgentEnabled = userAgentEnabled;
@@ -86,7 +85,7 @@ public final class HttpGremlinRequestEncoder extends MessageToMessageEncoder<Req
         }
 
         try {
-            final ByteBuf buffer = ((MessageTextSerializerV4)serializer).serializeRequestMessageV4(requestMessage, channelHandlerContext.alloc());
+            final ByteBuf buffer = serializer.serializeRequestAsBinary(requestMessage, channelHandlerContext.alloc());
             final FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/", buffer);
             request.headers().add(HttpHeaderNames.CONTENT_TYPE, mimeType);
             request.headers().add(HttpHeaderNames.CONTENT_LENGTH, buffer.readableBytes());
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseDebugStreamDecoder.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseDebugStreamDecoder.java
index 35dc49ef30..f73ea04702 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseDebugStreamDecoder.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseDebugStreamDecoder.java
@@ -21,19 +21,19 @@ package org.apache.tinkerpop.gremlin.driver.handler;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.handler.codec.MessageToMessageDecoder;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 
 import java.util.List;
 
 /**
- * Converts {@code HttpResponse} to a {@link ResponseMessage}.
+ * Converts {@code HttpResponse} to a {@link ResponseMessageV4}.
  */
 @ChannelHandler.Sharable
-public final class HttpGremlinResponseDebugStreamDecoder extends MessageToMessageDecoder<ResponseMessage> {
+public final class HttpGremlinResponseDebugStreamDecoder extends MessageToMessageDecoder<ResponseMessageV4> {
     public HttpGremlinResponseDebugStreamDecoder() {}
 
     @Override
-    protected void decode(final ChannelHandlerContext channelHandlerContext, final ResponseMessage response, final List<Object> objects) throws Exception {
+    protected void decode(final ChannelHandlerContext channelHandlerContext, final ResponseMessageV4 response, final List<Object> objects) throws Exception {
         System.out.println("HttpGremlinResponseStreamDecoder: ");
         System.out.println(response.getResult());
     }
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseStreamDecoder.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseStreamDecoder.java
index 70aae062ad..df5ede8cc7 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseStreamDecoder.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/handler/HttpGremlinResponseStreamDecoder.java
@@ -28,8 +28,8 @@ import io.netty.handler.codec.http.LastHttpContent;
 import io.netty.util.Attribute;
 import io.netty.util.AttributeKey;
 import io.netty.util.AttributeMap;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializerV4;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 
 import java.util.List;
@@ -40,9 +40,9 @@ public class HttpGremlinResponseStreamDecoder extends MessageToMessageDecoder<De
     // todo: move out
     public static final AttributeKey<Boolean> IS_FIRST_CHUNK = AttributeKey.valueOf("isFirstChunk");
 
-    private final MessageTextSerializerV4<?> serializer;
+    private final MessageSerializerV4<?> serializer;
 
-    public HttpGremlinResponseStreamDecoder(MessageTextSerializerV4<?> serializer) {
+    public HttpGremlinResponseStreamDecoder(MessageSerializerV4<?> serializer) {
         this.serializer = serializer;
     }
 
@@ -64,7 +64,7 @@ public class HttpGremlinResponseStreamDecoder extends MessageToMessageDecoder<De
                     System.out.println("not first chunk");
                 }
 
-                final ResponseMessage chunk = serializer.readChunk(((HttpContent) msg).content(), isFirstChunk.get());
+                final ResponseMessageV4 chunk = serializer.readChunk(((HttpContent) msg).content(), isFirstChunk.get());
 
                 if (chunk.getResult().getData() != null) {
                     System.out.println("payload size: " + ((List) chunk.getResult().getData()).size());
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/AbstractClient.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/AbstractClient.java
index a6c935584d..0d733c85eb 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/AbstractClient.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/AbstractClient.java
@@ -25,7 +25,7 @@ import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.handler.codec.http.HttpResponseStatus;
 import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -48,13 +48,13 @@ public abstract class AbstractClient implements SimpleClient {
     public abstract void writeAndFlush(final RequestMessageV4 requestMessage) throws Exception;
 
     @Override
-    public void submit(final RequestMessageV4 requestMessage, final Consumer<ResponseMessage> callback) throws Exception {
+    public void submit(final RequestMessageV4 requestMessage, final Consumer<ResponseMessageV4> callback) throws Exception {
         callbackResponseHandler.callback = callback;
         writeAndFlush(requestMessage);
     }
 
     @Override
-    public List<ResponseMessage> submit(final RequestMessageV4 requestMessage) throws Exception {
+    public List<ResponseMessageV4> submit(final RequestMessageV4 requestMessage) throws Exception {
         // this is just a test client to force certain behaviors of the server. hanging tests are a pain to deal with
         // especially in travis as it's not always clear where the hang is. a few reasonable timeouts might help
         // make debugging easier when we look at logs
@@ -62,9 +62,9 @@ public abstract class AbstractClient implements SimpleClient {
     }
 
     @Override
-    public CompletableFuture<List<ResponseMessage>> submitAsync(final RequestMessageV4 requestMessage) throws Exception {
-        final List<ResponseMessage> results = new ArrayList<>();
-        final CompletableFuture<List<ResponseMessage>> f = new CompletableFuture<>();
+    public CompletableFuture<List<ResponseMessageV4>> submitAsync(final RequestMessageV4 requestMessage) throws Exception {
+        final List<ResponseMessageV4> results = new ArrayList<>();
+        final CompletableFuture<List<ResponseMessageV4>> f = new CompletableFuture<>();
         callbackResponseHandler.callback = response -> {
             // message with trailers
             if (f.isDone() && response.getStatus().getCode() != HttpResponseStatus.NO_CONTENT)
@@ -84,11 +84,11 @@ public abstract class AbstractClient implements SimpleClient {
         return f;
     }
 
-    static class CallbackResponseHandler extends SimpleChannelInboundHandler<ResponseMessage> {
-        public Consumer<ResponseMessage> callback;
+    static class CallbackResponseHandler extends SimpleChannelInboundHandler<ResponseMessageV4> {
+        public Consumer<ResponseMessageV4> callback;
 
         @Override
-        protected void channelRead0(final ChannelHandlerContext channelHandlerContext, final ResponseMessage response) throws Exception {
+        protected void channelRead0(final ChannelHandlerContext channelHandlerContext, final ResponseMessageV4 response) throws Exception {
             callback.accept(response);
         }
     }
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java
index c6edb20d33..3f767997ae 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java
@@ -18,9 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.driver.simple;
 
-import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 
 import java.io.Closeable;
 import java.util.List;
@@ -32,21 +31,21 @@ import java.util.function.Consumer;
  */
 public interface SimpleClient extends Closeable {
 
-    public default void submit(final String gremlin, final Consumer<ResponseMessage> callback) throws Exception {
+    public default void submit(final String gremlin, final Consumer<ResponseMessageV4> callback) throws Exception {
         submit(RequestMessageV4.build(gremlin).create(), callback);
     }
 
-    public void submit(final RequestMessageV4 requestMessage, final Consumer<ResponseMessage> callback) throws Exception;
+    public void submit(final RequestMessageV4 requestMessage, final Consumer<ResponseMessageV4> callback) throws Exception;
 
-    public default List<ResponseMessage> submit(final String gremlin) throws Exception {
+    public default List<ResponseMessageV4> submit(final String gremlin) throws Exception {
         return submit(RequestMessageV4.build(gremlin).create());
     }
 
-    public List<ResponseMessage> submit(final RequestMessageV4 requestMessage) throws Exception;
+    public List<ResponseMessageV4> submit(final RequestMessageV4 requestMessage) throws Exception;
 
-    public default CompletableFuture<List<ResponseMessage>> submitAsync(final String gremlin) throws Exception {
+    public default CompletableFuture<List<ResponseMessageV4>> submitAsync(final String gremlin) throws Exception {
         return submitAsync(RequestMessageV4.build(gremlin).create());
     }
 
-    public CompletableFuture<List<ResponseMessage>> submitAsync(final RequestMessageV4 requestMessage) throws Exception;
+    public CompletableFuture<List<ResponseMessageV4>> submitAsync(final RequestMessageV4 requestMessage) throws Exception;
 }
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleHttpClient.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleHttpClient.java
index 5dd71e39af..504d4e2f0f 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleHttpClient.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleHttpClient.java
@@ -26,6 +26,7 @@ import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
 import org.apache.tinkerpop.gremlin.driver.HandshakeInterceptor;
 import org.apache.tinkerpop.gremlin.driver.handler.HttpGremlinResponseStreamDecoder;
 import org.apache.tinkerpop.gremlin.driver.handler.HttpGremlinRequestEncoder;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.Channel;
@@ -36,7 +37,6 @@ import io.netty.channel.socket.nio.NioSocketChannel;
 import io.netty.handler.codec.http.HttpClientCodec;
 import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryMapper;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializerV4;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,7 +87,7 @@ public class SimpleHttpClient extends AbstractClient {
                 sslCtx = null;
             }
 
-            final MessageTextSerializerV4<GraphBinaryMapper> serializer = new GraphBinaryMessageSerializerV4();
+            final MessageSerializerV4<GraphBinaryMapper> serializer = new GraphBinaryMessageSerializerV4();
             b.channel(NioSocketChannel.class)
                     .handler(new ChannelInitializer<SocketChannel>() {
                         @Override
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/util/ProfilingApplication.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/util/ProfilingApplication.java
index 90d440e8cb..255d4a4b75 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/util/ProfilingApplication.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/util/ProfilingApplication.java
@@ -23,8 +23,8 @@ import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.apache.tinkerpop.gremlin.driver.Channelizer;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 
 import java.io.BufferedWriter;
 import java.io.File;
@@ -154,7 +154,7 @@ public class ProfilingApplication {
         final int workerPoolSize = Integer.parseInt(options.getOrDefault("workerPoolSize", "2").toString());
         final int tooSlowThreshold = Integer.parseInt(options.getOrDefault("tooSlowThreshold", "125").toString());
         final String channelizer = options.getOrDefault("channelizer", Channelizer.HttpChannelizer.class.getName()).toString();
-        final String serializer = options.getOrDefault("serializer", Serializers.GRAPHBINARY_V4.name()).toString();
+        final String serializer = options.getOrDefault("serializer", SerializersV4.GRAPHBINARY_V4.name()).toString();
 
         final boolean exercise = Boolean.parseBoolean(options.getOrDefault("exercise", "false").toString());
         final String script = options.getOrDefault("script", "1+1").toString();
@@ -165,7 +165,7 @@ public class ProfilingApplication {
                 .nioPoolSize(nioPoolSize)
                 .channelizer(channelizer)
                 .maxWaitForConnection(maxWaitForConnection)
-                .serializer(Serializers.valueOf(serializer))
+                .serializer(SerializersV4.valueOf(serializer))
                 .workerPoolSize(workerPoolSize).create();
 
         try {
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ClusterConfigTest.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ClusterConfigTest.java
index 03b8fce75c..5854b53e89 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ClusterConfigTest.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ClusterConfigTest.java
@@ -20,8 +20,7 @@ package org.apache.tinkerpop.gremlin.driver;
 
 import org.apache.commons.configuration2.BaseConfiguration;
 import org.apache.commons.configuration2.Configuration;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV2;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3;
+import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV4;
 import org.apache.tinkerpop.shaded.jackson.core.StreamReadConstraints;
 import org.junit.Test;
 
@@ -33,40 +32,21 @@ import static org.junit.Assert.assertTrue;
 public class ClusterConfigTest {
 
     @Test
-    public void shouldPropagateSerializerConstraintsForGraphSON3() {
+    public void shouldPropagateSerializerConstraintsForGraphSON4() {
         final Configuration config = new BaseConfiguration();
         config.setProperty("serializer.config.maxNumberLength", 999);
         config.setProperty("serializer.config.maxStringLength", 123456);
         config.setProperty("serializer.config.maxNestingDepth", 55);
         config.setProperty("hosts", Arrays.asList("localhost"));
 
-        config.setProperty("serializer.className", GraphSONMessageSerializerV3.class.getCanonicalName());
+        config.setProperty("serializer.className", GraphSONMessageSerializerV4.class.getCanonicalName());
         final Cluster cluster = Cluster.open(config);
-        assertTrue(cluster.getSerializer() instanceof GraphSONMessageSerializerV3);
-        final GraphSONMessageSerializerV3 serV3 = (GraphSONMessageSerializerV3) cluster.getSerializer();
+        assertTrue(cluster.getSerializer() instanceof GraphSONMessageSerializerV4);
+        final GraphSONMessageSerializerV4 serV3 = (GraphSONMessageSerializerV4) cluster.getSerializer();
         final StreamReadConstraints constraints = serV3.getMapper().getFactory().streamReadConstraints();
 
         assertEquals(999, constraints.getMaxNumberLength());
         assertEquals(123456, constraints.getMaxStringLength());
         assertEquals(55, constraints.getMaxNestingDepth());
     }
-
-    @Test
-    public void shouldPropagateSerializerConstraintsForGraphSON2() {
-        final Configuration config = new BaseConfiguration();
-        config.setProperty("serializer.config.maxNumberLength", 999);
-        config.setProperty("serializer.config.maxStringLength", 123456);
-        config.setProperty("serializer.config.maxNestingDepth", 55);
-        config.setProperty("hosts", Arrays.asList("localhost"));
-
-        config.setProperty("serializer.className", GraphSONMessageSerializerV2.class.getCanonicalName());
-        final Cluster cluster = Cluster.open(config);
-        assertTrue(cluster.getSerializer() instanceof GraphSONMessageSerializerV2);
-        final GraphSONMessageSerializerV2 serV2 = (GraphSONMessageSerializerV2) cluster.getSerializer();
-        final StreamReadConstraints constraints = serV2.getMapper().getFactory().streamReadConstraints();
-
-        assertEquals(999, constraints.getMaxNumberLength());
-        assertEquals(123456, constraints.getMaxStringLength());
-        assertEquals(55, constraints.getMaxNestingDepth());
-    }
 }
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/RequestMessageTest.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/RequestMessageTest.java
deleted file mode 100644
index a8778af020..0000000000
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/RequestMessageTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.driver;
-
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.util.UUID;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class RequestMessageTest {
-
-    @Test
-    public void shouldSetOpWithDefaults() {
-        final RequestMessage msg = RequestMessage.build("op").create();
-        Assert.assertEquals("", msg.getProcessor());    // standard op processor
-        assertNotNull(msg.getRequestId());
-        assertEquals("op", msg.getOp());
-        assertNotNull(msg.getArgs());
-    }
-
-    @Test
-    public void shouldReturnEmptyOptionalArg() {
-        final RequestMessage msg = RequestMessage.build("op").create();
-        assertFalse(msg.optionalArgs("test").isPresent());
-    }
-
-    @Test
-    public void shouldReturnArgAsOptional() {
-        final RequestMessage msg = RequestMessage.build("op").add("test", "testing").create();
-        assertEquals("testing", msg.optionalArgs("test").get());
-    }
-}
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/WebSocketClientBehaviorIntegrateTest.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/WebSocketClientBehaviorIntegrateTest.java
deleted file mode 100644
index f70e60c5e4..0000000000
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/WebSocketClientBehaviorIntegrateTest.java
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.driver;
-
-import nl.altindag.log.LogCaptor;
-import org.apache.tinkerpop.gremlin.socket.server.SimpleSocketServer;
-import org.apache.tinkerpop.gremlin.socket.server.SocketServerSettings;
-import org.apache.tinkerpop.gremlin.socket.server.TestChannelizers;
-import org.apache.tinkerpop.gremlin.socket.server.TestWSGremlinInitializer;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestName;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.tinkerpop.gremlin.driver.exception.NoHostAvailableException;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.ExceptionHelper;
-
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-public class WebSocketClientBehaviorIntegrateTest {
-    private static final Logger logger = LoggerFactory.getLogger(WebSocketClientBehaviorIntegrateTest.class);
-
-    @Rule
-    public TestName name = new TestName();
-
-    private static LogCaptor logCaptor;
-
-    private final SocketServerSettings settings;
-
-    private SimpleSocketServer server;
-
-    public WebSocketClientBehaviorIntegrateTest() throws IOException {
-        settings = SocketServerSettings.read(FileSystems.getDefault().getPath("..","gremlin-tools", "gremlin-socket-server", "conf", "test-ws-gremlin.yaml"));
-        settings.SERIALIZER = "GraphSONV2";
-    }
-
-    @BeforeClass
-    public static void setupLogCaptor() {
-        logCaptor = LogCaptor.forRoot();
-    }
-
-    @AfterClass
-    public static void tearDown() {
-        logCaptor.close();
-    }
-
-    @Before
-    public void setUp() throws InterruptedException {
-        logCaptor.clearLogs();
-
-        server = new SimpleSocketServer(settings);
-        if (name.getMethodName().equals("shouldAttemptHandshakeForLongerThanDefaultNettySslHandshakeTimeout") ||
-                name.getMethodName().equals("shouldPrintCorrectErrorForRegularWebSocketHandshakeTimeout")) {
-            server.start(new TestChannelizers.TestWSNoOpInitializer());
-        } else if (name.getMethodName().equals("shouldContinueRunningRemainingConnectionsIfServerThrottlesNewConnections") ||
-                name.getMethodName().equals("shouldReturnCorrectExceptionIfServerThrottlesNewConnectionsAndMaxWaitExceeded")) {
-            server.start(new TestChannelizers.TestConnectionThrottlingInitializer(settings));
-        } else {
-            server.start(new TestWSGremlinInitializer(settings));
-        }
-    }
-
-    @After
-    public void shutdown() {
-        server.stop();
-    }
-
-    /**
-     * Tests that client is correctly sending user agent during web socket handshake by having the server return
-     * the captured user agent.
-     */
-    @Test
-    public void shouldIncludeUserAgentInHandshakeRequest() {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(1)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-        final Client.ClusteredClient client = cluster.connect();
-
-        // trigger the testing server to return captured user agent
-        String returnedUserAgent = client.submit("1", RequestOptions.build()
-                        .overrideRequestId(settings.USER_AGENT_REQUEST_ID).create()).one().getString();
-        assertEquals(UserAgent.USER_AGENT, returnedUserAgent);
-    }
-
-    /**
-     * Tests that no user agent is sent to server when that behaviour is disabled.
-     */
-    @Test
-    public void shouldNotIncludeUserAgentInHandshakeRequestIfDisabled() {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(1)
-                .serializer(Serializers.GRAPHSON_V2)
-                .enableUserAgentOnConnect(false)
-                .create();
-        final Client.ClusteredClient client = cluster.connect();
-
-        // trigger the testing server to return captured user agent
-        String returnedUserAgent = client.submit("1", RequestOptions.build()
-                .overrideRequestId(settings.USER_AGENT_REQUEST_ID).create()).one().getString();
-        assertEquals("", returnedUserAgent);
-    }
-
-    /**
-     * Constructs a deadlock situation when initializing a {@link Client} object in sessionless form that leads to
-     * hanging behavior in low resource environments (TINKERPOP-2504) and for certain configurations of the
-     * {@link Cluster} object where there are simply not enough threads to properly allow the {@link Host} and its
-     * related {@link ConnectionPool} objects to spin up properly - see TINKERPOP-2550.
-     */
-    @Test
-    public void shouldNotDeadlockOnInitialization() throws Exception {
-        // it seems you can add the same host more than once so while kinda weird it is helpful in faithfully
-        // recreating the deadlock situation, though it can/will happen with just one host. workerPoolSize at
-        // "1" also helps faithfully reproduce the problem though it can happen at larger pool sizes depending
-        // on the timing/interleaving of tasks. the larger connection pool sizes may not be required given the
-        // other settings at play but again, just trying to make sure the deadlock state is consistently produced
-        // and a larger pool size will mean more time to elapse scheduling connection creation tasks which may
-        // further improve chances of scheduling conflicts that produce the deadlock.
-        //
-        // to force this test to a fail state, change ClusteredClient.initializeImplementation() to use the
-        // standard Cluster.executor rather than the hostExecutor (which is a single threaded independent thread
-        // pool used just for the purpose of initializing the hosts).
-        final Cluster cluster = Cluster.build("localhost").
-                addContactPoint("localhost").
-                addContactPoint("localhost").port(settings.PORT).
-                workerPoolSize(1).
-                minConnectionPoolSize(32).maxConnectionPoolSize(32).create();
-
-        final AtomicBoolean failed = new AtomicBoolean(false);
-        final ExecutorService executor = Executors.newSingleThreadExecutor();
-        executor.submit(() -> {
-            try {
-                final Client client = cluster.connect();
-
-                // test will hang in init() where the Host and ConnectionPool are started up
-                client.init();
-            } catch (Exception ex) {
-                // should not "fail" - just hang and then timeout during the executor shutdown as there is
-                // a deadlock state, but we have this here just in case. a failed assertion of this value
-                // below could be interesting
-                logger.error("Client initialization failed with exception which was unexpected", ex);
-                failed.set(true);
-            } finally {
-                cluster.close();
-            }
-        });
-
-        executor.shutdown();
-
-        // 30 seconds should be ample time, even for travis. the deadlock state happens quite immediately in
-        // testing and in most situations this test should zip by in subsecond pace
-        assertThat(executor.awaitTermination(30, TimeUnit.SECONDS), is(true));
-        assertThat(failed.get(), is(false));
-    }
-
-    /**
-     * Test a scenario when server closes a connection which does not have any active requests. Such connection
-     * should be destroyed and replaced by another connection on next request.
-     */
-    @Test
-    public void shouldRemoveConnectionFromPoolWhenServerClose_WithNoPendingRequests() throws InterruptedException {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(1)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-        final Client.ClusteredClient client = cluster.connect();
-
-        // Initialize the client preemptively
-        client.init();
-
-        // assert number of connections opened
-        final ConnectionPool channelPool = client.hostConnectionPools.values().stream().findFirst().get();
-        assertEquals(1, channelPool.getConnectionIDs().size());
-
-        final String originalConnectionID = channelPool.getConnectionIDs().iterator().next();
-        logger.info("On client init ConnectionIDs: " + channelPool.getConnectionIDs());
-
-        // trigger the testing server to send a WS close frame
-        Vertex v = client.submit("1", RequestOptions.build()
-                .overrideRequestId(settings.SINGLE_VERTEX_DELAYED_CLOSE_CONNECTION_REQUEST_ID).create())
-                .one().getVertex();
-
-        assertNotNull(v);
-
-        // assert connection is not closed yet
-        assertEquals(1, channelPool.getConnectionIDs().size());
-
-        // wait for server to send the close WS frame
-        Thread.sleep(6000);
-
-        // assert that original connection is not part of the connection pool any more
-        assertThat("The original connection should have been closed by the server.",
-                channelPool.getConnectionIDs().contains(originalConnectionID), is(false));
-
-        // assert sanity after connection replacement
-        v = client.submit("1",
-                RequestOptions.build().overrideRequestId(settings.SINGLE_VERTEX_REQUEST_ID).create())
-                .one().getVertex();
-        assertNotNull(v);
-    }
-
-    /**
-     * Tests a scenario when the connection a faulty connection replaced by a new connection.
-     * Ensures that the creation of a new replacement channel only happens once.
-     */
-    @Test
-    public void shouldRemoveConnectionFromPoolWhenServerClose_WithPendingRequests() throws InterruptedException, ExecutionException {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(1)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-
-        final Client.ClusteredClient client = cluster.connect();
-
-        // Initialize the client preemptively
-        client.init();
-
-        // assert number of connections opened
-        final ConnectionPool channelPool = client.hostConnectionPools.values().stream().findFirst().get();
-        assertEquals(1, channelPool.getConnectionIDs().size());
-
-        // Send two requests in flight. Both should error out.
-        final CompletableFuture<ResultSet> req1 = client.submitAsync("1", RequestOptions.build()
-                .overrideRequestId(settings.CLOSE_CONNECTION_REQUEST_ID).create());
-        final CompletableFuture<ResultSet> req2 = client.submitAsync("1", RequestOptions.build()
-                .overrideRequestId(settings.CLOSE_CONNECTION_REQUEST_ID_2).create());
-
-
-        // assert both are sent on same connection
-        assertEquals(1, channelPool.getConnectionIDs().size());
-
-        // trigger write for both requests
-        req1.get();
-        req2.get();
-
-        // wait for close message to arrive from server
-        Thread.sleep(2000);
-
-        // Assert that we should consider creating a connection only once, since only one connection is being closed.
-        assertEquals(1, logCaptor.getLogs().stream().filter(str -> str.contains("Considering new connection on")).count());
-
-        // assert sanity after connection replacement
-        final Vertex v = client.submit("1",
-                RequestOptions.build().overrideRequestId(settings.SINGLE_VERTEX_REQUEST_ID).create())
-                .one().getVertex();
-        assertNotNull(v);
-    }
-
-    /**
-     * Tests the scenario when client intentionally closes the connection. In this case, the
-     * connection should not be recycled.
-     */
-    @Test
-    public void shouldNotCreateReplacementConnectionWhenClientClosesConnection() throws ExecutionException, InterruptedException {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(1)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-        final Client.ClusteredClient client = cluster.connect();
-
-        // Initialize the client preemptively
-        client.init();
-
-        // Clearing logCaptor before attempting to close the connection is in response to an issue where this test can
-        // be polluted by logs from a previous test when running on slow hardware.
-        logCaptor.clearLogs();
-
-        // assert number of connections opened
-        final ConnectionPool channelPool = client.hostConnectionPools.values().stream().findFirst().get();
-        assertEquals(1, channelPool.getConnectionIDs().size());
-
-        // close the connection pool in an authentic manner
-        channelPool.closeAsync().get();
-
-        // wait for channel closure callback to trigger
-        Thread.sleep(2000);
-
-        assertEquals("OnClose callback should be called but only once", 1,
-                logCaptor.getLogs().stream().filter(str -> str.contains("OnChannelClose callback called for channel")).count());
-
-        assertEquals("No new connection creation should be started", 0,
-                logCaptor.getLogs().stream().filter(str -> str.contains("Considering new connection on")).count());
-    }
-
-    /**
-     * (TINKERPOP-2814) Tests to make sure that the SSL handshake is now capped by connectionSetupTimeoutMillis and not
-     * the default Netty SSL handshake timeout of 10,000ms.
-     */
-    @Test
-    public void shouldAttemptHandshakeForLongerThanDefaultNettySslHandshakeTimeout() {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(1)
-                .connectionSetupTimeoutMillis(20000) // needs to be larger than 10000ms.
-                .enableSsl(true)
-                .create();
-
-        final Client.ClusteredClient client = cluster.connect();
-        final long start = System.currentTimeMillis();
-
-        Exception caught = null;
-        try {
-            client.submit("1");
-        } catch (Exception e) {
-            caught = e;
-        } finally {
-            // Test against 15000ms which should give a big enough buffer to avoid timing issues.
-            assertTrue(System.currentTimeMillis() - start > 15000);
-            assertTrue(caught != null);
-            assertTrue(caught instanceof NoHostAvailableException);
-            assertTrue(logCaptor.getLogs().stream().anyMatch(str -> str.contains("SSL handshake not completed")));
-        }
-
-        cluster.close();
-    }
-
-    /**
-     * Tests to make sure that the correct error message is logged when a non-SSL connection attempt times out.
-     */
-    @Test
-    public void shouldPrintCorrectErrorForRegularWebSocketHandshakeTimeout() throws InterruptedException {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(1)
-                .connectionSetupTimeoutMillis(120)
-                .create();
-
-        final Client.ClusteredClient client = cluster.connect();
-
-        Exception caught = null;
-        try {
-            client.submit("1");
-        } catch (Exception e) {
-            caught = e;
-        } finally {
-            assertTrue(caught != null);
-            assertTrue(caught instanceof NoHostAvailableException);
-            Thread.sleep(150);
-            assertTrue(logCaptor.getLogs().stream().anyMatch(str -> str.contains("WebSocket handshake not completed")));
-        }
-
-        cluster.close();
-    }
-
-    /**
-     * Tests that if a server throttles new connections (doesn't allow new connections to be made) then all requests
-     * will run and complete on the connections that are already open.
-     */
-    @Test
-    public void shouldContinueRunningRemainingConnectionsIfServerThrottlesNewConnections() throws ExecutionException, InterruptedException, TimeoutException {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(5)
-                .maxWaitForConnection(15000) // large value ensures that request will eventually find a connection.
-                .connectionSetupTimeoutMillis(1000)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-
-        final Client.ClusteredClient client = cluster.connect();
-
-        final List<CompletableFuture<ResultSet>> results = new ArrayList<CompletableFuture<ResultSet>>();
-        for (int i = 0; i < 5; i++) {
-            results.add(client.submitAsync("500"));
-        }
-
-        for (CompletableFuture<ResultSet> result : results) {
-            assertNotNull(result.get(60000, TimeUnit.MILLISECONDS).one().getVertex());
-        }
-
-        cluster.close();
-    }
-
-    /**
-     * Tests that if a server throttles new connections (doesn't allow new connections to be made) then any request
-     * that can't find a connection within its maxWaitForConnection will return an informative exception regarding
-     * the inability to open new connections.
-     */
-    @Test
-    public void shouldReturnCorrectExceptionIfServerThrottlesNewConnectionsAndMaxWaitExceeded() {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(5)
-                .maxWaitForConnection(250) // small value ensures that requests will return TimeoutException.
-                .connectionSetupTimeoutMillis(100)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-
-        final Client.ClusteredClient client = cluster.connect();
-
-        for (int i = 0; i < 5; i++) {
-            try {
-                client.submitAsync("3000");
-            } catch (Exception e) {
-                final Throwable rootCause = ExceptionHelper.getRootCause(e);
-                assertTrue(rootCause instanceof TimeoutException);
-                assertTrue(rootCause.getMessage().contains("WebSocket handshake not completed"));
-            }
-        }
-
-        cluster.close();
-    }
-
-    /**
-     * Tests that the client continues to work if the server temporarily goes down between two requests.
-     */
-    @Test
-    public void shouldContinueRunningIfServerGoesDownTemporarily() throws InterruptedException {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-
-        final Client.ClusteredClient client = cluster.connect();
-        final Object lock = new Object();
-
-        final ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(1);
-        scheduledPool.schedule(() -> {
-            try {
-                server.stopSync();
-                server = new SimpleSocketServer(settings);
-                server.start(new TestWSGremlinInitializer(settings));
-                synchronized (lock) {
-                    lock.notify();
-                }
-            } catch (InterruptedException ignored) {
-                // Ignored.
-            }
-        }, 1000, TimeUnit.MILLISECONDS);
-
-        synchronized (lock) {
-            assertNotNull(client.submit("1").one().getVertex());
-            lock.wait(30000);
-        }
-
-        assertNotNull(client.submit("1").one().getVertex());
-
-        cluster.close();
-    }
-
-    /**
-     * Tests that if the host is unavailable then the client will return an exception that contains information about
-     * the status of the host.
-     */
-    @Test
-    public void shouldReturnCorrectExceptionIfServerGoesDown() throws InterruptedException {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxWaitForConnection(500)
-                .connectionSetupTimeoutMillis(100)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-
-        final Client.ClusteredClient client = cluster.connect();
-        client.submit("1");
-
-        server.stopSync();
-
-        try {
-            client.submit("1");
-        } catch (Exception e) {
-            final Throwable rootCause = ExceptionHelper.getRootCause(e);
-            assertTrue(rootCause instanceof TimeoutException);
-            assertTrue(rootCause.getMessage().contains("Connection refused"));
-        }
-
-        cluster.close();
-    }
-
-    /**
-     * Tests that client is correctly sending all overridable per request settings (requestId, batchSize,
-     * evaluationTimeout, and userAgent) to the server.
-     */
-    @Test
-    public void shouldSendPerRequestSettingsToServer() {
-        final Cluster cluster = Cluster.build("localhost").port(settings.PORT)
-                .minConnectionPoolSize(1)
-                .maxConnectionPoolSize(1)
-                .serializer(Serializers.GRAPHSON_V2)
-                .create();
-        final Client.ClusteredClient client = cluster.connect();
-
-        // trigger the testing server to return captured request settings
-        String response = client.submit("1", RequestOptions.build()
-                .overrideRequestId(settings.PER_REQUEST_SETTINGS_REQUEST_ID)
-                .timeout(1234).userAgent("helloWorld").batchSize(12)
-                .materializeProperties("tokens").create()).one().getString();
-
-        String expectedResponse = String.format("requestId=%s evaluationTimeout=%d, batchSize=%d, userAgent=%s, materializeProperties=%s",
-                settings.PER_REQUEST_SETTINGS_REQUEST_ID, 1234, 12, "helloWorld", "tokens");
-        assertEquals(expectedResponse, response);
-    }
-}
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/AbstractChannelizer.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/AbstractChannelizer.java
index 0974391fe4..27457f0c33 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/AbstractChannelizer.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/AbstractChannelizer.java
@@ -23,11 +23,6 @@ import io.netty.handler.ssl.SslContext;
 import io.netty.handler.ssl.SslContextBuilder;
 import io.netty.handler.ssl.SslProvider;
 import io.netty.handler.timeout.IdleStateHandler;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV2;
 import org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor;
 import org.apache.tinkerpop.gremlin.server.auth.Authenticator;
 import org.apache.tinkerpop.gremlin.server.authz.Authorizer;
@@ -37,6 +32,11 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import io.netty.channel.ChannelInitializer;
 import io.netty.channel.ChannelPipeline;
 import io.netty.channel.socket.SocketChannel;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV4;
 import org.javatuples.Pair;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,7 +70,7 @@ import java.util.stream.Stream;
  * Gremlin scripts).
  * <p/>
  * Implementers need only worry about determining how incoming data is converted to a
- * {@link RequestMessage} and outgoing data is converted from a  {@link ResponseMessage} to whatever expected format is
+ * {@link RequestMessageV4} and outgoing data is converted from a  {@link ResponseMessageV4} to whatever expected format is
  * needed by the pipeline.
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -78,11 +78,8 @@ import java.util.stream.Stream;
 public abstract class AbstractChannelizer extends ChannelInitializer<SocketChannel> implements Channelizer {
     private static final Logger logger = LoggerFactory.getLogger(AbstractChannelizer.class);
     protected static final List<Settings.SerializerSettings> DEFAULT_SERIALIZERS = Arrays.asList(
-            new Settings.SerializerSettings(GraphSONMessageSerializerV2.class.getName(), Collections.emptyMap()),
-            new Settings.SerializerSettings(GraphBinaryMessageSerializerV1.class.getName(), Collections.emptyMap()),
-            new Settings.SerializerSettings(GraphBinaryMessageSerializerV1.class.getName(), new HashMap<String,Object>(){{
-                put(GraphBinaryMessageSerializerV1.TOKEN_SERIALIZE_RESULT_TO_STRING, true);
-            }})
+            new Settings.SerializerSettings(GraphSONMessageSerializerV4.class.getName(), Collections.emptyMap()),
+            new Settings.SerializerSettings(GraphBinaryMessageSerializerV4.class.getName(), Collections.emptyMap())
     );
 
     protected Settings settings;
@@ -107,7 +104,7 @@ public abstract class AbstractChannelizer extends ChannelInitializer<SocketChann
     protected static final String PIPELINE_HTTP_REQUEST_DECODER = "http-request-decoder";
     protected static final String GREMLIN_ENDPOINT = "/gremlin";
 
-    protected final Map<String, MessageSerializer<?>> serializers = new HashMap<>();
+    protected final Map<String, MessageSerializerV4<?>> serializers = new HashMap<>();
 
     protected Authenticator authenticator;
     protected Authorizer authorizer;
@@ -210,15 +207,15 @@ public abstract class AbstractChannelizer extends ChannelInitializer<SocketChann
         serializerSettings.stream().map(config -> {
             try {
                 final Class clazz = Class.forName(config.className);
-                if (!MessageSerializer.class.isAssignableFrom(clazz)) {
-                    logger.warn("The {} serialization class does not implement {} - it will not be available.", config.className, MessageSerializer.class.getCanonicalName());
-                    return Optional.<MessageSerializer>empty();
+                if (!MessageSerializerV4.class.isAssignableFrom(clazz)) {
+                    logger.warn("The {} serialization class does not implement {} - it will not be available.", config.className, MessageSerializerV4.class.getCanonicalName());
+                    return Optional.<MessageSerializerV4>empty();
                 }
 
                 if (clazz.getAnnotation(Deprecated.class) != null)
                     logger.warn("The {} serialization class is deprecated.", config.className);
 
-                final MessageSerializer<?> serializer = (MessageSerializer) clazz.newInstance();
+                final MessageSerializerV4<?> serializer = (MessageSerializerV4) clazz.newInstance();
                 final Map<String, Graph> graphsDefinedAtStartup = new HashMap<>();
                 for (String graphName : settings.graphs.keySet()) {
                     graphsDefinedAtStartup.put(graphName, graphManager.getGraph(graphName));
@@ -230,16 +227,16 @@ public abstract class AbstractChannelizer extends ChannelInitializer<SocketChann
                 return Optional.ofNullable(serializer);
             } catch (ClassNotFoundException cnfe) {
                 logger.warn("Could not find configured serializer class - {} - it will not be available", config.className);
-                return Optional.<MessageSerializer>empty();
+                return Optional.<MessageSerializerV4>empty();
             } catch (Exception ex) {
                 logger.warn("Could not instantiate configured serializer class - {} - it will not be available. {}", config.className, ex.getMessage());
-                return Optional.<MessageSerializer>empty();
+                return Optional.<MessageSerializerV4>empty();
             }
         }).filter(Optional::isPresent).map(Optional::get).flatMap(serializer ->
                         Stream.of(serializer.mimeTypesSupported()).map(mimeType -> Pair.with(mimeType, serializer))
         ).forEach(pair -> {
             final String mimeType = pair.getValue0();
-            final MessageSerializer<?> serializer = pair.getValue1();
+            final MessageSerializerV4<?> serializer = pair.getValue1();
             if (serializers.containsKey(mimeType))
                 logger.info("{} already has {} configured - it will not be replaced by {}, change order of serialization configuration if this is not desired.",
                         mimeType, serializers.get(mimeType).getClass().getName(), serializer.getClass().getName());
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java
index bbd9ab51b5..9982bf67a8 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GraphManager.java
@@ -18,9 +18,9 @@
  */
 package org.apache.tinkerpop.gremlin.server;
 
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 
 import javax.script.Bindings;
 import java.util.Map;
@@ -130,9 +130,9 @@ public interface GraphManager {
      * This method will be called before a script or query is processed by the
      * gremlin-server.
      *
-     * @param msg the {@link RequestMessage} received by the gremlin-server.
+     * @param msg the {@link RequestMessageV4} received by the gremlin-server.
      */
-    default void beforeQueryStart(final RequestMessage msg) {
+    default void beforeQueryStart(final RequestMessageV4 msg) {
 
     }
 
@@ -140,19 +140,19 @@ public interface GraphManager {
      * This method will be called before a script or query is processed by the
      * gremlin-server.
      *
-     * @param msg the {@link RequestMessage} received by the gremlin-server.
+     * @param msg the {@link RequestMessageV4} received by the gremlin-server.
      * @param error the exception encountered during processing from the gremlin-server.
      */
-    default void onQueryError(final RequestMessage msg, final Throwable error) {
+    default void onQueryError(final RequestMessageV4 msg, final Throwable error) {
 
     }
 
     /**
      * When a script or query successfully completes this method will be called.
      *
-     * @param msg the {@link RequestMessage} received by the gremlin-server.
+     * @param msg the {@link RequestMessageV4} received by the gremlin-server.
      */
-    default void onQuerySuccess(final RequestMessage msg) {
+    default void onQuerySuccess(final RequestMessageV4 msg) {
 
     }
 }
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java
index 521e3e6143..1bc5474a3a 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/Settings.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.server;
 import io.netty.handler.ssl.ClientAuth;
 import io.netty.handler.ssl.SslContext;
 import org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
 import org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin;
 import org.apache.tinkerpop.gremlin.jsr223.GremlinScriptEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
@@ -33,6 +32,7 @@ import org.apache.tinkerpop.gremlin.server.handler.AbstractAuthenticationHandler
 import org.apache.tinkerpop.gremlin.server.util.DefaultGraphManager;
 import org.apache.tinkerpop.gremlin.server.util.LifeCycleHook;
 import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.yaml.snakeyaml.LoaderOptions;
@@ -230,7 +230,7 @@ public class Settings {
     public Map<String, ScriptEngineSettings> scriptEngines;
 
     /**
-     * List of {@link MessageSerializer} to configure. If no serializers are specified then default serializers for
+     * List of {@link MessageSerializerV4} to configure. If no serializers are specified then default serializers for
      * the most current versions of "application/json" and "application/vnd.gremlin-v1.0+gryo" are applied.
      */
     public List<SerializerSettings> serializers = Collections.emptyList();
@@ -380,7 +380,7 @@ public class Settings {
     }
 
     /**
-     * Settings for the {@link MessageSerializer} implementations.
+     * Settings for the {@link MessageSerializerV4} implementations.
      */
     public static class SerializerSettings {
 
@@ -392,14 +392,14 @@ public class Settings {
         }
 
         /**
-         * The fully qualified class name of the {@link MessageSerializer} implementation. This class name will be
+         * The fully qualified class name of the {@link MessageSerializerV4} implementation. This class name will be
          * used to load the implementation from the classpath.
          */
         public String className;
 
         /**
-         * A {@link Map} containing {@link MessageSerializer} specific configurations. Consult the
-         * {@link MessageSerializer} implementation for specifics on what configurations are expected.
+         * A {@link Map} containing {@link MessageSerializerV4} specific configurations. Consult the
+         * {@link MessageSerializerV4} implementation for specifics on what configurations are expected.
          */
         public Map<String, Object> config = Collections.emptyMap();
     }
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/auth/Authenticator.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/auth/Authenticator.java
index 961406386b..4c5ee08756 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/auth/Authenticator.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/auth/Authenticator.java
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.gremlin.server.auth;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 import org.apache.tinkerpop.gremlin.server.Channelizer;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 
 import java.net.InetAddress;
 import java.util.Map;
@@ -72,12 +72,12 @@ public interface Authenticator {
          * Evaluates the client response data and generates a byte[] reply which may be a further challenge or purely
          * informational in the case that the negotiation is completed on this round.
          *
-         * This method is called each time a {@link RequestMessage} with an "op" code of "authenticate" is received
+         * This method is called each time a {@link RequestMessageV4} with an "op" code of "authenticate" is received
          * from a client. After it is called, {@link #isComplete()} is checked to determine whether the negotiation has
          * finished. If so, an {@link AuthenticatedUser} is obtained by calling {@link #getAuthenticatedUser()} and
          * that user associated with the active connection. If the negotiation is not yet complete,
          * the byte[] is returned to the client as a further challenge in an
-         * {@link ResponseMessage} with {@link HttpResponseStatus#PROXY_AUTHENTICATION_REQUIRED}. This continues until
+         * {@link ResponseMessageV4} with {@link HttpResponseStatus#PROXY_AUTHENTICATION_REQUIRED}. This continues until
          * the negotiation does complete or an error is encountered.
          */
         public byte[] evaluateResponse(final byte[] clientResponse) throws AuthenticationException;
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpBasicAuthorizationHandler.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpBasicAuthorizationHandler.java
index ee60461cb7..a3b3d35050 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpBasicAuthorizationHandler.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpBasicAuthorizationHandler.java
@@ -21,12 +21,7 @@ package org.apache.tinkerpop.gremlin.server.handler;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
-import io.netty.handler.codec.http.FullHttpMessage;
-import io.netty.handler.codec.http.FullHttpRequest;
-import io.netty.handler.codec.http.HttpUtil;
 import io.netty.util.ReferenceCountUtil;
-import org.apache.tinkerpop.gremlin.util.Tokens;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.server.GremlinServer;
 import org.apache.tinkerpop.gremlin.server.auth.AuthenticatedUser;
 import org.apache.tinkerpop.gremlin.server.authz.AuthorizationException;
@@ -35,7 +30,6 @@ import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST;
 import static io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR;
 import static io.netty.handler.codec.http.HttpResponseStatus.UNAUTHORIZED;
 
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java
index 17935cff4a..4a06873ee9 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpGremlinEndpointHandler.java
@@ -58,12 +58,11 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.util.TemporaryException;
 import org.apache.tinkerpop.gremlin.util.ExceptionHelper;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializerV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.codehaus.groovy.control.MultipleCompilationErrorsException;
 import org.javatuples.Pair;
 import org.slf4j.Logger;
@@ -153,13 +152,13 @@ public class HttpGremlinEndpointHandler extends SimpleChannelInboundHandler<Requ
     /**
      * Serializers for the response.
      */
-    private final Map<String, MessageSerializer<?>> serializers;
+    private final Map<String, MessageSerializerV4<?>> serializers;
 
     private final GremlinExecutor gremlinExecutor;
     private final GraphManager graphManager;
     private final Settings settings;
 
-    public HttpGremlinEndpointHandler(final Map<String, MessageSerializer<?>> serializers,
+    public HttpGremlinEndpointHandler(final Map<String, MessageSerializerV4<?>> serializers,
                                       final GremlinExecutor gremlinExecutor,
                                       final GraphManager graphManager,
                                       final Settings settings) {
@@ -171,7 +170,7 @@ public class HttpGremlinEndpointHandler extends SimpleChannelInboundHandler<Requ
 
     @Override
     public void channelRead0(final ChannelHandlerContext ctx, final RequestMessageV4 requestMessage) {
-        Pair<String, MessageTextSerializerV4<?>> serializer = ctx.attr(StateKey.SERIALIZER).get();
+        Pair<String, MessageSerializerV4<?>> serializer = ctx.channel().attr(StateKey.SERIALIZER).get();
         final RequestState requestState = NOT_STARTED;
 
         final Context requestCtx = new Context(requestMessage, ctx, settings, graphManager, gremlinExecutor,
@@ -302,7 +301,7 @@ public class HttpGremlinEndpointHandler extends SimpleChannelInboundHandler<Requ
         return GremlinError.general(t);
     }
 
-    private void iterateScriptEvalResult(final Context context, MessageTextSerializerV4<?> serializer, final RequestMessageV4 message)
+    private void iterateScriptEvalResult(final Context context, MessageSerializerV4<?> serializer, final RequestMessageV4 message)
             throws ProcessingException, InterruptedException, ScriptException {
         if (message.optionalField(Tokens.ARGS_BINDINGS).isPresent()) {
             final Map bindings = (Map) message.getFields().get(Tokens.ARGS_BINDINGS);
@@ -409,7 +408,7 @@ public class HttpGremlinEndpointHandler extends SimpleChannelInboundHandler<Requ
         return bindings;
     }
 
-    private void iterateTraversal(final Context context, MessageTextSerializerV4<?> serializer, Traversal.Admin<?, ?> traversal)
+    private void iterateTraversal(final Context context, MessageSerializerV4<?> serializer, Traversal.Admin<?, ?> traversal)
             throws InterruptedException {
         final RequestMessageV4 msg = context.getRequestMessage();
         logger.debug("Traversal request {} for in thread {}", msg.getRequestId(), Thread.currentThread().getName());
@@ -419,7 +418,7 @@ public class HttpGremlinEndpointHandler extends SimpleChannelInboundHandler<Requ
         handleIterator(context, new TraverserIterator(traversal), serializer);
     }
 
-    private void handleIterator(final Context context, final Iterator itty, final MessageTextSerializerV4<?> serializer) throws InterruptedException {
+    private void handleIterator(final Context context, final Iterator itty, final MessageSerializerV4<?> serializer) throws InterruptedException {
         final ChannelHandlerContext nettyContext = context.getChannelHandlerContext();
         final RequestMessageV4 msg = context.getRequestMessage();
         final Settings settings = context.getSettings();
@@ -544,7 +543,7 @@ public class HttpGremlinEndpointHandler extends SimpleChannelInboundHandler<Requ
     }
 
     private static ByteBuf makeChunk(final Context ctx, final RequestMessageV4 msg,
-                                     final MessageTextSerializerV4<?> serializer, final List<Object> aggregate,
+                                     final MessageSerializerV4<?> serializer, final List<Object> aggregate,
                                      final boolean hasMore) throws Exception {
         try {
             final ChannelHandlerContext nettyContext = ctx.getChannelHandlerContext();
@@ -555,11 +554,11 @@ public class HttpGremlinEndpointHandler extends SimpleChannelInboundHandler<Requ
                 ctx.setRequestState(FINISHING);
             }
 
-            ResponseMessage responseMessage = null;
+            ResponseMessageV4 responseMessage = null;
 
             // for this state no need to build full ResponseMessage
             if (ctx.getRequestState() != STREAMING) {
-                final ResponseMessage.Builder builder = ResponseMessage.buildV4().result(aggregate);
+                final ResponseMessageV4.Builder builder = ResponseMessageV4.build().result(aggregate);
 
                 // need to put status in last message
                 if (ctx.getRequestState() == FINISHING || ctx.getRequestState() == CHUNKING_NOT_SUPPORTED) {
@@ -581,7 +580,7 @@ public class HttpGremlinEndpointHandler extends SimpleChannelInboundHandler<Requ
                     }
                     ctx.setRequestState(FINISHED);
 
-                    return serializer.serializeResponseAsBinary(ResponseMessage.buildV4()
+                    return serializer.serializeResponseAsBinary(ResponseMessageV4.build()
                             .result(aggregate)
                             .code(HttpResponseStatus.OK)
                             .statusMessage("OK")
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java
index eb40a9e5d2..a928d12bcb 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpHandlerUtil.java
@@ -33,9 +33,8 @@ import org.apache.tinkerpop.gremlin.server.Context;
 import org.apache.tinkerpop.gremlin.server.GremlinServer;
 import org.apache.tinkerpop.gremlin.server.util.GremlinError;
 import org.apache.tinkerpop.gremlin.server.util.MetricManager;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializerV4;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerTokens;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
@@ -87,11 +86,11 @@ public class HttpHandlerUtil {
         ctx.writeAndFlush(response);
     }
 
-    static void writeError(final Context context, final ResponseMessage responseMessage, final MessageSerializer<?> serializer) {
+    static void writeError(final Context context, final ResponseMessageV4 responseMessage, final MessageSerializerV4<?> serializer) {
         try {
             final ChannelHandlerContext ctx = context.getChannelHandlerContext();
             final ByteBuf ByteBuf = context.getRequestState() == HttpGremlinEndpointHandler.RequestState.STREAMING
-                    ? ((MessageTextSerializerV4) serializer).writeErrorFooter(responseMessage, ctx.alloc())
+                    ? serializer.writeErrorFooter(responseMessage, ctx.alloc())
                     : serializer.serializeResponseAsBinary(responseMessage, ctx.alloc());
 
             context.setRequestState(HttpGremlinEndpointHandler.RequestState.ERROR);
@@ -103,8 +102,8 @@ public class HttpHandlerUtil {
         }
     }
 
-    static void writeError(final Context context, final GremlinError error, final MessageSerializer<?> serializer) {
-        final ResponseMessage responseMessage = ResponseMessage.buildV4()
+    static void writeError(final Context context, final GremlinError error, final MessageSerializerV4<?> serializer) {
+        final ResponseMessageV4 responseMessage = ResponseMessageV4.build()
                 .code(error.getCode())
                 .statusMessage(error.getMessage())
                 .exception(error.getException())
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestIdHandler.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestIdHandler.java
index 30e103b56c..824fc477c6 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestIdHandler.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestIdHandler.java
@@ -35,7 +35,7 @@ public class HttpRequestIdHandler extends ChannelDuplexHandler {
 
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
-        ctx.attr(StateKey.REQUEST_ID).set(UUID.randomUUID());
+        ctx.channel().attr(StateKey.REQUEST_ID).set(UUID.randomUUID());
         ctx.fireChannelRead(msg);
     }
 
@@ -43,7 +43,7 @@ public class HttpRequestIdHandler extends ChannelDuplexHandler {
     public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
         if (msg instanceof HttpResponse) {
             HttpResponse response = (HttpResponse) msg;
-            response.headers().add(REQUEST_ID_HEADER_NAME, ctx.attr(StateKey.REQUEST_ID).get());
+            response.headers().add(REQUEST_ID_HEADER_NAME, ctx.channel().attr(StateKey.REQUEST_ID).get());
         }
         ctx.write(msg, promise);
     }
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoder.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoder.java
index d1c9b1ad94..10b7bdf9f3 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoder.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoder.java
@@ -22,12 +22,10 @@ import io.netty.buffer.ByteBuf;
 import io.netty.handler.codec.http.FullHttpRequest;
 import io.netty.handler.codec.http.HttpHeaderNames;
 import io.netty.util.CharsetUtil;
-import org.apache.tinkerpop.gremlin.server.util.TextPlainMessageSerializer;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
+import org.apache.tinkerpop.gremlin.server.util.TextPlainMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.Tokens;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
@@ -49,7 +47,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.UUID;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -72,9 +69,9 @@ public class HttpRequestMessageDecoder extends MessageToMessageDecoder<FullHttpR
     /**
      * Serializer for {@code text/plain} which is a serializer exclusive to HTTP.
      */
-    private final TextPlainMessageSerializer textPlainSerializer = new TextPlainMessageSerializer();
+    private final TextPlainMessageSerializerV4 textPlainSerializer = new TextPlainMessageSerializerV4();
 
-    private final Map<String, MessageSerializer<?>> serializers;
+    private final Map<String, MessageSerializerV4<?>> serializers;
 
     /**
      * A generic mapper to decode an application/json request.
@@ -82,14 +79,14 @@ public class HttpRequestMessageDecoder extends MessageToMessageDecoder<FullHttpR
     private final ObjectMapper mapper = new ObjectMapper();
 
 
-    public HttpRequestMessageDecoder(final Map<String, MessageSerializer<?>> serializers) {
+    public HttpRequestMessageDecoder(final Map<String, MessageSerializerV4<?>> serializers) {
         this.serializers = serializers;
     }
 
     @Override
     protected void decode(final ChannelHandlerContext ctx, final FullHttpRequest req, final List<Object> objects) throws Exception {
         final String acceptMime = Optional.ofNullable(req.headers().get(HttpHeaderNames.ACCEPT)).orElse("application/json");
-        final Pair<String, MessageSerializer<?>> serializer = chooseSerializer(acceptMime);
+        final Pair<String, MessageSerializerV4<?>> serializer = chooseSerializer(acceptMime);
 
         if (req.method() != POST) {
             sendError(ctx, METHOD_NOT_ALLOWED, METHOD_NOT_ALLOWED.toString());
@@ -110,11 +107,11 @@ public class HttpRequestMessageDecoder extends MessageToMessageDecoder<FullHttpR
         }
 
         // checked in getRequestMessageFromHttpRequest
-        ctx.attr(StateKey.SERIALIZER).set(Pair.with(serializer.getValue0(), (MessageTextSerializerV4) serializer.getValue1()));
+        ctx.channel().attr(StateKey.SERIALIZER).set(Pair.with(serializer.getValue0(), serializer.getValue1()));
         objects.add(requestMessage);
     }
 
-    private Pair<String, MessageSerializer<?>> chooseSerializer(final String mimeType) {
+    private Pair<String, MessageSerializerV4<?>> chooseSerializer(final String mimeType) {
         final List<Pair<String, Double>> ordered = Stream.of(mimeType.split(",")).map(mediaType -> {
             // parse out each mediaType with its params - keeping it simple and just looking for "quality".  if
             // that value isn't there, default it to 1.0.  not really validating here so users better get their
@@ -138,7 +135,7 @@ public class HttpRequestMessageDecoder extends MessageToMessageDecoder<FullHttpR
     }
 
     /**
-     * Convert a http request into a {@link RequestMessage}.
+     * Convert a http request into a {@link RequestMessageV4}.
      * There are 2 payload types options here.
      * 1.
      *     existing https://tinkerpop.apache.org/docs/current/reference/#connecting-via-http
@@ -156,36 +153,20 @@ public class HttpRequestMessageDecoder extends MessageToMessageDecoder<FullHttpR
      *     Request body contains serialized RequestMessage
      */
     public RequestMessageV4 getRequestMessageFromHttpRequest(final FullHttpRequest request,
-                                                                    Map<String, MessageSerializer<?>> serializers) throws SerializationException {
+                                                                    Map<String, MessageSerializerV4<?>> serializers) throws SerializationException {
         final String contentType = request.headers().get(HttpHeaderNames.CONTENT_TYPE);
 
-        if (request.method() == POST && contentType != null && !contentType.equals("application/json") && serializers.containsKey(contentType)) {
-            final MessageSerializer<?> serializer = serializers.get(contentType);
-            if (!(serializer instanceof MessageTextSerializerV4)) {
-                throw new SerializationException("Server only supports V4 or later serializers.");
+        if (contentType != null && !contentType.equals("application/json") && serializers.containsKey(contentType)) {
+            final MessageSerializerV4<?> serializer = serializers.get(contentType);
+            if (!(serializer instanceof MessageSerializerV4)) {
+                throw new SerializationException("Server only supports MessageSerializerV4 or later serializers.");
             }
 
-            final MessageTextSerializerV4<?> serializerV4 = (MessageTextSerializerV4) serializer;
-
+            final MessageSerializerV4<?> serializerV4 = serializer;
             final ByteBuf buffer = request.content();
 
-            // additional validation for header
-            final int first = buffer.readByte();
-            // payload can be plain json or can start with additional header with content type.
-            // if first character is not "{" (0x7b) then need to verify is correct serializer selected.
-            if (first != 0x7b) {
-                final byte[] bytes = new byte[first];
-                buffer.readBytes(bytes);
-                final String mimeType = new String(bytes, StandardCharsets.UTF_8);
-
-                if (Arrays.stream(serializer.mimeTypesSupported()).noneMatch(t -> t.equals(mimeType)))
-                    throw new IllegalArgumentException("Mime type mismatch. Value in content-type header is not equal payload header.");
-            } else {
-                buffer.resetReaderIndex();
-            }
-
             try {
-                return serializerV4.deserializeRequestMessageV4(buffer);
+                return serializerV4.deserializeBinaryRequest(buffer);
             } catch (Exception e) {
                 throw new SerializationException("Unable to deserialize request using: " + serializerV4.getClass().getSimpleName(), e);
             }
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/SaslAuthenticationHandler.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/SaslAuthenticationHandler.java
deleted file mode 100644
index b8f4c81c99..0000000000
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/SaslAuthenticationHandler.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.server.handler;
-
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import io.netty.util.Attribute;
-import io.netty.util.AttributeMap;
-import org.apache.tinkerpop.gremlin.server.GremlinServer;
-import org.apache.tinkerpop.gremlin.server.Settings;
-import org.apache.tinkerpop.gremlin.server.auth.AuthenticatedUser;
-import org.apache.tinkerpop.gremlin.server.auth.AuthenticationException;
-import org.apache.tinkerpop.gremlin.server.auth.Authenticator;
-import org.apache.tinkerpop.gremlin.server.authz.Authorizer;
-import org.apache.tinkerpop.gremlin.util.Tokens;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A SASL authentication handler that allows the {@link Authenticator} to be plugged into it. This handler is meant
- * to be used with protocols that process a {@link RequestMessage}
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-@ChannelHandler.Sharable
-public class SaslAuthenticationHandler extends AbstractAuthenticationHandler {
-    private static final Logger logger = LoggerFactory.getLogger(SaslAuthenticationHandler.class);
-    private static final Base64.Decoder BASE64_DECODER = Base64.getDecoder();
-    private static final Base64.Encoder BASE64_ENCODER = Base64.getEncoder();
-    private static final Logger auditLogger = LoggerFactory.getLogger(GremlinServer.AUDIT_LOGGER_NAME);
-
-    protected final Settings settings;
-
-    public SaslAuthenticationHandler(final Authenticator authenticator, final Authorizer authorizer, final Settings settings) {
-        super(authenticator, authorizer);
-        this.settings = settings;
-    }
-
-    @Override
-    public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception {
-        if (msg instanceof RequestMessage){
-            final RequestMessage requestMessage = (RequestMessage) msg;
-
-            final Attribute<Authenticator.SaslNegotiator> negotiator = ((AttributeMap) ctx).attr(StateKey.NEGOTIATOR);
-            final Attribute<RequestMessage> request = ((AttributeMap) ctx).attr(StateKey.REQUEST_MESSAGE);
-            if (negotiator.get() == null) {
-                try {
-                    // First time through so save the request and send an AUTHENTICATE challenge with no data
-                    negotiator.set(authenticator.newSaslNegotiator(getRemoteInetAddress(ctx)));
-                    request.set(requestMessage);
-                    final ResponseMessage authenticate = ResponseMessage.build(requestMessage)
-                            .code(HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED).create();
-                    ctx.writeAndFlush(authenticate);
-                } catch (Exception ex) {
-                    // newSaslNegotiator can cause troubles - if we don't catch and respond nicely the driver seems
-                    // to hang until timeout which isn't so nice. treating this like a server error as it means that
-                    // the Authenticator isn't really ready to deal with requests for some reason.
-                    logger.error(String.format("%s is not ready to handle requests - check its configuration or related services",
-                            authenticator.getClass().getSimpleName()), ex);
-
-                    final ResponseMessage error = ResponseMessage.build(requestMessage)
-                            .statusMessage("Authenticator is not ready to handle requests")
-                            .code(HttpResponseStatus.INTERNAL_SERVER_ERROR).create();
-                    ctx.writeAndFlush(error);
-                }
-            } else {
-                if (requestMessage.getOp().equals(Tokens.OPS_AUTHENTICATION) && requestMessage.getArgs().containsKey(Tokens.ARGS_SASL)) {
-                    
-                    final Object saslObject = requestMessage.getArgs().get(Tokens.ARGS_SASL);
-                    final byte[] saslResponse;
-                    
-                    if(saslObject instanceof String) {
-                        saslResponse = BASE64_DECODER.decode((String) saslObject);
-                    } else {
-                        final ResponseMessage error = ResponseMessage.build(request.get())
-                                .statusMessage("Incorrect type for : " + Tokens.ARGS_SASL + " - base64 encoded String is expected")
-                                .code(HttpResponseStatus.BAD_REQUEST).create();
-                        ctx.writeAndFlush(error);
-                        return;
-                    }
-
-                    try {
-                        final byte[] saslMessage = negotiator.get().evaluateResponse(saslResponse);
-                        if (negotiator.get().isComplete()) {
-                            final AuthenticatedUser user = negotiator.get().getAuthenticatedUser();
-                            ctx.channel().attr(StateKey.AUTHENTICATED_USER).set(user);
-                            // User name logged with the remote socket address and authenticator classname for audit logging
-                            if (settings.enableAuditLog) {
-                                String address = ctx.channel().remoteAddress().toString();
-                                if (address.startsWith("/") && address.length() > 1) address = address.substring(1);
-                                final String[] authClassParts = authenticator.getClass().toString().split("[.]");
-                                auditLogger.info("User {} with address {} authenticated by {}",
-                                        user.getName(), address, authClassParts[authClassParts.length - 1]);
-                            }
-                            // If we have got here we are authenticated so remove the handler and pass
-                            // the original message down the pipeline for processing
-                            ctx.pipeline().remove(this);
-                            final RequestMessage original = request.get();
-                            ctx.fireChannelRead(original);
-                        } else {
-                            // not done here - send back the sasl message for next challenge.
-                            final Map<String,Object> metadata = new HashMap<>();
-                            metadata.put(Tokens.ARGS_SASL, BASE64_ENCODER.encodeToString(saslMessage));
-                            final ResponseMessage authenticate = ResponseMessage.build(requestMessage)
-                                    .statusAttributes(metadata)
-                                    .code(HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED).create();
-                            ctx.writeAndFlush(authenticate);
-                        }
-                    } catch (AuthenticationException ae) {
-                        final ResponseMessage error = ResponseMessage.build(request.get())
-                                .statusMessage(ae.getMessage())
-                                .code(HttpResponseStatus.UNAUTHORIZED).create();
-                        ctx.writeAndFlush(error);
-                    }
-                } else {
-                    final ResponseMessage error = ResponseMessage.build(requestMessage)
-                            .statusMessage("Failed to authenticate")
-                            .code(HttpResponseStatus.UNAUTHORIZED).create();
-                    ctx.writeAndFlush(error);
-                }
-            }
-        } else {
-            logger.warn("{} only processes RequestMessage instances - received {} - channel closing",
-                    this.getClass().getSimpleName(), msg.getClass());
-            ctx.close();
-        }
-    }
-
-    private InetAddress getRemoteInetAddress(final ChannelHandlerContext ctx)
-    {
-        final Channel channel = ctx.channel();
-
-        if (null == channel)
-            return null;
-
-        final SocketAddress genericSocketAddr = channel.remoteAddress();
-
-        if (null == genericSocketAddr || !(genericSocketAddr instanceof InetSocketAddress))
-            return null;
-
-        return ((InetSocketAddress)genericSocketAddr).getAddress();
-    }
-}
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/ServerSerializers.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/ServerSerializers.java
index b107b050fe..7ec33c1445 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/ServerSerializers.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/ServerSerializers.java
@@ -18,10 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.server.handler;
 
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3;
 import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryMapper;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV4;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 
 /**
@@ -35,12 +35,12 @@ final class ServerSerializers {
      * Default binary serializer used by the server when the serializer requested does not match what is on the server.
      * This defaults to GraphBinary 1.0.
      */
-    static final MessageSerializer<GraphBinaryMapper> DEFAULT_BINARY_SERIALIZER = new GraphBinaryMessageSerializerV1();
+    static final MessageSerializerV4<GraphBinaryMapper> DEFAULT_BINARY_SERIALIZER = new GraphBinaryMessageSerializerV4();
 
     /**
      * Default binary serializer used by the server when the serializer requested does not match what is on the server.
      * This defaults to GraphSON 3.0.
      */
-    static final MessageSerializer<ObjectMapper> DEFAULT_TEXT_SERIALIZER = new GraphSONMessageSerializerV3();
+    static final MessageSerializerV4<ObjectMapper> DEFAULT_TEXT_SERIALIZER = new GraphSONMessageSerializerV4();
 
 }
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/StateKey.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/StateKey.java
index 7ee47f87e3..5a1a09137e 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/StateKey.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/handler/StateKey.java
@@ -19,10 +19,10 @@
 package org.apache.tinkerpop.gremlin.server.handler;
 
 import io.netty.util.AttributeKey;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.server.auth.AuthenticatedUser;
 import org.apache.tinkerpop.gremlin.server.auth.Authenticator;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializerV4;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 import org.javatuples.Pair;
 
 import java.util.UUID;
@@ -39,7 +39,7 @@ public final class StateKey {
     /**
      * The key for the current serializer requested by the client.
      */
-    public static final AttributeKey<Pair<String, MessageTextSerializerV4<?>>> SERIALIZER = AttributeKey.valueOf("serializer");
+    public static final AttributeKey<Pair<String, MessageSerializerV4<?>>> SERIALIZER = AttributeKey.valueOf("serializer");
 
     /**
      * The key to indicate if the serializer should use its binary format.
@@ -54,7 +54,7 @@ public final class StateKey {
     /**
      * The key for the current request.
      */
-    public static final AttributeKey<RequestMessage> REQUEST_MESSAGE = AttributeKey.valueOf("request");
+    public static final AttributeKey<RequestMessageV4> REQUEST_MESSAGE = AttributeKey.valueOf("request");
 
     /**
      * The key for the current request ID.
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/GremlinError.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/GremlinError.java
index 481781b89d..fb237faa68 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/GremlinError.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/GremlinError.java
@@ -163,7 +163,7 @@ public class GremlinError {
     public static GremlinError failStep(final Failure failure) {
         // todo: double check message
         return new GremlinError(HttpResponseStatus.INTERNAL_SERVER_ERROR,
-                failure.getMessage() + ". " + failure.format(), "ServerFailStepException");
+                failure.getMessage(), "ServerFailStepException");
     }
 
     public static GremlinError general(final Throwable t) {
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializer.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerV4.java
similarity index 50%
rename from gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializer.java
rename to gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerV4.java
index 002058e09f..6bdfbf0e54 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializer.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerV4.java
@@ -20,12 +20,14 @@ package org.apache.tinkerpop.gremlin.server.util;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.handler.codec.http.HttpResponseStatus;
 import io.netty.util.CharsetUtil;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.ser.MessageTextSerializer;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
+import org.apache.tinkerpop.gremlin.util.ser.AbstractMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.function.Function;
@@ -34,7 +36,7 @@ import java.util.function.Function;
  * A highly use-case specific serializer that only has context for HTTP where results simply need to be converted
  * to string in a line by line fashion for text based returns.
  */
-public class TextPlainMessageSerializer implements MessageTextSerializer<Function<Object, String>> {
+public class TextPlainMessageSerializerV4 extends AbstractMessageSerializerV4<Function<Object, String>> {
 
     @Override
     public Function<Object, String> getMapper() {
@@ -42,26 +44,49 @@ public class TextPlainMessageSerializer implements MessageTextSerializer<Functio
     }
 
     @Override
-    public ByteBuf serializeResponseAsBinary(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        final String payload = serializeResponseAsString(responseMessage, allocator);
-        final ByteBuf encodedMessage = allocator.buffer(payload.length());
-        encodedMessage.writeCharSequence(payload, CharsetUtil.UTF_8);
+    public ByteBuf serializeResponseAsBinary(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+        return (responseMessage.getStatus().getCode() == HttpResponseStatus.OK)
+                ? convertStringData((List<Object>) responseMessage.getResult().getData(), false, allocator)
+                : convertErrorString(responseMessage.getStatus().getMessage(), allocator);
+    }
 
-        return encodedMessage;
+    @Override
+    public ByteBuf writeHeader(ResponseMessageV4 responseMessage, ByteBufAllocator allocator) throws SerializationException {
+        return convertStringData((List<Object>) responseMessage.getResult().getData(), false, allocator);
+    }
+
+    @Override
+    public ByteBuf writeChunk(Object aggregate, ByteBufAllocator allocator) throws SerializationException {
+        return convertStringData((List<Object>) aggregate, true, allocator);
+    }
+
+    @Override
+    public ByteBuf writeFooter(ResponseMessageV4 responseMessage, ByteBufAllocator allocator) throws SerializationException {
+        return convertStringData((List<Object>) responseMessage.getResult().getData(), true, allocator);
+    }
+
+    @Override
+    public ByteBuf writeErrorFooter(ResponseMessageV4 responseMessage, ByteBufAllocator allocator) throws SerializationException {
+        return convertErrorString(System.lineSeparator() + responseMessage.getStatus().getMessage(), allocator);
+    }
+
+    @Override
+    public ResponseMessageV4 readChunk(ByteBuf byteBuf, boolean isFirstChunk) throws SerializationException {
+        throw new UnsupportedOperationException("text/plain does not have deserialization functions");
     }
 
     @Override
-    public ByteBuf serializeRequestAsBinary(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf serializeRequestAsBinary(final RequestMessageV4 requestMessage, final ByteBufAllocator allocator) throws SerializationException {
         throw new UnsupportedOperationException("text/plain does not produce binary");
     }
 
     @Override
-    public RequestMessage deserializeRequest(final ByteBuf msg) throws SerializationException {
+    public RequestMessageV4 deserializeBinaryRequest(final ByteBuf msg) throws SerializationException {
         throw new UnsupportedOperationException("text/plain does not have deserialization functions");
     }
 
     @Override
-    public ResponseMessage deserializeResponse(final ByteBuf msg) throws SerializationException {
+    public ResponseMessageV4 deserializeBinaryResponse(final ByteBuf msg) throws SerializationException {
         throw new UnsupportedOperationException("text/plain does not have deserialization functions");
     }
 
@@ -70,33 +95,27 @@ public class TextPlainMessageSerializer implements MessageTextSerializer<Functio
         return new String[] { "text/plain" };
     }
 
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    private ByteBuf convertStringData(final List<Object> data, final boolean addStartingSeparator, final ByteBufAllocator allocator) throws SerializationException {
         final StringBuilder sb = new StringBuilder();
 
+        if (addStartingSeparator) sb.append(System.lineSeparator());
         // this should only serialize success conditions so all should have data in List form
-        final List<Object> data = (List<Object>) responseMessage.getResult().getData();
         for (int ix = 0; ix < data.size(); ix ++) {
             sb.append("==>");
             sb.append(data.get(ix));
             if (ix < data.size() - 1)
                 sb.append(System.lineSeparator());
         }
-        return sb.toString();
-    }
 
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        throw new UnsupportedOperationException("text/plain does not have any need to serialize requests");
-    }
+        final ByteBuf encodedMessage = allocator.buffer(sb.length());
+        encodedMessage.writeCharSequence(sb.toString(), CharsetUtil.UTF_8);
 
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        throw new UnsupportedOperationException("text/plain does not have deserialization functions");
+        return encodedMessage;
     }
 
-    @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        throw new UnsupportedOperationException("text/plain does not have deserialization functions");
+    private ByteBuf convertErrorString(final String error, final ByteBufAllocator allocator) throws SerializationException {
+        final ByteBuf encodedMessage = allocator.buffer(error.length());
+        encodedMessage.writeCharSequence(error, CharsetUtil.UTF_8);
+        return encodedMessage;
     }
 }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientConnectionIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientConnectionIntegrateTest.java
index f51bd29445..a10ac8d986 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientConnectionIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientConnectionIntegrateTest.java
@@ -26,7 +26,6 @@ import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 import org.apache.tinkerpop.gremlin.driver.exception.ConnectionException;
 import org.apache.tinkerpop.gremlin.driver.exception.NoHostAvailableException;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
 import org.apache.tinkerpop.gremlin.server.AbstractGremlinServerIntegrationTest;
 import org.apache.tinkerpop.gremlin.server.TestClientFactory;
 import org.hamcrest.core.Is;
@@ -98,7 +97,6 @@ public class ClientConnectionIntegrateTest extends AbstractGremlinServerIntegrat
     public void shouldCloseConnectionDeadDueToUnRecoverableError() throws Exception {
         // Set a low value of maxContentLength to intentionally trigger CorruptedFrameException
         final Cluster cluster = TestClientFactory.build()
-                                                 .serializer(Serializers.GRAPHBINARY_V1)
                                                  .maxContentLength(64)
                                                  .minConnectionPoolSize(1)
                                                  .maxConnectionPoolSize(2)
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/AbstractRemoteGraphProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/AbstractRemoteGraphProvider.java
index 49c9134117..7e29eb1050 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/AbstractRemoteGraphProvider.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/AbstractRemoteGraphProvider.java
@@ -24,7 +24,6 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.TestHelper;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
 import org.apache.tinkerpop.gremlin.process.computer.Computer;
 import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
 import org.apache.tinkerpop.gremlin.structure.RemoteGraph;
@@ -36,6 +35,7 @@ import org.apache.tinkerpop.gremlin.server.Settings;
 import org.apache.tinkerpop.gremlin.server.TestClientFactory;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 
 import java.io.InputStream;
 import java.util.HashMap;
@@ -323,7 +323,7 @@ public abstract class AbstractRemoteGraphProvider extends AbstractGraphProvider
         return g;
     }
 
-    public static Cluster.Builder createClusterBuilder(final Serializers serializer) {
+    public static Cluster.Builder createClusterBuilder(final SerializersV4 serializer) {
         // match the content length in the server yaml
         return TestClientFactory.build().maxContentLength(1000000).serializer(serializer);
     }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphComputerProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphComputerProvider.java
index 656158917f..ec2de64f46 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphComputerProvider.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphComputerProvider.java
@@ -20,9 +20,9 @@
 package org.apache.tinkerpop.gremlin.driver.remote;
 
 import org.apache.tinkerpop.gremlin.GraphProvider;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -147,6 +147,6 @@ import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComp
 public class GraphBinaryRemoteGraphComputerProvider extends AbstractRemoteGraphProvider {
 
     public GraphBinaryRemoteGraphComputerProvider() {
-        super(createClusterBuilder(Serializers.GRAPHBINARY_V1).create(), true);
+        super(createClusterBuilder(SerializersV4.GRAPHBINARY_V4).create(), true);
     }
 }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphProvider.java
index aac4139efd..0c30086752 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphProvider.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteGraphProvider.java
@@ -18,13 +18,13 @@
  */
 package org.apache.tinkerpop.gremlin.driver.remote;
 
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public class GraphBinaryRemoteGraphProvider extends AbstractRemoteGraphProvider implements AutoCloseable {
     public GraphBinaryRemoteGraphProvider() {
-        super(createClusterBuilder(Serializers.GRAPHBINARY_V1).create());
+        super(createClusterBuilder(SerializersV4.GRAPHBINARY_V4).create());
     }
 }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphSONRemoteGraphComputerProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphSONRemoteGraphComputerProvider.java
index 508b69cf5b..6a119441cc 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphSONRemoteGraphComputerProvider.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphSONRemoteGraphComputerProvider.java
@@ -20,9 +20,9 @@
 package org.apache.tinkerpop.gremlin.driver.remote;
 
 import org.apache.tinkerpop.gremlin.GraphProvider;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -146,6 +146,6 @@ import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComp
 @GraphProvider.Descriptor(computer = TinkerGraphComputer.class)
 public class GraphSONRemoteGraphComputerProvider extends AbstractRemoteGraphProvider {
     public GraphSONRemoteGraphComputerProvider() {
-        super(createClusterBuilder(Serializers.GRAPHSON_V3).create(), true);
+        super(createClusterBuilder(SerializersV4.GRAPHSON_V4).create(), true);
     }
 }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphSONRemoteGraphProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphSONRemoteGraphProvider.java
index 4405f0d3db..20a8fcc562 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphSONRemoteGraphProvider.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphSONRemoteGraphProvider.java
@@ -18,13 +18,13 @@
  */
 package org.apache.tinkerpop.gremlin.driver.remote;
 
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public class GraphSONRemoteGraphProvider extends AbstractRemoteGraphProvider implements AutoCloseable {
     public GraphSONRemoteGraphProvider() {
-        super(createClusterBuilder(Serializers.GRAPHSON_V3).create());
+        super(createClusterBuilder(SerializersV4.GRAPHSON_V4).create());
     }
 }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/RemoteWorld.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/RemoteWorld.java
index e6a18ea753..3e32bb7663 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/RemoteWorld.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/RemoteWorld.java
@@ -23,13 +23,13 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.TestHelper;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
 import org.apache.tinkerpop.gremlin.features.World;
 import org.apache.tinkerpop.gremlin.process.computer.Computer;
 import org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.server.TestClientFactory;
 import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 import org.junit.AssumptionViolatedException;
 
 import java.io.File;
@@ -49,7 +49,7 @@ public abstract class RemoteWorld implements World {
      * Helper method to create a test cluster based on the type of serializer. Can be used by implementations to help
      * construct a RemoteWorld.
      */
-    public static Cluster createTestCluster(final Serializers serializer) {
+    public static Cluster createTestCluster(final SerializersV4 serializer) {
         return TestClientFactory.build().serializer(serializer).create();
     }
 
@@ -160,24 +160,24 @@ public abstract class RemoteWorld implements World {
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     public static class GraphBinaryRemoteWorld extends RemoteWorld {
-        public GraphBinaryRemoteWorld() { super(createTestCluster(Serializers.GRAPHBINARY_V1)); }
+        public GraphBinaryRemoteWorld() { super(createTestCluster(SerializersV4.GRAPHBINARY_V4)); }
     }
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     public static class GraphBinaryRemoteComputerWorld extends RemoteComputerWorld {
-        public GraphBinaryRemoteComputerWorld() { super(createTestCluster(Serializers.GRAPHBINARY_V1)); }
+        public GraphBinaryRemoteComputerWorld() { super(createTestCluster(SerializersV4.GRAPHBINARY_V4)); }
     }
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     public static class GraphSONRemoteWorld extends RemoteWorld {
-        public GraphSONRemoteWorld() { super(createTestCluster(Serializers.GRAPHSON_V3)); }
+        public GraphSONRemoteWorld() { super(createTestCluster(SerializersV4.GRAPHSON_V4)); }
     }
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
     public static class GraphSONRemoteComputerWorld extends RemoteComputerWorld {
-        public GraphSONRemoteComputerWorld() { super(createTestCluster(Serializers.GRAPHSON_V3)); }
+        public GraphSONRemoteComputerWorld() { super(createTestCluster(SerializersV4.GRAPHSON_V4)); }
     }
 }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
index 9210f00a34..7eb4dd33dc 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
@@ -44,12 +44,9 @@ import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
 import org.apache.tinkerpop.gremlin.util.ExceptionHelper;
 import org.apache.tinkerpop.gremlin.util.TimeUtil;
-import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.function.FunctionUtils;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -61,6 +58,7 @@ import org.slf4j.LoggerFactory;
 
 import java.awt.*;
 import java.net.ConnectException;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -250,7 +248,7 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
 
     @Test
     public void shouldReportErrorWhenRequestCantBeSerialized() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V3).create();
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHSON_V4).create();
         try {
             final Client client = cluster.connect().alias("g");
 
@@ -881,64 +879,45 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
     }
 
     @Test
-    public void shouldSerializeToStringWhenRequestedGraphBinaryV1() throws Exception {
-        final Map<String, Object> m = new HashMap<>();
-        m.put("serializeResultToString", true);
-        final GraphBinaryMessageSerializerV1 serializer = new GraphBinaryMessageSerializerV1();
-        serializer.configure(m, null);
-
-        final Cluster cluster = TestClientFactory.build().serializer(serializer).create();
+    public void shouldWorkWithGraphSONV4Serialization() throws Exception {
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHSON_V4).create();
         final Client client = cluster.connect();
 
-        final ResultSet resultSet = client.submit("TinkerFactory.createClassic()");
-        final List<Result> results = resultSet.all().join();
-        assertEquals(1, results.size());
-        assertEquals("tinkergraph[vertices:6 edges:6]", results.get(0).getString());
+        try {
+            final List<Result> r = client.submit("TinkerFactory.createModern().traversal().V(1)").all().join();
+            assertEquals(1, r.size());
 
-        cluster.close();
+            final Vertex v = r.get(0).get(DetachedVertex.class);
+            assertEquals(1, v.id());
+            assertEquals("person", v.label());
+
+            assertEquals(2, IteratorUtils.count(v.properties()));
+            assertEquals("marko", v.value("name"));
+            assertEquals(29, Integer.parseInt(v.value("age").toString()));
+        } finally {
+            cluster.close();
+        }
     }
 
     @Test
-    public void shouldWorkWithGraphSONV1Serialization() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V1_UNTYPED).create();
+    public void shouldWorkWithGraphSONExtendedV4Serialization() throws Exception {
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHSON_V4).create();
         final Client client = cluster.connect();
 
         try {
-            final List<Result> r = client.submit("TinkerFactory.createModern().traversal().V(1)").all().join();
+            final List<Result> r = client.submit("java.time.Instant.EPOCH").all().join();
             assertEquals(1, r.size());
 
-            final Map<String, Object> m = r.get(0).get(Map.class);
-            assertEquals(4, m.size());
-            assertEquals(1, m.get("id"));
-            assertEquals("person", m.get("label"));
-            assertEquals("vertex", m.get("type"));
-
-            final Map<String, Object> properties = (Map<String, Object>) m.get("properties");
-            assertEquals(2, properties.size());
-
-            final List<Object> names = (List<Object>) properties.get("name");
-            assertEquals(1, names.size());
-
-            final Map<String, Object> nameProperties = (Map<String, Object>) names.get(0);
-            assertEquals(2, nameProperties.size());
-            assertEquals(0, nameProperties.get("id"));
-            assertEquals("marko", nameProperties.get("value"));
-
-            final List<Object> ages = (List<Object>) properties.get("age");
-            assertEquals(1, ages.size());
-
-            final Map<String, Object> ageProperties = (Map<String, Object>) ages.get(0);
-            assertEquals(2, ageProperties.size());
-            assertEquals(1, ageProperties.get("id"));
-            assertEquals(29, ageProperties.get("value"));
+            final Instant then = r.get(0).get(Instant.class);
+            assertEquals(Instant.EPOCH, then);
         } finally {
             cluster.close();
         }
     }
 
     @Test
-    public void shouldWorkWithGraphSONV2Serialization() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V2).create();
+    public void shouldWorkWithGraphBinaryV4Serialization() throws Exception {
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHBINARY_V4).create();
         final Client client = cluster.connect();
 
         try {
@@ -948,85 +927,11 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
             final Vertex v = r.get(0).get(DetachedVertex.class);
             assertEquals(1, v.id());
             assertEquals("person", v.label());
-
-            assertEquals(2, IteratorUtils.count(v.properties()));
-            assertEquals("marko", v.value("name"));
-            assertEquals(29, Integer.parseInt(v.value("age").toString()));
         } finally {
             cluster.close();
         }
     }
 
-//    @Test
-//    public void shouldWorkWithGraphSONExtendedV2Serialization() {
-//        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V2).create();
-//        final Client client = cluster.connect();
-//
-//        try {
-//            final List<Result> r = client.submit("java.time.Instant.EPOCH").all().join();
-//            assertEquals(1, r.size());
-//
-//            final Instant then = r.get(0).get(Instant.class);
-//            assertEquals(Instant.EPOCH, then);
-//        } finally {
-//            cluster.close();
-//        }
-//    }
-//
-//    @Test
-//    public void shouldWorkWithGraphSONV3Serialization() throws Exception {
-//        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V3).create();
-//        final Client client = cluster.connect();
-//
-//        try {
-//            final List<Result> r = client.submit("TinkerFactory.createModern().traversal().V(1)").all().join();
-//            assertEquals(1, r.size());
-//
-//            final Vertex v = r.get(0).get(DetachedVertex.class);
-//            assertEquals(1, v.id());
-//            assertEquals("person", v.label());
-//
-//            assertEquals(2, IteratorUtils.count(v.properties()));
-//            assertEquals("marko", v.value("name"));
-//            assertEquals(29, Integer.parseInt(v.value("age").toString()));
-//        } finally {
-//            cluster.close();
-//        }
-//    }
-//
-//    @Test
-//    public void shouldWorkWithGraphSONExtendedV3Serialization() throws Exception {
-//        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V3).create();
-//        final Client client = cluster.connect();
-//
-//        try {
-//            final List<Result> r = client.submit("java.time.Instant.EPOCH").all().join();
-//            assertEquals(1, r.size());
-//
-//            final Instant then = r.get(0).get(Instant.class);
-//            assertEquals(Instant.EPOCH, then);
-//        } finally {
-//            cluster.close();
-//        }
-//    }
-//
-//    @Test
-//    public void shouldWorkWithGraphBinaryV1Serialization() throws Exception {
-//        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHBINARY_V1).create();
-//        final Client client = cluster.connect();
-//
-//        try {
-//            final List<Result> r = client.submit("TinkerFactory.createModern().traversal().V(1)").all().join();
-//            assertEquals(1, r.size());
-//
-//            final Vertex v = r.get(0).get(DetachedVertex.class);
-//            assertEquals(1, v.id());
-//            assertEquals("person", v.label());
-//        } finally {
-//            cluster.close();
-//        }
-//    }
-
     @Test
     public void shouldFailClientSideWithTooLargeAResponse() {
         final Cluster cluster = TestClientFactory.build().maxContentLength(1).create();
@@ -1461,7 +1366,7 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
 
     @Test
     public void shouldAliasTraversalSourceVariables() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHBINARY_V1).create();
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHBINARY_V4).create();
         final Client client = cluster.connect();
         try {
             try {
@@ -1484,7 +1389,7 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
 
     @Test
     public void shouldAliasGraphVariablesInSession() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHBINARY_V1).create();
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHBINARY_V4).create();
         final Client client = cluster.connect(name.getMethodName());
 
         try {
@@ -1510,7 +1415,7 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
 
     @Test
     public void shouldAliasTraversalSourceVariablesInSession() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHBINARY_V1).create();
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHBINARY_V4).create();
         final Client client = cluster.connect(name.getMethodName());
 
         try {
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
index ea34978f45..8334c41522 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinResultSetIntegrateTest.java
@@ -38,10 +38,10 @@ import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProper
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 import org.hamcrest.CoreMatchers;
 import org.junit.After;
 import org.junit.Before;
@@ -72,18 +72,18 @@ public class GremlinResultSetIntegrateTest extends AbstractGremlinServerIntegrat
 
     @Parameterized.Parameters(name = "{0}")
     public static Iterable<Object[]> data() {
-        final MessageSerializer<GraphBinaryMapper> graphBinaryMessageSerializerV4 = new GraphBinaryMessageSerializerV4();
+        final MessageSerializerV4<GraphBinaryMapper> graphBinaryMessageSerializerV4 = new GraphBinaryMessageSerializerV4();
 
         return Arrays.asList(new Object[][]{
-                {Serializers.GRAPHBINARY_V1, graphBinaryMessageSerializerV4}
+                {SerializersV4.GRAPHBINARY_V4, graphBinaryMessageSerializerV4}
         });
     }
 
     @Parameterized.Parameter(value = 0)
-    public Serializers name;
+    public SerializersV4 name;
 
     @Parameterized.Parameter(value = 1)
-    public MessageSerializer<?> messageSerializer;
+    public MessageSerializerV4<?> messageSerializer;
 
     @Before
     public void beforeTest() {
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthIntegrateTest.java
index e39d8c2b44..fa18b8cc3c 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthIntegrateTest.java
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.driver.Cluster;
 import org.apache.tinkerpop.gremlin.driver.exception.NoHostAvailableException;
 import org.apache.tinkerpop.gremlin.driver.exception.ResponseException;
 import org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 import org.ietf.jgss.GSSException;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -34,8 +35,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
 
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
-
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.AnyOf.anyOf;
 import static org.hamcrest.core.IsInstanceOf.instanceOf;
@@ -165,7 +164,7 @@ public class GremlinServerAuthIntegrateTest extends AbstractGremlinServerIntegra
 
     @Test
     public void shouldAuthenticateWithPlainTextOverDefaultJSONSerialization() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON)
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHSON)
                 .credentials("stephen", "password").create();
         final Client client = cluster.connect();
 
@@ -173,8 +172,8 @@ public class GremlinServerAuthIntegrateTest extends AbstractGremlinServerIntegra
     }
 
     @Test
-    public void shouldAuthenticateWithPlainTextOverGraphSONV1Serialization() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V1_UNTYPED)
+    public void shouldAuthenticateWithPlainTextOverGraphSONV4Serialization() throws Exception {
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHSON_V4_UNTYPED)
                 .credentials("stephen", "password").create();
         final Client client = cluster.connect();
 
@@ -183,7 +182,7 @@ public class GremlinServerAuthIntegrateTest extends AbstractGremlinServerIntegra
 
     @Test
     public void shouldAuthenticateAndWorkWithVariablesOverDefaultJsonSerialization() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON)
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHSON)
                 .credentials("stephen", "password").create();
         final Client client = cluster.connect(name.getMethodName());
 
@@ -199,8 +198,8 @@ public class GremlinServerAuthIntegrateTest extends AbstractGremlinServerIntegra
     }
 
     @Test
-    public void shouldAuthenticateAndWorkWithVariablesOverGraphSONV1Serialization() throws Exception {
-        final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V1_UNTYPED)
+    public void shouldAuthenticateAndWorkWithVariablesOverGraphSONV4Serialization() throws Exception {
+        final Cluster cluster = TestClientFactory.build().serializer(SerializersV4.GRAPHSON_V4_UNTYPED)
                 .credentials("stephen", "password").create();
         final Client client = cluster.connect(name.getMethodName());
 
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthKrb5IntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthKrb5IntegrateTest.java
index 28fa27e424..73f810dcab 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthKrb5IntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthKrb5IntegrateTest.java
@@ -24,8 +24,8 @@ import org.apache.tinkerpop.gremlin.driver.Cluster;
 import org.apache.tinkerpop.gremlin.driver.exception.ResponseException;
 import org.apache.tinkerpop.gremlin.server.auth.Krb5Authenticator;
 import org.apache.tinkerpop.gremlin.util.ExceptionHelper;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
 import org.ietf.jgss.GSSException;
 import org.junit.Test;
 import org.slf4j.LoggerFactory;
@@ -204,10 +204,10 @@ public class GremlinServerAuthKrb5IntegrateTest extends AbstractGremlinServerInt
 
     @Test
     public void shouldAuthenticateWithSerializeResultToStringGraphBinaryV1() throws Exception {
-        assertAuthViaToStringWithSpecifiedSerializer(new GraphBinaryMessageSerializerV1());
+        assertAuthViaToStringWithSpecifiedSerializer(new GraphBinaryMessageSerializerV4());
     }
 
-    public void assertAuthViaToStringWithSpecifiedSerializer(final MessageSerializer<?> serializer) throws InterruptedException, ExecutionException {
+    public void assertAuthViaToStringWithSpecifiedSerializer(final MessageSerializerV4<?> serializer) throws InterruptedException, ExecutionException {
         final Map<String,Object> config = new HashMap<>();
         config.put("serializeResultToString", true);
         serializer.configure(config, null);
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
index 152806ca81..8eb454e455 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
@@ -43,16 +43,17 @@ import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 import org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator;
 import org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer;
 import org.apache.tinkerpop.gremlin.server.handler.HttpBasicAuthenticationHandler;
+import org.apache.tinkerpop.gremlin.server.util.TextPlainMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.structure.io.Storage;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
 import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.GraphSONUntypedMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerTokens;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 import org.hamcrest.CoreMatchers;
@@ -183,8 +184,11 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
                 break;
             case "should200OnPOSTWithChunkedResponse":
             case "shouldHandleErrorsInFirstChunkPOSTWithChunkedResponse":
+            case "shouldHandleErrorsInFirstChunkPOSTWithChunkedResponseUsingTextPlain":
             case "shouldHandleErrorsNotInFirstChunkPOSTWithChunkedResponse":
+            case "shouldHandleErrorsNotInFirstChunkPOSTWithChunkedResponseUsingTextPlain":
             case "should200OnPOSTWithChunkedResponseGraphBinary":
+            case "should200OnPOSTWithChunkedResponseUsingTextPlain":
                 settings.resultIterationBatchSize = 16;
                 break;
         }
@@ -1133,20 +1137,20 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
     public void should200OnPOSTWithChunkedResponseGraphBinary() throws Exception {
         final String gremlin = "inject(0,1,2,3,4,5,6,7,8,9,'ten',11,12,13,14,15,'new chunk')";
         final GraphBinaryMessageSerializerV4 serializer = new GraphBinaryMessageSerializerV4();
-        final ByteBuf serializedRequest = serializer.serializeRequestMessageV4(
+        final ByteBuf serializedRequest = serializer.serializeRequestAsBinary(
                 RequestMessageV4.build(gremlin).create(), new UnpooledByteBufAllocator(false));
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
-        httppost.addHeader(HttpHeaders.CONTENT_TYPE, Serializers.GRAPHBINARY_V4.getValue());
-        httppost.addHeader(HttpHeaders.ACCEPT, Serializers.GRAPHBINARY_V4.getValue());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, SerializersV4.GRAPHBINARY_V4.getValue());
+        httppost.addHeader(HttpHeaders.ACCEPT, SerializersV4.GRAPHBINARY_V4.getValue());
         httppost.setEntity(new ByteArrayEntity(serializedRequest.array()));
 
         try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
             assertEquals(200, response.getStatusLine().getStatusCode());
             assertTrue(response.getEntity().isChunked());
 
-            final ResponseMessage responseMessage = serializer.readChunk(toByteBuf(response.getEntity()), true);
+            final ResponseMessageV4 responseMessage = serializer.readChunk(toByteBuf(response.getEntity()), true);
             assertEquals(17, ((List)responseMessage.getResult().getData()).size());
 
             final Header[] footers = getTrailingHeaders(response);
@@ -1162,20 +1166,20 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
     public void should200OnPOSTWithEmptyChunkedResponseGraphBinary() throws Exception {
         final String gremlin = "g.V().iterate()";
         final GraphBinaryMessageSerializerV4 serializer = new GraphBinaryMessageSerializerV4();
-        final ByteBuf serializedRequest = serializer.serializeRequestMessageV4(
+        final ByteBuf serializedRequest = serializer.serializeRequestAsBinary(
                 RequestMessageV4.build(gremlin).create(), new UnpooledByteBufAllocator(false));
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
-        httppost.addHeader(HttpHeaders.CONTENT_TYPE, Serializers.GRAPHBINARY_V4.getValue());
-        httppost.addHeader(HttpHeaders.ACCEPT, Serializers.GRAPHBINARY_V4.getValue());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, SerializersV4.GRAPHBINARY_V4.getValue());
+        httppost.addHeader(HttpHeaders.ACCEPT, SerializersV4.GRAPHBINARY_V4.getValue());
         httppost.setEntity(new ByteArrayEntity(serializedRequest.array()));
 
         try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
             assertEquals(200, response.getStatusLine().getStatusCode());
             assertTrue(response.getEntity().isChunked());
 
-            final ResponseMessage responseMessage = serializer.readChunk(toByteBuf(response.getEntity()), true);
+            final ResponseMessageV4 responseMessage = serializer.readChunk(toByteBuf(response.getEntity()), true);
             assertEquals(0, ((List)responseMessage.getResult().getData()).size());
 
             final Header[] footers = getTrailingHeaders(response);
@@ -1187,6 +1191,79 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
         }
     }
 
+    @Test
+    public void should200OnPOSTWithChunkedResponseUsingTextPlain() throws Exception {
+        final CloseableHttpClient httpclient = HttpClients.createDefault();
+        final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
+        httppost.addHeader(HttpHeaders.ACCEPT, "text/plain");
+        // chunk size is 8, so should be 2 chunks
+        httppost.setEntity(new StringEntity("{\"gremlin\":\"g.inject(0,1,2,3,4,5,6,7,8,9,'ten',11,12,13,14,15,'new chunk')\"}", Consts.UTF_8));
+
+        try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertTrue(response.getEntity().isChunked());
+
+            String textPlainResponse = EntityUtils.toString(response.getEntity());
+            assertTrue(textPlainResponse.startsWith("==>0"));
+            assertTrue(textPlainResponse.endsWith(System.lineSeparator() + "==>new chunk"));
+        }
+    }
+
+    @Test
+    public void should200OnPOSTWithEmptyChunkedResponseUsingTextPlain() throws Exception {
+        final CloseableHttpClient httpclient = HttpClients.createDefault();
+        final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
+        httppost.addHeader(HttpHeaders.ACCEPT, "text/plain");
+        httppost.setEntity(new StringEntity("{\"gremlin\":\"g.V().iterate()\"}", Consts.UTF_8));
+
+        try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertTrue(response.getEntity().isChunked());
+
+            String textPlainResponse = EntityUtils.toString(response.getEntity());
+            assertEquals("", textPlainResponse);
+        }
+    }
+
+    @Test
+    public void shouldHandleErrorsInFirstChunkPOSTWithChunkedResponseUsingTextPlain() throws Exception {
+        final CloseableHttpClient httpclient = HttpClients.createDefault();
+        final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
+        httppost.addHeader(HttpHeaders.ACCEPT, "text/plain");
+        httppost.setEntity(new StringEntity("{\"gremlin\":\"g.inject(0,1,2,3,4,5,6,7,8,9,'ten',11,12,13,14,15,16).coalesce(is(lt(0)),fail('some error'))\"}", Consts.UTF_8));
+
+        try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertTrue(response.getEntity().isChunked());
+
+            String textPlainResponse = EntityUtils.toString(response.getEntity());
+            assertTrue(textPlainResponse.startsWith("some error"));
+        }
+    }
+
+    @Test
+    public void shouldHandleErrorsNotInFirstChunkPOSTWithChunkedResponseUsingTextPlain() throws Exception {
+        final CloseableHttpClient httpclient = HttpClients.createDefault();
+        final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
+        httppost.addHeader(HttpHeaders.ACCEPT, "text/plain");
+        httppost.setEntity(new StringEntity("{\"gremlin\":\"g.inject(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17).coalesce(is(lt(17)),fail('some error'))\"}", Consts.UTF_8));
+
+        try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertTrue(response.getEntity().isChunked());
+
+            String textPlainResponse = EntityUtils.toString(response.getEntity());
+            assertTrue(textPlainResponse.startsWith("==>0"));
+            assertTrue(textPlainResponse.contains("==>5"));
+            assertTrue(textPlainResponse.contains("==>15"));
+            assertTrue(textPlainResponse.endsWith(System.lineSeparator() + "some error"));
+        }
+    }
+
     @Test
     public void shouldHandleErrorsInFirstChunkPOSTWithChunkedResponse() throws Exception {
         final CloseableHttpClient httpclient = HttpClients.createDefault();
@@ -1256,19 +1333,19 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
     public void should200OnPOSTWithValidGraphSONBytecodeRequest() throws Exception {
         final Bytecode bytecodeQuery = EmptyGraph.instance().traversal().V().asAdmin().getBytecode();
         final GraphSONMessageSerializerV4 serializer = new GraphSONMessageSerializerV4();
-        final ByteBuf serializedRequest = serializer.serializeRequestMessageV4(
+        final ByteBuf serializedRequest = serializer.serializeRequestAsBinary(
                 RequestMessageV4.build(bytecodeQuery).addG("gmodern").create(),
                 new UnpooledByteBufAllocator(false));
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
-        httppost.addHeader(HttpHeaders.CONTENT_TYPE, Serializers.GRAPHSON_V4.getValue());
-        httppost.addHeader(HttpHeaders.ACCEPT, Serializers.GRAPHSON_V4.getValue());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, SerializersV4.GRAPHSON_V4.getValue());
+        httppost.addHeader(HttpHeaders.ACCEPT, SerializersV4.GRAPHSON_V4.getValue());
         httppost.setEntity(new ByteArrayEntity(serializedRequest.array()));
 
         try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
             assertEquals(200, response.getStatusLine().getStatusCode());
-            assertEquals(Serializers.GRAPHSON_V4.getValue(), response.getEntity().getContentType().getValue());
+            assertEquals(SerializersV4.GRAPHSON_V4.getValue(), response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
             final JsonNode dataArray = node.get("result").get(GraphSONTokens.VALUEPROP);
@@ -1283,21 +1360,21 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
         final GraphBinaryMessageSerializerV4 serializer = new GraphBinaryMessageSerializerV4();
 //        final Map<String, String> aliases = new HashMap<>();
 //        aliases.put("g", "gmodern");
-        final ByteBuf serializedRequest = serializer.serializeRequestMessageV4(
+        final ByteBuf serializedRequest = serializer.serializeRequestAsBinary(
                 RequestMessageV4.build(bytecodeQuery).addG("gmodern").create(),
 //                RequestMessage.build(Tokens.OPS_BYTECODE).addArg(Tokens.ARGS_GREMLIN, bytecodeQuery).addArg(Tokens.ARGS_ALIASES, aliases).create(),
                 new UnpooledByteBufAllocator(false));
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
-        httppost.addHeader(HttpHeaders.CONTENT_TYPE, Serializers.GRAPHBINARY_V4.getValue());
-        httppost.addHeader(HttpHeaders.ACCEPT, Serializers.GRAPHBINARY_V4.getValue());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, SerializersV4.GRAPHBINARY_V4.getValue());
+        httppost.addHeader(HttpHeaders.ACCEPT, SerializersV4.GRAPHBINARY_V4.getValue());
         httppost.setEntity(new ByteArrayEntity(serializedRequest.array()));
 
         try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
             assertEquals(200, response.getStatusLine().getStatusCode());
-            assertEquals(Serializers.GRAPHBINARY_V4.getValue(), response.getEntity().getContentType().getValue());
-            final ResponseMessage respMsg = serializer.deserializeResponse(toByteBuf(response.getEntity()));
+            assertEquals(SerializersV4.GRAPHBINARY_V4.getValue(), response.getEntity().getContentType().getValue());
+            final ResponseMessageV4 respMsg = serializer.deserializeBinaryResponse(toByteBuf(response.getEntity()));
             Object results = respMsg.getResult().getData();
             assertTrue(results instanceof List);
             assertEquals(6, ((List) results).size());
@@ -1309,19 +1386,19 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
         final GraphSONMessageSerializerV4 serializer = new GraphSONMessageSerializerV4();
         final SimpleBindings bindings = new SimpleBindings();
         bindings.put("x", 10.5d);
-        final ByteBuf serializedRequest = serializer.serializeRequestMessageV4(
+        final ByteBuf serializedRequest = serializer.serializeRequestAsBinary(
                 RequestMessageV4.build("x").addBindings(bindings).create(),
                 new UnpooledByteBufAllocator(false));
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
-        httppost.addHeader(HttpHeaders.ACCEPT, Serializers.GRAPHSON_V4.getValue());
-        httppost.addHeader("Content-Type", Serializers.GRAPHSON_V4.getValue());
+        httppost.addHeader(HttpHeaders.ACCEPT, SerializersV4.GRAPHSON_V4.getValue());
+        httppost.addHeader("Content-Type", SerializersV4.GRAPHSON_V4.getValue());
         httppost.setEntity(new ByteArrayEntity(serializedRequest.array()));
 
         try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
             assertEquals(200, response.getStatusLine().getStatusCode());
-            assertEquals(Serializers.GRAPHSON_V4.getValue(), response.getEntity().getContentType().getValue());
+            assertEquals(SerializersV4.GRAPHSON_V4.getValue(), response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
             assertEquals(10.5d, node.get("result").get(GraphSONTokens.VALUEPROP).get(0).get(GraphSONTokens.VALUEPROP).doubleValue(), 0.0001);
@@ -1331,14 +1408,14 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
     @Test
     public void should400OnPOSTWithInvalidRequestArgsWhenInvalidBindingsSupplied() throws Exception {
         final GraphSONMessageSerializerV4 serializer = new GraphSONMessageSerializerV4();
-        final ByteBuf serializedRequest = serializer.serializeRequestMessageV4(
+        final ByteBuf serializedRequest = serializer.serializeRequestAsBinary(
                 RequestMessageV4.build("g.V(id)").addBinding("id", "1").create(),
                 new UnpooledByteBufAllocator(false));
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
-        httppost.addHeader(HttpHeaders.ACCEPT, Serializers.GRAPHSON_V4.getValue());
-        httppost.addHeader("Content-Type", Serializers.GRAPHSON_V4.getValue());
+        httppost.addHeader(HttpHeaders.ACCEPT, SerializersV4.GRAPHSON_V4.getValue());
+        httppost.addHeader("Content-Type", SerializersV4.GRAPHSON_V4.getValue());
         httppost.setEntity(new ByteArrayEntity(serializedRequest.array()));
 
         try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
@@ -1353,13 +1430,13 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
     public void should400OnPOSTWithInvalidRequestArgsWhenAliasesNotSuppliedForBytecode() throws Exception {
         final Bytecode bytecodeQuery = EmptyGraph.instance().traversal().V().asAdmin().getBytecode();
         final GraphSONMessageSerializerV4 serializer = new GraphSONMessageSerializerV4();
-        final ByteBuf serializedRequest = serializer.serializeRequestMessageV4(
+        final ByteBuf serializedRequest = serializer.serializeRequestAsBinary(
                 RequestMessageV4.build(bytecodeQuery).create(), new UnpooledByteBufAllocator(false));
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
-        httppost.addHeader(HttpHeaders.CONTENT_TYPE, Serializers.GRAPHSON_V4.getValue());
-        httppost.addHeader(HttpHeaders.ACCEPT, Serializers.GRAPHSON_V4.getValue());
+        httppost.addHeader(HttpHeaders.CONTENT_TYPE, SerializersV4.GRAPHSON_V4.getValue());
+        httppost.addHeader(HttpHeaders.ACCEPT, SerializersV4.GRAPHSON_V4.getValue());
         httppost.setEntity(new ByteArrayEntity(serializedRequest.array()));
 
         try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
@@ -1406,15 +1483,15 @@ public class GremlinServerHttpIntegrateTest extends AbstractGremlinServerIntegra
     @Test
     public void should100onExpectContinueRequest() throws Exception {
         final GraphSONMessageSerializerV4 serializer = new GraphSONMessageSerializerV4();
-        final ByteBuf serializedRequest = serializer.serializeRequestMessageV4(
+        final ByteBuf serializedRequest = serializer.serializeRequestAsBinary(
                 RequestMessageV4.build("gmodern.V()").create(),
                 new UnpooledByteBufAllocator(false));
 
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new HttpPost(TestClientFactory.createURLString());
         httppost.setConfig(RequestConfig.custom().setExpectContinueEnabled(true).build());
-        httppost.addHeader(HttpHeaders.ACCEPT, Serializers.GRAPHSON_V4.getValue());
-        httppost.addHeader("Content-Type", Serializers.GRAPHSON_V4.getValue());
+        httppost.addHeader(HttpHeaders.ACCEPT, SerializersV4.GRAPHSON_V4.getValue());
+        httppost.addHeader("Content-Type", SerializersV4.GRAPHSON_V4.getValue());
         httppost.setEntity(new ByteArrayEntity(serializedRequest.array()));
 
         try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
index d495ba0397..f6a1dec5d2 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
@@ -48,8 +48,8 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.ExceptionHelper;
 import org.apache.tinkerpop.gremlin.util.function.Lambda;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.Matchers;
 import org.junit.After;
@@ -696,7 +696,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
     public void shouldNotThrowNoSuchElementException() throws Exception {
         try (SimpleClient client = TestClientFactory.createSimpleHttpClient()){
             // this should return "nothing" - there should be no exception
-            final List<ResponseMessage> responses = client.submit("g.V().has('name','kadfjaldjfla')");
+            final List<ResponseMessageV4> responses = client.submit("g.V().has('name','kadfjaldjfla')");
             assertTrue(((List) responses.get(0).getResult().getData()).isEmpty());
         }
     }
@@ -705,7 +705,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
     @SuppressWarnings("unchecked")
     public void shouldReceiveFailureTimeOutOnScriptEval() throws Exception {
         try (SimpleClient client = TestClientFactory.createSimpleHttpClient()){
-            final List<ResponseMessage> responses = client.submit("Thread.sleep(3000);'some-stuff-that-should not return'");
+            final List<ResponseMessageV4> responses = client.submit("Thread.sleep(3000);'some-stuff-that-should not return'");
             assertTrue(responses.get(0).getStatus().getMessage().contains("timeout occurred"));
 
             // validate that we can still send messages to the server
@@ -720,7 +720,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
             final RequestMessageV4 msg = RequestMessageV4.build("Thread.sleep(3000);'some-stuff-that-should not return'")
                     .addTimeoutMillis(100L)
                     .create();
-            final List<ResponseMessage> responses = client.submit(msg);
+            final List<ResponseMessageV4> responses = client.submit(msg);
             assertThat(responses.get(0).getStatus().getMessage(), allOf(startsWith("Evaluation exceeded"), containsString("100 ms")));
 
             // validate that we can still send messages to the server
@@ -733,7 +733,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
         try (SimpleClient client = TestClientFactory.createSimpleHttpClient()){
             // timeout configured for 1 second so the timed interrupt should trigger prior to the
             // evaluationTimeout which is at 30 seconds by default
-            final List<ResponseMessage> responses = client.submit("while(true){}");
+            final List<ResponseMessageV4> responses = client.submit("while(true){}");
             assertThat(responses.get(0).getStatus().getMessage(), startsWith("Timeout during script evaluation triggered by TimedInterruptCustomizerProvider"));
 
             // validate that we can still send messages to the server
@@ -880,7 +880,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
     public void shouldNotHavePartialContentWithOneResult() throws Exception {
         try (SimpleClient client = TestClientFactory.createSimpleHttpClient()) {
             final RequestMessageV4 request = RequestMessageV4.build("10").create();
-            final List<ResponseMessage> responses = client.submit(request);
+            final List<ResponseMessageV4> responses = client.submit(request);
             assertEquals(1, responses.size());
             assertEquals(HttpResponseStatus.OK, responses.get(0).getStatus().getCode());
         }
@@ -890,7 +890,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
     public void shouldHavePartialContentWithLongResultsCollection() throws Exception {
         try (SimpleClient client = TestClientFactory.createSimpleHttpClient()) {
             final RequestMessageV4 request = RequestMessageV4.build("new String[100]").create();
-            final List<ResponseMessage> responses = client.submit(request);
+            final List<ResponseMessageV4> responses = client.submit(request);
             assertThat(responses.size(), Matchers.greaterThan(1));
 
             // first message have no status
@@ -906,7 +906,7 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
     public void shouldFailWithBadScriptEval() throws Exception {
         try (SimpleClient client = TestClientFactory.createSimpleHttpClient()) {
             final RequestMessageV4 request = RequestMessageV4.build("new String().doNothingAtAllBecauseThis is a syntax error").create();
-            final List<ResponseMessage> responses = client.submit(request);
+            final List<ResponseMessageV4> responses = client.submit(request);
             assertEquals(HttpResponseStatus.INTERNAL_SERVER_ERROR, responses.get(0).getStatus().getCode());
             assertEquals(1, responses.size());
         }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSerializationIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSerializationIntegrateTest.java
index ebe6dfdf6c..44a9a681b5 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSerializationIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSerializationIntegrateTest.java
@@ -28,10 +28,9 @@ import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.apache.tinkerpop.gremlin.util.ser.AbstractMessageSerializer;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV2;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3;
+import org.apache.tinkerpop.gremlin.util.ser.AbstractMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV4;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -47,21 +46,20 @@ import static org.junit.Assert.assertEquals;
 @RunWith(Parameterized.class)
 public class GremlinServerSerializationIntegrateTest extends AbstractGremlinServerIntegrationTest {
 
-    private AbstractMessageSerializer serializer;
+    private AbstractMessageSerializerV4 serializer;
     private Cluster cluster = null;
     private Client client = null;
     private GraphTraversalSource g = null;
 
-    public GremlinServerSerializationIntegrateTest(AbstractMessageSerializer serializer) {
+    public GremlinServerSerializationIntegrateTest(AbstractMessageSerializerV4 serializer) {
         this.serializer = serializer;
     }
 
     @Parameterized.Parameters
     public static Collection serializers() {
         return Arrays.asList(new Object[][]{
-                {new GraphBinaryMessageSerializerV1()},
-                {new GraphSONMessageSerializerV3()},
-                {new GraphSONMessageSerializerV2()}
+                {new GraphBinaryMessageSerializerV4()},
+                {new GraphSONMessageSerializerV4()}
         });
     }
 
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoderTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoderTest.java
index 7a3e7cc7c6..8c13acb7f4 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoderTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/handler/HttpRequestMessageDecoderTest.java
@@ -31,14 +31,14 @@ import io.netty.handler.codec.http.HttpObjectAggregator;
 import io.netty.handler.codec.http.HttpServerCodec;
 import io.netty.handler.codec.http.HttpVersion;
 import io.netty.util.CharsetUtil;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerTokens;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
-import org.apache.tinkerpop.gremlin.util.ser.Serializers;
+import org.apache.tinkerpop.gremlin.util.ser.SerializersV4;
 import org.junit.Test;
 
 import java.util.HashMap;
@@ -59,12 +59,12 @@ public class HttpRequestMessageDecoderTest {
     private final GraphBinaryMessageSerializerV4 graphBinarySerializer = new GraphBinaryMessageSerializerV4();
     public final GraphSONMessageSerializerV4 graphSONSerializer = new GraphSONMessageSerializerV4();
 
-    private final static Map<String, MessageSerializer<?>> serializers = new HashMap<>();
+    private final static Map<String, MessageSerializerV4<?>> serializers = new HashMap<>();
     static {
-        serializers.put(Serializers.GRAPHSON_V4_UNTYPED.getValue(), Serializers.GRAPHSON_V4_UNTYPED.simpleInstance());
-        serializers.put("application/json", Serializers.GRAPHSON_V4_UNTYPED.simpleInstance());
-        serializers.put(Serializers.GRAPHSON_V4.getValue(), Serializers.GRAPHSON_V4.simpleInstance());
-        serializers.put(Serializers.GRAPHBINARY_V4.getValue(), Serializers.GRAPHBINARY_V4.simpleInstance());
+        serializers.put(SerializersV4.GRAPHSON_V4_UNTYPED.getValue(), SerializersV4.GRAPHSON_V4_UNTYPED.simpleInstance());
+        serializers.put("application/json", SerializersV4.GRAPHSON_V4_UNTYPED.simpleInstance());
+        serializers.put(SerializersV4.GRAPHSON_V4.getValue(), SerializersV4.GRAPHSON_V4.simpleInstance());
+        serializers.put(SerializersV4.GRAPHBINARY_V4.getValue(), SerializersV4.GRAPHBINARY_V4.simpleInstance());
     }
 
     @Test
@@ -74,7 +74,7 @@ public class HttpRequestMessageDecoderTest {
 
         final RequestMessageV4 request = RequestMessageV4.build("g.V()").create();
 
-        final ByteBuf buffer = graphSONSerializer.serializeRequestMessageV4(request, allocator);
+        final ByteBuf buffer = graphSONSerializer.serializeRequestAsBinary(request, allocator);
 
         final HttpHeaders headers = new DefaultHttpHeaders();
         headers.add(HttpHeaderNames.CONTENT_TYPE, SerTokens.MIME_GRAPHBINARY_V4);
@@ -98,7 +98,7 @@ public class HttpRequestMessageDecoderTest {
 
         final RequestMessageV4 request = RequestMessageV4.build("g.V()").addLanguage("gremlin-lang").create();
 
-        final ByteBuf buffer = graphBinarySerializer.serializeRequestMessageV4(request, allocator);
+        final ByteBuf buffer = graphBinarySerializer.serializeRequestAsBinary(request, allocator);
 
         final HttpHeaders headers = new DefaultHttpHeaders();
         headers.add(HttpHeaderNames.CONTENT_TYPE, SerTokens.MIME_GRAPHBINARY_V4);
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/notifications/ProviderGraphManagerHelper.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/notifications/ProviderGraphManagerHelper.java
index 94bd6fb3dd..098980a2da 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/notifications/ProviderGraphManagerHelper.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/notifications/ProviderGraphManagerHelper.java
@@ -24,10 +24,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.server.Settings;
 import org.apache.tinkerpop.gremlin.server.util.DefaultGraphManager;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 
+// TODO: revisit this class, these methods aren't called anymore
 public class ProviderGraphManagerHelper extends DefaultGraphManager {
 
   private Map<String, Map<String, Object>> beforeQueryStartTracking;
@@ -44,20 +45,20 @@ public class ProviderGraphManagerHelper extends DefaultGraphManager {
   }
  
   @Override
-  public void beforeQueryStart(final RequestMessage msg) {
-    final Map<String, Object> args = msg.getArgs();
+  public void beforeQueryStart(final RequestMessageV4 msg) {
+    final Map<String, Object> args = msg.getFields();
     final String requestID = msg.getRequestId().toString();
     this.beforeQueryStartTracking.put(requestID, args);
   }
 
   @Override
-  public void onQuerySuccess(final RequestMessage msg) {
+  public void onQuerySuccess(final RequestMessageV4 msg) {
     final String requestID = msg.getRequestId().toString();
     this.onQuerySuccessCount.add(requestID);
   }
 
   @Override
-  public void onQueryError(final RequestMessage msg, final Throwable e) {
+  public void onQueryError(final RequestMessageV4 msg, final Throwable e) {
     final String requestID = msg.getRequestId().toString();
     this.onQueryErrorCount.add(requestID);
   }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerV4Test.java
similarity index 72%
rename from gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerTest.java
rename to gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerV4Test.java
index b88daaf589..09d7cecc7f 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/util/TextPlainMessageSerializerV4Test.java
@@ -18,31 +18,31 @@
  */
 package org.apache.tinkerpop.gremlin.server.util;
 
+import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import io.netty.util.CharsetUtil;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
 
 import static org.junit.Assert.assertEquals;
 
-public class TextPlainMessageSerializerTest {
-
+public class TextPlainMessageSerializerV4Test {
     @Test
     public void shouldProducePlainText() throws Exception {
         final Map<String, Object> m = new HashMap<>();
-        final ResponseMessage msg = ResponseMessage.build(UUID.randomUUID()).
+        final ResponseMessageV4 msg = ResponseMessageV4.build().
                 result(Arrays.asList(1, new DetachedVertex(100, "person", m), java.awt.Color.RED)).create();
 
-        final TextPlainMessageSerializer messageSerializer = new TextPlainMessageSerializer();
-        final String output = messageSerializer.serializeResponseAsString(msg, ByteBufAllocator.DEFAULT);
+        final TextPlainMessageSerializerV4 messageSerializer = new TextPlainMessageSerializerV4();
+        final ByteBuf output = messageSerializer.serializeResponseAsBinary(msg, ByteBufAllocator.DEFAULT);
         final String exp = "==>1" + System.lineSeparator() +
-                           "==>v[100]" + System.lineSeparator() +
-                           "==>java.awt.Color[r=255,g=0,b=0]";
-        assertEquals(exp, output);
+                "==>v[100]" + System.lineSeparator() +
+                "==>java.awt.Color[r=255,g=0,b=0]";
+        assertEquals(exp, output.toString(CharsetUtil.UTF_8));
     }
 }
diff --git a/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/SerializationBenchmark.java b/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/SerializationBenchmark.java
index 6a91312d6c..2859997892 100644
--- a/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/SerializationBenchmark.java
+++ b/gremlin-tools/gremlin-benchmark/src/main/java/org/apache/tinkerpop/gremlin/driver/SerializationBenchmark.java
@@ -27,10 +27,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 import org.apache.tinkerpop.gremlin.structure.io.binary.DataType;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
 import org.apache.tinkerpop.gremlin.util.Tokens;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.Warmup;
@@ -102,18 +102,17 @@ public class SerializationBenchmark extends AbstractBenchmarkBase {
 
     private static final UUID id = UUID.randomUUID();
 
-    private static final ResponseMessage response = ResponseMessage
-            .build(UUID.randomUUID()).code(HttpResponseStatus.OK).result(new ReferenceVertex(1, "person"))
+    private static final ResponseMessageV4 response = ResponseMessageV4
+            .build().code(HttpResponseStatus.OK).result(new ReferenceVertex(1, "person"))
             .create();
 
     private static final Bytecode bytecode = new Bytecode();
-    private static final RequestMessage request = RequestMessage
-            .build(Tokens.OPS_BYTECODE).processor("traversal").overrideRequestId(UUID.randomUUID())
-            .add(Tokens.ARGS_GREMLIN, bytecode)
+    private static final RequestMessageV4 request = RequestMessageV4
+            .build(bytecode)
             .create();
 
-    private static final GraphBinaryMessageSerializerV1 binarySerializer = new GraphBinaryMessageSerializerV1();
-    private static final GraphSONMessageSerializerV3 graphsonSerializer = new GraphSONMessageSerializerV3();
+    private static final GraphBinaryMessageSerializerV4 binarySerializer = new GraphBinaryMessageSerializerV4();
+    private static final GraphSONMessageSerializerV4 graphsonSerializer = new GraphSONMessageSerializerV4();
 
     static {
         bytecode.addStep("V");
@@ -123,28 +122,28 @@ public class SerializationBenchmark extends AbstractBenchmarkBase {
     }
 
     @Benchmark
-    public RequestMessage testReadMessage1Binary() throws SerializationException {
+    public RequestMessageV4 testReadMessage1Binary() throws SerializationException {
         RequestMessageBinaryBuffer1.readerIndex(0);
 
-        return binarySerializer.deserializeRequest(RequestMessageBinaryBuffer1);
+        return binarySerializer.deserializeBinaryRequest(RequestMessageBinaryBuffer1);
     }
 
     @Benchmark
-    public RequestMessage testReadMessage2Binary() throws SerializationException {
+    public RequestMessageV4 testReadMessage2Binary() throws SerializationException {
         RequestMessageBinaryBuffer2.readerIndex(0);
-        return binarySerializer.deserializeRequest(RequestMessageBinaryBuffer2);
+        return binarySerializer.deserializeBinaryRequest(RequestMessageBinaryBuffer2);
     }
 
     @Benchmark
-    public RequestMessage testReadMessage1GraphSON() throws SerializationException {
+    public RequestMessageV4 testReadMessage1GraphSON() throws SerializationException {
         RequestMessageGraphSONBuffer1.readerIndex(0);
-        return graphsonSerializer.deserializeRequest(RequestMessageGraphSONBuffer1);
+        return graphsonSerializer.deserializeBinaryRequest(RequestMessageGraphSONBuffer1);
     }
 
     @Benchmark
-    public RequestMessage testReadMessage2GraphSON() throws SerializationException {
+    public RequestMessageV4 testReadMessage2GraphSON() throws SerializationException {
         RequestMessageGraphSONBuffer2.readerIndex(0);
-        return graphsonSerializer.deserializeRequest(RequestMessageGraphSONBuffer2);
+        return graphsonSerializer.deserializeBinaryRequest(RequestMessageGraphSONBuffer2);
     }
 
     @Benchmark
@@ -172,7 +171,7 @@ public class SerializationBenchmark extends AbstractBenchmarkBase {
     }
 
     @Benchmark
-    public RequestMessage testInstanceCreation() {
-        return RequestMessage.build("a").overrideRequestId(id).processor("b").create();
+    public RequestMessageV4 testInstanceCreation() {
+        return RequestMessageV4.build("a").addLanguage("gremlin-groovy").addG("g").create();
     }
 }
diff --git a/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/SocketServerRunner.java b/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/SocketServerRunner.java
index 9886569a18..8d31e9988c 100644
--- a/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/SocketServerRunner.java
+++ b/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/SocketServerRunner.java
@@ -31,10 +31,11 @@ public class SocketServerRunner {
     public static void main(final String[] args) throws InterruptedException, IOException {
         final SocketServerSettings settings = SocketServerSettings.read(FileSystems.getDefault().getPath("conf", "test-ws-gremlin.yaml"));
         final SimpleSocketServer server = new SimpleSocketServer(settings);
-        final Channel channel = server.start(new TestWSGremlinInitializer(settings));
-        while(channel.isOpen()) {
-            Thread.sleep(1000);
-        }
+        // TODO: add HTTP version of socketserver
+//        final Channel channel = server.start(new TestWSGremlinInitializer(settings));
+//        while(channel.isOpen()) {
+//            Thread.sleep(1000);
+//        }
     }
 
 }
diff --git a/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/TestChannelizers.java b/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/TestChannelizers.java
deleted file mode 100644
index 8639f7af27..0000000000
--- a/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/TestChannelizers.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.socket.server;
-
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelPipeline;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.handler.codec.http.HttpObjectAggregator;
-import io.netty.handler.codec.http.HttpServerCodec;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketServerCompressionHandler;
-
-/**
- * Class that holds the channelizers that can used for testing with the SimpleSocketServer.
- */
-public class TestChannelizers {
-
-    /**
-     * A base ChannelInitializer that setups the pipeline for HTTP handling. This class should be sub-classed by a
-     * handler that handles the actual data being received.
-     */
-    public static abstract class TestHttpServerInitializer extends ChannelInitializer<SocketChannel> {
-        protected static final String WEBSOCKET_PATH = "/gremlin";
-
-        @Override
-        public void initChannel(SocketChannel ch) {
-            final ChannelPipeline pipeline = ch.pipeline();
-            pipeline.addLast(new HttpServerCodec());
-            pipeline.addLast(new HttpObjectAggregator(65536));
-        }
-    }
-
-    /**
-     * A vanilla WebSocket server Initializer implementation using Netty. This initializer would configure the server
-     * for WebSocket handshake and decoding incoming WebSocket frames.
-     */
-    public static abstract class TestWebSocketServerInitializer extends TestChannelizers.TestHttpServerInitializer {
-
-        @Override
-        public void initChannel(SocketChannel ch) {
-            super.initChannel(ch);
-
-            final ChannelPipeline pipeline = ch.pipeline();
-            pipeline.addLast(new WebSocketServerCompressionHandler());
-            pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
-            this.postInit(ch.pipeline());
-        }
-
-        public abstract void postInit(final ChannelPipeline ch);
-    }
-
-    /**
-     * An initializer that adds a handler that will drop WebSocket frames.
-     */
-    public static class TestWSNoOpInitializer extends TestHttpServerInitializer {
-
-        @Override
-        public void initChannel(SocketChannel ch) {
-            super.initChannel(ch);
-            ch.pipeline().addLast(new TestHandlers.NoOpWebSocketServerHandler(WEBSOCKET_PATH));
-        }
-    }
-
-    /**
-     * An initializer that adds a handler to mimics a server that is throttling connections.
-     */
-    public static class TestConnectionThrottlingInitializer extends TestHttpServerInitializer {
-        int connectionCount = 0;
-        private SocketServerSettings settings;
-
-        public TestConnectionThrottlingInitializer(SocketServerSettings settings) { this.settings = settings; }
-
-        @Override
-        public void initChannel(SocketChannel ch) {
-            super.initChannel(ch);
-
-            final ChannelPipeline pipeline = ch.pipeline();
-            if (connectionCount < 1) {
-                pipeline.addLast(new WebSocketServerCompressionHandler());
-                pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
-                pipeline.addLast(new TestWSGremlinInitializer.ClientTestConfigurableHandler(settings));
-            } else {
-                pipeline.addLast(new TestHandlers.NoOpWebSocketServerHandler(WEBSOCKET_PATH));
-            }
-
-            connectionCount++;
-        }
-    }
-}
diff --git a/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/TestWSGremlinInitializer.java b/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/TestWSGremlinInitializer.java
deleted file mode 100644
index dbae78e509..0000000000
--- a/gremlin-tools/gremlin-socket-server/src/main/java/org/apache/tinkerpop/gremlin/socket/server/TestWSGremlinInitializer.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.socket.server;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.UnpooledByteBufAllocator;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelPipeline;
-import io.netty.handler.codec.MessageToMessageDecoder;
-import io.netty.handler.codec.http.HttpHeaders;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
-import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
-import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.ser.AbstractMessageSerializer;
-import org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV2;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3;
-import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-
-/**
- * Initializer which partially mimics the Gremlin Server. This initializer injects a handler in the
- * server pipeline that can be modified to send the desired response for a test case.
- * This handler identifies incoming requests with ids matching those in {@link SocketServerSettings}
- * and delivers the response which corresponds to the request id.
- */
-public class TestWSGremlinInitializer extends TestChannelizers.TestWebSocketServerInitializer {
-    private static final Logger logger = LoggerFactory.getLogger(TestWSGremlinInitializer.class);
-    private static final String USER_AGENT_HEADER = "User-Agent";
-
-    private final SocketServerSettings settings;
-
-    /**
-     * Gremlin serializer used for serializing/deserializing the request/response. This should be same as client.
-     */
-    private static AbstractMessageSerializer SERIALIZER;
-    private final static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
-
-    public TestWSGremlinInitializer(final SocketServerSettings settings) {
-        this.settings = settings;
-        switch(settings.SERIALIZER) {
-            case "GraphSONV2":
-                SERIALIZER = new GraphSONMessageSerializerV2();
-                break;
-            case "GraphSONV3":
-                SERIALIZER = new GraphSONMessageSerializerV3();
-                break;
-            case "GraphBinaryV1":
-                SERIALIZER = new GraphBinaryMessageSerializerV1();
-                break;
-            default:
-                logger.warn("Could not recognize serializer [%s], defaulting to GraphBinaryV1", settings.SERIALIZER);
-                SERIALIZER = new GraphBinaryMessageSerializerV1();
-                break;
-        }
-    }
-
-    @Override
-    public void postInit(ChannelPipeline pipeline) {
-        pipeline.addLast(new ClientTestConfigurableHandler(settings));
-    }
-
-    /**
-     * Handler introduced in the server pipeline to configure expected response for test cases.
-     */
-    static class ClientTestConfigurableHandler extends MessageToMessageDecoder<BinaryWebSocketFrame> {
-        private SocketServerSettings settings;
-        private String userAgent = "";
-
-        public ClientTestConfigurableHandler(SocketServerSettings settings) { this.settings = settings; }
-
-        @Override
-        protected void decode(final ChannelHandlerContext ctx, final BinaryWebSocketFrame frame, final List<Object> objects)
-                throws Exception {
-            final ByteBuf messageBytes = frame.content();
-            final byte len = messageBytes.readByte();
-            if (len <= 0) {
-                objects.add(RequestMessage.INVALID);
-                return;
-            }
-
-            final ByteBuf contentTypeBytes = ctx.alloc().buffer(len);
-            try {
-                messageBytes.readBytes(contentTypeBytes);
-            } finally {
-                contentTypeBytes.release();
-            }
-            final RequestMessage msg = SERIALIZER.deserializeRequest(messageBytes.discardReadBytes());
-            if (msg.getRequestId().equals(settings.SINGLE_VERTEX_DELAYED_CLOSE_CONNECTION_REQUEST_ID)) {
-                logger.info("sending vertex result frame");
-                ctx.channel().writeAndFlush(new BinaryWebSocketFrame(returnSingleVertexResponse(
-                        settings.SINGLE_VERTEX_DELAYED_CLOSE_CONNECTION_REQUEST_ID)));
-                logger.info("waiting for 2 sec");
-                Thread.sleep(2000);
-                logger.info("sending close frame");
-                ctx.channel().writeAndFlush(new CloseWebSocketFrame());
-            } else if (msg.getRequestId().equals(settings.SINGLE_VERTEX_REQUEST_ID)) {
-                logger.info("sending vertex result frame");
-                ctx.channel().writeAndFlush(new BinaryWebSocketFrame(returnSingleVertexResponse(settings.SINGLE_VERTEX_REQUEST_ID)));
-            } else if (msg.getRequestId().equals(settings.FAILED_AFTER_DELAY_REQUEST_ID)) {
-                logger.info("waiting for 1 sec");
-                Thread.sleep(1000);
-                final ResponseMessage responseMessage = ResponseMessage.build(msg)
-                        .code(HttpResponseStatus.INTERNAL_SERVER_ERROR)
-                        .statusAttributeException(new RuntimeException()).create();
-                ctx.channel().writeAndFlush(new BinaryWebSocketFrame(SERIALIZER.serializeResponseAsBinary(responseMessage, allocator)));
-            } else if (msg.getRequestId().equals(settings.CLOSE_CONNECTION_REQUEST_ID) || msg.getRequestId().equals(settings.CLOSE_CONNECTION_REQUEST_ID_2)) {
-                Thread.sleep(1000);
-                ctx.channel().writeAndFlush(new CloseWebSocketFrame());
-            } else if (msg.getRequestId().equals(settings.USER_AGENT_REQUEST_ID)) {
-                ctx.channel().writeAndFlush(new BinaryWebSocketFrame(returnSimpleBinaryResponse(settings.USER_AGENT_REQUEST_ID, userAgent)));
-            } else if (msg.getRequestId().equals(settings.PER_REQUEST_SETTINGS_REQUEST_ID)) {
-                String response = String.format("requestId=%s evaluationTimeout=%d, batchSize=%d, userAgent=%s, materializeProperties=%s",
-                        msg.getRequestId(), msg.getArgs().get("evaluationTimeout"),
-                        msg.getArgs().get("batchSize"), msg.getArgs().get("userAgent"), msg.getArgs().get("materializeProperties"));
-                ctx.channel().writeAndFlush(new BinaryWebSocketFrame(returnSimpleBinaryResponse(settings.PER_REQUEST_SETTINGS_REQUEST_ID, response)));
-            } else {
-                try {
-                    Thread.sleep(Long.parseLong((String) msg.getArgs().get("gremlin")));
-                    ctx.channel().writeAndFlush(new BinaryWebSocketFrame(returnSingleVertexResponse(msg.getRequestId())));
-                } catch (NumberFormatException nfe) {
-                    // Ignore. Only return a vertex if the query was a long value.
-                    logger.warn("Request unknown request with RequestId: %s", msg.getRequestId());
-                }
-            }
-        }
-
-        private ByteBuf returnSingleVertexResponse(final UUID requestID) throws SerializationException {
-            final TinkerGraph graph = TinkerFactory.createClassic();
-            final GraphTraversalSource g = graph.traversal();
-            final List<Vertex> t = new ArrayList<>(1);
-            t.add(g.V().limit(1).next());
-
-            return SERIALIZER.serializeResponseAsBinary(ResponseMessage.build(requestID).result(t).create(), allocator);
-        }
-
-        /**
-         * Packages a string message into a ResponseMessage and serializes it into a ByteBuf
-         * @throws SerializationException
-         */
-        private ByteBuf returnSimpleBinaryResponse(final UUID requestID, String message) throws SerializationException {
-            //Need to package message in a list of size 1 as some GLV's serializers require all messages to be in a list
-            final List<String> messageList = new ArrayList<>(1);
-            messageList.add(message);
-            return SERIALIZER.serializeResponseAsBinary(ResponseMessage.build(requestID).result(messageList).create(), allocator);
-        }
-
-        /**
-         * Captures and stores User-Agent if included in header
-         */
-        @Override
-        public void userEventTriggered(final ChannelHandlerContext ctx, final Object evt) {
-            if(evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) {
-                WebSocketServerProtocolHandler.HandshakeComplete handshake = (WebSocketServerProtocolHandler.HandshakeComplete) evt;
-                HttpHeaders requestHeaders = handshake.requestHeaders();
-                if(requestHeaders.contains(USER_AGENT_HEADER)) {
-                    userAgent = requestHeaders.get(USER_AGENT_HEADER);
-                }
-                else {
-                    ctx.fireUserEventTriggered(evt);
-                }
-            }
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/MessageSerializer.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/MessageSerializerV4.java
similarity index 61%
rename from gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/MessageSerializer.java
rename to gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/MessageSerializerV4.java
index a46cad10e7..8f10a2849a 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/MessageSerializer.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/MessageSerializerV4.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.util;
 
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import io.netty.buffer.ByteBuf;
@@ -27,24 +27,25 @@ import io.netty.buffer.ByteBufAllocator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.ServiceLoader;
 
 /**
  * Serializes data to and from Gremlin Server.  Typically, the object being serialized or deserialized will be an item
- * from an {@link Iterator} as returned from the {@code ScriptEngine} or an incoming {@link RequestMessage}.
- * {@link MessageSerializer} instances are instantiated to a cache via {@link ServiceLoader} and indexed based on
- * the mime types they support.  If a mime type is supported more than once, the first {@link MessageSerializer}
+ * from an {@link Iterator} as returned from the {@code ScriptEngine} or an incoming {@link RequestMessageV4}.
+ * {@link MessageSerializerV4} instances are instantiated to a cache via {@link ServiceLoader} and indexed based on
+ * the mime types they support.  If a mime type is supported more than once, the first {@link MessageSerializerV4}
  * instance loaded for that mime type is assigned. If a mime type is not found the server default is chosen. The
  * default may change from version to version so it is best to not rely on it when developing applications and to
  * always be explicit in specifying the type you wish to bind to.
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public interface MessageSerializer<M> {
+public interface MessageSerializerV4<M> {
 
-    static final Logger logger = LoggerFactory.getLogger(MessageSerializer.class);
+    static final Logger logger = LoggerFactory.getLogger(MessageSerializerV4.class);
 
     /**
      * Gets the "mapper" that performs the underlying serialization work.
@@ -52,30 +53,30 @@ public interface MessageSerializer<M> {
     M getMapper();
 
     /**
-     * Serialize a {@link ResponseMessage} to a Netty {@code ByteBuf}.
+     * Serialize a {@link ResponseMessageV4} to a Netty {@code ByteBuf}.
      *
      * @param responseMessage The response message to serialize to bytes.
      * @param allocator       The Netty allocator for the {@code ByteBuf} to return back.
      */
-    public ByteBuf serializeResponseAsBinary(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException;
+    public ByteBuf serializeResponseAsBinary(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException;
 
     /**
-     * Serialize a {@link ResponseMessage} to a Netty {@code ByteBuf}.
+     * Serialize a {@link ResponseMessageV4} to a Netty {@code ByteBuf}.
      *
      * @param requestMessage The request message to serialize to bytes.
      * @param allocator      The Netty allocator for the {@code ByteBuf} to return back.
      */
-    public ByteBuf serializeRequestAsBinary(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException;
+    public ByteBuf serializeRequestAsBinary(final RequestMessageV4 requestMessage, final ByteBufAllocator allocator) throws SerializationException;
 
     /**
-     * Deserialize a Netty {@code ByteBuf} into a {@link RequestMessage}.
+     * Deserialize a Netty {@code ByteBuf} into a {@link RequestMessageV4}.
      */
-    public RequestMessage deserializeRequest(final ByteBuf msg) throws SerializationException;
+    public RequestMessageV4 deserializeBinaryRequest(final ByteBuf msg) throws SerializationException;
 
     /**
-     * Deserialize a Netty {@code ByteBuf} into a {@link ResponseMessage}.
+     * Deserialize a Netty {@code ByteBuf} into a {@link RequestMessageV4}.
      */
-    public ResponseMessage deserializeResponse(final ByteBuf msg) throws SerializationException;
+    public ResponseMessageV4 deserializeBinaryResponse(final ByteBuf msg) throws SerializationException;
 
     /**
      * The list of mime types that the serializer supports. They should be ordered in preferred ordered where the
@@ -92,4 +93,25 @@ public interface MessageSerializer<M> {
      */
     public default void configure(final Map<String, Object> config, final Map<String, Graph> graphs) {
     }
+
+    public ByteBuf writeHeader(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException;
+
+    public ByteBuf writeChunk(final Object aggregate, final ByteBufAllocator allocator) throws SerializationException;
+
+    public ByteBuf writeFooter(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException;
+
+    public ByteBuf writeErrorFooter(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException;
+
+    public ResponseMessageV4 readChunk(final ByteBuf byteBuf, final boolean isFirstChunk) throws SerializationException;
+
+    public enum MessageParts {
+        HEADER, DATA, FOOTER;
+
+        public static final EnumSet<MessageParts> ALL = EnumSet.of(HEADER, DATA, FOOTER);
+        public static final EnumSet<MessageParts> START = EnumSet.of(HEADER, DATA);
+        public static final EnumSet<MessageParts> CHUNK = EnumSet.of(DATA);
+        public static final EnumSet<MessageParts> END = EnumSet.of(DATA, FOOTER);
+        public static final EnumSet<MessageParts> ERROR = EnumSet.of(FOOTER);
+    }
+
 }
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/Tokens.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/Tokens.java
index 127b6a1e48..fe0ed59e5d 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/Tokens.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/Tokens.java
@@ -18,7 +18,6 @@
  */
 package org.apache.tinkerpop.gremlin.util;
 
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.process.traversal.Failure;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -38,12 +37,7 @@ public final class Tokens {
     public static final String OPS_CLOSE = "close";
 
     /**
-     * The key for the per request server-side timeout in milliseconds.
-     */
-    public static final String TIMEOUT_MS = "timeoutMs";
-
-    /**
-     * Argument name that allows definition of the number of iterations each {@link ResponseMessage} should contain -
+     * Argument name that allows definition of the number of iterations each HTTP chunk should contain -
      * overrides the @{code resultIterationBatchSize} server setting.
      */
     public static final String ARGS_BATCH_SIZE = "batchSize";
@@ -59,14 +53,14 @@ public final class Tokens {
      */
     public static final String ARGS_ALIASES = "aliases";
 
+    public static final String ARGS_FORCE = "force";
+
     /**
      * Argument name that allows definition of alias names for {@link Graph} and {@link TraversalSource} objects on
      * the remote system.
      */
     public static final String ARGS_G = "g";
 
-    public static final String ARGS_FORCE = "force";
-
     /**
      * Argument name that corresponds to the Gremlin to evaluate.
      */
@@ -101,6 +95,11 @@ public final class Tokens {
     public static final String ARGS_SASL = "sasl";
     public static final String ARGS_SASL_MECHANISM = "saslMechanism";
 
+    /**
+     * The key for the per request server-side timeout in milliseconds.
+     */
+    public static final String TIMEOUT_MS = "timeoutMs";
+
     /**
      * A value that is a custom string that the user can pass to a server that might accept it for purpose of
      * identifying the kind of client it came from.
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessage.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessage.java
deleted file mode 100644
index bea8fc69cf..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessage.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.message;
-
-import org.apache.tinkerpop.gremlin.util.Tokens;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.UUID;
-
-/**
- * The model for a request message sent to the server.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class RequestMessage {
-    /**
-     * An "invalid" message.  Used internally only.
-     */
-    public static final RequestMessage INVALID = new RequestMessage(Tokens.OPS_INVALID);
-
-    private final UUID requestId;
-    private final String op;
-    private final String processor;
-    private final Map<String, Object> args;
-
-    private RequestMessage(final UUID requestId, final String op, final String processor, final Map<String, Object> args) {
-        this.requestId = requestId;
-        this.op = op;
-        this.processor = processor;
-        this.args = Optional.ofNullable(args).orElse(new HashMap<>());
-    }
-
-    /**
-     * Empty constructor for serialization.
-     */
-    private RequestMessage() {
-        this(null);
-    }
-
-    private RequestMessage(final String op) {
-        this(null, op, null, null);
-    }
-
-    /**
-     * The id of the current request and is used to track the message within Gremlin Server and in its response.  This
-     * value should be unique per request made.
-     */
-    public UUID getRequestId() {
-        return requestId;
-    }
-
-    /**
-     * The operation or command to perform as defined by a particular Processor.
-     */
-    public String getOp() {
-        return op;
-    }
-
-    /**
-     * The name of the Processor that should handle the {@link #op}.  Defaults to the standard processor if
-     * not specified.
-     */
-    public String getProcessor() {
-        return processor;
-    }
-
-    /**
-     * A {@link Map} of arguments that are supplied to the {@link #op}.  Each {@link #op} accepts different argument,
-     * so consult the documentation for a particular one to understand what is expected.
-     */
-    public Map<String, Object> getArgs() {
-        return args;
-    }
-
-    public <T> Optional<T> optionalArgs(final String key) {
-        final Object o = args.get(key);
-        return o == null ? Optional.empty() : Optional.of((T) o);
-    }
-
-    public <T> T getArg(final String key) {
-        return (T) args.get(key);
-    }
-
-    public <T> T getArgOrDefault(final String key, final T def) {
-        return (T) optionalArgs(key).orElse(def);
-    }
-
-    public static Builder from(final RequestMessage msg) {
-        final Builder builder = build(msg.op)
-                .overrideRequestId(msg.requestId)
-                .processor(msg.processor);
-        msg.args.forEach(builder::addArg);
-        return builder;
-    }
-
-    public static Builder build(final String op) {
-        return new Builder(op);
-    }
-
-    /**
-     * Builder class for {@link RequestMessage}.
-     */
-    public static final class Builder {
-        public static final String OP_PROCESSOR_NAME = "";
-        private UUID requestId;
-        private String op;
-        private String processor = OP_PROCESSOR_NAME;
-        private Map<String, Object> args = new HashMap<>();
-
-        private Builder(final String op) {
-            this.op = op;
-        }
-
-        /**
-         * If this value is not set in the builder then the {@link RequestMessage#processor} defaults to
-         * the standard op processor (empty string).
-         *
-         * @param processor the name of the processor
-         */
-        public Builder processor(final String processor) {
-            this.processor = processor;
-            return this;
-        }
-
-        /**
-         * Override the request identifier with a specified one, otherwise the {@link Builder} will randomly generate
-         * a {@link UUID}.
-         */
-        public Builder overrideRequestId(final UUID requestId) {
-            this.requestId = requestId;
-            return this;
-        }
-
-        public Builder addArg(final String key, final Object val) {
-            args.put(key, val);
-            return this;
-        }
-
-        public Builder add(final Object... keyValues) {
-            args.putAll(ElementHelper.asMap(keyValues));
-            return this;
-        }
-
-        /**
-         * Create the request message given the settings provided to the {@link Builder}.
-         */
-        public RequestMessage create() {
-            return new RequestMessage(null == requestId ? UUID.randomUUID() : requestId, op, processor, args);
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "RequestMessage{" +
-                ", requestId=" + requestId +
-                ", op='" + op + '\'' +
-                ", processor='" + processor + '\'' +
-                ", args=" + args +
-                '}';
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessageV4.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessageV4.java
index 1ddb7fe547..8425499487 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessageV4.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/RequestMessageV4.java
@@ -37,6 +37,8 @@ public final class RequestMessageV4 {
      */
     public static final RequestMessageV4 INVALID = new RequestMessageV4();
 
+    private static final String REQUEST_ID = "requestId";
+
     private String gremlinType; // Type information needed to help deserialize "gremlin" into either String/Bytecode.
 
     private Object gremlin; // Should be either a String or Bytecode type.
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseMessage.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseMessageV4.java
similarity index 68%
rename from gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseMessage.java
rename to gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseMessageV4.java
index 5348f2b06b..4f1deec9e2 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseMessage.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseMessageV4.java
@@ -26,32 +26,21 @@ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public final class ResponseMessage {
-
-    /**
-     * The current request that generated this response.
-     */
-    private final UUID requestId;
-    private final ResponseStatus responseStatus;
+public final class ResponseMessageV4 {
+    private final ResponseStatusV4 responseStatus;
     private final ResponseResult responseResult;
 
-    private ResponseMessage(final UUID requestId, final ResponseStatus responseStatus,
+    private ResponseMessageV4(final ResponseStatusV4 responseStatus,
                             final ResponseResult responseResult) {
-        this.requestId = requestId;
         this.responseResult = responseResult;
         this.responseStatus = responseStatus;
     }
 
-    public UUID getRequestId() {
-        return requestId;
-    }
-
-    public ResponseStatus getStatus() {
+    public ResponseStatusV4 getStatus() {
         return responseStatus;
     }
 
@@ -62,22 +51,21 @@ public final class ResponseMessage {
     @Override
     public String toString() {
         return "ResponseMessage{" +
-                "requestId=" + requestId +
                 ", status=" + responseStatus +
                 ", result=" + responseResult +
                 '}';
     }
 
     public static class ResponseMessageHeader {
-        private final ResponseMessage responseMessage;
+        private final ResponseMessageV4 responseMessage;
         private final boolean typed;
 
-        public ResponseMessageHeader(final ResponseMessage responseMessage, final boolean typed) {
+        public ResponseMessageHeader(final ResponseMessageV4 responseMessage, final boolean typed) {
             this.responseMessage = responseMessage;
             this.typed = typed;
         }
 
-        public ResponseMessage getResponseMessage() {
+        public ResponseMessageV4 getResponseMessage() {
             return responseMessage;
         }
 
@@ -87,15 +75,15 @@ public final class ResponseMessage {
     }
 
     public static class ResponseMessageFooter {
-        private final ResponseMessage responseMessage;
+        private final ResponseMessageV4 responseMessage;
         private final boolean typed;
 
-        public ResponseMessageFooter(final ResponseMessage responseMessage, final boolean typed) {
+        public ResponseMessageFooter(final ResponseMessageV4 responseMessage, final boolean typed) {
             this.responseMessage = responseMessage;
             this.typed = typed;
         }
 
-        public ResponseMessage getResponseMessage() {
+        public ResponseMessageV4 getResponseMessage() {
             return responseMessage;
         }
 
@@ -108,43 +96,15 @@ public final class ResponseMessage {
         return new Builder();
     }
 
-    public static Builder build(final RequestMessage requestMessage) {
-        return new Builder(requestMessage);
-    }
-
-    public static Builder build(final UUID requestId) {
-        return new Builder(requestId);
-    }
-
-    public static Builder buildV4() {
-        return new Builder();
-    }
-
     public final static class Builder {
-
-        private final UUID requestId;
         private HttpResponseStatus code = null;
-        private Object result = null;
+        private Object result = Collections.emptyList();
         private String statusMessage = null;
         private String exception = null;
         private Map<String, Object> attributes = Collections.emptyMap();
         private Map<String, Object> metaData = Collections.emptyMap();
 
-        private Builder() {
-            requestId = null;
-        }
-
-        private Builder(final RequestMessage requestMessage) {
-            this.requestId = requestMessage.getRequestId();
-        }
-
-        private Builder(final RequestMessageV4 requestMessage) {
-            this.requestId = requestMessage.getRequestId();
-        }
-
-        private Builder(final UUID requestId) {
-            this.requestId = requestId;
-        }
+        private Builder() { }
 
         public Builder code(final HttpResponseStatus code) {
             this.code = code;
@@ -190,14 +150,14 @@ public final class ResponseMessage {
             return this;
         }
 
-        public ResponseMessage create() {
+        public ResponseMessageV4 create() {
             final ResponseResult responseResult = new ResponseResult(result, metaData);
             // skip null values
             if (code == null && statusMessage == null) {
-                return new ResponseMessage(requestId, null, responseResult);
+                return new ResponseMessageV4(null, responseResult);
             }
-            final ResponseStatus responseStatus = new ResponseStatus(code, statusMessage, exception);
-            return new ResponseMessage(requestId, responseStatus, responseResult);
+            final ResponseStatusV4 responseStatus = new ResponseStatusV4(code, statusMessage, exception);
+            return new ResponseMessageV4(responseStatus, responseResult);
         }
     }
 }
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseStatus.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseStatusV4.java
similarity index 90%
rename from gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseStatus.java
rename to gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseStatusV4.java
index 9a27b62944..d0861b7ca4 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseStatus.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/message/ResponseStatusV4.java
@@ -26,20 +26,20 @@ import java.util.Map;
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public final class ResponseStatus {
+public final class ResponseStatusV4 {
     private final HttpResponseStatus code;
     private final String message;
     private final String exception;
     private final Map<String, Object> attributes;
 
-    public ResponseStatus(final HttpResponseStatus code, final String message, final Map<String, Object> attributes) {
+    public ResponseStatusV4(final HttpResponseStatus code, final String message, final Map<String, Object> attributes) {
         this.code = code;
         this.message = message;
         this.attributes = attributes;
         this.exception = null;
     }
 
-    public ResponseStatus(final HttpResponseStatus code, final String message, final String exception) {
+    public ResponseStatusV4(final HttpResponseStatus code, final String message, final String exception) {
         this.code = code;
         this.message = message;
         this.exception = exception;
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphBinaryMessageSerializerV1.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphBinaryMessageSerializerV1.java
deleted file mode 100644
index 2a5bd82de1..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphBinaryMessageSerializerV1.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.Unpooled;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryIo;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryMapper;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryReader;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryWriter;
-import org.apache.tinkerpop.gremlin.util.ser.binary.RequestMessageSerializer;
-import org.apache.tinkerpop.gremlin.util.ser.binary.ResponseMessageSerializer;
-import org.apache.tinkerpop.gremlin.structure.io.binary.TypeSerializerRegistry;
-import org.apache.tinkerpop.gremlin.structure.io.binary.types.CustomTypeSerializer;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
-import org.javatuples.Pair;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Base64;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-public abstract class AbstractGraphBinaryMessageSerializerV1 extends AbstractMessageSerializer<GraphBinaryMapper> implements MessageTextSerializer<GraphBinaryMapper> {
-    public static final String TOKEN_CUSTOM = "custom";
-    public static final String TOKEN_BUILDER = "builder";
-    public static final String TOKEN_SERIALIZE_RESULT_TO_STRING = "serializeResultToString";
-
-    private static final Base64.Encoder base64Encoder = Base64.getEncoder();
-    private static final Base64.Decoder base64Decoder = Base64.getDecoder();
-
-    private boolean serializeToString = false;
-    protected GraphBinaryReader reader;
-    protected GraphBinaryWriter writer;
-    private RequestMessageSerializer requestSerializer;
-    private ResponseMessageSerializer responseSerializer;
-    private GraphBinaryMapper mapper;
-
-    /**
-     * Creates a new instance of the message serializer using the default type serializers.
-     */
-    public AbstractGraphBinaryMessageSerializerV1() {
-        this(TypeSerializerRegistry.INSTANCE);
-    }
-
-    public AbstractGraphBinaryMessageSerializerV1(final TypeSerializerRegistry registry) {
-        reader = new GraphBinaryReader(registry);
-        writer = new GraphBinaryWriter(registry);
-        mapper = new GraphBinaryMapper(writer, reader);
-
-        requestSerializer = new RequestMessageSerializer();
-        responseSerializer = new ResponseMessageSerializer();
-    }
-
-    public AbstractGraphBinaryMessageSerializerV1(final TypeSerializerRegistry.Builder builder) {
-        this(builder.create());
-    }
-
-    protected abstract String obtainMimeType();
-
-    protected abstract String obtainStringdMimeType();
-
-    @Override
-    public GraphBinaryMapper getMapper() {
-        return mapper;
-    }
-
-    @Override
-    public void configure(final Map<String, Object> config, final Map<String, Graph> graphs) {
-        final String builderClassName = (String) config.get(TOKEN_BUILDER);
-        final TypeSerializerRegistry.Builder builder;
-
-        if (builderClassName != null) {
-            try {
-                final Class<?> clazz = Class.forName(builderClassName);
-                final Constructor<?> ctor = clazz.getConstructor();
-                builder = (TypeSerializerRegistry.Builder) ctor.newInstance();
-            } catch (Exception ex) {
-                throw new IllegalStateException(ex);
-            }
-        } else {
-            builder = TypeSerializerRegistry.build();
-        }
-
-        final List<String> classNameList = getListStringFromConfig(TOKEN_IO_REGISTRIES, config);
-        classNameList.forEach(className -> {
-            try {
-                final Class<?> clazz = Class.forName(className);
-                try {
-                    final Method instanceMethod = tryInstanceMethod(clazz);
-                    final IoRegistry ioreg = (IoRegistry) instanceMethod.invoke(null);
-                    final List<Pair<Class, CustomTypeSerializer>> classSerializers = ioreg.find(GraphBinaryIo.class, CustomTypeSerializer.class);
-                    for (Pair<Class,CustomTypeSerializer> cs : classSerializers) {
-                        builder.addCustomType(cs.getValue0(), cs.getValue1());
-                    }
-                } catch (Exception methodex) {
-                    throw new IllegalStateException(String.format("Could not instantiate IoRegistry from an instance() method on %s", className), methodex);
-                }
-            } catch (Exception ex) {
-                throw new IllegalStateException(ex);
-            }
-        });
-
-        addCustomClasses(config, builder);
-
-        this.serializeToString = Boolean.parseBoolean(config.getOrDefault(TOKEN_SERIALIZE_RESULT_TO_STRING, "false").toString());
-
-        final TypeSerializerRegistry registry = builder.create();
-        reader = new GraphBinaryReader(registry);
-        writer = new GraphBinaryWriter(registry);
-
-        requestSerializer = new RequestMessageSerializer();
-        responseSerializer = new ResponseMessageSerializer();
-    }
-
-    @Override
-    public ByteBuf serializeResponseAsBinary(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        final ByteBuf buffer = allocator.buffer();
-
-        try {
-            final ResponseMessage msgToWrite = !serializeToString ? responseMessage :
-                    ResponseMessage.build(responseMessage.getRequestId())
-                            .code(responseMessage.getStatus().getCode())
-                            .statusAttributes(responseMessage.getStatus().getAttributes())
-                            .responseMetaData(responseMessage.getResult().getMeta())
-                            .result(serializeResultToString(responseMessage))
-                            .statusMessage(responseMessage.getStatus().getMessage()).create();
-
-            responseSerializer.writeValue(msgToWrite, buffer, writer);
-        } catch (Exception ex) {
-            buffer.release();
-            throw ex;
-        }
-
-        return buffer;
-    }
-
-    @Override
-    public ByteBuf serializeRequestAsBinary(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        final byte[] header = obtainMimeType().getBytes(UTF_8);
-        final ByteBuf buffer = allocator.buffer().writeByte(header.length).writeBytes(header);
-
-        try {
-            requestSerializer.writeValue(requestMessage, buffer, writer);
-        } catch (Exception ex) {
-            buffer.release();
-            throw ex;
-        }
-
-        return buffer;
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final ByteBuf msg) throws SerializationException {
-        return requestSerializer.readValue(msg, reader);
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final ByteBuf msg) throws SerializationException {
-        return responseSerializer.readValue(msg, reader);
-    }
-
-    @Override
-    public String[] mimeTypesSupported() {
-        return new String[] {serializeToString ? obtainStringdMimeType() : obtainMimeType()};
-    }
-
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        final ByteBuf bb = serializeResponseAsBinary(responseMessage, allocator);
-        return base64Encoder.encodeToString(convertToBytes(bb));
-    }
-
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        final ByteBuf bb = allocator.buffer();
-
-        try {
-            requestSerializer.writeValue(requestMessage, bb, writer);
-        } catch (Exception ex) {
-            bb.release();
-            throw ex;
-        }
-
-        return base64Encoder.encodeToString(convertToBytes(bb));
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        return deserializeRequest(convertToByteBuf(msg));
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        return deserializeResponse(convertToByteBuf(msg));
-    }
-
-    private byte[] convertToBytes(final ByteBuf bb) {
-        byte[] bytes = new byte[bb.readableBytes()];
-        bb.getBytes(bb.readerIndex(), bytes);
-        return bytes;
-    }
-
-    private ByteBuf convertToByteBuf(final String msg) {
-        final byte[] b = base64Decoder.decode(msg);
-        final ByteBuf bb = Unpooled.buffer(b.length);
-        bb.writeBytes(b);
-        return bb;
-    }
-
-    private void addCustomClasses(final Map<String, Object> config, final TypeSerializerRegistry.Builder builder) {
-        final List<String> classNameList = getListStringFromConfig(TOKEN_CUSTOM, config);
-
-        classNameList.forEach(serializerDefinition -> {
-            final String className;
-            final String serializerName;
-            if (serializerDefinition.contains(";")) {
-                final String[] split = serializerDefinition.split(";");
-                if (split.length != 2)
-                    throw new IllegalStateException(String.format("Invalid format for serializer definition [%s] - expected <class>;<serializer-class>", serializerDefinition));
-
-                className = split[0];
-                serializerName = split[1];
-            } else {
-                throw new IllegalStateException(String.format("Invalid format for serializer definition [%s] - expected <class>;<serializer-class>", serializerDefinition));
-            }
-
-            try {
-                final Class clazz = Class.forName(className);
-                final Class serializerClazz = Class.forName(serializerName);
-                final CustomTypeSerializer serializer = (CustomTypeSerializer) serializerClazz.newInstance();
-                builder.addCustomType(clazz, serializer);
-            } catch (Exception ex) {
-                throw new IllegalStateException("CustomTypeSerializer could not be instantiated", ex);
-            }
-        });
-    }
-
-    private Object serializeResultToString(final ResponseMessage msg) {
-        if (msg.getResult() == null) return "null";
-        if (msg.getResult().getData() == null) return "null";
-
-        // the IteratorHandler should return a collection so keep it as such
-        final Object o = msg.getResult().getData();
-        if (o instanceof Collection) {
-            return ((Collection) o).stream().map(d -> null == d ? "null" : d.toString()).collect(Collectors.toList());
-        } else {
-            return o.toString();
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV1.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV1.java
deleted file mode 100644
index 5dbad261af..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV1.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import io.netty.util.ReferenceCountUtil;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONUtil;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.shaded.jackson.core.JsonGenerationException;
-import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
-import org.apache.tinkerpop.shaded.jackson.core.JsonProcessingException;
-import org.apache.tinkerpop.shaded.jackson.core.type.TypeReference;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
-import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer;
-import org.apache.tinkerpop.shaded.jackson.databind.module.SimpleModule;
-import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class AbstractGraphSONMessageSerializerV1 extends AbstractMessageSerializer<ObjectMapper> {
-    private static final Logger logger = LoggerFactory.getLogger(AbstractGraphSONMessageSerializerV1.class);
-
-    protected ObjectMapper mapper;
-
-    protected final TypeReference<Map<String, Object>> mapTypeReference = new TypeReference<Map<String, Object>>() {
-    };
-
-    public AbstractGraphSONMessageSerializerV1() {
-        final GraphSONMapper.Builder builder = configureBuilder(initBuilder(null));
-        mapper = builder.create().createMapper();
-    }
-
-    public AbstractGraphSONMessageSerializerV1(final GraphSONMapper mapper) {
-        this.mapper = mapper.createMapper();
-    }
-
-    abstract byte[] obtainHeader();
-
-    abstract GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder);
-
-    @Override
-    public void configure(final Map<String, Object> config, final Map<String, Graph> graphs) {
-        final GraphSONMapper.Builder initialBuilder = initBuilder(null);
-        addIoRegistries(config, initialBuilder);
-        applyMaxTokenLimits(initialBuilder, config);
-        mapper = configureBuilder(initialBuilder).create().createMapper();
-    }
-
-    @Override
-    public ByteBuf serializeResponseAsBinary(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        ByteBuf encodedMessage = null;
-        try {
-            final byte[] payload = mapper.writeValueAsBytes(responseMessage);
-            encodedMessage = allocator.buffer(payload.length);
-            encodedMessage.writeBytes(payload);
-
-            return encodedMessage;
-        } catch (Exception ex) {
-            if (encodedMessage != null) ReferenceCountUtil.release(encodedMessage);
-
-            logger.warn("Response [{}] could not be serialized by {}.", responseMessage.toString(), AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public ByteBuf serializeRequestAsBinary(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        ByteBuf encodedMessage = null;
-        try {
-            final byte[] header = obtainHeader();
-            final byte[] payload = mapper.writeValueAsBytes(requestMessage);
-
-            encodedMessage = allocator.buffer(header.length + payload.length);
-            encodedMessage.writeBytes(header);
-            encodedMessage.writeBytes(payload);
-
-            return encodedMessage;
-        } catch (Exception ex) {
-            if (encodedMessage != null) ReferenceCountUtil.release(encodedMessage);
-
-            logger.warn("Request [{}] could not be serialized by {}.", requestMessage.toString(), AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final ByteBuf msg) throws SerializationException {
-        try {
-            final byte[] payload = new byte[msg.readableBytes()];
-            msg.readBytes(payload);
-            return mapper.readValue(payload, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final ByteBuf msg) throws SerializationException {
-        try {
-            final byte[] payload = new byte[msg.readableBytes()];
-            msg.readBytes(payload);
-            final Map<String, Object> responseData = mapper.readValue(payload, mapTypeReference);
-            final Map<String, Object> status = (Map<String, Object>) responseData.get(SerTokens.TOKEN_STATUS);
-            final Map<String, Object> result = (Map<String, Object>) responseData.get(SerTokens.TOKEN_RESULT);
-            return ResponseMessage.build(UUID.fromString(responseData.get(SerTokens.TOKEN_REQUEST).toString()))
-                    .code(HttpResponseStatus.valueOf((Integer) status.get(SerTokens.TOKEN_CODE)))
-                    .statusMessage(String.valueOf(status.get(SerTokens.TOKEN_MESSAGE)))
-                    .statusAttributes((Map<String, Object>) status.get(SerTokens.TOKEN_ATTRIBUTES))
-                    .result(result.get(SerTokens.TOKEN_DATA))
-                    .responseMetaData((Map<String, Object>) result.get(SerTokens.TOKEN_META))
-                    .create();
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    private GraphSONMapper.Builder initBuilder(final GraphSONMapper.Builder builder) {
-        final GraphSONMapper.Builder b = null == builder ? GraphSONMapper.build() : builder;
-        return b.addCustomModule(new AbstractGraphSONMessageSerializerV1.GremlinServerModule())
-                .version(GraphSONVersion.V1_0);
-    }
-
-    private GraphSONMapper.Builder applyMaxTokenLimits(final GraphSONMapper.Builder builder, final Map<String, Object> config) {
-        if(config != null) {
-            if(config.containsKey("maxNumberLength")) {
-                builder.maxNumberLength((int)config.get("maxNumberLength"));
-            }
-            if(config.containsKey("maxStringLength")) {
-                builder.maxStringLength((int)config.get("maxStringLength"));
-            }
-            if(config.containsKey("maxNestingDepth")) {
-                builder.maxNestingDepth((int)config.get("maxNestingDepth"));
-            }
-        }
-        return builder;
-    }
-
-    @Override
-    public ObjectMapper getMapper() {
-        return this.mapper;
-    }
-
-    public final static class GremlinServerModule extends SimpleModule {
-        public GremlinServerModule() {
-            super("graphson-gremlin-server");
-            addSerializer(ResponseMessage.class, new ResponseMessageSerializer());
-        }
-    }
-
-    public final static class ResponseMessageSerializer extends StdSerializer<ResponseMessage> {
-        public ResponseMessageSerializer() {
-            super(ResponseMessage.class);
-        }
-
-        @Override
-        public void serialize(final ResponseMessage responseMessage, final JsonGenerator jsonGenerator,
-                              final SerializerProvider serializerProvider) throws IOException, JsonGenerationException {
-            ser(responseMessage, jsonGenerator, serializerProvider, null);
-        }
-
-        @Override
-        public void serializeWithType(final ResponseMessage responseMessage, final JsonGenerator jsonGenerator,
-                                      final SerializerProvider serializerProvider,
-                                      final TypeSerializer typeSerializer) throws IOException, JsonProcessingException {
-            ser(responseMessage, jsonGenerator, serializerProvider, typeSerializer);
-        }
-
-        public void ser(final ResponseMessage responseMessage, final JsonGenerator jsonGenerator,
-                        final SerializerProvider serializerProvider,
-                        final TypeSerializer typeSerializer) throws IOException, JsonProcessingException {
-            jsonGenerator.writeStartObject();
-            if (typeSerializer != null) jsonGenerator.writeStringField(GraphSONTokens.CLASS, HashMap.class.getName());
-
-            jsonGenerator.writeStringField(SerTokens.TOKEN_REQUEST, responseMessage.getRequestId() != null ? responseMessage.getRequestId().toString() : null);
-            jsonGenerator.writeObjectFieldStart(SerTokens.TOKEN_STATUS);
-
-            if (typeSerializer != null) jsonGenerator.writeStringField(GraphSONTokens.CLASS, HashMap.class.getName());
-            jsonGenerator.writeStringField(SerTokens.TOKEN_MESSAGE, responseMessage.getStatus().getMessage());
-            jsonGenerator.writeNumberField(SerTokens.TOKEN_CODE, responseMessage.getStatus().getCode().code());
-            jsonGenerator.writeObjectField(SerTokens.TOKEN_ATTRIBUTES, responseMessage.getStatus().getAttributes());
-            jsonGenerator.writeEndObject();
-
-            jsonGenerator.writeObjectFieldStart(SerTokens.TOKEN_RESULT);
-            if (typeSerializer != null) jsonGenerator.writeStringField(GraphSONTokens.CLASS, HashMap.class.getName());
-            if (null == responseMessage.getResult().getData())
-                jsonGenerator.writeNullField(SerTokens.TOKEN_DATA);
-            else
-                GraphSONUtil.writeWithType(SerTokens.TOKEN_DATA, responseMessage.getResult().getData(), jsonGenerator, serializerProvider, typeSerializer);
-            jsonGenerator.writeObjectField(SerTokens.TOKEN_META, responseMessage.getResult().getMeta());
-            jsonGenerator.writeEndObject();
-
-            jsonGenerator.writeEndObject();
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV2.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV2.java
deleted file mode 100644
index 3b8c9959b1..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV2.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import io.netty.util.ReferenceCountUtil;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.AbstractObjectDeserializer;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONUtil;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV2;
-import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
-import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer;
-import org.apache.tinkerpop.shaded.jackson.databind.module.SimpleModule;
-import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class AbstractGraphSONMessageSerializerV2 extends AbstractMessageSerializer<ObjectMapper> {
-    private static final Logger logger = LoggerFactory.getLogger(AbstractGraphSONMessageSerializerV2.class);
-
-    protected ObjectMapper mapper;
-
-    public AbstractGraphSONMessageSerializerV2() {
-        final GraphSONMapper.Builder builder = configureBuilder(initBuilder(null));
-        mapper = builder.create().createMapper();
-    }
-
-    @Deprecated
-    public AbstractGraphSONMessageSerializerV2(final GraphSONMapper mapper) {
-        this.mapper = mapper.createMapper();
-    }
-
-    public AbstractGraphSONMessageSerializerV2(final GraphSONMapper.Builder mapperBuilder) {
-        this.mapper = configureBuilder(mapperBuilder).create().createMapper();
-    }
-
-    abstract byte[] obtainHeader();
-
-    abstract GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder);
-
-    @Override
-    public void configure(final Map<String, Object> config, final Map<String, Graph> graphs) {
-        final GraphSONMapper.Builder initialBuilder = initBuilder(null);
-        addIoRegistries(config, initialBuilder);
-        applyMaxTokenLimits(initialBuilder, config);
-        mapper = configureBuilder(initialBuilder).create().createMapper();
-    }
-
-    @Override
-    public ByteBuf serializeResponseAsBinary(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        ByteBuf encodedMessage = null;
-        try {
-            final byte[] payload = mapper.writeValueAsBytes(responseMessage);
-            encodedMessage = allocator.buffer(payload.length);
-            encodedMessage.writeBytes(payload);
-
-            return encodedMessage;
-        } catch (Exception ex) {
-            if (encodedMessage != null) ReferenceCountUtil.release(encodedMessage);
-
-            logger.warn(String.format("Response [%s] could not be serialized by %s.", responseMessage, AbstractGraphSONMessageSerializerV2.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public ByteBuf serializeRequestAsBinary(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        ByteBuf encodedMessage = null;
-        try {
-            final byte[] header = obtainHeader();
-            final byte[] payload = mapper.writeValueAsBytes(requestMessage);
-
-            encodedMessage = allocator.buffer(header.length + payload.length);
-            encodedMessage.writeBytes(header);
-            encodedMessage.writeBytes(payload);
-
-            return encodedMessage;
-        } catch (Exception ex) {
-            if (encodedMessage != null) ReferenceCountUtil.release(encodedMessage);
-
-            logger.warn(String.format("Request [%s] could not be serialized by %s.", requestMessage, AbstractGraphSONMessageSerializerV2.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final ByteBuf msg) throws SerializationException {
-        try {
-            final byte[] payload = new byte[msg.readableBytes()];
-            msg.readBytes(payload);
-            return mapper.readValue(payload, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn(String.format("Request [%s] could not be deserialized by %s.", msg, AbstractGraphSONMessageSerializerV2.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final ByteBuf msg) throws SerializationException {
-        try {
-            final byte[] payload = new byte[msg.readableBytes()];
-            msg.readBytes(payload);
-            return mapper.readValue(payload, ResponseMessage.class);
-        } catch (Exception ex) {
-            logger.warn(String.format("Response [%s] could not be deserialized by %s.", msg, AbstractGraphSONMessageSerializerV2.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
-    }
-
-    private GraphSONMapper.Builder initBuilder(final GraphSONMapper.Builder builder) {
-        final GraphSONMapper.Builder b = null == builder ? GraphSONMapper.build() : builder;
-        return b.addCustomModule(GraphSONXModuleV2.build())
-                .version(GraphSONVersion.V2_0);
-    }
-
-    private GraphSONMapper.Builder applyMaxTokenLimits(final GraphSONMapper.Builder builder, final Map<String, Object> config) {
-        if (config != null) {
-            if (config.containsKey("maxNumberLength")) {
-                builder.maxNumberLength((int) config.get("maxNumberLength"));
-            }
-            if (config.containsKey("maxStringLength")) {
-                builder.maxStringLength((int) config.get("maxStringLength"));
-            }
-            if (config.containsKey("maxNestingDepth")) {
-                builder.maxNestingDepth((int) config.get("maxNestingDepth"));
-            }
-        }
-        return builder;
-    }
-
-    @Override
-    public ObjectMapper getMapper() {
-        return this.mapper;
-    }
-
-    public final static class GremlinServerModule extends SimpleModule {
-        public GremlinServerModule() {
-            super("graphson-gremlin-server");
-
-            // SERIALIZERS
-            addSerializer(ResponseMessage.class, new ResponseMessageSerializer());
-            addSerializer(RequestMessage.class, new RequestMessageSerializer());
-
-            //DESERIALIZERS
-            addDeserializer(ResponseMessage.class, new ResponseMessageDeserializer());
-            addDeserializer(RequestMessage.class, new RequestMessageDeserializer());
-        }
-    }
-
-    public final static class RequestMessageSerializer extends StdSerializer<RequestMessage> {
-        public RequestMessageSerializer() {
-            super(RequestMessage.class);
-        }
-
-        @Override
-        public void serialize(final RequestMessage requestMessage, final JsonGenerator jsonGenerator,
-                              final SerializerProvider serializerProvider) throws IOException {
-            ser(requestMessage, jsonGenerator, serializerProvider, null);
-        }
-
-        @Override
-        public void serializeWithType(final RequestMessage requestMessage, final JsonGenerator jsonGenerator,
-                                      final SerializerProvider serializerProvider,
-                                      final TypeSerializer typeSerializer) throws IOException {
-            ser(requestMessage, jsonGenerator, serializerProvider, typeSerializer);
-        }
-
-        public void ser(final RequestMessage requestMessage, final JsonGenerator jsonGenerator,
-                        final SerializerProvider serializerProvider,
-                        final TypeSerializer typeSerializer) throws IOException {
-            GraphSONUtil.writeStartObject(requestMessage, jsonGenerator, typeSerializer);
-
-            jsonGenerator.writeStringField(SerTokens.TOKEN_REQUEST, requestMessage.getRequestId().toString());
-            jsonGenerator.writeStringField(SerTokens.TOKEN_OP, requestMessage.getOp());
-            jsonGenerator.writeStringField(SerTokens.TOKEN_PROCESSOR, requestMessage.getProcessor());
-            jsonGenerator.writeObjectField(SerTokens.TOKEN_ARGS, requestMessage.getArgs());
-
-            GraphSONUtil.writeEndObject(requestMessage, jsonGenerator, typeSerializer);
-        }
-    }
-
-    public final static class RequestMessageDeserializer extends AbstractObjectDeserializer<RequestMessage> {
-        protected RequestMessageDeserializer() {
-            super(RequestMessage.class);
-        }
-
-        @Override
-        public RequestMessage createObject(final Map<String, Object> data) {
-            final Map<String, Object> args = (Map<String, Object>) data.get(SerTokens.TOKEN_ARGS);
-            RequestMessage.Builder builder = RequestMessage.build(data.get(SerTokens.TOKEN_OP).toString())
-                    .overrideRequestId(UUID.fromString(data.get(SerTokens.TOKEN_REQUEST).toString()));
-
-            if (data.containsKey(SerTokens.TOKEN_PROCESSOR))
-                builder = builder.processor(data.get(SerTokens.TOKEN_PROCESSOR).toString());
-
-            if (args != null) {
-                for (Map.Entry<String, Object> kv : args.entrySet()) {
-                    builder = builder.addArg(kv.getKey(), kv.getValue());
-                }
-            }
-
-            return builder.create();
-        }
-    }
-
-    public final static class ResponseMessageSerializer extends StdSerializer<ResponseMessage> {
-        public ResponseMessageSerializer() {
-            super(ResponseMessage.class);
-        }
-
-        @Override
-        public void serialize(final ResponseMessage responseMessage, final JsonGenerator jsonGenerator,
-                              final SerializerProvider serializerProvider) throws IOException {
-            ser(responseMessage, jsonGenerator, serializerProvider, null);
-        }
-
-        @Override
-        public void serializeWithType(final ResponseMessage responseMessage, final JsonGenerator jsonGenerator,
-                                      final SerializerProvider serializerProvider,
-                                      final TypeSerializer typeSerializer) throws IOException {
-            ser(responseMessage, jsonGenerator, serializerProvider, typeSerializer);
-        }
-
-        public void ser(final ResponseMessage responseMessage, final JsonGenerator jsonGenerator,
-                        final SerializerProvider serializerProvider,
-                        final TypeSerializer typeSerializer) throws IOException {
-            GraphSONUtil.writeStartObject(responseMessage, jsonGenerator, typeSerializer);
-
-            jsonGenerator.writeStringField(SerTokens.TOKEN_REQUEST, responseMessage.getRequestId() != null ? responseMessage.getRequestId().toString() : null);
-            jsonGenerator.writeFieldName(SerTokens.TOKEN_STATUS);
-
-            GraphSONUtil.writeStartObject(responseMessage, jsonGenerator, typeSerializer);
-            jsonGenerator.writeStringField(SerTokens.TOKEN_MESSAGE, responseMessage.getStatus().getMessage());
-            jsonGenerator.writeNumberField(SerTokens.TOKEN_CODE, responseMessage.getStatus().getCode().code());
-            jsonGenerator.writeObjectField(SerTokens.TOKEN_ATTRIBUTES, responseMessage.getStatus().getAttributes());
-            GraphSONUtil.writeEndObject(responseMessage, jsonGenerator, typeSerializer);
-
-            jsonGenerator.writeFieldName(SerTokens.TOKEN_RESULT);
-
-            GraphSONUtil.writeStartObject(responseMessage, jsonGenerator, typeSerializer);
-
-            if (null == responseMessage.getResult().getData()) {
-                jsonGenerator.writeNullField(SerTokens.TOKEN_DATA);
-            } else {
-                jsonGenerator.writeFieldName(SerTokens.TOKEN_DATA);
-                final Object result = responseMessage.getResult().getData();
-                serializerProvider.findTypedValueSerializer(result.getClass(), true, null).serialize(result, jsonGenerator, serializerProvider);
-            }
-
-            jsonGenerator.writeObjectField(SerTokens.TOKEN_META, responseMessage.getResult().getMeta());
-            GraphSONUtil.writeEndObject(responseMessage, jsonGenerator, typeSerializer);
-
-            GraphSONUtil.writeEndObject(responseMessage, jsonGenerator, typeSerializer);
-        }
-    }
-
-    public final static class ResponseMessageDeserializer extends AbstractObjectDeserializer<ResponseMessage> {
-        protected ResponseMessageDeserializer() {
-            super(ResponseMessage.class);
-        }
-
-        @Override
-        public ResponseMessage createObject(final Map<String, Object> data) {
-            final Map<String, Object> status = (Map<String, Object>) data.get(SerTokens.TOKEN_STATUS);
-            final Map<String, Object> result = (Map<String, Object>) data.get(SerTokens.TOKEN_RESULT);
-            return ResponseMessage.build(UUID.fromString(data.get(SerTokens.TOKEN_REQUEST).toString()))
-                    .code(HttpResponseStatus.valueOf((Integer) status.get(SerTokens.TOKEN_CODE)))
-                    .statusMessage(String.valueOf(status.get(SerTokens.TOKEN_MESSAGE)))
-                    .statusAttributes((Map<String, Object>) status.get(SerTokens.TOKEN_ATTRIBUTES))
-                    .result(result.get(SerTokens.TOKEN_DATA))
-                    .responseMetaData((Map<String, Object>) result.get(SerTokens.TOKEN_META))
-                    .create();
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV4.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV4.java
index 52cb961e00..db95fcb754 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV4.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV4.java
@@ -22,17 +22,21 @@ import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.handler.codec.http.HttpResponseStatus;
 import io.netty.util.ReferenceCountUtil;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.AbstractObjectDeserializer;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONUtil;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV3;
+import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
 import org.apache.tinkerpop.shaded.jackson.core.JsonProcessingException;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
 import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer;
+import org.apache.tinkerpop.shaded.jackson.databind.module.SimpleModule;
 import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,75 +46,84 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractGraphSONMessageSerializerV2 implements MessageTextSerializerV4<ObjectMapper> {
+public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractMessageSerializerV4<ObjectMapper> {
     private static final Logger logger = LoggerFactory.getLogger(AbstractGraphSONMessageSerializerV4.class);
 
+    protected ObjectMapper mapper;
+
     public AbstractGraphSONMessageSerializerV4() {
-        super();
+        final GraphSONMapper.Builder builder = configureBuilder(initBuilder());
+        mapper = builder.create().createMapper();
     }
 
     public AbstractGraphSONMessageSerializerV4(GraphSONMapper.Builder mapperBuilder) {
-        super(mapperBuilder);
+        this.mapper = configureBuilder(mapperBuilder).create().createMapper();
     }
 
-    @Override
-    public abstract String[] mimeTypesSupported();
+    abstract GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder);
 
     @Override
-    abstract byte[] obtainHeader();
+    public ObjectMapper getMapper() {
+        return this.mapper;
+    }
 
     @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, ResponseMessage.class);
-        } catch (Exception ex) {
-            logger.warn(String.format("Response [%s] could not be deserialized by %s.", msg, AbstractGraphSONMessageSerializerV4.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
+    public void configure(final Map<String, Object> config, final Map<String, Graph> graphs) {
+        final GraphSONMapper.Builder initialBuilder = initBuilder();
+        addIoRegistries(config, initialBuilder);
+        applyMaxTokenLimits(initialBuilder, config);
+        mapper = configureBuilder(initialBuilder).create().createMapper();
     }
 
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn(String.format("Request [%s] could not be deserialized by %s.", msg, AbstractGraphSONMessageSerializerV4.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
+    private GraphSONMapper.Builder initBuilder() {
+        final GraphSONMapper.Builder b = GraphSONMapper.build();
+        return b.addCustomModule(GraphSONXModuleV3.build()).version(GraphSONVersion.V4_0);
     }
 
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(requestMessage);
-        } catch (Exception ex) {
-            logger.warn(String.format("Request [%s] could not be serialized by %s.", requestMessage.toString(), AbstractGraphSONMessageSerializerV4.class.getName()), ex);
-            throw new SerializationException(ex);
+    private GraphSONMapper.Builder applyMaxTokenLimits(final GraphSONMapper.Builder builder, final Map<String, Object> config) {
+        if (config != null) {
+            if (config.containsKey("maxNumberLength")) {
+                builder.maxNumberLength((int) config.get("maxNumberLength"));
+            }
+            if (config.containsKey("maxStringLength")) {
+                builder.maxStringLength((int) config.get("maxStringLength"));
+            }
+            if (config.containsKey("maxNestingDepth")) {
+                builder.maxNestingDepth((int) config.get("maxNestingDepth"));
+            }
         }
+        return builder;
     }
 
     @Override
-    public ByteBuf serializeResponseAsBinary(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf serializeResponseAsBinary(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
         return writeHeader(responseMessage, allocator);
     }
 
     @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        throw new UnsupportedOperationException("Response serialization as String is not supported");
+    public ResponseMessageV4 deserializeBinaryResponse(final ByteBuf msg) throws SerializationException {
+        try {
+            final byte[] payload = new byte[msg.readableBytes()];
+            msg.readBytes(payload);
+            return mapper.readValue(payload, ResponseMessageV4.class);
+        } catch (Exception ex) {
+            logger.warn(String.format("Response [%s] could not be deserialized by %s.", msg, AbstractGraphSONMessageSerializerV4.class.getName()), ex);
+            throw new SerializationException(ex);
+        }
     }
 
     protected boolean isTyped() { return true; };
     @Override
-    public ByteBuf writeHeader(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf writeHeader(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
         ByteBuf encodedMessage = null;
         try {
             boolean writeFullMessage = responseMessage.getStatus() != null;
 
-            final byte[] header = mapper.writeValueAsBytes(new ResponseMessage.ResponseMessageHeader(responseMessage, isTyped()));
+            final byte[] header = mapper.writeValueAsBytes(new ResponseMessageV4.ResponseMessageHeader(responseMessage, isTyped()));
             final byte[] data = getChunk(true, responseMessage.getResult().getData());
 
             final byte[] footer = writeFullMessage
-                    ? mapper.writeValueAsBytes(new ResponseMessage.ResponseMessageFooter(responseMessage, isTyped()))
+                    ? mapper.writeValueAsBytes(new ResponseMessageV4.ResponseMessageFooter(responseMessage, isTyped()))
                     : new byte[0];
             // skip closing }
             final int headerLen = header.length - (isTyped() ? 3 : 2);
@@ -126,7 +139,7 @@ public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractGraphS
         } catch (Exception ex) {
             if (encodedMessage != null) ReferenceCountUtil.release(encodedMessage);
 
-            logger.warn(String.format("Response [%s] could not be serialized by %s.", responseMessage, AbstractGraphSONMessageSerializerV2.class.getName()), ex);
+            logger.warn(String.format("Response [%s] could not be serialized by %s.", responseMessage, AbstractGraphSONMessageSerializerV4.class.getName()), ex);
             throw new SerializationException(ex);
         }
     }
@@ -171,10 +184,10 @@ public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractGraphS
     }
 
     @Override
-    public ByteBuf writeFooter(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf writeFooter(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
         ByteBuf encodedMessage = null;
         try {
-            final byte[] footer = mapper.writeValueAsBytes(new ResponseMessage.ResponseMessageFooter(responseMessage, isTyped()));
+            final byte[] footer = mapper.writeValueAsBytes(new ResponseMessageV4.ResponseMessageFooter(responseMessage, isTyped()));
             final byte[] data = getChunk(false, responseMessage.getResult().getData());
             // skip opening {
             encodedMessage = allocator.buffer(footer.length - 2 + data.length).
@@ -190,10 +203,10 @@ public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractGraphS
     }
 
     @Override
-    public ByteBuf writeErrorFooter(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf writeErrorFooter(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
         ByteBuf encodedMessage = null;
         try {
-            final byte[] footer = mapper.writeValueAsBytes(new ResponseMessage.ResponseMessageFooter(responseMessage, isTyped()));
+            final byte[] footer = mapper.writeValueAsBytes(new ResponseMessageV4.ResponseMessageFooter(responseMessage, isTyped()));
             // skip opening {
             encodedMessage = allocator.buffer(footer.length - 2).
                     writeBytes(footer, 1, footer.length - 1);
@@ -208,42 +221,56 @@ public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractGraphS
     }
 
     @Override
-    public ResponseMessage readChunk(final ByteBuf byteBuf, final boolean isFirstChunk) {
+    public ResponseMessageV4 readChunk(final ByteBuf byteBuf, final boolean isFirstChunk) {
         throw new UnsupportedOperationException("Reading for streaming GraphSON is not supported");
     }
 
     @Override
-    public ByteBuf serializeRequestMessageV4(RequestMessageV4 requestMessage, ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf serializeRequestAsBinary(RequestMessageV4 requestMessage, ByteBufAllocator allocator) throws SerializationException {
         ByteBuf encodedMessage = null;
         try {
-            final byte[] header = obtainHeader();
             final byte[] payload = mapper.writeValueAsBytes(requestMessage);
 
-            encodedMessage = allocator.buffer(header.length + payload.length);
-            encodedMessage.writeBytes(header);
+            encodedMessage = allocator.buffer(payload.length);
             encodedMessage.writeBytes(payload);
 
             return encodedMessage;
         } catch (Exception ex) {
             if (encodedMessage != null) ReferenceCountUtil.release(encodedMessage);
 
-            logger.warn(String.format("Request [%s] could not be serialized by %s.", requestMessage, AbstractGraphSONMessageSerializerV2.class.getName()), ex);
+            logger.warn(String.format("Request [%s] could not be serialized by %s.", requestMessage, AbstractGraphSONMessageSerializerV4.class.getName()), ex);
             throw new SerializationException(ex);
         }
     }
 
     @Override
-    public RequestMessageV4 deserializeRequestMessageV4(ByteBuf msg) throws SerializationException {
+    public RequestMessageV4 deserializeBinaryRequest(ByteBuf msg) throws SerializationException {
         try {
             final byte[] payload = new byte[msg.readableBytes()];
             msg.readBytes(payload);
             return mapper.readValue(payload, RequestMessageV4.class);
         } catch (Exception ex) {
-            logger.warn(String.format("Request [%s] could not be deserialized by %s.", msg, AbstractGraphSONMessageSerializerV2.class.getName()), ex);
+            logger.warn(String.format("Request [%s] could not be deserialized by %s.", msg, AbstractGraphSONMessageSerializerV4.class.getName()), ex);
             throw new SerializationException(ex);
         }
     }
 
+    public final static class GremlinServerModuleV4 extends SimpleModule {
+        public GremlinServerModuleV4() {
+            super("graphsonV4-gremlin-server");
+
+            // SERIALIZERS
+            addSerializer(ResponseMessageV4.class, new ResponseMessageSerializerV4());
+            addSerializer(ResponseMessageV4.ResponseMessageHeader.class, new ResponseMessageHeaderSerializer());
+            addSerializer(ResponseMessageV4.ResponseMessageFooter.class, new ResponseMessageFooterSerializer());
+            addSerializer(RequestMessageV4.class, new GraphSONMessageSerializerV4.RequestMessageV4Serializer());
+
+            // DESERIALIZERS
+            addDeserializer(ResponseMessageV4.class, new ResponseMessageV4Deserializer());
+            addDeserializer(RequestMessageV4.class, new RequestMessageV4Deserializer());
+        }
+    }
+
     public final static class RequestMessageV4Serializer extends StdSerializer<RequestMessageV4> {
         public RequestMessageV4Serializer() {
             super(RequestMessageV4.class);
@@ -294,33 +321,92 @@ public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractGraphS
             if (data.containsKey(SerTokens.TOKEN_BINDINGS)) {
                 builder.addBindings((Map<String, Object>) data.get(SerTokens.TOKEN_BINDINGS));
             }
+            if (data.containsKey(Tokens.TIMEOUT_MS)) {
+                builder.addTimeoutMillis((long) data.get(Tokens.TIMEOUT_MS));
+            }
+            if (data.containsKey(Tokens.ARGS_MATERIALIZE_PROPERTIES)) {
+                builder.addMaterializeProperties(data.get(Tokens.ARGS_MATERIALIZE_PROPERTIES).toString());
+            }
+            if (data.containsKey(Tokens.ARGS_BATCH_SIZE)) {
+                builder.addChunkSize((int) data.get(Tokens.ARGS_BATCH_SIZE));
+            }
 
             return builder.create();
         }
     }
 
-    public final static class ResponseMessageHeaderSerializer extends StdSerializer<ResponseMessage.ResponseMessageHeader> {
+    public final static class ResponseMessageSerializerV4 extends StdSerializer<ResponseMessageV4> {
+        public ResponseMessageSerializerV4() {
+            super(ResponseMessageV4.class);
+        }
+
+        @Override
+        public void serialize(final ResponseMessageV4 responseMessage, final JsonGenerator jsonGenerator,
+                              final SerializerProvider serializerProvider) throws IOException {
+            ser(responseMessage, jsonGenerator, serializerProvider, null);
+        }
+
+        @Override
+        public void serializeWithType(final ResponseMessageV4 responseMessage, final JsonGenerator jsonGenerator,
+                                      final SerializerProvider serializerProvider,
+                                      final TypeSerializer typeSerializer) throws IOException {
+            ser(responseMessage, jsonGenerator, serializerProvider, typeSerializer);
+        }
+
+        public void ser(final ResponseMessageV4 responseMessage, final JsonGenerator jsonGenerator,
+                        final SerializerProvider serializerProvider,
+                        final TypeSerializer typeSerializer) throws IOException {
+            GraphSONUtil.writeStartObject(responseMessage, jsonGenerator, typeSerializer);
+
+            jsonGenerator.writeFieldName(SerTokens.TOKEN_STATUS);
+
+            GraphSONUtil.writeStartObject(responseMessage, jsonGenerator, typeSerializer);
+            jsonGenerator.writeStringField(SerTokens.TOKEN_MESSAGE, responseMessage.getStatus().getMessage());
+            jsonGenerator.writeNumberField(SerTokens.TOKEN_CODE, responseMessage.getStatus().getCode().code());
+            jsonGenerator.writeObjectField(SerTokens.TOKEN_ATTRIBUTES, responseMessage.getStatus().getAttributes());
+            GraphSONUtil.writeEndObject(responseMessage, jsonGenerator, typeSerializer);
+
+            jsonGenerator.writeFieldName(SerTokens.TOKEN_RESULT);
+
+            GraphSONUtil.writeStartObject(responseMessage, jsonGenerator, typeSerializer);
+
+            if (null == responseMessage.getResult().getData()) {
+                jsonGenerator.writeNullField(SerTokens.TOKEN_DATA);
+            } else {
+                jsonGenerator.writeFieldName(SerTokens.TOKEN_DATA);
+                final Object result = responseMessage.getResult().getData();
+                serializerProvider.findTypedValueSerializer(result.getClass(), true, null).serialize(result, jsonGenerator, serializerProvider);
+            }
+
+            jsonGenerator.writeObjectField(SerTokens.TOKEN_META, responseMessage.getResult().getMeta());
+            GraphSONUtil.writeEndObject(responseMessage, jsonGenerator, typeSerializer);
+
+            GraphSONUtil.writeEndObject(responseMessage, jsonGenerator, typeSerializer);
+        }
+    }
+
+    public final static class ResponseMessageHeaderSerializer extends StdSerializer<ResponseMessageV4.ResponseMessageHeader> {
         public ResponseMessageHeaderSerializer() {
-            super(ResponseMessage.ResponseMessageHeader.class);
+            super(ResponseMessageV4.ResponseMessageHeader.class);
         }
 
         @Override
-        public void serialize(final ResponseMessage.ResponseMessageHeader responseMessage, final JsonGenerator jsonGenerator,
+        public void serialize(final ResponseMessageV4.ResponseMessageHeader responseMessage, final JsonGenerator jsonGenerator,
                               final SerializerProvider serializerProvider) throws IOException {
             ser(responseMessage, jsonGenerator, serializerProvider, null);
         }
 
         @Override
-        public void serializeWithType(final ResponseMessage.ResponseMessageHeader responseMessage, final JsonGenerator jsonGenerator,
+        public void serializeWithType(final ResponseMessageV4.ResponseMessageHeader responseMessage, final JsonGenerator jsonGenerator,
                                       final SerializerProvider serializerProvider,
                                       final TypeSerializer typeSerializer) throws IOException {
             ser(responseMessage, jsonGenerator, serializerProvider, typeSerializer);
         }
 
-        public void ser(final ResponseMessage.ResponseMessageHeader responseMessageHeader, final JsonGenerator jsonGenerator,
+        public void ser(final ResponseMessageV4.ResponseMessageHeader responseMessageHeader, final JsonGenerator jsonGenerator,
                         final SerializerProvider serializerProvider,
                         final TypeSerializer typeSerializer) throws IOException {
-            final ResponseMessage responseMessage = responseMessageHeader.getResponseMessage();
+            final ResponseMessageV4 responseMessage = responseMessageHeader.getResponseMessage();
 
             GraphSONUtil.writeStartObject(responseMessage, jsonGenerator, typeSerializer);
 
@@ -332,28 +418,28 @@ public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractGraphS
         }
     }
 
-    public final static class ResponseMessageFooterSerializer extends StdSerializer<ResponseMessage.ResponseMessageFooter> {
+    public final static class ResponseMessageFooterSerializer extends StdSerializer<ResponseMessageV4.ResponseMessageFooter> {
         public ResponseMessageFooterSerializer() {
-            super(ResponseMessage.ResponseMessageFooter.class);
+            super(ResponseMessageV4.ResponseMessageFooter.class);
         }
 
         @Override
-        public void serialize(final ResponseMessage.ResponseMessageFooter responseMessage, final JsonGenerator jsonGenerator,
+        public void serialize(final ResponseMessageV4.ResponseMessageFooter responseMessage, final JsonGenerator jsonGenerator,
                               final SerializerProvider serializerProvider) throws IOException {
             ser(responseMessage, jsonGenerator, serializerProvider, null);
         }
 
         @Override
-        public void serializeWithType(final ResponseMessage.ResponseMessageFooter responseMessage, final JsonGenerator jsonGenerator,
+        public void serializeWithType(final ResponseMessageV4.ResponseMessageFooter responseMessage, final JsonGenerator jsonGenerator,
                                       final SerializerProvider serializerProvider,
                                       final TypeSerializer typeSerializer) throws IOException {
             ser(responseMessage, jsonGenerator, serializerProvider, typeSerializer);
         }
 
-        public void ser(final ResponseMessage.ResponseMessageFooter responseMessageFooter, final JsonGenerator jsonGenerator,
+        public void ser(final ResponseMessageV4.ResponseMessageFooter responseMessageFooter, final JsonGenerator jsonGenerator,
                         final SerializerProvider serializerProvider,
                         final TypeSerializer typeSerializer) throws IOException {
-            final ResponseMessage responseMessage = responseMessageFooter.getResponseMessage();
+            final ResponseMessageV4 responseMessage = responseMessageFooter.getResponseMessage();
 
             // todo: find a way to get rid off
             GraphSONUtil.writeStartObject(responseMessage, jsonGenerator, typeSerializer);
@@ -375,15 +461,15 @@ public abstract class AbstractGraphSONMessageSerializerV4 extends AbstractGraphS
         }
     }
 
-    public final static class ResponseMessageV4Deserializer extends AbstractObjectDeserializer<ResponseMessage> {
+    public final static class ResponseMessageV4Deserializer extends AbstractObjectDeserializer<ResponseMessageV4> {
         public ResponseMessageV4Deserializer() {
-            super(ResponseMessage.class);
+            super(ResponseMessageV4.class);
         }
 
         @Override
-        public ResponseMessage createObject(final Map<String, Object> data) {
+        public ResponseMessageV4 createObject(final Map<String, Object> data) {
             final Map<String, Object> status = (Map<String, Object>) data.get(SerTokens.TOKEN_STATUS);
-            return ResponseMessage.build()
+            return ResponseMessageV4.build()
                     .code(HttpResponseStatus.valueOf((Integer) status.get(SerTokens.TOKEN_CODE)))
                     .statusMessage(String.valueOf(status.get(SerTokens.TOKEN_MESSAGE)))
                     .exception(String.valueOf(status.get(SerTokens.TOKEN_EXCEPTION)))
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractMessageSerializer.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractMessageSerializerV4.java
similarity index 93%
rename from gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractMessageSerializer.java
rename to gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractMessageSerializerV4.java
index 74ecc185e3..de3883b605 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractMessageSerializer.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/AbstractMessageSerializerV4.java
@@ -18,9 +18,9 @@
  */
 package org.apache.tinkerpop.gremlin.util.ser;
 
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
 import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
 import org.apache.tinkerpop.gremlin.structure.io.Mapper;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 
 import java.lang.reflect.Method;
 import java.util.Collections;
@@ -28,12 +28,12 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * Base {@link MessageSerializer} that serializers can implement to get some helper methods around configuring a
+ * Base {@link MessageSerializerV4} that serializers can implement to get some helper methods around configuring a
  * {@link Mapper.Builder}.
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public abstract class AbstractMessageSerializer<M> implements MessageSerializer<M> {
+public abstract class AbstractMessageSerializerV4<M> implements MessageSerializerV4<M> {
     public static final String TOKEN_IO_REGISTRIES = "ioRegistries";
 
     /**
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphBinaryMessageSerializerV1.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphBinaryMessageSerializerV1.java
deleted file mode 100644
index d5677e98f4..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphBinaryMessageSerializerV1.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.Unpooled;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryIo;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryMapper;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryReader;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryWriter;
-import org.apache.tinkerpop.gremlin.util.ser.binary.RequestMessageSerializer;
-import org.apache.tinkerpop.gremlin.util.ser.binary.RequestMessageSerializerV4;
-import org.apache.tinkerpop.gremlin.util.ser.binary.ResponseMessageSerializer;
-import org.apache.tinkerpop.gremlin.structure.io.binary.TypeSerializerRegistry;
-import org.apache.tinkerpop.gremlin.structure.io.binary.types.CustomTypeSerializer;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
-import org.javatuples.Pair;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Base64;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-public final class GraphBinaryMessageSerializerV1 extends AbstractGraphBinaryMessageSerializerV1 {
-    private static final String MIME_TYPE = SerTokens.MIME_GRAPHBINARY_V1;
-    private static final String MIME_TYPE_STRINGD = SerTokens.MIME_GRAPHBINARY_V1 + "-stringd";
-
-    /**
-     * Creates a new instance of the message serializer using the default type serializers.
-     */
-    public GraphBinaryMessageSerializerV1() {
-        this(TypeSerializerRegistry.INSTANCE);
-    }
-
-    public GraphBinaryMessageSerializerV1(final TypeSerializerRegistry registry) {
-        super(registry);
-    }
-
-    public GraphBinaryMessageSerializerV1(final TypeSerializerRegistry.Builder builder) {
-        this(builder.create());
-    }
-
-    @Override
-    protected String obtainMimeType() {
-        return MIME_TYPE;
-    }
-
-    @Override
-    protected String obtainStringdMimeType() {
-        return MIME_TYPE_STRINGD;
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphBinaryMessageSerializerV4.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphBinaryMessageSerializerV4.java
index af5529447f..4e318ab80b 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphBinaryMessageSerializerV4.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphBinaryMessageSerializerV4.java
@@ -20,59 +20,163 @@ package org.apache.tinkerpop.gremlin.util.ser;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.Unpooled;
 import io.netty.handler.codec.http.HttpResponseStatus;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.io.Buffer;
+import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
+import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryIo;
 import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryMapper;
+import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryReader;
 import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryWriter;
 import org.apache.tinkerpop.gremlin.structure.io.binary.Marker;
 import org.apache.tinkerpop.gremlin.structure.io.binary.TypeSerializerRegistry;
+import org.apache.tinkerpop.gremlin.structure.io.binary.types.CustomTypeSerializer;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseStatus;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseStatusV4;
 import org.apache.tinkerpop.gremlin.util.ser.binary.RequestMessageSerializerV4;
+import org.apache.tinkerpop.gremlin.util.ser.binary.ResponseMessageSerializerV4;
+import org.javatuples.Pair;
 import org.javatuples.Triplet;
 
 import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Base64;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
-public class GraphBinaryMessageSerializerV4 extends AbstractGraphBinaryMessageSerializerV1
-    implements MessageTextSerializerV4<GraphBinaryMapper> {
+public class GraphBinaryMessageSerializerV4 extends AbstractMessageSerializerV4<GraphBinaryMapper> {
+    public static final String TOKEN_CUSTOM = "custom";
+    public static final String TOKEN_BUILDER = "builder";
+
+    private GraphBinaryReader reader;
+    private GraphBinaryWriter writer;
+    private RequestMessageSerializerV4 requestSerializer;
+    private ResponseMessageSerializerV4 responseSerializer;
+    private GraphBinaryMapper mapper;
 
     private static final NettyBufferFactory bufferFactory = new NettyBufferFactory();
     private static final String MIME_TYPE = SerTokens.MIME_GRAPHBINARY_V4;
-    private final byte[] header = MIME_TYPE.getBytes(UTF_8);
-    private final RequestMessageSerializerV4 requestSerializerV4;
 
+    /**
+     * Creates a new instance of the message serializer using the default type serializers.
+     */
     public GraphBinaryMessageSerializerV4() {
         this(TypeSerializerRegistry.INSTANCE);
     }
 
     public GraphBinaryMessageSerializerV4(final TypeSerializerRegistry registry) {
-        super(registry);
-        requestSerializerV4 = new RequestMessageSerializerV4();
+        reader = new GraphBinaryReader(registry);
+        writer = new GraphBinaryWriter(registry);
+        mapper = new GraphBinaryMapper(writer, reader);
+
+        requestSerializer = new RequestMessageSerializerV4();
+        responseSerializer = new ResponseMessageSerializerV4();
+    }
+
+    public GraphBinaryMessageSerializerV4(final TypeSerializerRegistry.Builder builder) {
+        this(builder.create());
+    }
+
+    @Override
+    public GraphBinaryMapper getMapper() {
+        return mapper;
     }
 
     @Override
-    protected String obtainMimeType() {
-        return MIME_TYPE;
+    public void configure(final Map<String, Object> config, final Map<String, Graph> graphs) {
+        final String builderClassName = (String) config.get(TOKEN_BUILDER);
+        final TypeSerializerRegistry.Builder builder;
+
+        if (builderClassName != null) {
+            try {
+                final Class<?> clazz = Class.forName(builderClassName);
+                final Constructor<?> ctor = clazz.getConstructor();
+                builder = (TypeSerializerRegistry.Builder) ctor.newInstance();
+            } catch (Exception ex) {
+                throw new IllegalStateException(ex);
+            }
+        } else {
+            builder = TypeSerializerRegistry.build();
+        }
+
+        final List<String> classNameList = getListStringFromConfig(TOKEN_IO_REGISTRIES, config);
+        classNameList.forEach(className -> {
+            try {
+                final Class<?> clazz = Class.forName(className);
+                try {
+                    final Method instanceMethod = tryInstanceMethod(clazz);
+                    final IoRegistry ioreg = (IoRegistry) instanceMethod.invoke(null);
+                    final List<Pair<Class, CustomTypeSerializer>> classSerializers = ioreg.find(GraphBinaryIo.class, CustomTypeSerializer.class);
+                    for (Pair<Class,CustomTypeSerializer> cs : classSerializers) {
+                        builder.addCustomType(cs.getValue0(), cs.getValue1());
+                    }
+                } catch (Exception methodex) {
+                    throw new IllegalStateException(String.format("Could not instantiate IoRegistry from an instance() method on %s", className), methodex);
+                }
+            } catch (Exception ex) {
+                throw new IllegalStateException(ex);
+            }
+        });
+
+        addCustomClasses(config, builder);
+
+        final TypeSerializerRegistry registry = builder.create();
+        reader = new GraphBinaryReader(registry);
+        writer = new GraphBinaryWriter(registry);
+
+        requestSerializer = new RequestMessageSerializerV4();
+        responseSerializer = new ResponseMessageSerializerV4();
     }
 
     @Override
-    protected String obtainStringdMimeType() {
-        return ""; // stringd not currently supported.
+    public String[] mimeTypesSupported() {
+        return new String[] {/*serializeToString ? obtainStringdMimeType() : obtainMimeType()*/MIME_TYPE};
+    }
+
+    private void addCustomClasses(final Map<String, Object> config, final TypeSerializerRegistry.Builder builder) {
+        final List<String> classNameList = getListStringFromConfig(TOKEN_CUSTOM, config);
+
+        classNameList.forEach(serializerDefinition -> {
+            final String className;
+            final String serializerName;
+            if (serializerDefinition.contains(";")) {
+                final String[] split = serializerDefinition.split(";");
+                if (split.length != 2)
+                    throw new IllegalStateException(String.format("Invalid format for serializer definition [%s] - expected <class>;<serializer-class>", serializerDefinition));
+
+                className = split[0];
+                serializerName = split[1];
+            } else {
+                throw new IllegalStateException(String.format("Invalid format for serializer definition [%s] - expected <class>;<serializer-class>", serializerDefinition));
+            }
+
+            try {
+                final Class clazz = Class.forName(className);
+                final Class serializerClazz = Class.forName(serializerName);
+                final CustomTypeSerializer serializer = (CustomTypeSerializer) serializerClazz.newInstance();
+                builder.addCustomType(clazz, serializer);
+            } catch (Exception ex) {
+                throw new IllegalStateException("CustomTypeSerializer could not be instantiated", ex);
+            }
+        });
     }
 
     @Override
-    public ByteBuf serializeRequestMessageV4(RequestMessageV4 requestMessage, ByteBufAllocator allocator) throws SerializationException {
-        final ByteBuf buffer = allocator.buffer().writeByte(header.length).writeBytes(header);
+    public ByteBuf serializeRequestAsBinary(RequestMessageV4 requestMessage, ByteBufAllocator allocator) throws SerializationException {
+        final ByteBuf buffer = allocator.buffer();
 
         try {
-            requestSerializerV4.writeValue(requestMessage, buffer, writer);
+            requestSerializer.writeValue(requestMessage, buffer, writer);
         } catch (Exception ex) {
             buffer.release();
             throw ex;
@@ -82,23 +186,18 @@ public class GraphBinaryMessageSerializerV4 extends AbstractGraphBinaryMessageSe
     }
 
     @Override
-    public RequestMessageV4 deserializeRequestMessageV4(ByteBuf msg) throws SerializationException {
-        return requestSerializerV4.readValue(msg, reader);
+    public RequestMessageV4 deserializeBinaryRequest(ByteBuf msg) throws SerializationException {
+        return requestSerializer.readValue(msg, reader);
     }
 
     @Override
-    public ByteBuf serializeResponseAsBinary(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf serializeResponseAsBinary(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
         return writeHeader(responseMessage, allocator);
     }
 
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        throw new UnsupportedOperationException("Response serialization as String is not supported");
-    }
-
     //////////////// chunked write
     @Override
-    public ByteBuf writeHeader(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf writeHeader(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
         final EnumSet<MessageParts> parts = responseMessage.getStatus() != null ? MessageParts.ALL : MessageParts.START;
 
         return write(responseMessage, null, allocator, parts);
@@ -110,16 +209,16 @@ public class GraphBinaryMessageSerializerV4 extends AbstractGraphBinaryMessageSe
     }
 
     @Override
-    public ByteBuf writeFooter(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf writeFooter(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
         return write(responseMessage, null, allocator, MessageParts.END);
     }
 
     @Override
-    public ByteBuf writeErrorFooter(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
+    public ByteBuf writeErrorFooter(final ResponseMessageV4 responseMessage, final ByteBufAllocator allocator) throws SerializationException {
         return write(responseMessage, null, allocator, MessageParts.ERROR);
     }
 
-    private ByteBuf write(final ResponseMessage responseMessage, final Object aggregate,
+    private ByteBuf write(final ResponseMessageV4 responseMessage, final Object aggregate,
                           final ByteBufAllocator allocator, final EnumSet<MessageParts> parts) throws SerializationException {
         final ByteBuf byteBuf = allocator.buffer();
         final Buffer buffer = bufferFactory.create(byteBuf);
@@ -142,7 +241,7 @@ public class GraphBinaryMessageSerializerV4 extends AbstractGraphBinaryMessageSe
             }
 
             if (parts.contains(MessageParts.FOOTER)) {
-                final ResponseStatus status = responseMessage.getStatus();
+                final ResponseStatusV4 status = responseMessage.getStatus();
 
                 // we don't know how much data we have, so need a special object
                 writer.write(Marker.END_OF_STREAM, buffer);
@@ -162,7 +261,7 @@ public class GraphBinaryMessageSerializerV4 extends AbstractGraphBinaryMessageSe
     //////////////// read message methods
 
     @Override
-    public ResponseMessage deserializeResponse(final ByteBuf msg) throws SerializationException {
+    public ResponseMessageV4 deserializeBinaryResponse(final ByteBuf msg) throws SerializationException {
         return readChunk(msg, true);
     }
 
@@ -187,13 +286,13 @@ public class GraphBinaryMessageSerializerV4 extends AbstractGraphBinaryMessageSe
     }
 
     @Override
-    public ResponseMessage readChunk(final ByteBuf byteBuf, final boolean isFirstChunk) throws SerializationException {
+    public ResponseMessageV4 readChunk(final ByteBuf byteBuf, final boolean isFirstChunk) throws SerializationException {
         final Buffer buffer = bufferFactory.create(byteBuf);
 
         try {
             // empty input buffer
             if (buffer.readableBytes() == 0) {
-                return ResponseMessage.buildV4().
+                return ResponseMessageV4.build().
                         code(HttpResponseStatus.NO_CONTENT).result(Collections.emptyList()).create();
             }
 
@@ -211,13 +310,13 @@ public class GraphBinaryMessageSerializerV4 extends AbstractGraphBinaryMessageSe
 
             // no footer
             if (buffer.readableBytes() == 0) {
-                return ResponseMessage.buildV4()
+                return ResponseMessageV4.build()
                         .result(result)
                         .create();
             }
 
             final Triplet<HttpResponseStatus, String, String> footer = readFooter(buffer);
-            return ResponseMessage.buildV4()
+            return ResponseMessageV4.build()
                     .result(result)
                     .code(footer.getValue0())
                     .statusMessage(footer.getValue1())
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV1.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV1.java
deleted file mode 100644
index 5ff7cc1ff1..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV1.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.TypeInfo;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.ByteBuffer;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * Serialize results to JSON with version 1.0.x schema.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class GraphSONMessageSerializerV1 extends AbstractGraphSONMessageSerializerV1 implements MessageTextSerializer<ObjectMapper> {
-    private static final Logger logger = LoggerFactory.getLogger(GraphSONMessageSerializerV1.class);
-    private static final String MIME_TYPE = SerTokens.MIME_GRAPHSON_V1;
-
-    private static byte[] header;
-
-    static {
-        final ByteBuffer buffer = ByteBuffer.allocate(MIME_TYPE.length() + 1);
-        buffer.put((byte) MIME_TYPE.length());
-        buffer.put(MIME_TYPE.getBytes());
-        header = buffer.array();
-    }
-
-    public GraphSONMessageSerializerV1() {
-        super();
-    }
-
-    public GraphSONMessageSerializerV1(final GraphSONMapper mapper) {
-        super(mapper);
-    }
-
-    @Override
-    public String[] mimeTypesSupported() {
-        return new String[]{MIME_TYPE, SerTokens.MIME_JSON};
-    }
-
-    @Override
-    GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
-        return builder.addCustomModule(new GremlinServerModule())
-                .typeInfo(TypeInfo.PARTIAL_TYPES);
-    }
-
-    @Override
-    byte[] obtainHeader() {
-        return header;
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        try {
-            final Map<String, Object> responseData = mapper.readValue(msg, mapTypeReference);
-            final Map<String, Object> status = (Map<String, Object>) responseData.get(SerTokens.TOKEN_STATUS);
-            final Map<String, Object> result = (Map<String, Object>) responseData.get(SerTokens.TOKEN_RESULT);
-            return ResponseMessage.build(UUID.fromString(responseData.get(SerTokens.TOKEN_REQUEST).toString()))
-                    .code(HttpResponseStatus.valueOf((Integer) status.get(SerTokens.TOKEN_CODE)))
-                    .statusMessage(String.valueOf(status.get(SerTokens.TOKEN_MESSAGE)))
-                    .statusAttributes((Map<String, Object>) status.get(SerTokens.TOKEN_ATTRIBUTES))
-                    .result(result.get(SerTokens.TOKEN_DATA))
-                    .responseMetaData((Map<String, Object>) result.get(SerTokens.TOKEN_META))
-                    .create();
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(responseMessage);
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be serialized by {}.", responseMessage.toString(), AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(requestMessage);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be serialized by {}.", requestMessage.toString(), AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV2.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV2.java
deleted file mode 100644
index fadd11262b..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV2.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBufAllocator;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV2;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.TypeInfo;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.ByteBuffer;
-
-/**
- * Serialize results to JSON with version 2.0.x schema and the extended module.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class GraphSONMessageSerializerV2 extends AbstractGraphSONMessageSerializerV2 implements MessageTextSerializer<ObjectMapper> {
-    private static final Logger logger = LoggerFactory.getLogger(GraphSONMessageSerializerV2.class);
-    private static final String MIME_TYPE = SerTokens.MIME_GRAPHSON_V2;
-
-    private static byte[] header;
-
-    static {
-        final ByteBuffer buffer = ByteBuffer.allocate(MIME_TYPE.length() + 1);
-        buffer.put((byte) MIME_TYPE.length());
-        buffer.put(MIME_TYPE.getBytes());
-        header = buffer.array();
-    }
-
-    /**
-     * Creates a default GraphSONMessageSerializer. By default this will internally instantiate a {@link GraphSONMapper}
-     * and register a {@link GremlinServerModule} and {@link GraphSONXModuleV2} to the mapper.
-     *
-     * @see #GraphSONMessageSerializerV2(GraphSONMapper.Builder)
-     */
-    public GraphSONMessageSerializerV2() {
-        super();
-    }
-
-    /**
-     * Create a GraphSONMessageSerializer from a {@link GraphSONMapper}. Deprecated, use
-     * {@link #GraphSONMessageSerializerV2(GraphSONMapper.Builder)} instead.
-     */
-    @Deprecated
-    public GraphSONMessageSerializerV2(final GraphSONMapper mapper) {
-        super(mapper);
-    }
-
-    /**
-     * Create a GraphSONMessageSerializer with a provided {@link GraphSONMapper.Builder}.
-     *
-     * Note that to make this mapper usable in the context of request messages and responses,
-     * this method will automatically register a {@link GremlinServerModule} to the provided
-     * mapper.
-     */
-    public GraphSONMessageSerializerV2(final GraphSONMapper.Builder mapperBuilder) {
-        super(mapperBuilder);
-    }
-
-    @Override
-    public String[] mimeTypesSupported() {
-        return new String[]{MIME_TYPE, SerTokens.MIME_JSON};
-    }
-
-    @Override
-    GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
-        // already set to 2.0 in AbstractGraphSONMessageSerializerV2
-        return builder.typeInfo(TypeInfo.PARTIAL_TYPES).addCustomModule(new GremlinServerModule());
-    }
-
-    @Override
-    byte[] obtainHeader() {
-        return header;
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, ResponseMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(responseMessage);
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be serialized by {}.", responseMessage.toString(), AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(requestMessage);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be serialized by {}.", requestMessage.toString(), AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV3.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV3.java
deleted file mode 100644
index e4d2380a3b..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV3.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBufAllocator;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV3;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.ByteBuffer;
-
-/**
- * Serialize results to JSON with version 3.0.x schema and the extended module.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class GraphSONMessageSerializerV3 extends AbstractGraphSONMessageSerializerV2 implements MessageTextSerializer<ObjectMapper> {
-    private static final Logger logger = LoggerFactory.getLogger(GraphSONMessageSerializerV3.class);
-    private static final String MIME_TYPE = SerTokens.MIME_GRAPHSON_V3;
-
-    private static byte[] header;
-
-    static {
-        final ByteBuffer buffer = ByteBuffer.allocate(MIME_TYPE.length() + 1);
-        buffer.put((byte) MIME_TYPE.length());
-        buffer.put(MIME_TYPE.getBytes());
-        header = buffer.array();
-    }
-
-    /**
-     * Creates a default GraphSONMessageSerializer.
-     * <p>
-     * By default this will internally instantiate a {@link GraphSONMapper} and register
-     * a {@link GremlinServerModule} and {@link GraphSONXModuleV3} to the mapper.
-     *
-     * @see #GraphSONMessageSerializerV3(GraphSONMapper.Builder)
-     */
-    public GraphSONMessageSerializerV3() {
-        super();
-    }
-
-    /**
-     * Create a GraphSONMessageSerializer from a {@link GraphSONMapper}. Deprecated, use
-     * {@link #GraphSONMessageSerializerV3(GraphSONMapper.Builder)} instead.
-     */
-    @Deprecated
-    public GraphSONMessageSerializerV3(final GraphSONMapper mapper) {
-        super(mapper);
-    }
-
-    /**
-     * Create a GraphSONMessageSerializer with a provided {@link GraphSONMapper.Builder}.
-     *
-     * Note that to make this mapper usable in the context of request messages and responses,
-     * this method will automatically register a {@link GremlinServerModule} to the provided
-     * mapper.
-     */
-    public GraphSONMessageSerializerV3(final GraphSONMapper.Builder mapperBuilder) {
-        super(mapperBuilder);
-    }
-
-    @Override
-    public String[] mimeTypesSupported() {
-        return new String[]{MIME_TYPE, SerTokens.MIME_JSON};
-    }
-
-    @Override
-    GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
-        // override the 2.0 in AbstractGraphSONMessageSerializerV2
-        return builder.version(GraphSONVersion.V3_0).addCustomModule(new GremlinServerModule());
-    }
-
-    @Override
-    byte[] obtainHeader() {
-        return header;
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, ResponseMessage.class);
-        } catch (Exception ex) {
-            logger.warn(String.format("Response [%s] could not be deserialized by %s.", msg, GraphSONMessageSerializerV3.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(responseMessage);
-        } catch (Exception ex) {
-            logger.warn(String.format("Response [%s] could not be serialized by %s.", responseMessage.toString(), GraphSONMessageSerializerV3.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn(String.format("Request [%s] could not be deserialized by %s.", msg, GraphSONMessageSerializerV3.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(requestMessage);
-        } catch (Exception ex) {
-            logger.warn(String.format("Request [%s] could not be serialized by %s.", requestMessage.toString(), GraphSONMessageSerializerV3.class.getName()), ex);
-            throw new SerializationException(ex);
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV4.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV4.java
index 4ff6406460..a700be6354 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV4.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV4.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV3;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.apache.tinkerpop.shaded.jackson.databind.module.SimpleModule;
 
 import java.nio.ByteBuffer;
@@ -31,34 +31,8 @@ import java.nio.ByteBuffer;
  * Serialize results to JSON with version 4.0.x schema and the extended module.
  */
 public final class GraphSONMessageSerializerV4 extends AbstractGraphSONMessageSerializerV4 {
-
-    public final static class GremlinServerModuleV4 extends SimpleModule {
-        public GremlinServerModuleV4() {
-            super("graphsonV4-gremlin-server");
-
-            // SERIALIZERS
-            addSerializer(ResponseMessage.class, new ResponseMessageSerializer());
-            addSerializer(ResponseMessage.ResponseMessageHeader.class, new ResponseMessageHeaderSerializer());
-            addSerializer(ResponseMessage.ResponseMessageFooter.class, new ResponseMessageFooterSerializer());
-            addSerializer(RequestMessageV4.class, new GraphSONMessageSerializerV4.RequestMessageV4Serializer());
-
-            // DESERIALIZERS
-            addDeserializer(ResponseMessage.class, new ResponseMessageV4Deserializer());
-            addDeserializer(RequestMessageV4.class, new GraphSONMessageSerializerV4.RequestMessageV4Deserializer());
-        }
-    }
-
     private static final String MIME_TYPE = SerTokens.MIME_GRAPHSON_V4;
 
-    private static byte[] header;
-
-    static {
-        final ByteBuffer buffer = ByteBuffer.allocate(MIME_TYPE.length() + 1);
-        buffer.put((byte) MIME_TYPE.length());
-        buffer.put(MIME_TYPE.getBytes());
-        header = buffer.array();
-    }
-
     /**
      * Creates a default GraphSONMessageSerializer.
      * <p>
@@ -92,9 +66,4 @@ public final class GraphSONMessageSerializerV4 extends AbstractGraphSONMessageSe
         // override the 2.0 in AbstractGraphSONMessageSerializerV2
         return builder.version(GraphSONVersion.V4_0).addCustomModule(new GremlinServerModuleV4());
     }
-
-    @Override
-    byte[] obtainHeader() {
-        return header;
-    }
 }
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV1.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV1.java
deleted file mode 100644
index 6eb50ecc4c..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV1.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.TypeInfo;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.ByteBuffer;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * Serialize results to JSON with version 1.0.x schema and serialization which does not embed types.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class GraphSONUntypedMessageSerializerV1 extends AbstractGraphSONMessageSerializerV1 implements MessageTextSerializer<ObjectMapper> {
-    private static final Logger logger = LoggerFactory.getLogger(GraphSONUntypedMessageSerializerV1.class);
-    private static final String MIME_TYPE = SerTokens.MIME_GRAPHSON_V1_UNTYPED;
-
-    private static byte[] header;
-
-    static {
-        final ByteBuffer buffer = ByteBuffer.allocate(MIME_TYPE.length() + 1);
-        buffer.put((byte) MIME_TYPE.length());
-        buffer.put(MIME_TYPE.getBytes());
-        header = buffer.array();
-    }
-
-    public GraphSONUntypedMessageSerializerV1() {
-        super();
-    }
-
-    public GraphSONUntypedMessageSerializerV1(final GraphSONMapper mapper) {
-        super(mapper);
-    }
-
-    @Override
-    public String[] mimeTypesSupported() {
-        return new String[]{MIME_TYPE, SerTokens.MIME_JSON};
-    }
-
-    @Override
-    GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
-        // already set to 1.0 in AbstractGraphSONMessageSerializerV1
-        return builder.addCustomModule(new GremlinServerModule())
-                .typeInfo(TypeInfo.NO_TYPES);
-    }
-
-    @Override
-    byte[] obtainHeader() {
-        return header;
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        try {
-            final Map<String, Object> responseData = mapper.readValue(msg, mapTypeReference);
-            final Map<String, Object> status = (Map<String, Object>) responseData.get(SerTokens.TOKEN_STATUS);
-            final Map<String, Object> result = (Map<String, Object>) responseData.get(SerTokens.TOKEN_RESULT);
-            return ResponseMessage.build(UUID.fromString(responseData.get(SerTokens.TOKEN_REQUEST).toString()))
-                    .code(HttpResponseStatus.valueOf((Integer) status.get(SerTokens.TOKEN_CODE)))
-                    .statusMessage(String.valueOf(status.get(SerTokens.TOKEN_MESSAGE)))
-                    .statusAttributes((Map<String, Object>) status.get(SerTokens.TOKEN_ATTRIBUTES))
-                    .result(result.get(SerTokens.TOKEN_DATA))
-                    .responseMetaData((Map<String, Object>) result.get(SerTokens.TOKEN_META))
-                    .create();
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(responseMessage);
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be serialized by {}.", responseMessage.toString(), AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(requestMessage);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be serialized by {}.", requestMessage.toString(), AbstractGraphSONMessageSerializerV1.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV2.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV2.java
deleted file mode 100644
index eae64c4fd4..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV2.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBufAllocator;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV2;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.TypeInfo;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.ByteBuffer;
-
-/**
- * Serialize results to JSON with version 2.0.x schema and the extended module without embedded types.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class GraphSONUntypedMessageSerializerV2 extends AbstractGraphSONMessageSerializerV2 implements MessageTextSerializer<ObjectMapper> {
-    private static final Logger logger = LoggerFactory.getLogger(GraphSONUntypedMessageSerializerV2.class);
-    private static final String MIME_TYPE = SerTokens.MIME_GRAPHSON_V2_UNTYPED;
-
-    private static byte[] header;
-
-    static {
-        final ByteBuffer buffer = ByteBuffer.allocate(MIME_TYPE.length() + 1);
-        buffer.put((byte) MIME_TYPE.length());
-        buffer.put(MIME_TYPE.getBytes());
-        header = buffer.array();
-    }
-
-    /**
-     * Creates a default GraphSONMessageSerializer.
-     *
-     * By default this will internally instantiate a {@link GraphSONMapper} and register
-     * a {@link GremlinServerModule} and {@link GraphSONXModuleV2} to the mapper.
-     *
-     * @see #GraphSONUntypedMessageSerializerV2(GraphSONMapper.Builder)
-     */
-    public GraphSONUntypedMessageSerializerV2() {
-        super();
-    }
-
-    /**
-     * Create a GraphSONMessageSerializer with a provided {@link GraphSONMapper.Builder}.
-     *
-     * Note that to make this mapper usable in the context of request messages and responses,
-     * this method will automatically register a {@link GremlinServerModule} to the provided
-     * mapper.
-     */
-    public GraphSONUntypedMessageSerializerV2(final GraphSONMapper.Builder mapperBuilder) {
-        super(mapperBuilder);
-    }
-
-    @Override
-    public String[] mimeTypesSupported() {
-        return new String[]{MIME_TYPE, SerTokens.MIME_JSON};
-    }
-
-    @Override
-    GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
-        // already set to 2.0 in AbstractGraphSONMessageSerializerV2
-        return builder.typeInfo(TypeInfo.NO_TYPES).addCustomModule(new GremlinServerModule());
-    }
-
-    @Override
-    byte[] obtainHeader() {
-        return header;
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, ResponseMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(responseMessage);
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be serialized by {}.", responseMessage.toString(), AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(requestMessage);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be serialized by {}.", requestMessage.toString(), AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV3.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV3.java
deleted file mode 100644
index 9dffa216c3..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV3.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBufAllocator;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV2;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.TypeInfo;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.ByteBuffer;
-
-/**
- * Serialize results to JSON with version 3.0.x schema and the extended module without embedded types.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class GraphSONUntypedMessageSerializerV3 extends AbstractGraphSONMessageSerializerV2 implements MessageTextSerializer<ObjectMapper> {
-    private static final Logger logger = LoggerFactory.getLogger(GraphSONUntypedMessageSerializerV3.class);
-    private static final String MIME_TYPE = SerTokens.MIME_GRAPHSON_V3_UNTYPED;
-
-    private static byte[] header;
-
-    static {
-        final ByteBuffer buffer = ByteBuffer.allocate(MIME_TYPE.length() + 1);
-        buffer.put((byte) MIME_TYPE.length());
-        buffer.put(MIME_TYPE.getBytes());
-        header = buffer.array();
-    }
-
-    /**
-     * Creates a default GraphSONMessageSerializer.
-     *
-     * By default this will internally instantiate a {@link GraphSONMapper} and register
-     * a {@link GremlinServerModule} and {@link GraphSONXModuleV2} to the mapper.
-     *
-     * @see #GraphSONUntypedMessageSerializerV3(GraphSONMapper.Builder)
-     */
-    public GraphSONUntypedMessageSerializerV3() {
-        super();
-    }
-
-    /**
-     * Create a GraphSONMessageSerializer with a provided {@link GraphSONMapper.Builder}.
-     *
-     * Note that to make this mapper usable in the context of request messages and responses,
-     * this method will automatically register a {@link GremlinServerModule} to the provided
-     * mapper.
-     */
-    public GraphSONUntypedMessageSerializerV3(final GraphSONMapper.Builder mapperBuilder) {
-        super(mapperBuilder);
-    }
-
-    @Override
-    public String[] mimeTypesSupported() {
-        return new String[]{MIME_TYPE, SerTokens.MIME_JSON};
-    }
-
-    @Override
-    GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
-        return builder.typeInfo(TypeInfo.NO_TYPES).addCustomModule(new GremlinServerModule());
-    }
-
-    @Override
-    byte[] obtainHeader() {
-        return header;
-    }
-
-    @Override
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, ResponseMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(responseMessage);
-        } catch (Exception ex) {
-            logger.warn("Response [{}] could not be serialized by {}.", responseMessage.toString(), AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException {
-        try {
-            return mapper.readValue(msg, RequestMessage.class);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be deserialized by {}.", msg, AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-
-    @Override
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException {
-        try {
-            return mapper.writeValueAsString(requestMessage);
-        } catch (Exception ex) {
-            logger.warn("Request [{}] could not be serialized by {}.", requestMessage.toString(), AbstractGraphSONMessageSerializerV2.class.getName());
-            throw new SerializationException(ex);
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV4.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV4.java
index e6836f808a..f89404903a 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV4.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONUntypedMessageSerializerV4.java
@@ -30,15 +30,6 @@ import java.nio.ByteBuffer;
 public final class GraphSONUntypedMessageSerializerV4 extends AbstractGraphSONMessageSerializerV4 {
     private static final String MIME_TYPE = SerTokens.MIME_GRAPHSON_V4_UNTYPED;
 
-    private static byte[] header;
-
-    static {
-        final ByteBuffer buffer = ByteBuffer.allocate(MIME_TYPE.length() + 1);
-        buffer.put((byte) MIME_TYPE.length());
-        buffer.put(MIME_TYPE.getBytes());
-        header = buffer.array();
-    }
-
     /**
      * Creates a default GraphSONMessageSerializer.
      *
@@ -69,12 +60,7 @@ public final class GraphSONUntypedMessageSerializerV4 extends AbstractGraphSONMe
 
     @Override
     GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
-        return builder.typeInfo(TypeInfo.NO_TYPES).addCustomModule(new GraphSONMessageSerializerV4.GremlinServerModuleV4());
-    }
-
-    @Override
-    byte[] obtainHeader() {
-        return header;
+        return builder.typeInfo(TypeInfo.NO_TYPES).addCustomModule(new GremlinServerModuleV4());
     }
 
     @Override
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/MessageTextSerializer.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/MessageTextSerializer.java
deleted file mode 100644
index 7d46aabafb..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/MessageTextSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBufAllocator;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-
-/**
- * An extension to the MessageSerializer interface that allows a format to be compatible with text-based
- * websocket messages.  This interface is for internal purposes only.  Implementers who have mapper serialization
- * needs should NOT implement this interface as it will not be used.  Gremlin Server only supports plain JSON
- * for text-based requests.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public interface MessageTextSerializer<M> extends MessageSerializer<M> {
-    public String serializeResponseAsString(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException;
-
-    public String serializeRequestAsString(final RequestMessage requestMessage, final ByteBufAllocator allocator) throws SerializationException;
-
-    public RequestMessage deserializeRequest(final String msg) throws SerializationException;
-
-    public ResponseMessage deserializeResponse(final String msg) throws SerializationException;
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/MessageTextSerializerV4.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/MessageTextSerializerV4.java
deleted file mode 100644
index 475fd35860..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/MessageTextSerializerV4.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-
-import java.util.EnumSet;
-
-/**
- * An extension to the MessageTextSerializer interface that is used for serializing RequestMessageV4.
- */
-public interface MessageTextSerializerV4<M> extends MessageTextSerializer<M> {
-    /**
-     * Serialize a {@link ResponseMessage} to a Netty {@code ByteBuf}.
-     *
-     * @param requestMessage The V4 request message to serialize to bytes.
-     * @param allocator      The Netty allocator for the {@code ByteBuf} to return back.
-     */
-    public ByteBuf serializeRequestMessageV4(final RequestMessageV4 requestMessage, final ByteBufAllocator allocator) throws SerializationException;
-
-    /**
-     * Deserialize a Netty {@code ByteBuf} into a {@link RequestMessageV4}.
-     */
-    public RequestMessageV4 deserializeRequestMessageV4(final ByteBuf msg) throws SerializationException;
-
-    public ByteBuf writeHeader(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException;
-
-    public ByteBuf writeChunk(final Object aggregate, final ByteBufAllocator allocator) throws SerializationException;
-
-    public ByteBuf writeFooter(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException;
-
-    public ByteBuf writeErrorFooter(final ResponseMessage responseMessage, final ByteBufAllocator allocator) throws SerializationException;
-
-    public ResponseMessage readChunk(final ByteBuf byteBuf, final boolean isFirstChunk) throws SerializationException;
-
-    public enum MessageParts {
-        HEADER, DATA, FOOTER;
-
-        public static final EnumSet<MessageParts> ALL = EnumSet.of(HEADER, DATA, FOOTER);
-        public static final EnumSet<MessageParts> START = EnumSet.of(HEADER, DATA);
-        public static final EnumSet<MessageParts> CHUNK = EnumSet.of(DATA);
-        public static final EnumSet<MessageParts> END = EnumSet.of(DATA, FOOTER);
-        public static final EnumSet<MessageParts> ERROR = EnumSet.of(FOOTER);
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/RequestMessageGryoSerializer.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/RequestMessageGryoSerializer.java
deleted file mode 100644
index 8b0c30b908..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/RequestMessageGryoSerializer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.InputShim;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShim;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.OutputShim;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class RequestMessageGryoSerializer implements SerializerShim<RequestMessage> {
-    @Override
-    public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final RequestMessage requestMessage) {
-        kryo.writeObject(output, requestMessage.getRequestId());
-        output.writeString(requestMessage.getProcessor());
-        output.writeString(requestMessage.getOp());
-        kryo.writeObject(output, requestMessage.getArgs());
-    }
-
-    @Override
-    public <I extends InputShim> RequestMessage read(final KryoShim<I, ?> kryo, final I input, final Class<RequestMessage> aClass) {
-        final UUID id = kryo.readObject(input, UUID.class);
-        final String processor = input.readString();
-        final String op = input.readString();
-
-        final RequestMessage.Builder builder = RequestMessage.build(op)
-                .overrideRequestId(id)
-                .processor(processor);
-
-        final Map<String, Object> args = kryo.readObject(input, HashMap.class);
-        args.forEach(builder::addArg);
-        return builder.create();
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/ResponseMessageGryoSerializer.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/ResponseMessageGryoSerializer.java
deleted file mode 100644
index 7eb036b1f6..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/ResponseMessageGryoSerializer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.handler.codec.http.HttpResponseStatus;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.InputShim;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShim;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.OutputShim;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class ResponseMessageGryoSerializer implements SerializerShim<ResponseMessage> {
-    @Override
-    public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final ResponseMessage responseMessage) {
-        kryo.writeObjectOrNull(output, responseMessage.getRequestId() != null ? responseMessage.getRequestId() : null, UUID.class);
-
-        // status
-        output.writeShort((short) responseMessage.getStatus().getCode().code());
-        output.writeString(responseMessage.getStatus().getMessage());
-        kryo.writeClassAndObject(output, responseMessage.getStatus().getAttributes());
-
-        // result
-        kryo.writeClassAndObject(output, responseMessage.getResult().getData());
-        kryo.writeClassAndObject(output, responseMessage.getResult().getMeta());
-
-    }
-
-    @Override
-    public <I extends InputShim> ResponseMessage read(final KryoShim<I, ?> kryo, final I input, final Class<ResponseMessage> clazz) {
-        final UUID requestId = kryo.readObjectOrNull(input, UUID.class);
-        final int status = input.readShort();
-        final String statusMsg = input.readString();
-        final Map<String,Object> statusAttributes = (Map<String,Object>) kryo.readClassAndObject(input);
-        final Object result = kryo.readClassAndObject(input);
-        final Map<String,Object> metaAttributes = (Map<String,Object>) kryo.readClassAndObject(input);
-
-        return ResponseMessage.build(requestId)
-                .code(HttpResponseStatus.valueOf(status))
-                .statusMessage(statusMsg)
-                .statusAttributes(statusAttributes)
-                .result(result)
-                .responseMetaData(metaAttributes)
-                .create();
-    }
-}
\ No newline at end of file
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/Serializers.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/SerializersV4.java
similarity index 54%
rename from gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/Serializers.java
rename to gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/SerializersV4.java
index e33c1c0b91..b5ed41f08c 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/Serializers.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/SerializersV4.java
@@ -18,50 +18,20 @@
  */
 package org.apache.tinkerpop.gremlin.util.ser;
 
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
+import org.apache.tinkerpop.gremlin.util.MessageSerializerV4;
 
 /**
  * An enum of the default serializers.
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public enum Serializers {
+public enum SerializersV4 {
 
     /**
      * GraphSON 3.0.
      */
     GRAPHSON(SerTokens.MIME_JSON),
 
-    /**
-     * GraphSON 1.0 with types.
-     */
-    GRAPHSON_V1(SerTokens.MIME_GRAPHSON_V1),
-
-    /**
-     * GraphSON 1.0 without types.
-     */
-    GRAPHSON_V1_UNTYPED(SerTokens.MIME_GRAPHSON_V1_UNTYPED),
-
-    /**
-     * GraphSON 2.0 with types.
-     */
-    GRAPHSON_V2(SerTokens.MIME_GRAPHSON_V2),
-
-    /**
-     * GraphSON 2.0 without types.
-     */
-    GRAPHSON_V2_UNTYPED(SerTokens.MIME_GRAPHSON_V2_UNTYPED),
-
-    /**
-     * GraphSON 3.0 with types.
-     */
-    GRAPHSON_V3(SerTokens.MIME_GRAPHSON_V3),
-
-    /**
-     * GraphSON 3.0 without types.
-     */
-    GRAPHSON_V3_UNTYPED(SerTokens.MIME_GRAPHSON_V3_UNTYPED),
-
     /**
      * GraphSON 4.0 with types.
      */
@@ -72,11 +42,6 @@ public enum Serializers {
      */
     GRAPHSON_V4_UNTYPED(SerTokens.MIME_GRAPHSON_V4_UNTYPED),
 
-    /**
-     * GraphBinary 1.0.
-     */
-    GRAPHBINARY_V1(SerTokens.MIME_GRAPHBINARY_V1),
-
     /**
      * GraphBinary 4.0.
      */
@@ -84,7 +49,7 @@ public enum Serializers {
 
     private String value;
 
-    Serializers(final String mimeType) {
+    SerializersV4(final String mimeType) {
         this.value = mimeType;
     }
 
@@ -92,29 +57,15 @@ public enum Serializers {
         return value;
     }
 
-    public MessageSerializer<?> simpleInstance() {
+    public MessageSerializerV4<?> simpleInstance() {
         switch (value) {
             case SerTokens.MIME_JSON:
             case SerTokens.MIME_GRAPHSON_V4:
                 return new GraphSONMessageSerializerV4();
-            case SerTokens.MIME_GRAPHSON_V3:
-                return new GraphSONMessageSerializerV3();
-            case SerTokens.MIME_GRAPHSON_V1:
-                return new GraphSONMessageSerializerV1();
-            case SerTokens.MIME_GRAPHSON_V1_UNTYPED:
-                return new GraphSONUntypedMessageSerializerV1();
-            case SerTokens.MIME_GRAPHSON_V2:
-                return new GraphSONMessageSerializerV2();
-            case SerTokens.MIME_GRAPHSON_V2_UNTYPED:
-                return new GraphSONUntypedMessageSerializerV2();
-            case SerTokens.MIME_GRAPHSON_V3_UNTYPED:
-                return new GraphSONUntypedMessageSerializerV3();
             case SerTokens.MIME_GRAPHSON_V4_UNTYPED:
                 return new GraphSONUntypedMessageSerializerV4();
             case SerTokens.MIME_GRAPHBINARY_V4:
                 return new GraphBinaryMessageSerializerV4();
-            case SerTokens.MIME_GRAPHBINARY_V1:
-                return new GraphBinaryMessageSerializerV1();
             default:
                 throw new RuntimeException("Could not create a simple MessageSerializer instance of " + value);
         }
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/RequestMessageSerializer.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/RequestMessageSerializer.java
deleted file mode 100644
index 9fecfc35e9..0000000000
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/RequestMessageSerializer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser.binary;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.tinkerpop.gremlin.util.ser.NettyBufferFactory;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
-import org.apache.tinkerpop.gremlin.structure.io.Buffer;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryReader;
-import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryWriter;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.UUID;
-
-public class RequestMessageSerializer {
-    private static NettyBufferFactory bufferFactory = new NettyBufferFactory();
-
-    public RequestMessage readValue(final ByteBuf byteBuf, final GraphBinaryReader context) throws SerializationException {
-        // Wrap netty's buffer
-        final Buffer buffer = bufferFactory.create(byteBuf);
-
-        final int version = buffer.readByte() & 0xff;
-
-        if (version >>> 7 != 1) {
-            // This is an indication that the request buffer was incorrectly built
-            // Or the buffer offsets are wrong
-            throw new SerializationException("The most significant bit should be set according to the format");
-        }
-
-        try {
-            final UUID id = context.readValue(buffer, UUID.class, false);
-            final String op = context.readValue(buffer, String.class, false);
-            final String processor = context.readValue(buffer, String.class, false);
-
-            final RequestMessage.Builder builder = RequestMessage.build(op).overrideRequestId(id).processor(processor);
-
-            final Map<String, Object> args = context.readValue(buffer, Map.class, false);
-            args.forEach(builder::addArg);
-
-            return builder.create();
-        } catch (IOException ex) {
-            throw new SerializationException(ex);
-        }
-    }
-
-    public void writeValue(final RequestMessage value, final ByteBuf byteBuf, final GraphBinaryWriter context) throws SerializationException {
-        // Wrap netty's buffer
-        final Buffer buffer = bufferFactory.create(byteBuf);
-
-        try {
-            // Version
-            buffer.writeByte(GraphBinaryWriter.VERSION_BYTE);
-            // RequestId
-            context.writeValue(value.getRequestId(), buffer, false);
-            // Op
-            context.writeValue(value.getOp(), buffer, false);
-            // Processor
-            context.writeValue(value.getProcessor(), buffer, false);
-            // Args
-            context.writeValue(value.getArgs(), buffer, false);
-        } catch (IOException ex) {
-            throw new SerializationException(ex);
-        }
-    }
-}
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/RequestMessageSerializerV4.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/RequestMessageSerializerV4.java
index 5c083f5cd1..ee0e398049 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/RequestMessageSerializerV4.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/RequestMessageSerializerV4.java
@@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
 import org.apache.tinkerpop.gremlin.util.ser.NettyBufferFactory;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.util.ser.SerTokens;
 import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.structure.io.Buffer;
@@ -72,6 +71,15 @@ public class RequestMessageSerializerV4 {
             if (fields.containsKey(SerTokens.TOKEN_BINDINGS)) {
                 builder.addBindings((Map<String, Object>) fields.get(SerTokens.TOKEN_BINDINGS));
             }
+            if (fields.containsKey(Tokens.TIMEOUT_MS)) {
+                builder.addTimeoutMillis((long) fields.get(Tokens.TIMEOUT_MS));
+            }
+            if (fields.containsKey(Tokens.ARGS_MATERIALIZE_PROPERTIES)) {
+                builder.addMaterializeProperties(fields.get(Tokens.ARGS_MATERIALIZE_PROPERTIES).toString());
+            }
+            if (fields.containsKey(Tokens.ARGS_BATCH_SIZE)) {
+                builder.addChunkSize((int) fields.get(Tokens.ARGS_BATCH_SIZE));
+            }
 
             return builder.create();
         } catch (IOException ex) {
diff --git a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/ResponseMessageSerializer.java b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/ResponseMessageSerializerV4.java
similarity index 83%
rename from gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/ResponseMessageSerializer.java
rename to gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/ResponseMessageSerializerV4.java
index 2009726081..e57c0f92ea 100644
--- a/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/ResponseMessageSerializer.java
+++ b/gremlin-util/src/main/java/org/apache/tinkerpop/gremlin/util/ser/binary/ResponseMessageSerializerV4.java
@@ -20,23 +20,22 @@ package org.apache.tinkerpop.gremlin.util.ser.binary;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.handler.codec.http.HttpResponseStatus;
-import org.apache.tinkerpop.gremlin.util.ser.NettyBufferFactory;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseResult;
-import org.apache.tinkerpop.gremlin.util.message.ResponseStatus;
-import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 import org.apache.tinkerpop.gremlin.structure.io.Buffer;
 import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryReader;
 import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryWriter;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseResult;
+import org.apache.tinkerpop.gremlin.util.message.ResponseStatusV4;
+import org.apache.tinkerpop.gremlin.util.ser.NettyBufferFactory;
+import org.apache.tinkerpop.gremlin.util.ser.SerializationException;
 
 import java.io.IOException;
 import java.util.Map;
-import java.util.UUID;
 
-public class ResponseMessageSerializer {
+public class ResponseMessageSerializerV4 {
     private static final NettyBufferFactory bufferFactory = new NettyBufferFactory();
 
-    public ResponseMessage readValue(final ByteBuf byteBuf, final GraphBinaryReader context) throws SerializationException {
+    public ResponseMessageV4 readValue(final ByteBuf byteBuf, final GraphBinaryReader context) throws SerializationException {
         // Wrap netty's buffer
         final Buffer buffer = bufferFactory.create(byteBuf);
         final int version = buffer.readByte() & 0xff;
@@ -48,7 +47,7 @@ public class ResponseMessageSerializer {
         }
 
         try {
-            return ResponseMessage.build(context.readValue(buffer, UUID.class, true))
+            return ResponseMessageV4.build()
                     .code(HttpResponseStatus.valueOf(context.readValue(buffer, Integer.class, false)))
                     .statusMessage(context.readValue(buffer, String.class, true))
                     .statusAttributes(context.readValue(buffer, Map.class, false))
@@ -60,18 +59,16 @@ public class ResponseMessageSerializer {
         }
     }
 
-    public void writeValue(final ResponseMessage value, final ByteBuf byteBuf, final GraphBinaryWriter context) throws SerializationException {
+    public void writeValue(final ResponseMessageV4 value, final ByteBuf byteBuf, final GraphBinaryWriter context) throws SerializationException {
         // Wrap netty's buffer
         final Buffer buffer = bufferFactory.create(byteBuf);
 
         final ResponseResult result = value.getResult();
-        final ResponseStatus status = value.getStatus();
+        final ResponseStatusV4 status = value.getStatus();
 
         try {
             // Version
             buffer.writeByte(GraphBinaryWriter.VERSION_BYTE);
-            // Nullable request id
-            context.writeValue(value.getRequestId(), buffer, true);
             // Status code
             context.writeValue(status.getCode().code(), buffer, false);
             // Nullable status message
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractTypedCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractTypedCompatibilityTest.java
index bd80313e24..0b86581c26 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractTypedCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractTypedCompatibilityTest.java
@@ -41,8 +41,8 @@ import org.apache.tinkerpop.gremlin.structure.io.graphbinary.GraphBinaryCompatib
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTypedCompatibilityTest;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.apache.tinkerpop.gremlin.util.function.Lambda;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.junit.Test;
 
 import java.math.BigDecimal;
@@ -84,37 +84,37 @@ import static org.junit.Assume.assumeThat;
  */
 public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibilityTest {
 
-    @Test
-    public void shouldReadWriteAuthenticationChallenge() throws Exception {
-        final String resourceName = "authenticationchallenge";
-
-        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
-                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
-
-        final ResponseMessage resource = findModelEntryObject(resourceName);
-        final ResponseMessage fromStatic = read(readFromResource(resourceName), ResponseMessage.class);
-        final ResponseMessage recycled = read(write(fromStatic, ResponseMessage.class, resourceName), ResponseMessage.class);
-        assertNotSame(fromStatic, recycled);
-        assertResponseMessage(resource, fromStatic, recycled);
-    }
-
-    @Test
-    public void shouldReadWriteAuthenticationResponse() throws Exception {
-        final String resourceName = "authenticationresponse";
-
-        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
-                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
-        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
-        assertNotSame(fromStatic, recycled);
-        assertRequestMessage(resource, fromStatic, recycled);
-        assertEquals(resource.getArgs().get("saslMechanism"), recycled.getArgs().get("saslMechanism"));
-        assertEquals(resource.getArgs().get("sasl"), recycled.getArgs().get("sasl"));
-        assertEquals(resource.getArgs().get("saslMechanism"), fromStatic.getArgs().get("saslMechanism"));
-        assertEquals(resource.getArgs().get("sasl"), fromStatic.getArgs().get("sasl"));
-    }
+//    @Test
+//    public void shouldReadWriteAuthenticationChallenge() throws Exception {
+//        final String resourceName = "authenticationchallenge";
+//
+//        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
+//                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
+//
+//        final ResponseMessage resource = findModelEntryObject(resourceName);
+//        final ResponseMessage fromStatic = read(readFromResource(resourceName), ResponseMessage.class);
+//        final ResponseMessage recycled = read(write(fromStatic, ResponseMessage.class, resourceName), ResponseMessage.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertResponseMessage(resource, fromStatic, recycled);
+//    }
+
+//    @Test
+//    public void shouldReadWriteAuthenticationResponse() throws Exception {
+//        final String resourceName = "authenticationresponse";
+//
+//        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
+//                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
+//        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertRequestMessage(resource, fromStatic, recycled);
+//        assertEquals(resource.getArgs().get("saslMechanism"), recycled.getArgs().get("saslMechanism"));
+//        assertEquals(resource.getArgs().get("sasl"), recycled.getArgs().get("sasl"));
+//        assertEquals(resource.getArgs().get("saslMechanism"), fromStatic.getArgs().get("saslMechanism"));
+//        assertEquals(resource.getArgs().get("sasl"), fromStatic.getArgs().get("sasl"));
+//    }
 
     @Test
     public void shouldReadWriteBarrier() throws Exception {
@@ -645,109 +645,109 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
         assertEquals(resource, recycled);
     }
 
-    @Test
-    public void shouldReadWriteSessionClose() throws Exception {
-        final String resourceName = "sessionclose";
-
-        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
-                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
-        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
-        assertNotSame(fromStatic, recycled);
-        assertRequestMessage(resource, fromStatic, recycled);
-        assertEquals(resource.getArgs().get("session"), recycled.getArgs().get("session"));
-        assertEquals(resource.getArgs().get("session"), fromStatic.getArgs().get("session"));
-    }
-
-    @Test
-    public void shouldReadWriteSessionEval() throws Exception {
-        final String resourceName = "sessioneval";
-
-        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
-                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
-        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
-        assertNotSame(fromStatic, recycled);
-        assertRequestMessage(resource, fromStatic, recycled);
-        assertEquals(resource.getArgs().get("session"), recycled.getArgs().get("session"));
-        assertEquals(resource.getArgs().get("language"), recycled.getArgs().get("language"));
-        assertEquals(resource.getArgs().get("gremlin"), recycled.getArgs().get("gremlin"));
-        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) recycled.getArgs().get("bindings")).get("x"));
-        assertEquals(resource.getArgs().get("session"), fromStatic.getArgs().get("session"));
-        assertEquals(resource.getArgs().get("language"), fromStatic.getArgs().get("language"));
-        assertEquals(resource.getArgs().get("gremlin"), fromStatic.getArgs().get("gremlin"));
-        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) fromStatic.getArgs().get("bindings")).get("x"));
-    }
-
-    @Test
-    public void shouldReadWriteSessionEvalAliased() throws Exception {
-        final String resourceName = "sessionevalaliased";
-
-        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
-                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
-        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
-        assertNotSame(fromStatic, recycled);
-        assertRequestMessage(resource, fromStatic, recycled);
-        assertEquals(resource.getArgs().get("session"), recycled.getArgs().get("session"));
-        assertEquals(resource.getArgs().get("language"), recycled.getArgs().get("language"));
-        assertEquals(resource.getArgs().get("gremlin"), recycled.getArgs().get("gremlin"));
-        assertEquals(((Map) resource.getArgs().get("aliases")).get("g"), ((Map) recycled.getArgs().get("aliases")).get("g"));
-        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) recycled.getArgs().get("bindings")).get("x"));
-        assertEquals(resource.getArgs().get("session"), fromStatic.getArgs().get("session"));
-        assertEquals(resource.getArgs().get("language"), fromStatic.getArgs().get("language"));
-        assertEquals(resource.getArgs().get("gremlin"), fromStatic.getArgs().get("gremlin"));
-        assertEquals(((Map) resource.getArgs().get("aliases")).get("g"), ((Map) fromStatic.getArgs().get("aliases")).get("g"));
-        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) fromStatic.getArgs().get("bindings")).get("x"));
-    }
-
-    @Test
-    public void shouldReadWriteSessionlessEval() throws Exception {
-        final String resourceName = "sessionlesseval";
-
-        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
-                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
-        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
-        assertNotSame(fromStatic, recycled);
-        assertRequestMessage(resource, fromStatic, recycled);
-        assertEquals(resource.getArgs().get("language"), recycled.getArgs().get("language"));
-        assertEquals(resource.getArgs().get("gremlin"), recycled.getArgs().get("gremlin"));
-        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) recycled.getArgs().get("bindings")).get("x"));
-        assertEquals(resource.getArgs().get("language"), fromStatic.getArgs().get("language"));
-        assertEquals(resource.getArgs().get("gremlin"), fromStatic.getArgs().get("gremlin"));
-        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) fromStatic.getArgs().get("bindings")).get("x"));
-    }
-
-    @Test
-    public void shouldReadWriteSessionlessEvalAliased() throws Exception {
-        final String resourceName = "sessionlessevalaliased";
-
-        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
-                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
-        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
-        assertNotSame(fromStatic, recycled);
-        assertRequestMessage(resource, fromStatic, recycled);
-        assertEquals(resource.getArgs().get("language"), recycled.getArgs().get("language"));
-        assertEquals(resource.getArgs().get("gremlin"), recycled.getArgs().get("gremlin"));
-        assertEquals(((Map) resource.getArgs().get("aliases")).get("g"), ((Map) recycled.getArgs().get("aliases")).get("g"));
-        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) recycled.getArgs().get("bindings")).get("x"));
-        assertEquals(resource.getArgs().get("language"), fromStatic.getArgs().get("language"));
-        assertEquals(resource.getArgs().get("gremlin"), fromStatic.getArgs().get("gremlin"));
-        assertEquals(((Map) resource.getArgs().get("aliases")).get("g"), ((Map) fromStatic.getArgs().get("aliases")).get("g"));
-        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) fromStatic.getArgs().get("bindings")).get("x"));
-    }
+//    @Test
+//    public void shouldReadWriteSessionClose() throws Exception {
+//        final String resourceName = "sessionclose";
+//
+//        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
+//                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
+//        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertRequestMessage(resource, fromStatic, recycled);
+//        assertEquals(resource.getArgs().get("session"), recycled.getArgs().get("session"));
+//        assertEquals(resource.getArgs().get("session"), fromStatic.getArgs().get("session"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteSessionEval() throws Exception {
+//        final String resourceName = "sessioneval";
+//
+//        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
+//                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
+//        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertRequestMessage(resource, fromStatic, recycled);
+//        assertEquals(resource.getArgs().get("session"), recycled.getArgs().get("session"));
+//        assertEquals(resource.getArgs().get("language"), recycled.getArgs().get("language"));
+//        assertEquals(resource.getArgs().get("gremlin"), recycled.getArgs().get("gremlin"));
+//        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) recycled.getArgs().get("bindings")).get("x"));
+//        assertEquals(resource.getArgs().get("session"), fromStatic.getArgs().get("session"));
+//        assertEquals(resource.getArgs().get("language"), fromStatic.getArgs().get("language"));
+//        assertEquals(resource.getArgs().get("gremlin"), fromStatic.getArgs().get("gremlin"));
+//        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) fromStatic.getArgs().get("bindings")).get("x"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteSessionEvalAliased() throws Exception {
+//        final String resourceName = "sessionevalaliased";
+//
+//        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
+//                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
+//        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertRequestMessage(resource, fromStatic, recycled);
+//        assertEquals(resource.getArgs().get("session"), recycled.getArgs().get("session"));
+//        assertEquals(resource.getArgs().get("language"), recycled.getArgs().get("language"));
+//        assertEquals(resource.getArgs().get("gremlin"), recycled.getArgs().get("gremlin"));
+//        assertEquals(((Map) resource.getArgs().get("aliases")).get("g"), ((Map) recycled.getArgs().get("aliases")).get("g"));
+//        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) recycled.getArgs().get("bindings")).get("x"));
+//        assertEquals(resource.getArgs().get("session"), fromStatic.getArgs().get("session"));
+//        assertEquals(resource.getArgs().get("language"), fromStatic.getArgs().get("language"));
+//        assertEquals(resource.getArgs().get("gremlin"), fromStatic.getArgs().get("gremlin"));
+//        assertEquals(((Map) resource.getArgs().get("aliases")).get("g"), ((Map) fromStatic.getArgs().get("aliases")).get("g"));
+//        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) fromStatic.getArgs().get("bindings")).get("x"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteSessionlessEval() throws Exception {
+//        final String resourceName = "sessionlesseval";
+//
+//        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
+//                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
+//        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertRequestMessage(resource, fromStatic, recycled);
+//        assertEquals(resource.getArgs().get("language"), recycled.getArgs().get("language"));
+//        assertEquals(resource.getArgs().get("gremlin"), recycled.getArgs().get("gremlin"));
+//        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) recycled.getArgs().get("bindings")).get("x"));
+//        assertEquals(resource.getArgs().get("language"), fromStatic.getArgs().get("language"));
+//        assertEquals(resource.getArgs().get("gremlin"), fromStatic.getArgs().get("gremlin"));
+//        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) fromStatic.getArgs().get("bindings")).get("x"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteSessionlessEvalAliased() throws Exception {
+//        final String resourceName = "sessionlessevalaliased";
+//
+//        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
+//                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
+//        final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertRequestMessage(resource, fromStatic, recycled);
+//        assertEquals(resource.getArgs().get("language"), recycled.getArgs().get("language"));
+//        assertEquals(resource.getArgs().get("gremlin"), recycled.getArgs().get("gremlin"));
+//        assertEquals(((Map) resource.getArgs().get("aliases")).get("g"), ((Map) recycled.getArgs().get("aliases")).get("g"));
+//        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) recycled.getArgs().get("bindings")).get("x"));
+//        assertEquals(resource.getArgs().get("language"), fromStatic.getArgs().get("language"));
+//        assertEquals(resource.getArgs().get("gremlin"), fromStatic.getArgs().get("gremlin"));
+//        assertEquals(((Map) resource.getArgs().get("aliases")).get("g"), ((Map) fromStatic.getArgs().get("aliases")).get("g"));
+//        assertEquals(((Map) resource.getArgs().get("bindings")).get("x"), ((Map) fromStatic.getArgs().get("bindings")).get("x"));
+//    }
 
     @Test
     public void shouldReadWriteSet() throws Exception {
@@ -776,19 +776,19 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
         assertEquals(resource, recycled);
     }
 
-    @Test
-    public void shouldReadWriteStandardResult() throws Exception {
-        final String resourceName = "standardresult";
-
-        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
-                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
-
-        final ResponseMessage resource = findModelEntryObject(resourceName);
-        final ResponseMessage fromStatic = read(readFromResource(resourceName), ResponseMessage.class);
-        final ResponseMessage recycled = read(write(fromStatic, HashMap.class, resourceName), ResponseMessage.class);
-        assertNotSame(fromStatic, recycled);
-        assertResponseMessage(resource, fromStatic, recycled);
-    }
+//    @Test
+//    public void shouldReadWriteStandardResult() throws Exception {
+//        final String resourceName = "standardresult";
+//
+//        assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
+//                is(this.getClass().equals(GraphBinaryCompatibilityTest.class)));
+//
+//        final ResponseMessage resource = findModelEntryObject(resourceName);
+//        final ResponseMessage fromStatic = read(readFromResource(resourceName), ResponseMessage.class);
+//        final ResponseMessage recycled = read(write(fromStatic, HashMap.class, resourceName), ResponseMessage.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertResponseMessage(resource, fromStatic, recycled);
+//    }
 
     @Test
     public void shouldReadWriteT() throws Exception {
@@ -975,33 +975,33 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
         assertEquals(resource, recycled);
     }
 
-    private static void assertResponseMessage(final ResponseMessage resource, final ResponseMessage fromStatic,
-                                              final ResponseMessage recycled) {
-        assertEquals(resource.getRequestId(), recycled.getRequestId());
-        assertEquals(resource.getStatus().getCode().code(), recycled.getStatus().getCode().code());
-        assertEquals(resource.getStatus().getMessage(), recycled.getStatus().getMessage());
-        assertEquals(resource.getStatus().getAttributes(), recycled.getStatus().getAttributes());
-        assertEquals(resource.getResult().getData(), recycled.getResult().getData());
-        assertEquals(resource.getResult().getMeta(), recycled.getResult().getMeta());
-        assertEquals(resource.getStatus().getMessage(), recycled.getStatus().getMessage());
-        assertEquals(resource.getRequestId(), fromStatic.getRequestId());
-        assertEquals(resource.getStatus().getCode().code(), fromStatic.getStatus().getCode().code());
-        assertEquals(resource.getStatus().getMessage(), fromStatic.getStatus().getMessage());
-        assertEquals(resource.getStatus().getAttributes(), fromStatic.getStatus().getAttributes());
-        assertEquals(resource.getResult().getData(), fromStatic.getResult().getData());
-        assertEquals(resource.getResult().getMeta(), fromStatic.getResult().getMeta());
-        assertEquals(resource.getStatus().getMessage(), fromStatic.getStatus().getMessage());
-    }
-
-    private static void assertRequestMessage(final RequestMessage resource, final RequestMessage fromStatic,
-                                             final RequestMessage recycled) {
-        assertEquals(resource.getRequestId(), recycled.getRequestId());
-        assertEquals(resource.getOp(), recycled.getOp());
-        assertEquals(resource.getProcessor(), recycled.getProcessor());
-        assertEquals(resource.getArgs(), recycled.getArgs());
-        assertEquals(resource.getRequestId(), fromStatic.getRequestId());
-        assertEquals(resource.getOp(), fromStatic.getOp());
-        assertEquals(resource.getProcessor(), fromStatic.getProcessor());
-        assertEquals(resource.getArgs(), fromStatic.getArgs());
-    }
+//    private static void assertResponseMessage(final ResponseMessage resource, final ResponseMessage fromStatic,
+//                                              final ResponseMessage recycled) {
+//        assertEquals(resource.getRequestId(), recycled.getRequestId());
+//        assertEquals(resource.getStatus().getCode().getValue(), recycled.getStatus().getCode().getValue());
+//        assertEquals(resource.getStatus().getMessage(), recycled.getStatus().getMessage());
+//        assertEquals(resource.getStatus().getAttributes(), recycled.getStatus().getAttributes());
+//        assertEquals(resource.getResult().getData(), recycled.getResult().getData());
+//        assertEquals(resource.getResult().getMeta(), recycled.getResult().getMeta());
+//        assertEquals(resource.getStatus().getMessage(), recycled.getStatus().getMessage());
+//        assertEquals(resource.getRequestId(), fromStatic.getRequestId());
+//        assertEquals(resource.getStatus().getCode().getValue(), fromStatic.getStatus().getCode().getValue());
+//        assertEquals(resource.getStatus().getMessage(), fromStatic.getStatus().getMessage());
+//        assertEquals(resource.getStatus().getAttributes(), fromStatic.getStatus().getAttributes());
+//        assertEquals(resource.getResult().getData(), fromStatic.getResult().getData());
+//        assertEquals(resource.getResult().getMeta(), fromStatic.getResult().getMeta());
+//        assertEquals(resource.getStatus().getMessage(), fromStatic.getStatus().getMessage());
+//    }
+
+//    private static void assertRequestMessage(final RequestMessage resource, final RequestMessage fromStatic,
+//                                             final RequestMessage recycled) {
+//        assertEquals(resource.getRequestId(), recycled.getRequestId());
+//        assertEquals(resource.getOp(), recycled.getOp());
+//        assertEquals(resource.getProcessor(), recycled.getProcessor());
+//        assertEquals(resource.getArgs(), recycled.getArgs());
+//        assertEquals(resource.getRequestId(), fromStatic.getRequestId());
+//        assertEquals(resource.getOp(), fromStatic.getOp());
+//        assertEquals(resource.getProcessor(), fromStatic.getProcessor());
+//        assertEquals(resource.getArgs(), fromStatic.getArgs());
+//    }
 }
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
index 14d3bfaaf8..724d8e9fdb 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
@@ -25,8 +25,8 @@ import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 import org.junit.Test;
 
 import java.util.HashMap;
@@ -41,43 +41,43 @@ import static org.junit.Assert.assertNotSame;
  */
 public abstract class AbstractUntypedCompatibilityTest extends AbstractCompatibilityTest {
 
-    @Test
-    public void shouldReadWriteAuthenticationChallenge() throws Exception {
-        final String resourceName = "authenticationchallenge";
-
-        final ResponseMessage resource = findModelEntryObject(resourceName);
-        final byte[] bytes = write(resource, ResponseMessage.class, resourceName);
-        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
-        final HashMap recycled = read(bytes, HashMap.class);
-        assertNotSame(fromStatic, recycled);
-        assertEquals(fromStatic, recycled);
-        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
-        assertEquals(HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED.code(), ((Map) fromStatic.get("status")).get("code"));
-        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
-        assertEquals(HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED.code(), ((Map) recycled.get("status")).get("code"));
-    }
-
-    @Test
-    public void shouldReadWriteAuthenticationResponse() throws Exception {
-        final String resourceName = "authenticationresponse";
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
-        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
-        final HashMap recycled = read(bytes, HashMap.class);
-        assertNotSame(fromStatic, recycled);
-        assertEquals(fromStatic, recycled);
-        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
-        assertEquals(resource.getOp(), fromStatic.get("op"));
-        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
-        assertEquals(resource.getArgs().get("saslMechanism"), ((Map) fromStatic.get("args")).get("saslMechanism"));
-        assertEquals(resource.getArgs().get("sasl"), ((Map) fromStatic.get("args")).get("sasl"));
-        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
-        assertEquals(resource.getOp(), recycled.get("op"));
-        assertEquals(resource.getProcessor(), recycled.get("processor"));
-        assertEquals(resource.getArgs().get("saslMechanism"), ((Map) recycled.get("args")).get("saslMechanism"));
-        assertEquals(resource.getArgs().get("sasl"), ((Map) recycled.get("args")).get("sasl"));
-    }
+//    @Test
+//    public void shouldReadWriteAuthenticationChallenge() throws Exception {
+//        final String resourceName = "authenticationchallenge";
+//
+//        final ResponseMessage resource = findModelEntryObject(resourceName);
+//        final byte[] bytes = write(resource, ResponseMessage.class, resourceName);
+//        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
+//        final HashMap recycled = read(bytes, HashMap.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertEquals(fromStatic, recycled);
+//        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
+//        assertEquals(HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED.code(), ((Map) fromStatic.get("status")).get("code"));
+//        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
+//        assertEquals(HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED.code(), ((Map) recycled.get("status")).get("code"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteAuthenticationResponse() throws Exception {
+//        final String resourceName = "authenticationresponse";
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
+//        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
+//        final HashMap recycled = read(bytes, HashMap.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertEquals(fromStatic, recycled);
+//        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
+//        assertEquals(resource.getOp(), fromStatic.get("op"));
+//        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
+//        assertEquals(resource.getArgs().get("saslMechanism"), ((Map) fromStatic.get("args")).get("saslMechanism"));
+//        assertEquals(resource.getArgs().get("sasl"), ((Map) fromStatic.get("args")).get("sasl"));
+//        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
+//        assertEquals(resource.getOp(), recycled.get("op"));
+//        assertEquals(resource.getProcessor(), recycled.get("processor"));
+//        assertEquals(resource.getArgs().get("saslMechanism"), ((Map) recycled.get("args")).get("saslMechanism"));
+//        assertEquals(resource.getArgs().get("sasl"), ((Map) recycled.get("args")).get("sasl"));
+//    }
 
     @Test
     public void shouldReadWriteEdge() throws Exception {
@@ -171,157 +171,157 @@ public abstract class AbstractUntypedCompatibilityTest extends AbstractCompatibi
         assertEquals(resource.value(), recycled.get("value"));
     }
 
-    @Test
-    public void shouldReadWriteSessionClose() throws Exception {
-        final String resourceName = "sessionclose";
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
-        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
-        final HashMap recycled = read(bytes, HashMap.class);
-        assertNotSame(fromStatic, recycled);
-        assertEquals(fromStatic, recycled);
-        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
-        assertEquals(resource.getOp(), fromStatic.get("op"));
-        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
-        assertEquals(resource.getArgs().get("session").toString(), ((Map) fromStatic.get("args")).get("session"));
-        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
-        assertEquals(resource.getOp(), recycled.get("op"));
-        assertEquals(resource.getProcessor(), recycled.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
-        assertEquals(resource.getArgs().get("session").toString(), ((Map) recycled.get("args")).get("session"));
-    }
-
-    @Test
-    public void shouldReadWriteSessionEval() throws Exception {
-        final String resourceName = "sessioneval";
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
-        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
-        final HashMap recycled = read(bytes, HashMap.class);
-        assertNotSame(fromStatic, recycled);
-        assertEquals(fromStatic, recycled);
-        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
-        assertEquals(resource.getOp(), fromStatic.get("op"));
-        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
-        assertEquals(resource.getArgs().get("gremlin"), ((Map) fromStatic.get("args")).get("gremlin"));
-        assertEquals(resource.getArgs().get("language"), ((Map) fromStatic.get("args")).get("language"));
-        assertEquals(resource.getArgs().get("session").toString(), ((Map) fromStatic.get("args")).get("session"));
-        assertEquals(resource.getArgs().get("bindings"), ((Map) fromStatic.get("args")).get("bindings"));
-        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
-        assertEquals(resource.getOp(), recycled.get("op"));
-        assertEquals(resource.getProcessor(), recycled.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
-        assertEquals(resource.getArgs().get("gremlin"), ((Map) recycled.get("args")).get("gremlin"));
-        assertEquals(resource.getArgs().get("language"), ((Map) recycled.get("args")).get("language"));
-        assertEquals(resource.getArgs().get("session").toString(), ((Map) recycled.get("args")).get("session"));
-        assertEquals(resource.getArgs().get("bindings"), ((Map) recycled.get("args")).get("bindings"));
-    }
-
-    @Test
-    public void shouldReadWriteSessionEvalAliased() throws Exception {
-        final String resourceName = "sessionevalaliased";
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
-        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
-        final HashMap recycled = read(bytes, HashMap.class);
-        assertNotSame(fromStatic, recycled);
-        assertEquals(fromStatic, recycled);
-        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
-        assertEquals(resource.getOp(), fromStatic.get("op"));
-        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
-        assertEquals(resource.getArgs().get("gremlin"), ((Map) fromStatic.get("args")).get("gremlin"));
-        assertEquals(resource.getArgs().get("language"), ((Map) fromStatic.get("args")).get("language"));
-        assertEquals(resource.getArgs().get("session").toString(), ((Map) fromStatic.get("args")).get("session"));
-        assertEquals(resource.getArgs().get("bindings"), ((Map) fromStatic.get("args")).get("bindings"));
-        assertEquals(resource.getArgs().get("aliased"), ((Map) fromStatic.get("args")).get("aliased"));
-        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
-        assertEquals(resource.getOp(), recycled.get("op"));
-        assertEquals(resource.getProcessor(), recycled.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
-        assertEquals(resource.getArgs().get("gremlin"), ((Map) recycled.get("args")).get("gremlin"));
-        assertEquals(resource.getArgs().get("language"), ((Map) recycled.get("args")).get("language"));
-        assertEquals(resource.getArgs().get("session").toString(), ((Map) recycled.get("args")).get("session"));
-        assertEquals(resource.getArgs().get("bindings"), ((Map) recycled.get("args")).get("bindings"));
-        assertEquals(resource.getArgs().get("aliased"), ((Map) recycled.get("args")).get("aliased"));
-    }
-
-    @Test
-    public void shouldReadWriteSessionlessEval() throws Exception {
-        final String resourceName = "sessionlesseval";
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
-        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
-        final HashMap recycled = read(bytes, HashMap.class);
-        assertNotSame(fromStatic, recycled);
-        assertEquals(fromStatic, recycled);
-        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
-        assertEquals(resource.getOp(), fromStatic.get("op"));
-        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
-        assertEquals(resource.getArgs().get("gremlin"), ((Map) fromStatic.get("args")).get("gremlin"));
-        assertEquals(resource.getArgs().get("language"), ((Map) fromStatic.get("args")).get("language"));
-        assertEquals(resource.getArgs().get("bindings"), ((Map) fromStatic.get("args")).get("bindings"));
-        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
-        assertEquals(resource.getOp(), recycled.get("op"));
-        assertEquals(resource.getProcessor(), recycled.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
-        assertEquals(resource.getArgs().get("gremlin"), ((Map) recycled.get("args")).get("gremlin"));
-        assertEquals(resource.getArgs().get("language"), ((Map) recycled.get("args")).get("language"));
-        assertEquals(resource.getArgs().get("bindings"), ((Map) recycled.get("args")).get("bindings"));
-    }
-
-    @Test
-    public void shouldReadWriteSessionlessEvalAliased() throws Exception {
-        final String resourceName = "sessionlessevalaliased";
-
-        final RequestMessage resource = findModelEntryObject(resourceName);
-        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
-        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
-        final HashMap recycled = read(bytes, HashMap.class);
-        assertNotSame(fromStatic, recycled);
-        assertEquals(fromStatic, recycled);
-        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
-        assertEquals(resource.getOp(), fromStatic.get("op"));
-        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
-        assertEquals(resource.getArgs().get("gremlin"), ((Map) fromStatic.get("args")).get("gremlin"));
-        assertEquals(resource.getArgs().get("language"), ((Map) fromStatic.get("args")).get("language"));
-        assertEquals(resource.getArgs().get("bindings"), ((Map) fromStatic.get("args")).get("bindings"));
-        assertEquals(resource.getArgs().get("aliased"), ((Map) fromStatic.get("args")).get("aliased"));
-        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
-        assertEquals(resource.getOp(), recycled.get("op"));
-        assertEquals(resource.getProcessor(), recycled.get("processor"));
-        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
-        assertEquals(resource.getArgs().get("gremlin"), ((Map) recycled.get("args")).get("gremlin"));
-        assertEquals(resource.getArgs().get("language"), ((Map) recycled.get("args")).get("language"));
-        assertEquals(resource.getArgs().get("bindings"), ((Map) recycled.get("args")).get("bindings"));
-        assertEquals(resource.getArgs().get("aliased"), ((Map) recycled.get("args")).get("aliased"));
-    }
-
-    @Test
-    public void shouldReadWriteStandardResult() throws Exception {
-        final String resourceName = "standardresult";
-
-        final ResponseMessage resource = findModelEntryObject(resourceName);
-        final byte[] bytes = write(resource, ResponseMessage.class, resourceName);
-        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
-        final HashMap recycled = read(bytes, HashMap.class);
-        assertNotSame(fromStatic, recycled);
-        assertEquals(fromStatic, recycled);
-        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
-        assertEquals(resource.getStatus().getCode().code(), ((Map) fromStatic.get("status")).get("code"));
-        assertEquals(resource.getStatus().getMessage(), ((Map) fromStatic.get("status")).get("message"));
-        assertEquals(resource.getStatus().getAttributes(), ((Map) fromStatic.get("status")).get("attributes"));
-        assertEquals(resource.getResult().getMeta(), ((Map) fromStatic.get("result")).get("meta"));
-        assertEquals(((List) resource.getResult().getData()).size(), ((List) ((Map) fromStatic.get("result")).get("data")).size());
-    }
+//    @Test
+//    public void shouldReadWriteSessionClose() throws Exception {
+//        final String resourceName = "sessionclose";
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
+//        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
+//        final HashMap recycled = read(bytes, HashMap.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertEquals(fromStatic, recycled);
+//        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
+//        assertEquals(resource.getOp(), fromStatic.get("op"));
+//        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
+//        assertEquals(resource.getArgs().get("session").toString(), ((Map) fromStatic.get("args")).get("session"));
+//        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
+//        assertEquals(resource.getOp(), recycled.get("op"));
+//        assertEquals(resource.getProcessor(), recycled.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
+//        assertEquals(resource.getArgs().get("session").toString(), ((Map) recycled.get("args")).get("session"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteSessionEval() throws Exception {
+//        final String resourceName = "sessioneval";
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
+//        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
+//        final HashMap recycled = read(bytes, HashMap.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertEquals(fromStatic, recycled);
+//        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
+//        assertEquals(resource.getOp(), fromStatic.get("op"));
+//        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
+//        assertEquals(resource.getArgs().get("gremlin"), ((Map) fromStatic.get("args")).get("gremlin"));
+//        assertEquals(resource.getArgs().get("language"), ((Map) fromStatic.get("args")).get("language"));
+//        assertEquals(resource.getArgs().get("session").toString(), ((Map) fromStatic.get("args")).get("session"));
+//        assertEquals(resource.getArgs().get("bindings"), ((Map) fromStatic.get("args")).get("bindings"));
+//        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
+//        assertEquals(resource.getOp(), recycled.get("op"));
+//        assertEquals(resource.getProcessor(), recycled.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
+//        assertEquals(resource.getArgs().get("gremlin"), ((Map) recycled.get("args")).get("gremlin"));
+//        assertEquals(resource.getArgs().get("language"), ((Map) recycled.get("args")).get("language"));
+//        assertEquals(resource.getArgs().get("session").toString(), ((Map) recycled.get("args")).get("session"));
+//        assertEquals(resource.getArgs().get("bindings"), ((Map) recycled.get("args")).get("bindings"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteSessionEvalAliased() throws Exception {
+//        final String resourceName = "sessionevalaliased";
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
+//        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
+//        final HashMap recycled = read(bytes, HashMap.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertEquals(fromStatic, recycled);
+//        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
+//        assertEquals(resource.getOp(), fromStatic.get("op"));
+//        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
+//        assertEquals(resource.getArgs().get("gremlin"), ((Map) fromStatic.get("args")).get("gremlin"));
+//        assertEquals(resource.getArgs().get("language"), ((Map) fromStatic.get("args")).get("language"));
+//        assertEquals(resource.getArgs().get("session").toString(), ((Map) fromStatic.get("args")).get("session"));
+//        assertEquals(resource.getArgs().get("bindings"), ((Map) fromStatic.get("args")).get("bindings"));
+//        assertEquals(resource.getArgs().get("aliased"), ((Map) fromStatic.get("args")).get("aliased"));
+//        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
+//        assertEquals(resource.getOp(), recycled.get("op"));
+//        assertEquals(resource.getProcessor(), recycled.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
+//        assertEquals(resource.getArgs().get("gremlin"), ((Map) recycled.get("args")).get("gremlin"));
+//        assertEquals(resource.getArgs().get("language"), ((Map) recycled.get("args")).get("language"));
+//        assertEquals(resource.getArgs().get("session").toString(), ((Map) recycled.get("args")).get("session"));
+//        assertEquals(resource.getArgs().get("bindings"), ((Map) recycled.get("args")).get("bindings"));
+//        assertEquals(resource.getArgs().get("aliased"), ((Map) recycled.get("args")).get("aliased"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteSessionlessEval() throws Exception {
+//        final String resourceName = "sessionlesseval";
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
+//        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
+//        final HashMap recycled = read(bytes, HashMap.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertEquals(fromStatic, recycled);
+//        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
+//        assertEquals(resource.getOp(), fromStatic.get("op"));
+//        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
+//        assertEquals(resource.getArgs().get("gremlin"), ((Map) fromStatic.get("args")).get("gremlin"));
+//        assertEquals(resource.getArgs().get("language"), ((Map) fromStatic.get("args")).get("language"));
+//        assertEquals(resource.getArgs().get("bindings"), ((Map) fromStatic.get("args")).get("bindings"));
+//        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
+//        assertEquals(resource.getOp(), recycled.get("op"));
+//        assertEquals(resource.getProcessor(), recycled.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
+//        assertEquals(resource.getArgs().get("gremlin"), ((Map) recycled.get("args")).get("gremlin"));
+//        assertEquals(resource.getArgs().get("language"), ((Map) recycled.get("args")).get("language"));
+//        assertEquals(resource.getArgs().get("bindings"), ((Map) recycled.get("args")).get("bindings"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteSessionlessEvalAliased() throws Exception {
+//        final String resourceName = "sessionlessevalaliased";
+//
+//        final RequestMessage resource = findModelEntryObject(resourceName);
+//        final byte[] bytes = write(resource, RequestMessage.class, resourceName);
+//        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
+//        final HashMap recycled = read(bytes, HashMap.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertEquals(fromStatic, recycled);
+//        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
+//        assertEquals(resource.getOp(), fromStatic.get("op"));
+//        assertEquals(resource.getProcessor(), fromStatic.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) fromStatic.get("args")).size());
+//        assertEquals(resource.getArgs().get("gremlin"), ((Map) fromStatic.get("args")).get("gremlin"));
+//        assertEquals(resource.getArgs().get("language"), ((Map) fromStatic.get("args")).get("language"));
+//        assertEquals(resource.getArgs().get("bindings"), ((Map) fromStatic.get("args")).get("bindings"));
+//        assertEquals(resource.getArgs().get("aliased"), ((Map) fromStatic.get("args")).get("aliased"));
+//        assertEquals(resource.getRequestId().toString(), recycled.get("requestId"));
+//        assertEquals(resource.getOp(), recycled.get("op"));
+//        assertEquals(resource.getProcessor(), recycled.get("processor"));
+//        assertEquals(resource.getArgs().size(), ((Map) recycled.get("args")).size());
+//        assertEquals(resource.getArgs().get("gremlin"), ((Map) recycled.get("args")).get("gremlin"));
+//        assertEquals(resource.getArgs().get("language"), ((Map) recycled.get("args")).get("language"));
+//        assertEquals(resource.getArgs().get("bindings"), ((Map) recycled.get("args")).get("bindings"));
+//        assertEquals(resource.getArgs().get("aliased"), ((Map) recycled.get("args")).get("aliased"));
+//    }
+
+//    @Test
+//    public void shouldReadWriteStandardResult() throws Exception {
+//        final String resourceName = "standardresult";
+//
+//        final ResponseMessage resource = findModelEntryObject(resourceName);
+//        final byte[] bytes = write(resource, ResponseMessage.class, resourceName);
+//        final HashMap fromStatic = read(readFromResource(resourceName), HashMap.class);
+//        final HashMap recycled = read(bytes, HashMap.class);
+//        assertNotSame(fromStatic, recycled);
+//        assertEquals(fromStatic, recycled);
+//        assertEquals(resource.getRequestId().toString(), fromStatic.get("requestId"));
+//        assertEquals(resource.getStatus().getCode().getValue(), ((Map) fromStatic.get("status")).get("code"));
+//        assertEquals(resource.getStatus().getMessage(), ((Map) fromStatic.get("status")).get("message"));
+//        assertEquals(resource.getStatus().getAttributes(), ((Map) fromStatic.get("status")).get("attributes"));
+//        assertEquals(resource.getResult().getMeta(), ((Map) fromStatic.get("result")).get("meta"));
+//        assertEquals(((List) resource.getResult().getData()).size(), ((List) ((Map) fromStatic.get("result")).get("data")).size());
+//    }
 
     @Test
     public void shouldReadWriteVertex() throws Exception {
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
index 738efa28d4..22a3f7f333 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
@@ -41,8 +41,8 @@ import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
+import org.apache.tinkerpop.gremlin.util.message.RequestMessageV4;
+import org.apache.tinkerpop.gremlin.util.message.ResponseMessageV4;
 
 import java.io.File;
 import java.math.BigDecimal;
@@ -162,39 +162,40 @@ public class Model {
         final Map<String,Object> requestAliases = new HashMap<>();
         requestAliases.put("g", "social");
 
-        RequestMessage requestMessage;
-        requestMessage = RequestMessage.build("authentication").
-                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
-                add("saslMechanism", "PLAIN", "sasl", "AHN0ZXBocGhlbgBwYXNzd29yZA==").create();
-        addRequestMessageEntry(requestMessage, "Authentication Response", "The following `RequestMessage` is an example of the response that should be made to a SASL-based authentication challenge.");
-        requestMessage = RequestMessage.build("eval").processor("session").
-                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
-                add("gremlin", "g.V(x)", "bindings", requestBindings, "language", "gremlin-groovy", "session", "unique-session-identifier").create();
-        addRequestMessageEntry(requestMessage, "Session Eval", "The following `RequestMessage` is an example of a simple session request for a script evaluation with parameters.");
-        requestMessage = RequestMessage.build("eval").processor("session").
-                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
-                add("gremlin", "social.V(x)", "bindings", requestBindings, "language", "gremlin-groovy", "aliases", requestAliases, "session","unique-session-identifier").create();
-        addRequestMessageEntry(requestMessage, "Session Eval Aliased", "The following `RequestMessage` is an example of a session request for a script evaluation with an alias that binds the `TraversalSource` of \"g\" to \"social\".");
-        requestMessage = RequestMessage.build("close").processor("session").
-                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
-                add("session", "unique-session-identifier").create();
-        addRequestMessageEntry(requestMessage, "Session Close", "The following `RequestMessage` is an example of a request to close a session.");
-        requestMessage = RequestMessage.build("eval").
-                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
-                add("gremlin", "g.V(x)", "bindings", requestBindings, "language", "gremlin-groovy").create();
-        addRequestMessageEntry(requestMessage, "Sessionless Eval", "The following `RequestMessage` is an example of a simple sessionless request for a script evaluation with parameters.");
-        requestMessage = RequestMessage.build("eval").
-                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
-                add("gremlin", "social.V(x)", "bindings", requestBindings, "language", "gremlin-groovy", "aliases", requestAliases).create();
-        addRequestMessageEntry(requestMessage, "Sessionless Eval Aliased", "The following `RequestMessage` is an example of a sessionless request for a script evaluation with an alias that binds the `TraversalSource` of \"g\" to \"social\".");
-
-        ResponseMessage responseMessage = ResponseMessage.build(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).
-                code(HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED).create();
-        addResponseMessageEntry(responseMessage, "Authentication Challenge", "When authentication is enabled, an initial request to the server will result in an authentication challenge. The typical response message will appear as follows, but handling it could be different depending on the SASL implementation (e.g. multiple challenges maybe requested in some cases, but not in the default provided by Gremlin Server).");
-        responseMessage = ResponseMessage.build(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).
-                code(HttpResponseStatus.OK).
-                result(Collections.singletonList(graph.vertices().next())).create();
-        addResponseMessageEntry(responseMessage, "Standard Result", "The following `ResponseMessage` is a typical example of the typical successful response Gremlin Server will return when returning results from a script.");
+//        TODO: revisit
+//        RequestMessage requestMessage;
+//        requestMessage = RequestMessage.build("authentication").
+//                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
+//                add("saslMechanism", "PLAIN", "sasl", "AHN0ZXBocGhlbgBwYXNzd29yZA==").create();
+//        addRequestMessageEntry(requestMessage, "Authentication Response", "The following `RequestMessage` is an example of the response that should be made to a SASL-based authentication challenge.");
+//        requestMessage = RequestMessage.build("eval").processor("session").
+//                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
+//                add("gremlin", "g.V(x)", "bindings", requestBindings, "language", "gremlin-groovy", "session", "unique-session-identifier").create();
+//        addRequestMessageEntry(requestMessage, "Session Eval", "The following `RequestMessage` is an example of a simple session request for a script evaluation with parameters.");
+//        requestMessage = RequestMessage.build("eval").processor("session").
+//                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
+//                add("gremlin", "social.V(x)", "bindings", requestBindings, "language", "gremlin-groovy", "aliases", requestAliases, "session","unique-session-identifier").create();
+//        addRequestMessageEntry(requestMessage, "Session Eval Aliased", "The following `RequestMessage` is an example of a session request for a script evaluation with an alias that binds the `TraversalSource` of \"g\" to \"social\".");
+//        requestMessage = RequestMessage.build("close").processor("session").
+//                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
+//                add("session", "unique-session-identifier").create();
+//        addRequestMessageEntry(requestMessage, "Session Close", "The following `RequestMessage` is an example of a request to close a session.");
+//        requestMessage = RequestMessage.build("eval").
+//                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
+//                add("gremlin", "g.V(x)", "bindings", requestBindings, "language", "gremlin-groovy").create();
+//        addRequestMessageEntry(requestMessage, "Sessionless Eval", "The following `RequestMessage` is an example of a simple sessionless request for a script evaluation with parameters.");
+//        requestMessage = RequestMessage.build("eval").
+//                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
+//                add("gremlin", "social.V(x)", "bindings", requestBindings, "language", "gremlin-groovy", "aliases", requestAliases).create();
+//        addRequestMessageEntry(requestMessage, "Sessionless Eval Aliased", "The following `RequestMessage` is an example of a sessionless request for a script evaluation with an alias that binds the `TraversalSource` of \"g\" to \"social\".");
+//
+//        ResponseMessage responseMessage = ResponseMessage.build(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).
+//                code(org.apache.tinkerpop.gremlin.util.message.ResponseStatusCode.AUTHENTICATE).create();
+//        addResponseMessageEntry(responseMessage, "Authentication Challenge", "When authentication is enabled, an initial request to the server will result in an authentication challenge. The typical response message will appear as follows, but handling it could be different depending on the SASL implementation (e.g. multiple challenges maybe requested in some cases, but not in the default provided by Gremlin Server).");
+//        responseMessage = ResponseMessage.build(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).
+//                code(org.apache.tinkerpop.gremlin.util.message.ResponseStatusCode.SUCCESS).
+//                result(Collections.singletonList(graph.vertices().next())).create();
+//        addResponseMessageEntry(responseMessage, "Standard Result", "The following `ResponseMessage` is a typical example of the typical successful response Gremlin Server will return when returning results from a script.");
         
         addExtendedEntry(new BigDecimal(new BigInteger("123456789987654321123456789987654321")), "BigDecimal", "");
         addExtendedEntry(new BigInteger("123456789987654321123456789987654321"), "BigInteger", "");
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
index 394384650e..bc1fc271ab 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
@@ -108,8 +108,9 @@ public class GraphBinaryCompatibilityTest extends AbstractTypedCompatibilityTest
         }
     }
 
-    @Override
-    public void shouldReadWriteAuthenticationChallenge() throws Exception {
-        super.shouldReadWriteAuthenticationChallenge();
-    }
+//    TODO: revisit
+//    @Override
+//    public void shouldReadWriteAuthenticationChallenge() throws Exception {
+//        super.shouldReadWriteAuthenticationChallenge();
+//    }
 }
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
index 15a0e6897d..0451d36da6 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
@@ -24,8 +24,6 @@ import org.apache.tinkerpop.gremlin.structure.io.Model;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3;
 import org.apache.tinkerpop.gremlin.util.TestSupport;
-import org.apache.tinkerpop.gremlin.util.ser.AbstractGraphSONMessageSerializerV2;
-import org.apache.tinkerpop.gremlin.util.ser.GraphSONMessageSerializerV3;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -45,13 +43,13 @@ public class GraphSONTypedCompatibilityTest extends AbstractTypedCompatibilityTe
             addRegistry(TinkerIoRegistryV2.instance()).
             typeInfo(TypeInfo.PARTIAL_TYPES).
             addCustomModule(GraphSONXModuleV2.build()).
-            addCustomModule(new AbstractGraphSONMessageSerializerV2.GremlinServerModule()).
+//            addCustomModule(new AbstractGraphSONMessageSerializerV2.GremlinServerModule()).
             version(GraphSONVersion.V2_0).create().createMapper();
 
     private static ObjectMapper mapperV3 = GraphSONMapper.build().
             addRegistry(TinkerIoRegistryV3.instance()).
             addCustomModule(GraphSONXModuleV3.build()).
-            addCustomModule(new GraphSONMessageSerializerV3.GremlinServerModule()).
+//            addCustomModule(new GraphSONMessageSerializerV3.GremlinServerModule()).
             version(GraphSONVersion.V3_0).create().createMapper();
 
     private static final String testCaseDataPath = root.getPath() + File.separator + "test-case-data" + File.separator
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
index fa02c89256..dfb7a9b2aa 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
@@ -23,8 +23,6 @@ import org.apache.tinkerpop.gremlin.structure.io.AbstractUntypedCompatibilityTes
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3;
-import org.apache.tinkerpop.gremlin.util.ser.AbstractGraphSONMessageSerializerV1;
-import org.apache.tinkerpop.gremlin.util.ser.AbstractGraphSONMessageSerializerV2;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -43,21 +41,21 @@ public class GraphSONUntypedCompatibilityTest extends AbstractUntypedCompatibili
     private static final ObjectMapper mapperV1 = GraphSONMapper.build().
             addRegistry(TinkerIoRegistryV1.instance()).
             typeInfo(TypeInfo.NO_TYPES).
-            addCustomModule(new AbstractGraphSONMessageSerializerV1.GremlinServerModule()).
+//            addCustomModule(new AbstractGraphSONMessageSerializerV1.GremlinServerModule()).
             version(GraphSONVersion.V1_0).create().createMapper();
 
     private static final ObjectMapper mapperV2 = GraphSONMapper.build().
                     addRegistry(TinkerIoRegistryV2.instance()).
                     typeInfo(TypeInfo.NO_TYPES).
                     addCustomModule(GraphSONXModuleV2.build()).
-                    addCustomModule(new AbstractGraphSONMessageSerializerV2.GremlinServerModule()).
+//                    addCustomModule(new AbstractGraphSONMessageSerializerV2.GremlinServerModule()).
                     version(GraphSONVersion.V2_0).create().createMapper();
 
     private static final ObjectMapper mapperV3 = GraphSONMapper.build().
             addRegistry(TinkerIoRegistryV3.instance()).
             typeInfo(TypeInfo.NO_TYPES).
             addCustomModule(GraphSONXModuleV3.build()).
-            addCustomModule(new AbstractGraphSONMessageSerializerV2.GremlinServerModule()).
+//            addCustomModule(new AbstractGraphSONMessageSerializerV2.GremlinServerModule()).
             version(GraphSONVersion.V3_0).create().createMapper();
 
     private static final String testCaseDataPath = root.getPath() + File.separator + "test-case-data" + File.separator
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV1Test.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV1Test.java
deleted file mode 100644
index b62909a390..0000000000
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV1Test.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.shaded.jackson.core.StreamReadConstraints;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-
-public class AbstractGraphSONMessageSerializerV1Test {
-    @Test
-    public void shouldApplyMaxTokenLengthsOnConfigure() {
-        // Initialize bare-bones AbstractGraphSONMessageSerializerV1
-        final AbstractGraphSONMessageSerializerV1 serializer = new AbstractGraphSONMessageSerializerV1() {
-            @Override byte[] obtainHeader() { return new byte[0]; }
-            @Override GraphSONMapper.Builder configureBuilder(GraphSONMapper.Builder builder) { return builder;}
-            @Override public String[] mimeTypesSupported() {return new String[0]; }
-        };
-
-        final Map<String, Object> config = new HashMap<>();
-        config.put("maxNumberLength", 999);
-        config.put("maxStringLength", 12345);
-        config.put("maxNestingDepth", 55);
-
-        serializer.configure(config, null);
-
-        final StreamReadConstraints constraints = serializer.getMapper().getFactory().streamReadConstraints();
-
-        assertEquals(999, constraints.getMaxNumberLength());
-        assertEquals(12345, constraints.getMaxStringLength());
-        assertEquals(55, constraints.getMaxNestingDepth());
-    }
-}
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV2Test.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV4Test.java
similarity index 89%
rename from gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV2Test.java
rename to gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV4Test.java
index 14232c5c82..3b89688d3f 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV2Test.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractGraphSONMessageSerializerV4Test.java
@@ -27,12 +27,11 @@ import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
 
-public class AbstractGraphSONMessageSerializerV2Test {
+public class AbstractGraphSONMessageSerializerV4Test {
     @Test
     public void shouldApplyMaxTokenLengthsOnConfigure() {
         // Initialize bare-bones AbstractGraphSONMessageSerializerV2
-        final AbstractGraphSONMessageSerializerV2 serializer = new AbstractGraphSONMessageSerializerV2() {
-            @Override byte[] obtainHeader() { return new byte[0]; }
+        final AbstractGraphSONMessageSerializerV4 serializer = new AbstractGraphSONMessageSerializerV4() {
             @Override GraphSONMapper.Builder configureBuilder(GraphSONMapper.Builder builder) { return builder;}
             @Override public String[] mimeTypesSupported() {return new String[0]; }
         };
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV1Test.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV1Test.java
deleted file mode 100644
index 6e7a1a10f0..0000000000
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV1Test.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.UnpooledByteBufAllocator;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.apache.tinkerpop.shaded.jackson.databind.util.StdDateFormat;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-/**
- * Serializer tests that cover lossy serialization/deserialization methods.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class GraphSONMessageSerializerV1Test {
-
-    private UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1");
-    private ResponseMessage.Builder responseMessageBuilder = ResponseMessage.build(requestId);
-    private static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
-
-    public MessageSerializer<ObjectMapper> serializer = new GraphSONMessageSerializerV1();
-
-    @Test
-    public void shouldSerializeIterable() throws Exception {
-        final ArrayList<Integer> list = new ArrayList<>();
-        list.add(1);
-        list.add(100);
-
-        final ResponseMessage response = convert(list);
-        assertCommon(response);
-
-        final List<Integer> deserializedFunList = (List<Integer>) response.getResult().getData();
-        assertEquals(2, deserializedFunList.size());
-        assertEquals(new Integer(1), deserializedFunList.get(0));
-        assertEquals(new Integer(100), deserializedFunList.get(1));
-    }
-
-    @Test
-    public void shouldSerializeIterableWithNull() throws Exception {
-        final ArrayList<Integer> list = new ArrayList<>();
-        list.add(1);
-        list.add(null);
-        list.add(100);
-
-        final ResponseMessage response = convert(list);
-        assertCommon(response);
-
-        final List<Integer> deserializedFunList = (List<Integer>) response.getResult().getData();
-        assertEquals(3, deserializedFunList.size());
-        assertEquals(new Integer(1), deserializedFunList.get(0));
-        assertNull(deserializedFunList.get(1));
-        assertEquals(new Integer(100), deserializedFunList.get(2));
-    }
-
-    @Test
-    public void shouldSerializeMap() throws Exception {
-        final Map<String, Object> map = new HashMap<>();
-        final Map<String, String> innerMap = new HashMap<>();
-        innerMap.put("a", "b");
-
-        map.put("x", 1);
-        map.put("y", "some");
-        map.put("z", innerMap);
-
-        final ResponseMessage response = convert(map);
-        assertCommon(response);
-
-        final Map<String, Object> deserializedMap = (Map<String, Object>) response.getResult().getData();
-        assertEquals(3, deserializedMap.size());
-        assertEquals(1, deserializedMap.get("x"));
-        assertEquals("some", deserializedMap.get("y"));
-
-        final Map<String, String> deserializedInnerMap = (Map<String, String>) deserializedMap.get("z");
-        assertEquals(1, deserializedInnerMap.size());
-        assertEquals("b", deserializedInnerMap.get("a"));
-    }
-
-    @Test
-    public void shouldSerializeMapEntries() throws Exception {
-        final Graph graph = TinkerGraph.open();
-        final Vertex v1 = graph.addVertex();
-        final Date d = new Date();
-
-        final Map<Object, Object> map = new HashMap<>();
-        map.put("x", 1);
-        map.put(v1, 100);
-        map.put(d, "test");
-
-        final ResponseMessage response = convert(IteratorUtils.asList(map.entrySet()));
-        assertCommon(response);
-
-        final List<Map<String, Object>> deserializedEntries = (List<Map<String, Object>>) response.getResult().getData();
-        assertEquals(3, deserializedEntries.size());
-        deserializedEntries.forEach(e -> {
-            if (e.containsKey("x"))
-                assertEquals(1, e.get("x"));
-            else if (e.containsKey(v1.id().toString()))
-                assertEquals(100, e.get(v1.id().toString()));
-            else if (e.containsKey(StdDateFormat.instance.format(d)))
-                assertEquals("test", e.get(StdDateFormat.instance.format(d)));
-            else
-                fail("Map entries contains a key that is not part of what was serialized");
-        });
-    }
-
-    @Test
-    public void shouldSerializeEdge() throws Exception {
-        final Graph graph = TinkerGraph.open();
-        final Vertex v1 = graph.addVertex();
-        final Vertex v2 = graph.addVertex();
-        final Edge e = v1.addEdge("test", v2);
-        e.property("abc", 123);
-
-        final Iterable<Edge> iterable = IteratorUtils.list(graph.edges());
-
-        final ResponseMessage response = convert(iterable);
-        assertCommon(response);
-
-        final List<Map<String, Object>> edgeList = (List<Map<String, Object>>) response.getResult().getData();
-        assertEquals(1, edgeList.size());
-
-        final Map<String, Object> deserializedEdge = edgeList.get(0);
-        assertEquals(e.id(), deserializedEdge.get(GraphSONTokens.ID));
-        assertEquals(v1.id(), deserializedEdge.get(GraphSONTokens.OUT));
-        assertEquals(v2.id(), deserializedEdge.get(GraphSONTokens.IN));
-        assertEquals(v1.label(), deserializedEdge.get(GraphSONTokens.OUT_LABEL));
-        assertEquals(v2.label(), deserializedEdge.get(GraphSONTokens.IN_LABEL));
-        assertEquals(e.label(), deserializedEdge.get(GraphSONTokens.LABEL));
-        assertEquals(GraphSONTokens.EDGE, deserializedEdge.get(GraphSONTokens.TYPE));
-
-        final Map<String, Object> properties = (Map<String, Object>) deserializedEdge.get(GraphSONTokens.PROPERTIES);
-        assertNotNull(properties);
-        assertEquals(123, properties.get("abc"));
-
-    }
-
-    @Test
-    public void shouldSerializeEdgeProperty() throws Exception {
-        final Graph graph = TinkerGraph.open();
-        final Vertex v1 = graph.addVertex();
-        final Vertex v2 = graph.addVertex();
-        final Edge e = v1.addEdge("test", v2);
-        e.property("abc", 123);
-
-        final Iterable<Property<Object>> iterable = IteratorUtils.list(e.properties("abc"));
-        final ResponseMessage response = convert(iterable);
-        assertCommon(response);
-
-        final List<Map<String, Object>> propertyList = (List<Map<String, Object>>) response.getResult().getData();
-        assertEquals(1, propertyList.size());
-        assertEquals(123, propertyList.get(0).get("value"));
-    }
-
-    @Test
-    public void shouldSerializeVertexWithEmbeddedMap() throws Exception {
-        final Graph graph = TinkerGraph.open();
-        final Vertex v = graph.addVertex();
-        final Map<String, Object> map = new HashMap<>();
-        map.put("x", 500);
-        map.put("y", "some");
-
-        final ArrayList<Object> friends = new ArrayList<>();
-        friends.add("x");
-        friends.add(5);
-        friends.add(map);
-
-        v.property(VertexProperty.Cardinality.single, "friends", friends);
-
-        final List list = IteratorUtils.list(graph.vertices());
-
-        final ResponseMessage response = convert(list);
-        assertCommon(response);
-
-        final List<Map<String, Object>> vertexList = (List<Map<String, Object>>) response.getResult().getData();
-        assertEquals(1, vertexList.size());
-
-        final Map<String, Object> deserializedVertex = vertexList.get(0);
-        assertEquals(v.id(), deserializedVertex.get(GraphSONTokens.ID));
-        assertEquals(Vertex.DEFAULT_LABEL, deserializedVertex.get(GraphSONTokens.LABEL));
-
-        final Map<String, Object> properties = ((Map<String, Object>) deserializedVertex.get(GraphSONTokens.PROPERTIES));
-        assertEquals(1, properties.size());
-
-        final List<Map<String,Object>> friendsProperties = (List<Map<String,Object>>) properties.get("friends");
-        assertEquals(1, friendsProperties.size());
-
-        final List<Object> deserializedInnerList = (List<Object>) friendsProperties.get(0).get(GraphSONTokens.VALUE);
-        assertEquals(3, deserializedInnerList.size());
-        assertEquals("x", deserializedInnerList.get(0));
-        assertEquals(5, deserializedInnerList.get(1));
-
-        final Map<String, Object> deserializedInnerInnerMap = (Map<String, Object>) deserializedInnerList.get(2);
-        assertEquals(2, deserializedInnerInnerMap.size());
-        assertEquals(500, deserializedInnerInnerMap.get("x"));
-        assertEquals("some", deserializedInnerInnerMap.get("y"));
-    }
-
-    @Test
-    public void shouldSerializeToJsonMapWithElementForKey() throws Exception {
-        final TinkerGraph graph = TinkerFactory.createClassic();
-        final GraphTraversalSource g = graph.traversal();
-        final Map<Vertex, Integer> map = new HashMap<>();
-        map.put(g.V().has("name", "marko").next(), 1000);
-
-        final ResponseMessage response = convert(map);
-        assertCommon(response);
-
-        final Map<String, Integer> deserializedMap = (Map<String, Integer>) response.getResult().getData();
-        assertEquals(1, deserializedMap.size());
-
-        // with no embedded types the key (which is a vertex) simply serializes out to an id
-        // {"result":{"1":1000},"code":200,"requestId":"2d62161b-9544-4f39-af44-62ec49f9a595","type":0}
-        assertEquals(new Integer(1000), deserializedMap.get("1"));
-    }
-
-    @Test
-    public void shouldSerializeToTreeJson() throws Exception {
-        final TinkerGraph graph = TinkerFactory.createClassic();
-        final GraphTraversalSource g = graph.traversal();
-        final Map t = g.V(1).out().properties("name").tree().next();
-
-        final ResponseMessage response = convert(t);
-        assertCommon(response);
-
-        final Map<String, Map<String, Map>> deserializedMap = (Map<String, Map<String, Map>>) response.getResult().getData();
-
-        assertEquals(1, deserializedMap.size());
-
-        //check the first object and it's properties
-        final Map<String,Object> vertex = deserializedMap.get("1").get("key");
-        final Map<String,List<Map>> vertexProperties = (Map<String, List<Map>>)vertex.get("properties");
-        assertEquals(1, (int)vertex.get("id"));
-        assertEquals("marko", vertexProperties.get("name").get(0).get("value"));
-
-        //check objects tree structure
-        //check Vertex property
-        final Map<String, Map<String, Map>> subTreeMap =  deserializedMap.get("1").get("value");
-        final Map<String, Map<String, Map>> subTreeMap2 = subTreeMap.get("2").get("value");
-        final Map<String, String> vertexPropertiesDeep = subTreeMap2.get("2").get("key");
-        assertEquals("vadas", vertexPropertiesDeep.get("value"));
-        assertEquals("name", vertexPropertiesDeep.get("label"));
-
-        // check subitem
-        final Map<String,Object> vertex2 = subTreeMap.get("3").get("key");
-        final Map<String,List<Map>> vertexProperties2 = (Map<String, List<Map>>)vertex2.get("properties");
-
-        assertEquals("lop", vertexProperties2.get("name").get(0).get("value"));
-    }
-
-    @Test
-    public void shouldSerializeFullResponseMessage() throws Exception {
-        final UUID id = UUID.randomUUID();
-
-        final Map<String, Object> metaData = new HashMap<>();
-        metaData.put("test", "this");
-        metaData.put("one", 1);
-
-        final Map<String, Object> attributes = new HashMap<>();
-        attributes.put("test", "that");
-        attributes.put("two", 2);
-
-        final ResponseMessage response = ResponseMessage.build(id)
-                .responseMetaData(metaData)
-                .code(HttpResponseStatus.OK)
-                .result("some-result")
-                .statusAttributes(attributes)
-                .statusMessage("worked")
-                .create();
-
-        final ByteBuf bb = serializer.serializeResponseAsBinary(response, allocator);
-        final ResponseMessage deserialized = serializer.deserializeResponse(bb);
-
-        assertEquals(id, deserialized.getRequestId());
-        assertEquals("this", deserialized.getResult().getMeta().get("test"));
-        assertEquals(1, deserialized.getResult().getMeta().get("one"));
-        assertEquals("some-result", deserialized.getResult().getData());
-        assertEquals("that", deserialized.getStatus().getAttributes().get("test"));
-        assertEquals(2, deserialized.getStatus().getAttributes().get("two"));
-        assertEquals(HttpResponseStatus.OK.code(), deserialized.getStatus().getCode().code());
-        assertEquals("worked", deserialized.getStatus().getMessage());
-    }
-    
-    private void assertCommon(final ResponseMessage response) {
-        assertEquals(requestId, response.getRequestId());
-        assertEquals(HttpResponseStatus.OK, response.getStatus().getCode());
-    }
-
-    private ResponseMessage convert(final Object toSerialize) throws SerializationException {
-        final ByteBuf bb = serializer.serializeResponseAsBinary(responseMessageBuilder.result(toSerialize).create(), allocator);
-        return serializer.deserializeResponse(bb);
-    }
-}
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV2Test.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV2Test.java
deleted file mode 100644
index 906cf0cafc..0000000000
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV2Test.java
+++ /dev/null
@@ -1,627 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.UnpooledByteBufAllocator;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.io.AbstractIoRegistry;
-import org.apache.tinkerpop.gremlin.structure.io.GraphWriter;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONIo;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV2;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.TinkerPopJacksonModule;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.shaded.jackson.core.JsonGenerationException;
-import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
-import org.apache.tinkerpop.shaded.jackson.databind.JsonMappingException;
-import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
-import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
-import org.apache.tinkerpop.shaded.jackson.databind.node.NullNode;
-import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdScalarSerializer;
-import org.apache.tinkerpop.shaded.jackson.databind.util.StdDateFormat;
-import org.junit.Test;
-
-import java.awt.*;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * These tests focus on message serialization and not "result" serialization as test specific to results (e.g.
- * vertices, edges, annotated values, etc.) are handled in the IO packages.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-@SuppressWarnings("unchecked")
-public class GraphSONMessageSerializerV2Test {
-
-    public static final GraphSONMessageSerializerV2 SERIALIZER = new GraphSONMessageSerializerV2();
-    private static final RequestMessage msg = RequestMessage.build("op")
-            .overrideRequestId(UUID.fromString("2D62161B-9544-4F39-AF44-62EC49F9A595")).create();
-    private static final ObjectMapper mapper = new ObjectMapper();
-
-    private final UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1");
-    private final ResponseMessage.Builder responseMessageBuilder = ResponseMessage.build(requestId);
-    private final static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
-
-    @Test
-    public void shouldConfigureIoRegistry() throws Exception {
-        final GraphSONMessageSerializerV2 serializer = new GraphSONMessageSerializerV2();
-        final Map<String, Object> config = new HashMap<String, Object>() {{
-            put(AbstractMessageSerializer.TOKEN_IO_REGISTRIES, Arrays.asList(ColorIoRegistry.class.getName()));
-        }};
-
-        serializer.configure(config, null);
-
-        final ResponseMessage toSerialize = ResponseMessage.build(UUID.fromString("2D62161B-9544-4F39-AF44-62EC49F9A595"))
-                .result(Color.RED).create();
-        final String results = serializer.serializeResponseAsString(toSerialize, allocator);
-        final JsonNode json = mapper.readTree(results);
-        assertNotNull(json);
-        assertThat(json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA).get(GraphSONTokens.VALUEPROP).booleanValue(), is(true));
-        assertEquals("java:color", json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA).get(GraphSONTokens.VALUETYPE).textValue());
-    }
-
-    @Test
-    public void shouldSerializeToJsonNullResultReturnsNull() throws Exception {
-        final ResponseMessage message = ResponseMessage.build(msg).create();
-        final String results = SERIALIZER.serializeResponseAsString(message, allocator);
-        final JsonNode json = mapper.readTree(results);
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.path(SerTokens.TOKEN_REQUEST).asText());
-        assertEquals(NullNode.getInstance(), json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA));
-    }
-
-    @Test
-    public void shouldSerializeToJsonIterable() throws Exception {
-        final ArrayList<FunObject> funList = new ArrayList<>();
-        funList.add(new FunObject("x"));
-        funList.add(new FunObject("y"));
-
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(funList).create(), allocator);
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode converted = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-
-        assertEquals(2, converted.size());
-
-        assertEquals("x", converted.get(0).asText());
-        assertEquals("y", converted.get(1).asText());
-    }
-
-    @Test
-    public void shouldSerializeToJsonIterator() throws Exception {
-        final ArrayList<FunObject> funList = new ArrayList<>();
-        funList.add(new FunObject("x"));
-        funList.add(new FunObject("y"));
-
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(funList).create(), allocator);
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode converted = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-
-        assertEquals(2, converted.size());
-
-        assertEquals("x", converted.get(0).asText());
-        assertEquals("y", converted.get(1).asText());
-    }
-
-    @Test
-    public void shouldSerializeToJsonIteratorNullElement() throws Exception {
-
-        final ArrayList<FunObject> funList = new ArrayList<>();
-        funList.add(new FunObject("x"));
-        funList.add(null);
-        funList.add(new FunObject("y"));
-
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(funList.iterator()).create(), allocator);
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode converted = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-
-        assertEquals(3, converted.size());
-
-        assertEquals("x", converted.get(0).asText());
-        assertEquals(NullNode.getInstance(), converted.get(1));
-        assertEquals("y", converted.get(2).asText());
-    }
-
-    @Test
-    public void shouldSerializeToJsonMap() throws Exception {
-        final Map<String, Object> map = new HashMap<>();
-        final Map<String, String> innerMap = new HashMap<>();
-        innerMap.put("a", "b");
-
-        map.put("x", new FunObject("x"));
-        map.put("y", "some");
-        map.put("z", innerMap);
-
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(map).create(), allocator);
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode jsonObject = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-
-        assertNotNull(jsonObject);
-        assertEquals("some", jsonObject.get("y").asText());
-        assertEquals("x", jsonObject.get("x").asText());
-
-        final JsonNode innerJsonObject = jsonObject.get("z");
-        assertNotNull(innerJsonObject);
-        assertEquals("b", innerJsonObject.get("a").asText());
-    }
-
-    @Test
-    public void shouldShouldSerializeMapEntries() throws Exception {
-        final Graph graph = TinkerGraph.open();
-        final Vertex v1 = graph.addVertex();
-        final Date d = new Date();
-
-        final Map<Object, Object> map = new HashMap<>();
-        map.put("x", 1);
-        map.put(v1, 100);
-        map.put(d, "test");
-
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(IteratorUtils.asList(map)).create(), allocator);
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode jsonObject = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-        jsonObject.elements().forEachRemaining(e -> {
-            if (e.has("x"))
-                assertEquals(1, e.get("x").get(GraphSONTokens.VALUEPROP).asInt());
-            else if (e.has(v1.id().toString()))
-                assertEquals(100, e.get(v1.id().toString()).get(GraphSONTokens.VALUEPROP).asInt());
-            else if (e.has(StdDateFormat.instance.format(d)))
-                assertEquals("test", e.get(StdDateFormat.instance.format(d)).asText());
-            else
-                fail("Map entries contains a key that is not part of what was serialized");
-        });
-    }
-
-    @Test
-    public void shouldSerializeEdge() throws Exception {
-        final Graph g = TinkerGraph.open();
-        final Vertex v1 = g.addVertex();
-        final Vertex v2 = g.addVertex();
-        final Edge e = v1.addEdge("test", v2);
-        e.property("abc", 123);
-
-        final Iterable<Edge> iterable = IteratorUtils.list(g.edges());
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(iterable).create(), allocator);
-
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode converted = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-
-        assertNotNull(converted);
-        assertEquals(1, converted.size());
-
-        final JsonNode edgeAsJson = converted.get(0).get(GraphSONTokens.VALUEPROP);
-        assertNotNull(edgeAsJson);
-
-        assertEquals(((Long) e.id()).longValue(), edgeAsJson.get(GraphSONTokens.ID).get(GraphSONTokens.VALUEPROP).asLong());
-        assertEquals(((Long) v1.id()).longValue(), edgeAsJson.get(GraphSONTokens.OUT).get(GraphSONTokens.VALUEPROP).asLong());
-        assertEquals(((Long) v2.id()).longValue(), edgeAsJson.get(GraphSONTokens.IN).get(GraphSONTokens.VALUEPROP).asLong());
-        assertEquals(e.label(), edgeAsJson.get(GraphSONTokens.LABEL).asText());
-
-        final JsonNode properties = edgeAsJson.get(GraphSONTokens.PROPERTIES);
-        assertNotNull(properties);
-        assertEquals(123, properties.get("abc").get(GraphSONTokens.VALUEPROP).get("value").get(GraphSONTokens.VALUEPROP).asInt());
-    }
-
-    @Test
-    public void shouldSerializeEdgeProperty() throws Exception {
-        final Graph g = TinkerGraph.open();
-        final Vertex v1 = g.addVertex();
-        final Vertex v2 = g.addVertex();
-        final Edge e = v1.addEdge("test", v2);
-        e.property("abc", 123);
-
-        final Iterable<Property<Object>> iterable = IteratorUtils.list(e.properties("abc"));
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(iterable).create(), allocator);
-
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode converted = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-
-        assertNotNull(converted);
-        assertEquals(1, converted.size());
-
-        final JsonNode propertyAsJson = converted.get(0);
-        assertNotNull(propertyAsJson);
-
-        assertEquals(123, propertyAsJson.get(GraphSONTokens.VALUEPROP).get("value").get(GraphSONTokens.VALUEPROP).asInt());
-    }
-
-    @Test
-    public void shouldSerializeToJsonIteratorWithEmbeddedMap() throws Exception {
-        final Graph g = TinkerGraph.open();
-        final Vertex v = g.addVertex();
-        final Map<String, Object> map = new HashMap<>();
-        map.put("x", 500);
-        map.put("y", "some");
-
-        final ArrayList<Object> friends = new ArrayList<>();
-        friends.add("x");
-        friends.add(5);
-        friends.add(map);
-
-        v.property(VertexProperty.Cardinality.single, "friends", friends);
-
-        final Iterable iterable = IteratorUtils.list(g.vertices());
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(iterable).create(), allocator);
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode converted = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-
-        assertNotNull(converted);
-        assertEquals(1, converted.size());
-
-        final JsonNode vertexAsJson = converted.get(0).get(GraphSONTokens.VALUEPROP);
-        assertNotNull(vertexAsJson);
-
-        final JsonNode properties = vertexAsJson.get(GraphSONTokens.PROPERTIES);
-        assertNotNull(properties);
-        assertEquals(1, properties.size());
-
-        final JsonNode friendProperties = properties.get("friends");
-        assertEquals(1, friendProperties.size());
-        final JsonNode friendsProperty = friendProperties.get(0).get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.VALUE);
-        assertNotNull(friendsProperty);
-        assertEquals(3, friendsProperty.size());
-
-        final String object1 = friendsProperty.get(0).asText();
-        assertEquals("x", object1);
-
-        final int object2 = friendsProperty.get(1).get(GraphSONTokens.VALUEPROP).asInt();
-        assertEquals(5, object2);
-
-        final JsonNode object3 = friendsProperty.get(2);
-        assertEquals(500, object3.get("x").get(GraphSONTokens.VALUEPROP).asInt());
-        assertEquals("some", object3.get("y").asText());
-    }
-
-    @Test
-    public void shouldSerializeToJsonMapWithElementForKey() throws Exception {
-        final TinkerGraph graph = TinkerFactory.createClassic();
-        final GraphTraversalSource g = graph.traversal();
-        final Map<Vertex, Integer> map = new HashMap<>();
-        map.put(g.V().has("name", "marko").next(), 1000);
-
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(map).create(), allocator);
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode converted = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-
-        assertNotNull(converted);
-
-        // with no embedded types the key (which is a vertex) simply serializes out to an id
-        // {"result":{"1":1000},"code":200,"requestId":"2d62161b-9544-4f39-af44-62ec49f9a595","type":0}
-        assertEquals(1000, converted.get("1").get(GraphSONTokens.VALUEPROP).asInt());
-    }
-
-    @Test
-    public void shouldDeserializeRequestNicelyWithNoArgs() throws Exception {
-        final UUID request = UUID.fromString("011CFEE9-F640-4844-AC93-034448AC0E80");
-        final RequestMessage m = SERIALIZER.deserializeRequest(String.format("{\"requestId\":\"%s\",\"op\":\"eval\"}", request));
-        assertEquals(request, m.getRequestId());
-        assertEquals("eval", m.getOp());
-        assertNotNull(m.getArgs());
-        assertEquals(0, m.getArgs().size());
-    }
-
-    @Test
-    public void shouldDeserializeRequestNicelyWithArgs() throws Exception {
-        final UUID request = UUID.fromString("011CFEE9-F640-4844-AC93-034448AC0E80");
-        final RequestMessage m = SERIALIZER.deserializeRequest(String.format("{\"requestId\":\"%s\",\"op\":\"eval\",\"args\":{\"x\":\"y\"}}", request));
-        assertEquals(request, m.getRequestId());
-        assertEquals("eval", m.getOp());
-        assertNotNull(m.getArgs());
-        assertEquals("y", m.getArgs().get("x"));
-    }
-
-    @Test(expected = SerializationException.class)
-    public void shouldDeserializeRequestParseMessage() throws Exception {
-        SERIALIZER.deserializeRequest("{\"requestId\":\"%s\",\"op\":\"eval\",\"args\":{\"x\":\"y\"}}");
-    }
-
-    @Test
-    public void shouldSerializeFullResponseMessage() throws Exception {
-        final UUID id = UUID.randomUUID();
-
-        final Map<String, Object> metaData = new HashMap<>();
-        metaData.put("test", "this");
-        metaData.put("one", 1);
-
-        final Map<String, Object> attributes = new HashMap<>();
-        attributes.put("test", "that");
-        attributes.put("two", 2);
-
-        final ResponseMessage response = ResponseMessage.build(id)
-                .responseMetaData(metaData)
-                .code(HttpResponseStatus.OK)
-                .result("some-result")
-                .statusAttributes(attributes)
-                .statusMessage("worked")
-                .create();
-
-        final String results = SERIALIZER.serializeResponseAsString(response, allocator);
-        final ResponseMessage deserialized = SERIALIZER.deserializeResponse(results);
-
-        assertEquals(id, deserialized.getRequestId());
-        assertEquals("this", deserialized.getResult().getMeta().get("test"));
-        assertEquals(1, deserialized.getResult().getMeta().get("one"));
-        assertEquals("some-result", deserialized.getResult().getData());
-        assertEquals("that", deserialized.getStatus().getAttributes().get("test"));
-        assertEquals(2, deserialized.getStatus().getAttributes().get("two"));
-        assertEquals(HttpResponseStatus.OK.code(), deserialized.getStatus().getCode().code());
-        assertEquals("worked", deserialized.getStatus().getMessage());
-    }
-    
-    @Test
-    public void shouldSerializeToTreeJson() throws Exception {
-        final TinkerGraph graph = TinkerFactory.createClassic();
-        final GraphTraversalSource g = graph.traversal();
-        final Tree t = g.V(1).out().properties("name").tree().next();
-
-        final String results = SERIALIZER.serializeResponseAsString(ResponseMessage.build(msg).result(t).create(), allocator);
-
-        final JsonNode json = mapper.readTree(results);
-
-        assertNotNull(json);
-        assertEquals(msg.getRequestId().toString(), json.get(SerTokens.TOKEN_REQUEST).asText());
-        final JsonNode converted = json.get(SerTokens.TOKEN_RESULT).get(SerTokens.TOKEN_DATA);
-        assertNotNull(converted);
-
-        //result is: tree{v1=>tree{vp['name'->'vadas']=>null, vp['name'->'lop']=>null, vp['name'->'josh']=>null}}
-        
-        //check the first object and it's properties
-        assertEquals(1, converted.get(GraphSONTokens.VALUEPROP)
-                .get(0)
-                .get(GraphSONTokens.KEY).get(GraphSONTokens.VALUEPROP)
-                .get(GraphSONTokens.ID).get(GraphSONTokens.VALUEPROP).asInt());
-
-        assertEquals("marko", converted.get(GraphSONTokens.VALUEPROP)
-                .get(0)
-                .get(GraphSONTokens.KEY).get(GraphSONTokens.VALUEPROP)
-                .get(GraphSONTokens.PROPERTIES)
-                .get("name")
-                .get(0)
-                .get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.VALUE).asText());
-
-        //check the leafs
-        Set expectedValues = new HashSet<String>() {{
-            add("vadas");
-            add("lop");
-            add("josh");
-        }};
-        
-        Set actualValues = new HashSet<String>();
-        for (int i = 0; i < 3; i++) {
-            actualValues.add(converted.get(GraphSONTokens.VALUEPROP)
-                .get(0)
-                .get(GraphSONTokens.VALUE).get(GraphSONTokens.VALUEPROP)
-                .get(i)
-                .get(GraphSONTokens.KEY).get(GraphSONTokens.VALUEPROP)
-                .get(GraphSONTokens.PROPERTIES)
-                .get("name")
-                .get(0)
-                .get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.VALUE).asText());
-        }
-
-        assertEquals(expectedValues, actualValues);
-    }
-
-    @Test
-    public void shouldToStringUnknownObjects() {
-        GraphSONMapper gm20 = GraphSONMapper.build().version(GraphSONVersion.V2_0).create();
-        GraphSONMapper gm10 = GraphSONMapper.build().version(GraphSONVersion.V1_0).create();
-
-        GraphWriter writer = GraphSONWriter.build().mapper(gm20).create();
-        // subsequent creations of GraphWriters and GraphSONMappers should not affect
-        // each other.
-        GraphWriter writer2 = GraphSONWriter.build().mapper(gm10).create();
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            writer.writeObject(baos, new FunObject("value"));
-            assertEquals(baos.toString(), "\"value\"");
-        } catch (Exception e) {
-            fail("should have succeeded serializing the unknown object to a string");
-        }
-    }
-
-    @Test
-    public void shouldSerializeAndDeserializeRequestMessageFromObjectMapper() throws IOException {
-        final ObjectMapper om = GraphSONMapper.build().version(GraphSONVersion.V2_0)
-                .addCustomModule(new GraphSONMessageSerializerV2.GremlinServerModule())
-                .create().createMapper();
-
-        final Map<String, Object> requestBindings = new HashMap<>();
-        requestBindings.put("x", 1);
-
-        final Map<String, Object> requestAliases = new HashMap<>();
-        requestAliases.put("g", "social");
-
-        final RequestMessage requestMessage = RequestMessage.build("eval").processor("session").
-                overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
-                add("gremlin", "social.V(x)", "bindings", requestBindings, "language", "gremlin-groovy", "aliases", requestAliases, "session", UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).create();
-
-        final String json = om.writeValueAsString(requestMessage);
-        final RequestMessage readRequestMessage = om.readValue(json, RequestMessage.class);
-
-        assertEquals(requestMessage.getOp(), readRequestMessage.getOp());
-        assertEquals(requestMessage.getProcessor(), readRequestMessage.getProcessor());
-        assertEquals(requestMessage.getRequestId(), readRequestMessage.getRequestId());
-        assertEquals(requestMessage.getArgs(), readRequestMessage.getArgs());
-    }
-
-    @Test
-    public void shouldSerializeAndDeserializeResponseMessageFromObjectMapper() throws IOException {
-        final ObjectMapper om = GraphSONMapper.build().version(GraphSONVersion.V2_0)
-                .addCustomModule(new GraphSONMessageSerializerV2.GremlinServerModule())
-                .create().createMapper();
-        final Graph graph = TinkerFactory.createModern();
-
-        final ResponseMessage responseMessage = ResponseMessage.build(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).
-                code(HttpResponseStatus.OK).
-                result(Collections.singletonList(graph.vertices().next())).create();
-
-        final String respJson = om.writeValueAsString(responseMessage);
-        final ResponseMessage responseMessageRead = om.readValue(respJson, ResponseMessage.class);
-
-        assertEquals(responseMessage.getRequestId(), responseMessageRead.getRequestId());
-        assertEquals(responseMessage.getResult().getMeta(), responseMessageRead.getResult().getMeta());
-        assertEquals(responseMessage.getResult().getData(), responseMessageRead.getResult().getData());
-        assertEquals(responseMessage.getStatus().getAttributes(), responseMessageRead.getStatus().getAttributes());
-        assertEquals(responseMessage.getStatus().getCode().code(), responseMessageRead.getStatus().getCode().code());
-        assertEquals(responseMessage.getStatus().getMessage(), responseMessageRead.getStatus().getMessage());
-    }
-
-    @Test
-    public void shouldRegisterGremlinServerModuleAutomaticallyWithMapper() throws SerializationException {
-        GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV2.build());
-        GraphSONMessageSerializerV2 graphSONMessageSerializerV2 = new GraphSONMessageSerializerV2(builder);
-
-        ResponseMessage rm = convert("hello", graphSONMessageSerializerV2);
-        assertEquals(rm.getRequestId(), requestId);
-        assertEquals(rm.getResult().getData(), "hello");
-    }
-
-
-    @Test
-    @SuppressWarnings("deprecation")
-    public void shouldFailOnMessageSerializerWithMapperIfNoGremlinServerModule() {
-        final GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV2.build());
-        final GraphSONMessageSerializerV2 graphSONMessageSerializerV2 = new GraphSONMessageSerializerV2(builder.create());
-
-        try {
-            convert("hello", graphSONMessageSerializerV2);
-            fail("Serialization should have failed since no GremlinServerModule registered.");
-        } catch (SerializationException e) {
-            assertTrue(e.getMessage().contains("Could not find a type identifier for the class"));
-            assertTrue(e.getCause() instanceof JsonMappingException);
-            assertTrue(e.getCause().getCause() instanceof IllegalArgumentException);
-        }
-    }
-
-    private ResponseMessage convert(final Object toSerialize, MessageSerializer<?> serializer) throws SerializationException {
-        final ByteBuf bb = serializer.serializeResponseAsBinary(responseMessageBuilder.result(toSerialize).create(), allocator);
-        return serializer.deserializeResponse(bb);
-    }
-
-    private class FunObject {
-        private String val;
-
-        public FunObject(String val) {
-            this.val = val;
-        }
-
-        public String toString() {
-            return this.val;
-        }
-    }
-
-    public static class ColorIoRegistry extends AbstractIoRegistry {
-        public ColorIoRegistry() {
-            register(GraphSONIo.class, null, new ColorSimpleModule());
-        }
-    }
-
-    public static class ColorSimpleModule extends TinkerPopJacksonModule {
-        public ColorSimpleModule() {
-            super("color-fun");
-            addSerializer(Color.class, new ColorSerializer());
-        }
-
-        @Override
-        public Map<Class, String> getTypeDefinitions() {
-            return new HashMap<Class, String>(){{
-                put(Color.class, "color");
-            }};
-        }
-
-        @Override
-        public String getTypeNamespace() {
-            return "java";
-        }
-    }
-
-    public static class ColorSerializer extends StdScalarSerializer<Color> {
-        public ColorSerializer() {
-            super(Color.class);
-        }
-
-        @Override
-        public void serialize(final Color color, final JsonGenerator jsonGenerator,
-                              final SerializerProvider serializerProvider) throws IOException, JsonGenerationException {
-            jsonGenerator.writeBoolean(color.equals(Color.RED));
-        }
-    }
-}
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV3Test.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV3Test.java
deleted file mode 100644
index c117153522..0000000000
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV3Test.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.util.ser;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufAllocator;
-import io.netty.buffer.UnpooledByteBufAllocator;
-import io.netty.handler.codec.http.HttpResponseStatus;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV3;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.util.MessageSerializer;
-import org.apache.tinkerpop.gremlin.util.Tokens;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import org.apache.tinkerpop.shaded.jackson.databind.JsonMappingException;
-import org.junit.Test;
-
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import static org.apache.tinkerpop.gremlin.util.MockitoHamcrestMatcherAdapter.reflectionEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.hasItemInArray;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * Serializer tests that cover non-lossy serialization/deserialization methods.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-@SuppressWarnings("unchecked")
-public class GraphSONMessageSerializerV3Test {
-
-    protected final UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1");
-    protected final ResponseMessage.Builder responseMessageBuilder = ResponseMessage.build(requestId);
-    protected final static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
-
-    public final GraphSONMessageSerializerV3 serializer = new GraphSONMessageSerializerV3();
-
-    @Test
-    public void shouldSerializeIterable() throws Exception {
-        final ArrayList<Integer> list = new ArrayList<>();
-        list.add(1);
-        list.add(100);
-
-        final ResponseMessage response = convert(list);
-        assertCommon(response);
-
-        final List<Integer> deserializedFunList = (List<Integer>) response.getResult().getData();
-        assertEquals(2, deserializedFunList.size());
-        assertEquals(Integer.valueOf(1), deserializedFunList.get(0));
-        assertEquals(Integer.valueOf(100), deserializedFunList.get(1));
-    }
-
-    @Test
-    public void shouldSerializeIterableWithNull() throws Exception {
-        final ArrayList<Integer> list = new ArrayList<>();
-        list.add(1);
-        list.add(null);
-        list.add(100);
-
-        final ResponseMessage response = convert(list);
-        assertCommon(response);
-
-        final List<Integer> deserializedFunList = (List<Integer>) response.getResult().getData();
-        assertEquals(3, deserializedFunList.size());
-        assertEquals(Integer.valueOf(1), deserializedFunList.get(0));
-        assertNull(deserializedFunList.get(1));
-        assertEquals(Integer.valueOf(100), deserializedFunList.get(2));
-    }
-
-    @Test
-    public void shouldSerializeMap() throws Exception {
-        final Map<String, Object> map = new HashMap<>();
-        final Map<String, String> innerMap = new HashMap<>();
-        innerMap.put("a", "b");
-
-        map.put("w", true);
-        map.put("x", 1);
-        map.put("y", "some");
-        map.put("z", innerMap);
-
-        final ResponseMessage response = convert(Collections.singletonList(map));
-        assertCommon(response);
-
-        final Map<String, Object> deserializedMap = (Map<String, Object>) ((List)response.getResult().getData()).get(0);
-        assertEquals(4, deserializedMap.size());
-        assertEquals(true, deserializedMap.get("w"));
-        assertEquals(1, deserializedMap.get("x"));
-        assertEquals("some", deserializedMap.get("y"));
-
-        final Map<String, String> deserializedInnerMap = (Map<String, String>) deserializedMap.get("z");
-        assertEquals(1, deserializedInnerMap.size());
-        assertEquals("b", deserializedInnerMap.get("a"));
-    }
-
-    @Test
-    public void shouldSerializeMapEntries() throws Exception {
-        final Graph graph = TinkerGraph.open();
-        final Vertex v1 = graph.addVertex();
-        final Date d = new Date();
-
-        final Map<Object, Object> map = new HashMap<>();
-        map.put("x", 1);
-        map.put(v1, 100);
-        map.put(d, "test");
-
-        final ResponseMessage response = convert(IteratorUtils.asList(map.entrySet()));
-        assertCommon(response);
-
-        final List<Map<Object, Object>> deserializedEntries = (List<Map<Object, Object>>) response.getResult().getData();
-        assertEquals(3, deserializedEntries.size());
-        deserializedEntries.forEach(m -> {
-            final Map.Entry<Object,Object> e = m.entrySet().iterator().next();
-            if (e.getKey().equals("x"))
-                assertEquals(1, e.getValue());
-            else if (e.getKey() instanceof Vertex && e.getKey().equals(v1))
-                assertEquals(100, e.getValue());
-            else if (e.getKey() instanceof Date)
-                assertEquals("test", e.getValue());
-            else
-                fail("Map entries contains a key that is not part of what was serialized");
-        });
-    }
-
-    @Test
... 2837 lines suppressed ...