Merge branch '3.5-dev'
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 10f1734..ba40a9f 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -16,6 +16,30 @@
 ////
 = TinkerPop3 CHANGELOG
 
+== TinkerPop 3.6.0 (NOT NAMED YET)
+
+
+
+[[release-3-6-0]]
+=== TinkerPop 3.6.0 (Release Date: NOT OFFICIALLY RELEASED YET)
+
+* Changed TinkerGraph to allow identifiers to be heterogeneous when filtering.
+* Fixed query indentation for profile metrics where indent levels were not being respected.
+* `TraversalOpProcessor` no longer accepts a `String` representation of `Bytecode` for the "gremlin" argument which was left to support older versions of the drivers.
+* Removed requirement that "ids" used to filter vertices and edges need to be all of a single type.
+* Created `gremlin-annotations` module where the `@GremlinDsl` annotation and related code has been moved.
+* Removed `groovy` and `groovy-json` dependencies from `gremlin-driver` as well as related `JsonBuilder` serialization support.
+* Replaced log4j usage with logback where builds rely on and packaged distributions now contain the latter.
+* Prevented metrics computation unless the traversal is in a locked state.
+* Created a way to produce a corpus of Gremlin traversals via `FeatureReader` and `DocumentationReader` in `gremlin-language`.
+* Exposed Gherkin tests as part of the provider test suite.
+* Packaged Gherkin tests and data as standalone package as a convenience distribution.
+* Bumped to Apache Hadoop 3.3.1.
+* Bumped to Apache Spark 3.1.2.
+* Changed `NumberHelper` to properly cast to `byte` and `short` rather than default coercing to `Integer`.
+* Modified some driver defaults (maximum content length, pool size, maximum in process) to be more consistent with one another.
+* Fixed a potential connection load balancing issue due to a race condition not updating the usage count.
+
 == TinkerPop 3.5.0 (The Sleeping Gremlin: No. 18 Entr'acte Symphonique)
 
 image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/gremlin-sleeping-beauty.png[width=185]
diff --git a/docker/gremlin-server/docker-entrypoint.sh b/docker/gremlin-server/docker-entrypoint.sh
index 775daa5..d007cce 100644
--- a/docker/gremlin-server/docker-entrypoint.sh
+++ b/docker/gremlin-server/docker-entrypoint.sh
@@ -76,7 +76,7 @@
 /opt/gremlin-server/bin/gremlin-server.sh conf/gremlin-server-integration-secure.yaml &
 
 java -cp /opt/gremlin-test/gremlin-test-${GREMLIN_SERVER_VERSION}-jar-with-dependencies.jar \
-     -Dlog4j.configuration="file:/opt/gremlin-server/conf/log4j-server.properties" \
+     -Dlogback.configurationFile="file:/opt/gremlin-server/conf/logback.xml" \
      org.apache.tinkerpop.gremlin.server.KdcFixture /opt/gremlin-server &
 
 export JAVA_OPTIONS="-Xms512m -Xmx4096m -Djava.security.krb5.conf=/opt/gremlin-server/target/kdc/krb5.conf"
diff --git a/docker/gremlin-server/gremlin-server-integration-krb5.yaml b/docker/gremlin-server/gremlin-server-integration-krb5.yaml
index cb7e737..d3a138f 100644
--- a/docker/gremlin-server/gremlin-server-integration-krb5.yaml
+++ b/docker/gremlin-server/gremlin-server-integration-krb5.yaml
@@ -33,9 +33,9 @@
                org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
                org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/generate-all.groovy]}}}}
 serializers:
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0]}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0] }}
@@ -55,7 +55,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 1000000
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/docker/gremlin-server/gremlin-server-integration-secure.yaml b/docker/gremlin-server/gremlin-server-integration-secure.yaml
index e6a999f..93e931f 100644
--- a/docker/gremlin-server/gremlin-server-integration-secure.yaml
+++ b/docker/gremlin-server/gremlin-server-integration-secure.yaml
@@ -33,9 +33,9 @@
                org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
                org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/generate-all.groovy]}}}}
 serializers:
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0]}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0] }}
@@ -55,7 +55,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 1000000
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/docker/gremlin-server/gremlin-server-integration.yaml b/docker/gremlin-server/gremlin-server-integration.yaml
index a0d5f4a..94fb195 100644
--- a/docker/gremlin-server/gremlin-server-integration.yaml
+++ b/docker/gremlin-server/gremlin-server-integration.yaml
@@ -34,9 +34,9 @@
                org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
                org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/generate-all.groovy]}}}}
 serializers:
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0]}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0] }}
@@ -56,7 +56,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 1000000
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/docs/site/home/downloads.html b/docs/site/home/downloads.html
index db2f792..a3c5774 100644
--- a/docs/site/home/downloads.html
+++ b/docs/site/home/downloads.html
@@ -25,40 +25,40 @@
     <table class="table">
         <tr>
             <td>
-                <strong>3.5.0</strong> (latest, stable)
+                <strong>3.5.1</strong> (latest, stable)
             </td>
             <td>
-                3-May-2021
+                19-July-2021
             </td>
             <td>
-                <a href="https://github.com/apache/tinkerpop/blob/3.5.0/CHANGELOG.asciidoc#release-3-5-0">release notes</a> |
-                <a href="https://tinkerpop.apache.org/docs/3.5.0/upgrade/#_tinkerpop_3_5_0">upgrade</a> |
-                <a href="https://tinkerpop.apache.org/docs/3.5.0/">documentation</a> |
-                <a href="#" data-toggle="modal" data-target="#contributors-3_5_0">contributors</a>
+                <a href="https://github.com/apache/tinkerpop/blob/3.5.1/CHANGELOG.asciidoc#release-3-5-1">release notes</a> |
+                <a href="https://tinkerpop.apache.org/docs/3.5.1/upgrade/#_tinkerpop_3_5_1">upgrade</a> |
+                <a href="https://tinkerpop.apache.org/docs/3.5.1/">documentation</a> |
+                <a href="#" data-toggle="modal" data-target="#contributors-3_5_1">contributors</a>
             </td>
             <td align="right">
-                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.0/apache-tinkerpop-gremlin-console-3.5.0-bin.zip" class="btn btn-primary">Gremlin Console <span class="glyphicon glyphicon-download-alt"></span></a>
-                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.0/apache-tinkerpop-gremlin-server-3.5.0-bin.zip" class="btn btn-primary">Gremlin Server <span class="glyphicon glyphicon-download-alt"></span></a>
-                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.0/apache-tinkerpop-3.5.0-src.zip" class="btn btn-primary">Source <span class="glyphicon glyphicon-download-alt"></span></a>
+                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.1/apache-tinkerpop-gremlin-console-3.5.1-bin.zip" class="btn btn-primary">Gremlin Console <span class="glyphicon glyphicon-download-alt"></span></a>
+                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.1/apache-tinkerpop-gremlin-server-3.5.1-bin.zip" class="btn btn-primary">Gremlin Server <span class="glyphicon glyphicon-download-alt"></span></a>
+                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.1/apache-tinkerpop-3.5.1-src.zip" class="btn btn-primary">Source <span class="glyphicon glyphicon-download-alt"></span></a>
             </td>
         </tr>
         <tr>
             <td>
-                <strong>3.4.11</strong> (maintenance)
+                <strong>3.4.12</strong> (maintenance)
             </td>
             <td>
-                3-May-2021
+                19-July-2021
             </td>
             <td>
-                <a href="https://github.com/apache/tinkerpop/blob/3.4.11/CHANGELOG.asciidoc#release-3-4-11">release notes</a> |
-                <a href="https://tinkerpop.apache.org/docs/3.4.11/upgrade/#_tinkerpop_3_4_11">upgrade</a> |
-                <a href="https://tinkerpop.apache.org/docs/3.4.11/">documentation</a> |
-                <a href="#" data-toggle="modal" data-target="#contributors-3_4_11">contributors</a>
+                <a href="https://github.com/apache/tinkerpop/blob/3.4.12/CHANGELOG.asciidoc#release-3-4-12">release notes</a> |
+                <a href="https://tinkerpop.apache.org/docs/3.4.12/upgrade/#_tinkerpop_3_4_12">upgrade</a> |
+                <a href="https://tinkerpop.apache.org/docs/3.4.12/">documentation</a> |
+                <a href="#" data-toggle="modal" data-target="#contributors-3_4_12">contributors</a>
             </td>
             <td align="right">
-                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.4.11/apache-tinkerpop-gremlin-console-3.4.11-bin.zip" class="btn btn-primary">Gremlin Console <span class="glyphicon glyphicon-download-alt"></span></a>
-                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.4.11/apache-tinkerpop-gremlin-server-3.4.11-bin.zip" class="btn btn-primary">Gremlin Server <span class="glyphicon glyphicon-download-alt"></span></a>
-                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.4.11/apache-tinkerpop-3.4.11-src.zip" class="btn btn-primary">Source <span class="glyphicon glyphicon-download-alt"></span></a>
+                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.4.12/apache-tinkerpop-gremlin-console-3.4.12-bin.zip" class="btn btn-primary">Gremlin Console <span class="glyphicon glyphicon-download-alt"></span></a>
+                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.4.12/apache-tinkerpop-gremlin-server-3.4.12-bin.zip" class="btn btn-primary">Gremlin Server <span class="glyphicon glyphicon-download-alt"></span></a>
+                <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.4.12/apache-tinkerpop-3.4.12-src.zip" class="btn btn-primary">Source <span class="glyphicon glyphicon-download-alt"></span></a>
             </td>
         </tr>
     </table>
@@ -67,7 +67,9 @@
     <div class="form-group row">
         <div class="col-xs-3">
     <select id="dropdownArchives" class="form-control">
-        <option selected="selected">3.4.10 (18-Jan-2021)</option>
+        <option selected="selected">3.5.0 (3-May-2021)</option>
+        <option>3.4.11 (3-May-2021)</option>
+        <option>3.4.10 (18-Jan-2021)</option>
         <option>3.4.9 (7-Dec-2020)</option>
         <option>3.4.8 (3-Aug-2020)</option>
         <option>3.4.7 (1-Jun-2020)</option>
@@ -138,11 +140,63 @@
          </tr>
      </table>
     <p><strong>Note</strong> that upgrade documentation was only introduced at 3.1.1-incubating which is why there are no "upgrade" links in versions prior to that one.
+    <p><strong>Note</strong> this page lists official Apache releases only. TinkerPop occasionally produces unofficial binary release candidates (denoted by the suffix "-RC") which are NOT promoted or announced as actual release versions. <i>Such releases are for early development and evaluation purposes only.</i></p>
     <p>As a convenience, TinkerPop also deploys packaged artifacts to the following locations:</p>
-    <p><a href="https://hub.docker.com/u/tinkerpop/">Docker</a> | <a href="https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.tinkerpop%22">Maven Central</a> | <a href="https://pypi.python.org/pypi/gremlinpython/">PyPI</a> | <a href="https://www.npmjs.com/package/gremlin">npm</a> | <a href="https://www.nuget.org/packages/Gremlin.Net/">NuGet</a></p>
-
-     <p><strong>Note</strong> this page lists official Apache releases only. TinkerPop occasionally produces unofficial binary release candidates (denoted by the suffix "-RC") which are NOT promoted or announced as actual release versions. <i>Such releases are for early development and evaluation purposes only.</i></p>
-
+    <table class="table">
+        <tr>
+            <th>Repository</th>
+            <th>Artifacts</th>
+            <th>&nbsp;</th>
+        </tr>
+        <tr>
+            <td><strong>Docker</strong></td>
+            <td>
+                <p><a href="https://hub.docker.com/r/tinkerpop/gremlin-server">Gremlin Server</a></p>
+                <p><a href="https://hub.docker.com/r/tinkerpop/gremlin-console">Gremlin Console</a></p>
+            </td>
+            <td><pre><code>docker pull tinkerpop/gremlin-server
+docker pull tinkerpop/gremlin-console</code></pre></td>
+        </tr>
+        <tr>
+            <td><strong>Maven Central</strong></td>
+            <td><a href="https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.tinkerpop%22">groupId: org.apache.tinkerpop</a></td>
+            <td>
+                <pre><code>&lt;!-- gremlin-driver is a common dependency but there are others --&gt;
+&lt;dependency&gt;
+    &lt;groupId&gt;org.apache.tinkerpop&lt;/groupId&gt;
+    &lt;artifactId&gt;gremlin-driver&lt;/artifactId&gt;
+    &lt;version&gt;3.5.1&lt;/version&gt;
+&lt;/dependency&gt;</code></pre>
+            </td>
+        </tr>
+        <tr>
+            <td><strong>PyPI</strong></td>
+            <td><a href="https://pypi.python.org/pypi/gremlinpython/">gremlinpython</a></td>
+            <td><pre><code>pip install gremlinpython</code></pre></td>
+        </tr>
+        <tr>
+            <td><strong>npm</strong></td>
+            <td>
+                <p><a href="https://www.npmjs.com/package/gremlin">gremlin</a></p>
+                <p><a href="https://www.npmjs.com/package/gremlint">gremlint</a></p>
+            </td>
+            <td>
+                <pre><code>npm i gremlin
+npm i gremlint</code></pre>
+            </td>
+        </tr>
+        <tr>
+            <td><strong>NuGet</strong></td>
+            <td>
+                <p><a href="https://www.nuget.org/packages/Gremlin.Net/">Gremlin.Net</a></p>
+                <p><a href="https://www.nuget.org/packages/Gremlin.Net.Template/">Gremlin.Net.Template</a></p>
+            </td>
+            <td>
+                <pre><code>dotnet add package Gremlin.Net --version 3.5.1
+dotnet add package Gremlin.Net.template --version 3.5.1</code></pre>
+            </td>
+        </tr>
+    </table>
     <a name="verify"></a>
     <h4>Verifying Downloads</h4>
     <p>All downloads have associated PGP and SHA512 signatures to help verify a distribution provided by a mirror. To verify a distribution via PGP or GPG first download the
@@ -176,6 +230,31 @@
  </div>
 
     <!-- Contributor Modals -->
+    <!-- 3.5.1 -->
+    <div class="modal fade" id="contributors-3_5_1" tabindex="-1" role="dialog">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">3.5.1</h4>
+                </div>
+                <div class="modal-body">
+                    <p>Release Manager: Florian Hockmann</p>
+                    <pre><code>$ git shortlog -sn 3.5.0..3.5.1
+    69  Stephen Mallette
+    36  Florian Hockmann
+     9  dependabot[bot]
+     4  oyvindsabo
+     1  Clement de Groc
+     1  Ebrahim</code></pre>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
     <!-- 3.5.0 -->
     <div class="modal fade" id="contributors-3_5_0" tabindex="-1" role="dialog">
         <div class="modal-dialog" role="document">
@@ -219,6 +298,29 @@
         </div>
     </div>
 
+    <!-- 3.4.12 -->
+    <div class="modal fade" id="contributors-3_4_12" tabindex="-1" role="dialog">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">3.4.12</h4>
+                </div>
+                <div class="modal-body">
+                    <p>Release Manager: Florian Hockmann</p>
+                    <pre><code>$ git shortlog -sn 3.4.11..3.4.12
+    22  Stephen Mallette
+    12  Florian Hockmann
+     1  Clement de Groc
+     1  oyvindsabo</code></pre>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
     <!-- 3.4.11 -->
     <div class="modal fade" id="contributors-3_4_11" tabindex="-1" role="dialog">
         <div class="modal-dialog" role="document">
diff --git a/docs/site/home/img/discord_logo.png b/docs/site/home/img/discord_logo.png
new file mode 100644
index 0000000..25d8f2b
--- /dev/null
+++ b/docs/site/home/img/discord_logo.png
Binary files differ
diff --git a/docs/site/home/img/join_discord.png b/docs/site/home/img/join_discord.png
new file mode 100644
index 0000000..fc46a38
--- /dev/null
+++ b/docs/site/home/img/join_discord.png
Binary files differ
diff --git a/docs/site/home/index.html b/docs/site/home/index.html
index 5415f41..f7418b7 100644
--- a/docs/site/home/index.html
+++ b/docs/site/home/index.html
@@ -23,15 +23,14 @@
             <p><font size="3">Apache TinkerPop&trade; is a graph computing framework for both graph databases (OLTP) and graph analytic systems (OLAP).</font></p>
          </div>
          <div class="col-md-6">
-            <br/>
             <p>
+               <a href="https://discord.gg/ndMpKZcBEE" target="_blank"><img src="img/join_discord.png" class="img-responsive rounded mx-auto d-block" style="padding:10px; width: 375px"/></a>
             </p>
-            <b><font size="4">TinkerPop</font> <font size="4">3.5.0</font></b> (<font size="2">Released: 3-May-2021</font>)
-            <p><b>Downloads</b></p>
+            <b><font size="4">TinkerPop</font> <font size="4">3.5.1 Downloads</font></b> (<font size="2">Released: 19-July-2021</font>)
             <p>
-               <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.0/apache-tinkerpop-gremlin-console-3.5.0-bin.zip" class="btn btn-primary">Gremlin Console <span class="glyphicon glyphicon-download-alt"></span></a>
-               <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.0/apache-tinkerpop-gremlin-server-3.5.0-bin.zip" class="btn btn-primary">Gremlin Server <span class="glyphicon glyphicon-download-alt"></span></a>
-               <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.0/apache-tinkerpop-3.5.0-src.zip" class="btn btn-primary">Source <span class="glyphicon glyphicon-download-alt"></span></a>
+               <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.1/apache-tinkerpop-gremlin-console-3.5.1-bin.zip" class="btn btn-primary">Gremlin Console <span class="glyphicon glyphicon-download-alt"></span></a>
+               <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.1/apache-tinkerpop-gremlin-server-3.5.1-bin.zip" class="btn btn-primary">Gremlin Server <span class="glyphicon glyphicon-download-alt"></span></a>
+               <a href="https://www.apache.org/dyn/closer.lua/tinkerpop/3.5.1/apache-tinkerpop-3.5.1-src.zip" class="btn btn-primary">Source <span class="glyphicon glyphicon-download-alt"></span></a>
             </p>
             <div class="row">
                <div class="col-md-6">
@@ -41,7 +40,7 @@
                      <ul>
                         <li><a href="https://tinkerpop.apache.org/docs/current/reference">Reference Documentation</a></li>
                      </ul>
-                     <li><a href="https://tinkerpop.apache.org/docs/3.5.0/upgrade/#_tinkerpop_3_5_0">Upgrade Information</a></li>
+                     <li><a href="https://tinkerpop.apache.org/docs/3.5.1/upgrade/#_tinkerpop_3_5_1">Upgrade Information</a></li>
                      <li>TinkerPop Javadoc - <a href="https://tinkerpop.apache.org/javadocs/current/core/">core</a> / <a href="https://tinkerpop.apache.org/javadocs/current/full/">full</a></li>
                   </ul>
                </div>
@@ -173,31 +172,43 @@
          <div class="row">
             <div class="col-xs-8">
                TinkerPop is an open source project that <a href="https://tinkerpop.apache.org/docs/current/dev/developer#_contributing">welcomes contributions</a>. There are many ways to get involved:
-               <p/>
+               <p></p>
                <ol>
+
+                  <li>
+                     Join the <a href="https://discord.gg/ndMpKZcBEE" target="_blank">Discord</a> Server.
+                        <ul>
+                           <li>Chat with users and developers to get answers to your questions.</li>
+                        </ul>
+                  </li>
                   <li>
                      Join the <a href="https://groups.google.com/group/gremlin-users">Gremlin-Users</a> public mailing list.
                      <ul>
                         <li>Help users by answering questions and demonstrating your expertise in TinkerPop and graphs.</li>
                      </ul>
+                  </li>
                   <li>
                      Join the <a href="https://lists.apache.org/list.html?dev@tinkerpop.apache.org">TinkerPop Developer</a> public mailing list.
                      <ul>
                         <li>Contribute ideas on how to make the TinkerPop code- and documentation-base better.</li>
                      </ul>
+                  </li>
                   <li>Submit bug and feature issues to TinkerPop <a href="https://issues.apache.org/jira/browse/TINKERPOP/">JIRA</a>.</li>
                   <ul>
                      <li>Provide easily reproducible bug reports and well articulated feature requests.</li>
                   </ul>
+                  </li>
                   <li>
                      Clone the TinkerPop <a href="https://github.com/apache/tinkerpop">Git repository</a> and provide a <a href="https://help.github.com/articles/using-pull-requests/">pull-request</a>.
                      <ul>
                         <li>Focus on a particular area of the codebase and take responsibility for your contribution.</li>
                      </ul>
+                  </li>
                   <li>Make significant, long lasting contributions over time.</li>
                   <ul>
                      <li>Become a TinkerPop Committer and help determine the evolution of The TinkerPop.</li>
                   </ul>
+               </li>
                </ol>
                <p>To build TinkerPop from source, please review the <a href="https://tinkerpop.apache.org/docs/current/dev/developer/#building-testing">developer documentation</a>.
             </div>
@@ -217,6 +228,7 @@
          <ul>
             <li><a href="https://cn.aliyun.com/product/gdb">Alibaba Graph Database</a> - A real-time, reliable, cloud-native graph database service that supports property graph model.</li>
             <li><a href="https://aws.amazon.com/neptune/">Amazon Neptune</a> - Fully-managed graph database service.</li>
+            <li><a href="https://arcadedb.com/">ArcadeDB</a> - Multi-Model Database Supporting Graphs, Key/Value, Documents and Time-Series.</li>
             <li><a href="https://github.com/ArangoDB-Community/arangodb-tinkerpop-provider">ArangoDB</a> - OLTP Provider for ArangoDB.</li>
             <li><a href="https://github.com/lambdazen/bitsy/wiki">Bitsy</a> - A small, fast, embeddable, durable in-memory graph database.</li>
             <li><a href="https://github.com/blazegraph/tinkerpop3">Blazegraph</a> - RDF graph database with OLTP support.</li>
@@ -238,6 +250,7 @@
             <li><a href="https://s2graph.apache.org/">Apache S2Graph</a> - OLTP graph database running on Apache HBase.</li>
             <li><a href="https://github.com/pietermartin/sqlg">Sqlg</a> - OLTP implementation on SQL databases.</li>
             <li><a href="https://stardog.com/">Stardog</a> - RDF graph database with OLTP and OLAP support.</li>
+            <li><a href="https://www.tibco.com/products/tibco-graph-database/">Tibco Graph Database</a> - Combined OLTP and OLAP features in a single enterprise-grade database.</li>
             <li><a href="https://tinkerpop.apache.org/docs/current/reference/#tinkergraph-gremlin">TinkerGraph</a> - In-memory OLTP and OLAP reference implementation.</li>
             <li><a href="https://thinkaurelius.github.io/titan/">Titan</a> - Distributed OLTP and OLAP graph database with BerkeleyDB, Apache Cassandra and Apache HBase support.</li>
             <li><a href="https://github.com/awslabs/dynamodb-titan-storage-backend">Titan (Amazon)</a> - The Amazon DynamoDB storage backend for Titan.</li>
@@ -257,6 +270,7 @@
             <li><a href="https://tinkerpop.apache.org/docs/current/reference/#gremlin-python">gremlin-python</a> (python/variant) - Gremlin hosted in Python for use with any Python-based VM.</li>
             <li><a href="https://github.com/emehrkay/gremlinpy">gremlin-py</a> (python/variant) - Write pure Python Gremlin that can be sent to Gremlin Server.</li>
             <li><a href="https://github.com/wolf4ood/gremlin-rs">gremlin-rs</a> (rust/variant) - A Gremlin Server driver and language variant for Rust.</li>
+            <li><a href="https://github.com/babbel/grumlin">grumlin</a> (ruby/variant) - A Gremlin Server driver and language variant for Ruby.</li>
             <li><a href="https://github.com/mpollmeier/gremlin-scala">gremlin-scala</a> (scala/variant) - A Scala-based Gremlin language variant for TinkerPop3.</li>
             <li><a href="https://github.com/karthicks/gremlin-ogm">gremlin-objects</a> (java/dsl) - An Object Graph Mapping Library For Gremlin.</li>
             <li><a href="https://github.com/jbmusso/gremlin-template-string">gremlin-template-string</a> (js/variant) - A Gremlin language builder.</li>
@@ -293,6 +307,7 @@
          <ul>
             <li><a href="https://www.exakat.io/">exakat.io</a> - Static analysis engine for PHP, powered by Gremlin.</li>
             <li><a href="https://bricaud.github.io/graphexp/graphexp.html">Graphexp</a> - Interactive visualization of the Gremlin graph database with D3.js.</li>
+            <li><a href="https://github.com/aws/graph-notebook">Graph Notebook</a> - Library extending Jupyter notebooks to integrate with Apache TinkerPop, openCypher, and RDF SPARQL.</li>
             <li><a href="https://github.com/bechbd/gremlin-ide">gremlin-ide</a> - An IDE for Apache TinkerPop-enabled databases using React and Electron.</li>
             <li><a href="https://gremlify.com/">gremlify</a> - A Gremlin workspace for queries and visualization.</li>
             <li><a href="https://github.com/prabushitha/gremlin-visualizer">Gremlin-Visualizer</a> A visualization tool for the results of gremlin traversals.</li>
@@ -317,7 +332,7 @@
             <li><a href="https://stephen.genoprime.com/">Stephen Mallette</a> (2011 - PMC Chair): Gremlin Console/Server/Driver, Language Variants and general core development.</li>
             <li><a href="https://github.com/jorgebay">Jorge Bay</a> (2017 - PMC): GraphBinary serialization, JavaScript and .NET libraries, mailing list support.</li>
             <li><a href="https://github.com/FlorianHockmann/">Florian Hockmann</a> (2017 - PMC): .NET libraries, mailing list support.</li>
-            <li><a href="https://www.kelvinlawrence.net/">Kelvin Lawrence</a> (2017 - Committer): Documentation and mailing list support.</li>
+            <li><a href="https://www.kelvinlawrence.net/">Kelvin Lawrence</a> (2017 - PMC): Documentation and mailing list support.</li>
             <li><a href="https://www.linkedin.com/in/divijvaidya/">Divij Vaidya</a> (2019 - Committer): Gremlin server-client interaction.</li>
             <li><a href="https://oyvindsabo.com/">Øyvind Sæbø</a> (2021 - Committer): Gremlint query formatter.</li>
          </ul>
diff --git a/docs/site/home/template/header-footer.html b/docs/site/home/template/header-footer.html
index 258043e..b8f8a66 100644
--- a/docs/site/home/template/header-footer.html
+++ b/docs/site/home/template/header-footer.html
@@ -75,16 +75,16 @@
                   Documentation <b class="caret"></b>
                   </a>
                   <ul class="dropdown-menu">
-                     <li class="dropdown-header">Latest: 3.5.0 (3-May-2021)</li>
-                     <li><a href="https://tinkerpop.apache.org/docs/current">TinkerPop 3.5.0</a></li>
+                     <li class="dropdown-header">Latest: 3.5.1 (19-July-2021)</li>
+                     <li><a href="https://tinkerpop.apache.org/docs/current">TinkerPop 3.5.1</a></li>
                      <li><a href="https://tinkerpop.apache.org/docs/current/upgrade">Upgrade Information</a></li>
                      <li><a href="https://tinkerpop.apache.org/javadocs/current/core/">Core Javadoc API</a></li>
                      <li><a href="https://tinkerpop.apache.org/javadocs/current/full/">Full Javadoc API</a></li>
                      <li role="separator" class="divider"></li>
-                     <li class="dropdown-header">Maintenance: 3.4.11 (3-May-2021)</li>
-                     <li><a href="https://tinkerpop.apache.org/docs/3.4.11/">TinkerPop 3.4.11</a></li>
-                     <li><a href="https://tinkerpop.apache.org/javadocs/3.4.11/core/">Core Javadoc API</a></li>
-                     <li><a href="https://tinkerpop.apache.org/javadocs/3.4.11/full/">Full Javadoc API</a></li>
+                     <li class="dropdown-header">Maintenance: 3.4.12 (19-July-2021)</li>
+                     <li><a href="https://tinkerpop.apache.org/docs/3.4.12/">TinkerPop 3.4.12</a></li>
+                     <li><a href="https://tinkerpop.apache.org/javadocs/3.4.12/core/">Core Javadoc API</a></li>
+                     <li><a href="https://tinkerpop.apache.org/javadocs/3.4.12/full/">Full Javadoc API</a></li>
                      <li role="separator" class="divider"></li>
                      <li><a href="https://tinkerpop.apache.org/docs/">Documentation Archives</a></li>
                      <li><a href="https://tinkerpop.apache.org/javadocs/">Javadoc Archives</a></li>
@@ -112,6 +112,7 @@
                   <ul class="dropdown-menu">
                      <li><a href="https://groups.google.com/group/gremlin-users">User Mailing List</a></li>
                      <li><a href="https://lists.apache.org/list.html?dev@tinkerpop.apache.org">Developer Mailing List</a></li>
+                     <li><a href="https://discord.gg/ndMpKZcBEE" target="_blank"><img src="img/discord_logo.png" class="nav-icon"/>Join us on Discord</a></li>
                      <li><a href="https://issues.apache.org/jira/browse/TINKERPOP/">Issue Tracker</a></li>
                      <li><a href="https://tinkerpop.apache.org/docs/current/dev/developer/#_contributing">Contributing</a></li>
                      <li><a href="providers.html">Providers</a></li>
diff --git a/docs/src/dev/developer/contributing.asciidoc b/docs/src/dev/developer/contributing.asciidoc
index 1d4dea9..76c5132 100644
--- a/docs/src/dev/developer/contributing.asciidoc
+++ b/docs/src/dev/developer/contributing.asciidoc
@@ -191,15 +191,14 @@
 . Make changes in the fork
 .. It is typically best to create a branch for the changes. Consider naming that branch after the JIRA issue number
 to easily track what that branch is for.
-.. Consider which release branch (e.g. `master`, `3.3-dev` - consult the
+.. Consider which release branch (e.g. `master`, `3.5-dev` - consult the
 link:https://tinkerpop.apache.org/docs/x.y.z/dev/developer/#branches[Branches Section] for more information) to create
 the development branch from in the first place. In other words, is the change to be targeted at a specific TinkerPop
 version (e.g. a patch to an older version)? When in doubt, please ask on dev@tinkerpop.apache.org.
 . Build the project and run tests.
 .. A simple build can be accomplished with maven: `mvn clean install`.
 .. Often, a "simple build" isn't sufficient and integration tests are required:
-`mvn clean install -DskipIntegrationTests=false -DincludeNeo4j`. Note that Hadoop must be running for the integration
-tests to execute.
+`mvn clean install -DskipIntegrationTests=false -DincludeNeo4j`.
 .. Docker can help simplify building and testing: `docker/build.sh -t -i -n`
 .. Please see the <<building-testing,Building and Testing>> section for more building and testing options.
 . Consider whether documentation or tests need to be added or updated as part of the change, and add them as needed.
diff --git a/docs/src/dev/developer/development-environment.asciidoc b/docs/src/dev/developer/development-environment.asciidoc
index 7dd3d5b..248fc3c 100644
--- a/docs/src/dev/developer/development-environment.asciidoc
+++ b/docs/src/dev/developer/development-environment.asciidoc
@@ -111,8 +111,8 @@
 The documentation generation process is not Maven-based and uses shell scripts to process the project's asciidoc. The
 scripts should work on Mac and Linux.
 
-To generate documentation, it is required that link:https://hadoop.apache.org[Hadoop 2.7.x] is running in
-link:https://hadoop.apache.org/docs/r2.7.7/hadoop-project-dist/hadoop-common/SingleCluster.html#Pseudo-Distributed_Operation[pseudo-distributed]
+To generate documentation, it is required that link:https://hadoop.apache.org[Hadoop 3.3.x] is running in
+link:https://hadoop.apache.org/docs/r3.3.1/hadoop-project-dist/hadoop-common/SingleCluster.html#Pseudo-Distributed_Operation[pseudo-distributed]
 mode. Be sure to set the `HADOOP_GREMLIN_LIBS` environment variable as described in the
 link:https://tinkerpop.apache.org/docs/current/reference/#hadoop-gremlin[reference documentation]. It is also important
 to set the `CLASSPATH` to point at the directory containing the Hadoop configuration files, like `mapred-site.xml`.
diff --git a/docs/src/dev/developer/for-committers.asciidoc b/docs/src/dev/developer/for-committers.asciidoc
index e020b71..089726b 100644
--- a/docs/src/dev/developer/for-committers.asciidoc
+++ b/docs/src/dev/developer/for-committers.asciidoc
@@ -198,6 +198,7 @@
 The JIRA issues that track removal of deprecated methods should be periodically evaluated to determine if it is
 prudent to schedule them into a release.
 
+[[developing-tests]]
 == Developing Tests
 
 TinkerPop has a wide variety of test types that help validate its internal code as well as external provider code.
@@ -224,9 +225,10 @@
 `Check` instead. Please see link:https://github.com/apache/tinkerpop/blob/e32a4187e4f25e290aabe14007f9087c48a06521/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/NativeNeo4jStructureCheck.java[NativeNeo4jStructureCheck]
 for an example.
 
+[[gremlin-language-test-cases]]
 === Gremlin Language Test Cases
 
-Test cases for the Gremlin Language currently requires that the newly developed test be added in three places:
+Test cases for the Gremlin Language currently requires that the newly developed test be added in two places:
 
 1. As a test written in Java in the `gremlin-test` module within the subpackages of
 `org.apache.tinkerpop.gremlin.process.traversal.step`
@@ -465,6 +467,45 @@
   And the graph should return 0 for count of "g.E()"
 ----
 
+[[gherkin-tags]]
+==== Tags
+
+Features have tags associated with them to help allow developers to better break up test runs if they desire. There
+are two types of tags:
+
+* `@StepClass*` - Marks the step grouping and is a prefix that precedes and either refers to one of the four types of
+steps: `Branch`, `Filter`, `Map`, and `SideEffect` (e.g. `@StepClassBranch`) or to an `Integrated` grouping that does
+not fit those individual classifications well.
+* `@Step*` - Marks testing for a particular step. While this tag is generally unique to the feature
+file itself and test filtering could be accomplished at that level by way of the file, the use of the tag is a
+secondary option and allows filtering to be consistently managed by tags alone. The suffix is the Gremlin step itself
+(e.g. `@StepHas`) in all cases except for `@StepVertex` which covers `V()`, `E()`, `out()`, `in()`, `both()`, `inE()`,
+`outE()`, and `bothE()`.
+
+Scenarios have tags associated with them that help identify subsets of tests so that a test runner can selectively
+include or ignore certain tests. The tags enable the practical and necessary ability for providers to ignore tests that
+they simply cannot support. It is important to be aware of the following tags when writing tests as not including a
+tag when one is necessary will cause provider tests to fail:
+
+* `@AllowNullPropertyValues` - The scenario requires that the graph be configured with `AllowNullPropertyValues` as
+`true` (meaning that it can store `null` values).
+* `@GraphComputerVerificationInjectionNotSupported` - The scenario will not work on with `GraphComputer` because the
+`inject()` step is not supported.
+* `@GraphComputerVerificationMidVNotSupported` - The scenario will not work on with `GraphComputer` because the
+mid-`V()` step is not supported.
+* `@GraphComputerVerificationOneBulk` - The scenario will not work because `withBulk(false)` is configured and that
+is not compatible with `GraphComputer`
+* `@GraphComputerVerificationReferenceOnly` - The scenario itself is not written to support `GraphComputer` because it
+tries to reference inaccessible properties that are on elements only available by "reference" (i.e `T.id` only).
+* `@GraphComputerVerificationStrategyNotSupported` - The scenario uses a traversal strategy that is not supported by
+`GraphComputer`.
+* `@GraphComputerVerificationStarGraphExceeded` - The scenario itself is not written to support `GraphComputer` because
+the traversal does not mind the star graph limitation.
+* `@MultiMetaProperties` - The scenario uses "The Crew" graph as a dataset or otherwise utilizes multi-properties
+or meta-properties for creating or querying data.
+* `@RemoteOnly` - The scenario uses some Gremlin syntax that cannot be supported outside of remote test executions. The
+best example of this sort of test would be one that uses the remote `Lambda` syntax.
+
 == Developing Benchmarks
 
 Benchmarks are a useful tool to track performance between TinkerPop versions and also as tools to aid development
@@ -791,10 +832,10 @@
 [[logging]]
 == Logging
 
-TinkerPop uses SLF4j for logging and typically leans back on Log4j as the implementation. Configuring log outputs
-for debugging purposes within tests can be altered by editing the `log4j-test.properties` file in each module's test
+TinkerPop uses SLF4j for logging and relies on logback as the implementation. Configuring log outputs
+for debugging purposes within tests can be altered by editing the `logback-test.xml` file in each module's test
 resources.  That file gets copied to the `target/test-classes` on build and surefire and failsafe plugins in maven
-are then configured to point at that area of the file system for those configuration files. The properties files
+are then configured to point at that area of the file system for those configuration files. The XML files
 can be edited to fine tune control of the log output, but generally speaking the current configuration is likely
 best for everyone's general purposes, so if changes are made please revert them prior to commit.
 
diff --git a/docs/src/dev/provider/index.asciidoc b/docs/src/dev/provider/index.asciidoc
index 1c928f6..8992db1 100644
--- a/docs/src/dev/provider/index.asciidoc
+++ b/docs/src/dev/provider/index.asciidoc
@@ -617,6 +617,29 @@
 </dependency>
 ----
 
+Providers currently have two approaches to consider when validating their TinkerPop implementations. The first approach
+comes from the wholly JVM oriented original test suite which was developed in the early days of TinkerPop 3.x design
+and development. The second approach is available as of 3.6.0, is Gherkin-based and originates from the Gremlin
+Language Variant test suite which is language agnostic.
+
+The first approach is more complete and more opinionated as to how an implementation should behave and in many ways
+helpful in getting an implementation semantically correct from the ground up (i.e. first getting the `Graph` Structure
+API implemented well by getting the Structure Suite to pass which will almost inevitably ensure that the most of the
+Gremlin language oriented tests in the Process Suite pass early on). On the other hand, the fact that this test suite
+is rigorous also can make it harder to implement especially if your graph already exists and behaves in a certain
+fashion.
+
+The second approach only validates Gremlin semantics which is ultimately what users concern themselves with as that is
+the method by which they will interact with a provider's `Graph`. This test suite is less concerned with how a
+TinkerPop implementation does what it does, so long as it succeeds at processing Gremlin traversals. There is
+significant overlap between this test suite and the aforementioned Process Suite.
+
+At this time, it would be wise for providers to implement both approaches as the goal for TinkerPop is to move away
+from the rigors of the JVM Structure and Process Suites in favor of Gherkin. Over time, the Structure and Process
+Suites will be deprecated and removed.
+
+==== JVM Test Suite
+
 The operational semantics of any OLTP or OLAP implementation are validated by `gremlin-test`. To implement these tests,
 provide test case implementations as shown below, where `XXX` below denotes the name of the graph implementation (e.g.
 TinkerGraph, Neo4jGraph, HadoopGraph, etc.).
@@ -758,7 +781,7 @@
 creating temporary files. The value is typically set to the project build directory. For example using the Maven
 SureFire Plugin, this is done via the configuration argLine with `-Dbuild.dir=${project.build.directory}`.
 
-==== Checking resource leak
+===== Checking Resource Leaks
 
 The TinkerPop query engine retrieves data by interfacing with the provider using iterators. These iterators (depending
 on the provider) may hold up resources in the underlying storage layer and hence, it is critical to close them after
@@ -772,6 +795,111 @@
 Assertions for leak detection are enabled by default when running the test suite. They can be temporarily disabled
 by way of a system property - simply set `-DtestIteratorLeaks=false".
 
+[[gherkin-tests-suite]]
+==== Gherkin Test Suite
+
+The Gherkin Test Suite is a language agnostic set of tests that verify Gremlin semantics. It provides a unified set of
+tests that validate many TinkerPop components internally. The tests themselves can be found in `gremlin-tests/features`
+(link:https://github.com/apache/tinkerpop/tree/x.y.z/gremlin-test/features[here]) with their syntax described in the
+link:https://tinkerpop.apache.org/docs/x.y.z/dev/developer/#gremlin-language-test-cases[TinkerPop Developer Documentation].
+
+TinkerPop provides some infrastructure, for JVM based graphs, to help make it easier for providers to implement these
+tests against their implementations. This infrastructure is built on `cucumber-java` which is a dependency of
+`gremlin-test`. There are two main components to implementing the tests:
+
+1. A `org.apache.tinkerpop.gremlin.features.World` implementation which is a class in `gremlin-test`.
+2. A JUnit test class that will act as the runner for the tests with the appropriate annotations
+
+TIP: It may be helpful to get familiar with link:https://cucumber.io/docs/installation/java/[Cucumber] before
+proceeding with an implementation.
+
+The `World` implementation provides context to the tests and allows providers to intercept test events that might be
+important to proper execution specific to their implementations. The most important part of implementing `World` is
+properly implementing the `GraphTraversalSource getGraphTraversalSource(GraphData)` method which provides to the test
+the `GraphTraversalSource` to execute the test against.
+
+The JUnit test class is really just the test runner. It is a simple class which must include some Cucumber annotations.
+The following is just an example as taken from TinkerGraph:
+
+[source,java]
+----
+@RunWith(Cucumber.class)
+@CucumberOptions(
+        tags = "not @RemoteOnly",
+        glue = { "org.apache.tinkerpop.gremlin.features" },
+        features = { "../gremlin-test/features" },
+        plugin = {"pretty", "junit:target/cucumber.xml",
+        objectFactory = GuiceFactory.class})
+----
+
+The `@CucumberOptions` that are used are mostly implementation specific, so it will be up to the provider to make some
+choices as to what is right for their environment. For TinkerGraph, it needed to ignore Gherkin tests with the
+`@RemoteOnly` tag (the full list of possible tags can be found link:https://tinkerpop.apache.org/docs/current/dev/developer/#gherkin-tags[here]),
+as will most providers. The "glue" will be the same for all test implementers as it refers to a package containing
+TinkerPop's test infrastructure in `gremlin-test` (unless of course, a provider needs to develop their own
+infrastructure for some reason). The "features" is the path to the actual Gherkin test files that should be made
+available locally. The "plugin" defines a JUnit style output, which happens to be understood by Maven.
+
+The "objectFactory" is the last component. Cucumber relies on dependency injection to get a `World` implementation into
+the test infrastructure. Providers may choose from multiple available implementations, but TinkerPop chose to use
+Guice. To follow this approach include the following module:
+
+[source,xml]
+----
+<dependency>
+    <groupId>com.google.inject</groupId>
+    <artifactId>guice</artifactId>
+    <version>4.2.3</version>
+    <scope>test</scope>
+</dependency>
+----
+
+Following the Neo4jGraph implementation, there are two classes to construct:
+
+[source,java]
+----
+public class ServiceModule extends AbstractModule {
+    @Override
+    protected void configure() {
+        bind(World.class).to(Neo4jGraphWorld.class);
+    }
+}
+
+public class WorldInjectorSource implements InjectorSource {
+    @Override
+    public Injector getInjector() {
+        return Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule());
+    }
+}
+----
+
+The key here is that the `Neo4jGraphWorld` implementation gets bound to `World` in the `ServiceModule` and there is
+a `WorldInjectorSource` that specifies the `ServiceModule` to Cucumber. As a final step, the provider's test resources
+needs a `cucumber.properties` file with an entry that specifies the `InjectorSource` so that Guice can find it. Here
+is the example taken from TinkerGraph where the `WorldInjectorSource` is inner class of `TinkerGraphFeatureTest`
+itself.
+
+[source,text]
+----
+guice.injector-source=org.apache.tinkerpop.gremlin.neo4j.Neo4jGraphFeatureTest$WorldInjectorSource
+----
+
+In the event that a single `World` configuration is insufficient, it may be necessary to develop a custom
+`ObjectFactory`. An easy way to do this is to create a class that extends from the `AbstractGuiceFactory` in
+`gremlin-test` and provide that class to the `@CucumberOptions`. This approach does rely on the `ServiceLoader` which
+means it will be important to include a `io.cucumber.core.backend.ObjectFactory` file in `META-INF/services` and an
+entry that registers the custom implementation. Please see the TinkerGraph test code for further information on this
+approach.
+
+If implementing the Gherkin tests, providers can choose to opt-in to the slimmed down version of the normal JVM process
+test suite to help alleviate test duplication between the two frameworks:
+
+[source,java]
+----
+@Graph.OptIn(Graph.OptIn.SUITE_PROCESS_LIMITED_STANDARD)
+@Graph.OptIn(Graph.OptIn.SUITE_PROCESS_LIMITED_COMPUTER)
+----
+
 === Accessibility via GremlinPlugin
 
 image:gremlin-plugin.png[width=100,float=left] The applications distributed with TinkerPop do not distribute with
diff --git a/docs/src/recipes/olap-spark-yarn.asciidoc b/docs/src/recipes/olap-spark-yarn.asciidoc
index 64cc6a0..aeb99a2 100644
--- a/docs/src/recipes/olap-spark-yarn.asciidoc
+++ b/docs/src/recipes/olap-spark-yarn.asciidoc
@@ -22,7 +22,7 @@
 distributed, analytical graph queries (OLAP) on a computer cluster. The
 link:https://tinkerpop.apache.org/docs/x.y.z/reference/#sparkgraphcomputer[reference documentation] covers the cases
 where Spark runs locally or where the cluster is managed by a Spark server. However, many users can only run OLAP jobs
-via the http://hadoop.apache.org/[Hadoop 2.x] Resource Manager (YARN), which requires `SparkGraphComputer` to be
+via the http://hadoop.apache.org/[Hadoop 3.x] Resource Manager (YARN), which requires `SparkGraphComputer` to be
 configured differently. This recipe describes this configuration.
 
 === Approach
@@ -45,8 +45,8 @@
 from various vendors.
 
 If you want to try the recipe on a local Hadoop pseudo-cluster, the easiest way to install
-it is to look at the install script at https://github.com/apache/tinkerpop/blob/x.y.z/docker/hadoop/install.sh
-and the `start hadoop` section of https://github.com/apache/tinkerpop/blob/x.y.z/docker/scripts/build.sh.
+it is to look at the install script at link:https://github.com/apache/tinkerpop/blob/x.y.z/docker/hadoop/install.sh[install.sh]
+and the `start hadoop` section of link:https://github.com/apache/tinkerpop/blob/x.y.z/docker/scripts/build.sh[build.sh].
 
 This recipe assumes that you installed the Gremlin Console with the
 link:https://tinkerpop.apache.org/docs/x.y.z/reference/#spark-plugin[Spark plugin] (the
@@ -63,8 +63,8 @@
 #!/bin/bash
 # Variables to be adapted to the actual environment
 GREMLIN_HOME=/home/yourdir/lib/apache-tinkerpop-gremlin-console-x.y.z-standalone
-export HADOOP_HOME=/usr/local/lib/hadoop-2.7.7
-export HADOOP_CONF_DIR=/usr/local/lib/hadoop-2.7.7/etc/hadoop
+export HADOOP_HOME=/usr/local/lib/hadoop-3.3.1
+export HADOOP_CONF_DIR=/usr/local/lib/hadoop-3.3.1/etc/hadoop
 
 # Have TinkerPop find the hadoop cluster configs and hadoop native libraries
 export CLASSPATH=$HADOOP_CONF_DIR
diff --git a/docs/src/reference/gremlin-applications.asciidoc b/docs/src/reference/gremlin-applications.asciidoc
index 5372e12..aeb43de 100644
--- a/docs/src/reference/gremlin-applications.asciidoc
+++ b/docs/src/reference/gremlin-applications.asciidoc
@@ -969,7 +969,7 @@
 |authorization.authorizer |The fully qualified classname of an `Authorizer` implementation to use. |_none_
 |authorization.config |A `Map` of configuration settings to be passed to the `Authorizer` when it is constructed.  The settings available are dependent on the implementation. |_none_
 |channelizer |The fully qualified classname of the `Channelizer` implementation to use.  A `Channelizer` is a "channel initializer" which Gremlin Server uses to define the type of processing pipeline to use.  By allowing different `Channelizer` implementations, Gremlin Server can support different communication protocols (e.g. WebSocket). |`WebSocketChannelizer`
-|enableAuditLog |The `AuthenticationHandler`, `AuthorizationHandler` and processors can issue audit logging messages with the authenticated user, remote socket address and requests with a gremlin query. For privacy reasons, the default value of this setting is false. The audit logging messages are logged at the INFO level via the `audit.org.apache.tinkerpop.gremlin.server` logger, which can be configured using the log4j.properties file. |_false_
+|enableAuditLog |The `AuthenticationHandler`, `AuthorizationHandler` and processors can issue audit logging messages with the authenticated user, remote socket address and requests with a gremlin query. For privacy reasons, the default value of this setting is false. The audit logging messages are logged at the INFO level via the `audit.org.apache.tinkerpop.gremlin.server` logger, which can be configured using the `logback.xml` file. |_false_
 |graphManager |The fully qualified classname of the `GraphManager` implementation to use.  A `GraphManager` is a class that adheres to the TinkerPop `GraphManager` interface, allowing custom implementations for storing and managing graph references, as well as defining custom methods to open and close graphs instantiations. To prevent Gremlin Server from starting when all graphs fails, the `CheckedGraphManager` can be used.|`DefaultGraphManager`
 |graphs |A `Map` of `Graph` configuration files where the key of the `Map` becomes the name to which the `Graph` will be bound and the value is the file name of a `Graph` configuration file. |_none_
 |gremlinPool |The number of "Gremlin" threads available to execute actual scripts in a `ScriptEngine`. This pool represents the workers available to handle blocking operations in Gremlin Server. When set to `0`, Gremlin Server will use the value provided by `Runtime.availableProcessors()`. |0
diff --git a/docs/src/reference/gremlin-variants.asciidoc b/docs/src/reference/gremlin-variants.asciidoc
index b7d80d9..bbe2a85 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -497,8 +497,18 @@
 [[gremlin-java-dsl]]
 === Domain Specific Languages
 
-Creating a <<dsl,Domain Specific Language>> (DSL) in Java requires the `@GremlinDsl` Java annotation in `gremlin-core`.
-This annotation should be applied to a "DSL interface" that extends `GraphTraversal.Admin`:
+Creating a <<dsl,Domain Specific Language>> (DSL) in Java requires the `@GremlinDsl` Java annotation in the
+`gremlin-annotations` module. This annotation should be applied to a "DSL interface" that extends
+`GraphTraversal.Admin`:
+
+[source,xml]
+----
+<dependency>
+    <groupId>org.apache.tinkerpop</groupId>
+    <artifactId>gremlin-annotations</artifactId>
+    <version>x.y.z</version>
+</dependency>
+----
 
 [source,java]
 ----
diff --git a/docs/src/reference/implementations-hadoop-start.asciidoc b/docs/src/reference/implementations-hadoop-start.asciidoc
index 0d0a53b..78b010a 100644
--- a/docs/src/reference/implementations-hadoop-start.asciidoc
+++ b/docs/src/reference/implementations-hadoop-start.asciidoc
@@ -31,9 +31,9 @@
 data in the Hadoop cluster represents a TinkerPop graph, then Hadoop-Gremlin can be used to process the graph
 using both TinkerPop's OLTP and OLAP graph computing models.
 
-IMPORTANT: This section assumes that the user has a Hadoop 2.x cluster functioning. For more information on getting
+IMPORTANT: This section assumes that the user has a Hadoop 3.x cluster functioning. For more information on getting
 started with Hadoop, please see the
-link:http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SingleCluster.html[Single Node Setup]
+link:http://hadoop.apache.org/docs/r3.3.1/hadoop-project-dist/hadoop-common/SingleCluster.html[Single Node Setup]
 tutorial. Moreover, if using `SparkGraphComputer` it is advisable that the reader also
 familiarize their self with and Spark (link:http://spark.apache.org/docs/latest/quick-start.html[Quick Start]).
 
diff --git a/docs/src/upgrade/index.asciidoc b/docs/src/upgrade/index.asciidoc
index 8e78f4f..fdd8cd2 100644
--- a/docs/src/upgrade/index.asciidoc
+++ b/docs/src/upgrade/index.asciidoc
@@ -34,6 +34,8 @@
 * Graph Language Provider
 * Graph Plugin Provider
 
+include::release-3.6.x.asciidoc[]
+
 include::release-3.5.x.asciidoc[]
 
 include::release-3.4.x.asciidoc[]
diff --git a/docs/src/upgrade/release-3.5.x.asciidoc b/docs/src/upgrade/release-3.5.x.asciidoc
index 2507865..c908df4 100644
--- a/docs/src/upgrade/release-3.5.x.asciidoc
+++ b/docs/src/upgrade/release-3.5.x.asciidoc
@@ -58,7 +58,19 @@
 The above examples use the Java `Date` method `toGMTString()` to properly format the date for demonstration purposes.
 From a Gremlin language perspective there are no functions that can be called on the return value of `datetime()`.
 
-See:link:https://issues.apache.org/jira/browse/TINKERPOP-2596[TINKERPOP-2596]
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2596[TINKERPOP-2596]
+
+==== Driver Defaults
+
+Some default value settings were changed to be consistent across different languages.
+
+* The default for `PoolSize` is now `8` instead of `4` in .NET.
+* The default for `MaxInProcessPerConnection` is now `32` instead of `16` in .NET.
+* The default for `maxContentLength` is now 10 mb in the Java builder instead of 65536.
+* The default for `pool_size` is now `8` instead of `4` in Python.
+* If a `protocol_factory` is not specified, it now adheres to the `max_content_length` specified instead of always using 65536 in Python.
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2379[TINKERPOP-2379]
 
 ==== Refinements to null
 
diff --git a/docs/src/upgrade/release-3.6.x.asciidoc b/docs/src/upgrade/release-3.6.x.asciidoc
new file mode 100644
index 0000000..80626f8
--- /dev/null
+++ b/docs/src/upgrade/release-3.6.x.asciidoc
@@ -0,0 +1,148 @@
+////
+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.
+////
+
+= TinkerPop 3.6.0
+
+*NOT NAMED YET*
+
+== TinkerPop 3.6.0
+
+*Release Date: NOT OFFICIALLY RELEASED YET*
+
+Please see the link:https://github.com/apache/tinkerpop/blob/3.6.0/CHANGELOG.asciidoc#release-3-6-0[changelog] for a complete list of all the modifications that are part of this release.
+
+=== Upgrading for Users
+
+==== gremlin-annotations
+
+There is a new module called `gremlin-annotations` and it holds the annotations used to construct
+link:https://tinkerpop.apache.org/docs/current/reference/#gremlin-java-dsl[Java-based Gremlin DSLs]. These annotations
+were formerly in `gremlin-core` and therefore it will be necessary to modify dependencies accordingly when upgrading
+to 3.6.0. Package and class names have remained the same and general usage is unchanged.
+
+[source,xml]
+----
+<dependency>
+    <groupId>org.apache.tinkerpop</groupId>
+    <artifactId>gremlin-annotations</artifactId>
+    <version>3.6.0</version>
+</dependency>
+----
+
+It is worth noting that `gremlin-groovy` utilized the DSL annotations to construct the
+link:https://tinkerpop.apache.org/docs/3.6.0/reference/#credentials-dsl[Credentials DSL] so the `gremlin-annotations`
+package is now explicitly associated to `gremlin-groovy` but as an `<optional>` dependency.
+
+See:link:https://issues.apache.org/jira/browse/TINKERPOP-2411[TINKERPOP-2411]
+
+==== Logging Changes
+
+In Gremlin Server and Gremlin Console distributions, the default logging implementation of log4j 1.2.x has been
+replaced by logback 1.2.x given link:https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2019-17571[CVE-2019-17571].
+While it was easy to replace log4j for users of the zip distributions, it was a little harder for our packaged Docker
+containers which should work more cleanly out of the box.
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2534[TINKERPOP-2534]
+
+==== Short and Byte
+
+Numeric operations around `short` and `byte` have not behaved quite like `int` and `long`. Here is an example of a
+`sum` operation with `sack()`:
+
+[source,text]
+----
+gremlin> g.withSack((short) 2).inject((short) 1, (int) 2).sack(sum).sack()
+==>3
+==>4
+gremlin> g.withSack((short) 2).inject((short) 1, (int) 2).sack(sum).sack().collect{it.class}
+==>class java.lang.Integer
+==>class java.lang.Integer
+gremlin> g.withSack((short) 2).inject((short) 1, (long) 2).sack(sum).sack().collect{it.class}
+==>class java.lang.Integer
+==>class java.lang.Long
+gremlin> g.withSack((short) 2).inject((short) 1,(byte) 2).sack(sum).sack().collect{it.class}
+==>class java.lang.Integer
+==>class java.lang.Integer
+----
+
+Note that the type returned for the the `sum` should be the largest type encountered in the operation, thus if a
+`long + int` would return `long` or a `byte + int` would return `int`. The last example above shows inconsistency in
+this rule when dealing with types `short` and `byte` which simply promote them to `int`.
+
+For 3.6.0, that inconsistency is resolved and may be a breaking change should code be relying on the integer promotion.
+
+[source,text]
+----
+gremlin> g.withSack((short) 2).inject((short) 1,(byte) 2).sack(sum).sack().collect{it.class}
+==>class java.lang.Short
+==>class java.lang.Short
+gremlin> g.withSack((byte) 2).inject((byte) 1,(byte) 2).sack(sum).sack().collect{it.class}
+==>class java.lang.Byte
+==>class java.lang.Byte
+----
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2610[TINKERPOP-2610]
+
+==== Groovy in gremlin-driver
+
+The `gremlin-driver` module no longer depends on `groovy` or `groovy-json`. It became an `<optional>` dependency in
+3.5.0 and general deprecation of the serializers for the `JsonBuilder` class from Groovy (which was the only reason the
+dependency existed in the first place) occurred in 3.5.2. As they were made `<optional>` it is likely that users who
+required those packages have already adjusted their dependencies to explicitly include them. As for those who still
+make use of `JsonBuilder` serialization for some reason, the only recourse is to find the code in TinkerPop and
+maintain it independently. The following classes were removed as of this change (links go to their 3.5.1 versions):
+
+* link:https://github.com/apache/tinkerpop/blob/3.5.1/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/JsonBuilderGryoSerializer.java[JsonBuilderGryoSerializer]
+* link:https://github.com/apache/tinkerpop/blob/3.5.1/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV1d0.java#L170-L184[AbstractGraphSONMessageSerializerV1d0$JsonBuilderJacksonSerializer]
+* link:https://github.com/apache/tinkerpop/blob/3.5.1/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java#L168-L182[AbstractGraphSONMessageSerializerV2d0$JsonBuilderJacksonSerializer]
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2593[TINKERPOP-2593]
+
+=== Upgrading for Providers
+
+==== Graph System Providers
+
+===== Gherkin Tests
+
+TinkerPop originally introduced Gherkin-based feature tests when GLVs were first introduced to help provide a language
+agnostic test capability. The Gherkin tests were a near one-to-one copy of the tests of the Gremlin Process Test Suite
+which focus on Gremlin semantics. Unfortunately, having both JVM tests and Gherkin tests meant maintaining two sets
+of tests which were testing identical things.
+
+To simplify the ongoing maintenance of the test suite and to make it even easier to contribute to the enforcement of
+Gremlin semantics, TinkerPop now provides infrastructure in the `gremlin-test` module to run the Gherkin-based tests.
+For 3.6.0, the old test suite remains intact and is not deprecated, but providers are encouraged to implement the
+Gherkin tests as they will include newer tests that may not be in the old test suite and it would be good to gather
+feedback on the new test suite's usage so that when deprecation and removal of the old suite comes to pass the
+transition will not carry as much friction.
+
+Note that the 3.6.0 release includes a convenience zip distribution for `gremlin-test` that packages both the data
+files and Gherkin features files for a release. This new file can be found on the
+link:https://tinkerpop.apache.org/downloads.html[Downloads page] on the website.
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2601[TINKERPOP-2601],
+link:https://tinkerpop.apache.org/docs/3.6.0/dev/provider/#gherkin-tests-suite[Provider Documentation]
+
+===== Filters with Mixed Id Types
+
+The requirement that "ids" passed to `Graph.vertices` and `Graph.edges` all be of a single type has been removed. This
+requirement was a bit to prescriptive when there really wasn't a need to enforce such a validation. It even conflicted
+with TinkerGraph operations where mixed `T.id` types is a feature. Graph providers may continue to support this
+requirement if they wish, but it is no longer enforced by TinkerPop and the `Graph.idArgsMustBeEitherIdOrElement` has
+been removed so providers will need to construct their own exception.
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2507[TINKERPOP-2507]
\ No newline at end of file
diff --git a/docs/static/images/gremlin-discord-scene.png b/docs/static/images/gremlin-discord-scene.png
new file mode 100644
index 0000000..be8d7ca
--- /dev/null
+++ b/docs/static/images/gremlin-discord-scene.png
Binary files differ
diff --git a/gremlin-annotations/pom.xml b/gremlin-annotations/pom.xml
new file mode 100644
index 0000000..74d0293
--- /dev/null
+++ b/gremlin-annotations/pom.xml
@@ -0,0 +1,150 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>tinkerpop</artifactId>
+        <groupId>org.apache.tinkerpop</groupId>
+        <version>3.6.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>gremlin-annotations</artifactId>
+    <name>Apache TinkerPop :: Gremlin Annotations</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tinkerpop</groupId>
+            <artifactId>gremlin-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup</groupId>
+            <artifactId>javapoet</artifactId>
+            <version>1.13.0</version>
+        </dependency>
+        <!-- TESTING -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.testing.compile</groupId>
+            <artifactId>compile-testing</artifactId>
+            <version>0.19</version>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- self-conflict resolutions over compile-testing -->
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>30.0-jre</version>
+            <exclusions>
+                <!-- prefer the versions from compile-testing -->
+                <exclusion>
+                    <groupId>org.checkerframework</groupId>
+                    <artifactId>checker-qual</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.google.errorprone</groupId>
+                    <artifactId>error_prone_annotations</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.checkerframework</groupId>
+            <artifactId>checker-qual</artifactId>
+            <version>3.7.0</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <directory>${basedir}/target</directory>
+        <finalName>${project.artifactId}-${project.version}</finalName>
+        <testResources>
+            <testResource>
+                <directory>${basedir}/src/test/resources
+                </directory>
+            </testResource>
+        </testResources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-failsafe-plugin</artifactId>
+            </plugin>
+            <!-- -proc:none = disable annotation processing - testing of the GremlinDslProcessor is handled separately -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <compilerArgs>
+                        <arg>-parameters</arg>
+                        <arg>-proc:none</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>jdk11</id>
+            <activation>
+                <jdk>11</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <version>3.8.1</version>
+                        <configuration>
+                            <release>8</release>
+                            <compilerArgs>
+                                <arg>-parameters</arg>
+                                <arg>-proc:none</arg>
+                            </compilerArgs>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>
\ No newline at end of file
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java b/gremlin-annotations/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
similarity index 100%
rename from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
rename to gremlin-annotations/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-annotations/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
similarity index 100%
rename from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
rename to gremlin-annotations/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java b/gremlin-annotations/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
similarity index 100%
rename from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
rename to gremlin-annotations/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
diff --git a/gremlin-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/gremlin-annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor
similarity index 100%
rename from gremlin-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
rename to gremlin-annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java b/gremlin-annotations/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
similarity index 100%
rename from gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
rename to gremlin-annotations/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalSourceDsl.java b/gremlin-annotations/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalSourceDsl.java
similarity index 100%
rename from gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalSourceDsl.java
rename to gremlin-annotations/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalSourceDsl.java
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/RemoteDslTraversal.java b/gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/RemoteDslTraversal.java
similarity index 100%
rename from gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/RemoteDslTraversal.java
rename to gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/RemoteDslTraversal.java
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java b/gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
similarity index 100%
rename from gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
rename to gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialNoDefaultMethodsTraversalDsl.java b/gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialNoDefaultMethodsTraversalDsl.java
similarity index 100%
rename from gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialNoDefaultMethodsTraversalDsl.java
rename to gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialNoDefaultMethodsTraversalDsl.java
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalDsl.java b/gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalDsl.java
similarity index 100%
rename from gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalDsl.java
rename to gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalDsl.java
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java b/gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
similarity index 100%
rename from gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
rename to gremlin-annotations/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
diff --git a/gremlin-archetype/gremlin-archetype-dsl/pom.xml b/gremlin-archetype/gremlin-archetype-dsl/pom.xml
index ac46e2a..9ae9e60 100644
--- a/gremlin-archetype/gremlin-archetype-dsl/pom.xml
+++ b/gremlin-archetype/gremlin-archetype-dsl/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>gremlin-archetype</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>gremlin-archetype-dsl</artifactId>
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
index 282779f..96677ea 100644
--- a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
@@ -35,9 +35,15 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <version>${slf4j.version}</version>
+            <groupId>org.apache.tinkerpop</groupId>
+            <artifactId>gremlin-annotations</artifactId>
+            <version>${project.version}</version>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback.version}</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
diff --git a/gremlin-archetype/gremlin-archetype-server/pom.xml b/gremlin-archetype/gremlin-archetype-server/pom.xml
index 9b6d5ee..c7ca57a 100644
--- a/gremlin-archetype/gremlin-archetype-server/pom.xml
+++ b/gremlin-archetype/gremlin-archetype-server/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>gremlin-archetype</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>gremlin-archetype-server</artifactId>
diff --git a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/README.asciidoc b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/README.asciidoc
index 9daafb2..14d6373 100644
--- a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/README.asciidoc
+++ b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/README.asciidoc
@@ -65,4 +65,4 @@
 Run this project as follows:
 
 [source,text]
-mvn exec:java -Dexec.mainClass="${package}.App" -Dlog4j.configuration=file:conf/log4j.properties -Dport=8182
+mvn exec:java -Dexec.mainClass="${package}.App" -Dlogback.configurationFile=file:conf/logback.xml -Dport=8182
diff --git a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/log4j-test.properties b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/log4j-test.properties
deleted file mode 100644
index ef436fe..0000000
--- a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/log4j-test.properties
+++ /dev/null
@@ -1,21 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/log4j.properties b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/log4j.properties
deleted file mode 100644
index 2b58359..0000000
--- a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/log4j.properties
+++ /dev/null
@@ -1,21 +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.
-
-log4j.rootLogger=INFO, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/logback-test.xml b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/logback-test.xml
new file mode 100644
index 0000000..5d94c3b
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/logback-test.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/logback.xml b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/logback.xml
new file mode 100644
index 0000000..8d11ce4
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/conf/logback.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/pom.xml b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/pom.xml
index 3f4945b..22ceff8 100644
--- a/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/pom.xml
+++ b/gremlin-archetype/gremlin-archetype-server/src/main/resources/archetype-resources/pom.xml
@@ -35,9 +35,9 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <version>${slf4j.version}</version>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.tinkerpop</groupId>
@@ -72,7 +72,7 @@
                 <version>2.22.0</version>
                 <configuration>
                     <systemPropertyVariables>
-                        <log4j.configuration>file:conf/log4j-test.properties</log4j.configuration>
+                        <logback.configurationFile>file:conf/logback-test.properties</logback.configurationFile>
                     </systemPropertyVariables>
                 </configuration>
             </plugin>
diff --git a/gremlin-archetype/gremlin-archetype-tinkergraph/pom.xml b/gremlin-archetype/gremlin-archetype-tinkergraph/pom.xml
index daf51a3..6caa60e 100644
--- a/gremlin-archetype/gremlin-archetype-tinkergraph/pom.xml
+++ b/gremlin-archetype/gremlin-archetype-tinkergraph/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>gremlin-archetype</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>gremlin-archetype-tinkergraph</artifactId>
diff --git a/gremlin-archetype/gremlin-archetype-tinkergraph/src/main/resources/archetype-resources/pom.xml b/gremlin-archetype/gremlin-archetype-tinkergraph/src/main/resources/archetype-resources/pom.xml
index 6f1ebed..830e194 100644
--- a/gremlin-archetype/gremlin-archetype-tinkergraph/src/main/resources/archetype-resources/pom.xml
+++ b/gremlin-archetype/gremlin-archetype-tinkergraph/src/main/resources/archetype-resources/pom.xml
@@ -35,9 +35,9 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <version>${slf4j.version}</version>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback.version}</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
diff --git a/gremlin-archetype/pom.xml b/gremlin-archetype/pom.xml
index 76c366d..92920bf 100644
--- a/gremlin-archetype/pom.xml
+++ b/gremlin-archetype/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>tinkerpop</artifactId>
         <groupId>org.apache.tinkerpop</groupId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>gremlin-archetype</artifactId>
diff --git a/gremlin-console/bin/gremlin.sh b/gremlin-console/bin/gremlin.sh
index bea9d1a..9b204a5 120000
--- a/gremlin-console/bin/gremlin.sh
+++ b/gremlin-console/bin/gremlin.sh
@@ -1 +1 @@
-../target/apache-tinkerpop-gremlin-console-3.5.2-SNAPSHOT-standalone/bin/gremlin.sh
\ No newline at end of file
+../target/apache-tinkerpop-gremlin-console-3.6.0-SNAPSHOT-standalone/bin/gremlin.sh
\ No newline at end of file
diff --git a/gremlin-console/conf/log4j-console.properties b/gremlin-console/conf/log4j-console.properties
deleted file mode 100644
index f0710f6..0000000
--- a/gremlin-console/conf/log4j-console.properties
+++ /dev/null
@@ -1,29 +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.
-
-log4j.rootLogger=${gremlin.log4j.level}, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%-5p %c %x - %m%n
-
-log4j.logger.org.apache.hadoop.mapred.JobClient=INFO
-log4j.logger.org.apache.hadoop.mapreduce.Job=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.driver.Host=ERROR
-log4j.logger.org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.MapReduceGraphComputer=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.spark.process.computer.SparkGraphComputer=INFO
-log4j.logger.org.apache.spark.metrics.MetricsSystem=ERROR
\ No newline at end of file
diff --git a/gremlin-console/conf/logback.xml b/gremlin-console/conf/logback.xml
new file mode 100644
index 0000000..556ffa2
--- /dev/null
+++ b/gremlin-console/conf/logback.xml
@@ -0,0 +1,33 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C{1} - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph" level="INFO"/>
+    <logger name="org.apache.tinkerpop.gremlin.driver.Host" level="ERROR"/>
+    <logger name="org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.MapReduceGraphComputer" level="INFO"/>
+    <logger name="org.apache.hadoop.mapreduce.Job" level="INFO"/>
+    <logger name="org.apache.spark.metrics.MetricsSystem" level="ERROR"/>
+    <logger name="org.apache.tinkerpop.gremlin.spark.process.computer.SparkGraphComputer" level="INFO"/>
+    <logger name="org.apache.hadoop.mapred.JobClient" level="INFO"/>
+    <root level="${gremlin.logback.level}">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-console/pom.xml b/gremlin-console/pom.xml
index 0be5af9..c7bd663 100644
--- a/gremlin-console/pom.xml
+++ b/gremlin-console/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>tinkerpop</artifactId>
         <groupId>org.apache.tinkerpop</groupId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-console</artifactId>
     <name>Apache TinkerPop :: Gremlin Console</name>
@@ -51,13 +51,8 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <optional>true</optional>
         </dependency>
         <!-- TESTING -->
@@ -461,6 +456,16 @@
                                 </configuration>
                             </execution>
                             <execution>
+                                <id>docker-image-tag-latest</id>
+                                <goals>
+                                    <goal>tag</goal>
+                                </goals>
+                                <configuration>
+                                    <tag>latest</tag>
+                                    <skip>${only.when.is.prerelease.version}</skip>
+                                </configuration>
+                            </execution>
+                            <execution>
                                 <id>docker-image-push</id>
                                 <phase>deploy</phase>
                                 <goals>
@@ -482,6 +487,17 @@
                                     <skip>${only.when.is.prerelease.version}</skip>
                                 </configuration>
                             </execution>
+                            <execution>
+                                <id>docker-image-push-latest</id>
+                                <phase>deploy</phase>
+                                <goals>
+                                    <goal>push</goal>
+                                </goals>
+                                <configuration>
+                                    <tag>latest</tag>
+                                    <skip>${only.when.is.prerelease.version}</skip>
+                                </configuration>
+                            </execution>
                         </executions>
                         <configuration>
                             <repository>tinkerpop/gremlin-console</repository>
diff --git a/gremlin-console/src/main/bin/gremlin.sh b/gremlin-console/src/main/bin/gremlin.sh
index bd5b71c..9fbd8a0 100755
--- a/gremlin-console/src/main/bin/gremlin.sh
+++ b/gremlin-console/src/main/bin/gremlin.sh
@@ -67,7 +67,7 @@
     JAVA="$JAVA_HOME/bin/java -server"
 fi
 
-# Set default message threshold for Log4j Gremlin's console appender
+# Set default message threshold for logging in Gremlin's console appender
 if [ -z "${GREMLIN_LOG_LEVEL:-}" ]; then
     GREMLIN_LOG_LEVEL=WARN
 fi
@@ -97,7 +97,7 @@
     JVM_OPTS+=( "${JAVA_OPTIONS}" )
 fi
 
-JVM_OPTS+=( "-Duser.working_dir=${USER_DIR}" "-Dtinkerpop.ext=${USER_EXT_DIR:-${SYSTEM_EXT_DIR}}" "-Dlog4j.configuration=conf/log4j-console.properties" "-Dgremlin.log4j.level=$GREMLIN_LOG_LEVEL" )
+JVM_OPTS+=( "-Duser.working_dir=${USER_DIR}" "-Dtinkerpop.ext=${USER_EXT_DIR:-${SYSTEM_EXT_DIR}}" "-Dlogback.configurationFile=conf/logback.xml" "-Dgremlin.logback.level=$GREMLIN_LOG_LEVEL" )
 JVM_OPTS=$(awk -v RS=' ' '!/^$/ {if (!x[$0]++) print}' <<< "${JVM_OPTS}" | grep -v '^$' | paste -sd ' ' -)
 
 if [ -n "$SCRIPT_DEBUG" ]; then
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 2f12c4c..a19c4b6 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
@@ -43,7 +43,6 @@
 import org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0;
 import org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0;
 import org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0;
-import org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer;
 import org.apache.tinkerpop.gremlin.driver.ser.MessageTextSerializer;
 import org.apache.tinkerpop.gremlin.driver.ser.SerTokens;
 import org.apache.tinkerpop.gremlin.driver.ser.SerializationException;
@@ -86,7 +85,6 @@
                     GryoMessageSerializerV1d0.class,
                     GryoMessageSerializerV3d0.class,
                     GraphBinaryMessageSerializerV1.class,
-                    JsonBuilderGryoSerializer.class,
                     MessageTextSerializer.class,
                     SerializationException.class,
                     Serializers.class,
diff --git a/gremlin-console/src/main/static/LICENSE b/gremlin-console/src/main/static/LICENSE
index f3da4f7..fa7879f 100644
--- a/gremlin-console/src/main/static/LICENSE
+++ b/gremlin-console/src/main/static/LICENSE
@@ -225,7 +225,6 @@
 
      JCL 1.1.1 implemented over SLF4J (org.slf4j:jcl-over-slf4j:1.7.25 - http://www.slf4j.org) - for details, see licenses/slf4j
      SLF4J API Module (org.slf4j:slf4j-api:1.7.25 - http://www.slf4j.org) - for details, see licenses/slf4j
-     SLF4J LOG4J-12 Binding (org.slf4j:slf4j-log4j12:1.7.25 - http://www.slf4j.org) - for details, see licenses/slf4j
      Foundation stylesheet for CodeRay (http://foundation.zurb.com) - for details, see licenses/foundation
      normalize.css 2.1.2 (http://necolas.github.io/normalize.css/) - for details, see licenses/normalize
 
@@ -236,3 +235,8 @@
 The Apache TinkerPop project bundles the following components under the ISC License:
 
      jBCrypt (org.mindrot:jbcrypt:0.4 - https://github.com/djmdjm/jBCrypt) - for details, see licenses/jbcrypt
+
+The Apache TinkerPop project bundles the following components under the Eclipse Public License 1.0:
+
+     logback-core (ch.qos.logback:logback-core:1.2.3 - https://logback.qos.ch) - for details, see licenses/logback
+     logback-classic (ch.qos.logback:logback-classic:1.2.3 - https://logback.qos.ch) - for details, see licenses/logback
diff --git a/gremlin-console/src/main/static/licenses/logback b/gremlin-console/src/main/static/licenses/logback
new file mode 100644
index 0000000..8953762
--- /dev/null
+++ b/gremlin-console/src/main/static/licenses/logback
@@ -0,0 +1,14 @@
+Logback LICENSE
+---------------
+
+Logback: the reliable, generic, fast and flexible logging framework.
+Copyright (C) 1999-2015, QOS.ch. All rights reserved.
+
+This program and the accompanying materials are dual-licensed under
+either the terms of the Eclipse Public License v1.0 as published by
+the Eclipse Foundation
+
+  or (per the licensee's choosing)
+
+under the terms of the GNU Lesser General Public License version 2.1
+as published by the Free Software Foundation.
\ No newline at end of file
diff --git a/gremlin-console/src/test/resources/log4j-silent.properties b/gremlin-console/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 1825bb0..0000000
--- a/gremlin-console/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,23 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-console/src/test/resources/log4j-test.properties b/gremlin-console/src/test/resources/log4j-test.properties
deleted file mode 100644
index ef436fe..0000000
--- a/gremlin-console/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,21 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-console/src/test/resources/logback-silent.xml b/gremlin-console/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..4c5947d
--- /dev/null
+++ b/gremlin-console/src/test/resources/logback-silent.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-console/src/test/resources/logback-test.xml b/gremlin-console/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..5d94c3b
--- /dev/null
+++ b/gremlin-console/src/test/resources/logback-test.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-core/pom.xml b/gremlin-core/pom.xml
index f07d216..cef750b 100644
--- a/gremlin-core/pom.xml
+++ b/gremlin-core/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-core</artifactId>
     <name>Apache TinkerPop :: Gremlin Core</name>
@@ -52,20 +52,11 @@
             <artifactId>commons-lang3</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-text</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.yaml</groupId>
             <artifactId>snakeyaml</artifactId>
             <version>${snakeyaml.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.javatuples</groupId>
-            <artifactId>javatuples</artifactId>
-            <version>${java.tuples.version}</version>
-        </dependency>
-        <dependency>
             <groupId>com.carrotsearch</groupId>
             <artifactId>hppc</artifactId>
             <version>0.7.1</version>
@@ -82,11 +73,6 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>com.squareup</groupId>
-            <artifactId>javapoet</artifactId>
-            <version>1.8.0</version>
-        </dependency>
-        <dependency>
             <groupId>net.objecthunter</groupId>
             <artifactId>exp4j</artifactId>
             <version>0.4.8</version>
@@ -107,8 +93,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
+            <groupId>io.github.hakky54</groupId>
+            <artifactId>logcaptor</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -121,47 +107,6 @@
             <artifactId>hamcrest</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>com.google.testing.compile</groupId>
-            <artifactId>compile-testing</artifactId>
-            <version>0.15</version>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.google.guava</groupId>
-                    <artifactId>guava</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>com.google.errorprone</groupId>
-                    <artifactId>error_prone_annotations</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <!-- resolve self-conflict within compile-testing -->
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>23.4-android</version>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.google.errorprone</groupId>
-                    <artifactId>error_prone_annotations</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>com.google.errorprone</groupId>
-            <artifactId>error_prone_annotations</artifactId>
-            <version>2.0.19</version>
-            <scope>test</scope>
-            <exclusions>
-              <exclusion>
-                <artifactId>tools</artifactId>
-                <groupId>com.sun</groupId>
-              </exclusion>
-            </exclusions>
-        </dependency>
     </dependencies>
     <build>
         <directory>${basedir}/target</directory>
@@ -181,46 +126,6 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-failsafe-plugin</artifactId>
             </plugin>
-            <!-- disable annotation processing - testing of the GremlinDslProcessor is handled separately -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                    <compilerArgs>
-                        <arg>-parameters</arg>
-                        <arg>-proc:none</arg>
-                    </compilerArgs>
-                </configuration>
-            </plugin>
         </plugins>
     </build>
-
-    <profiles>
-        <profile>
-            <id>jdk11</id>
-            <activation>
-                <jdk>11</jdk>
-            </activation>
-            <build>
-                <pluginManagement>
-                    <plugins>
-                        <plugin>
-                            <groupId>org.apache.maven.plugins</groupId>
-                            <artifactId>maven-compiler-plugin</artifactId>
-                            <version>3.8.1</version>
-                            <configuration>
-                                <release>8</release>
-                                <compilerArgs>
-                                    <arg>-parameters</arg>
-                                    <arg>-proc:none</arg>
-                                </compilerArgs>
-                            </configuration>
-                        </plugin>
-                    </plugins>
-                </pluginManagement>
-            </build>
-        </profile>
-    </profiles>
 </project>
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
index 697f0eb..4956833 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
@@ -29,6 +29,7 @@
 
 import java.io.Serializable;
 import java.util.NoSuchElementException;
+import java.util.Optional;
 import java.util.function.BinaryOperator;
 
 /**
@@ -43,11 +44,11 @@
     }
 
     /**
-     * Returns {@code null} if traversal is not iterated or if not locked after strategy application.
+     * Returns {@code Optional.empty()} if traversal is not iterated or if not locked after strategy application.
      */
-    public MutableMetrics getMetrics() {
+    public Optional<MutableMetrics> getMetrics() {
         if (this.traversal.isLocked()) this.initializeIfNeeded();
-        return metrics;
+        return Optional.ofNullable(metrics);
     }
 
     @Override
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
index 4f92069..2c4b0e8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -133,10 +133,13 @@
     }
 
     /**
-     * Extracts metrics from the provided {@code traversal} and computes metrics. Calling this method finalizes the
+     * Extracts metrics from the provided {@link Traversal} and computes metrics. Calling this method finalizes the
      * metrics such that their values can no longer be modified.
      */
     public synchronized void setMetrics(final Traversal.Admin traversal, final boolean onGraphComputer) {
+        // this is meant to be called on a traversal that is locked so that the metrics can get initialized
+        // properly in all the ProfileStep instances
+        if (!traversal.isLocked()) throw new IllegalStateException("Metrics cannot be computed when the traversal is not locked");
         if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
         finalized = true;
         handleNestedTraversals(traversal, null, onGraphComputer);
@@ -151,8 +154,8 @@
 
         for (int ii = 0; ii < profileSteps.size(); ii++) {
             // The index is necessary to ensure that step order is preserved after a merge.
-            final ProfileStep step = profileSteps.get(ii);
-            final MutableMetrics stepMetrics = onGraphComputer ? traversal.getSideEffects().get(step.getId()) : step.getMetrics();
+            final ProfileStep<?> step = profileSteps.get(ii);
+            final MutableMetrics stepMetrics = onGraphComputer ? traversal.getSideEffects().get(step.getId()) : step.getMetrics().get();
 
             this.totalStepDuration += stepMetrics.getDuration(MutableMetrics.SOURCE_UNIT);
             tempMetrics.add(Pair.with(ii, stepMetrics.clone()));
@@ -178,7 +181,7 @@
 
             final MutableMetrics metrics = onGraphComputer ?
                     traversal.getSideEffects().get(step.getId()) :
-                    ((ProfileStep) step).getMetrics();
+                    ((ProfileStep<?>) step).getMetrics().get();
 
             if (null != metrics) { // this happens when a particular branch never received a .next() call (the metrics were never initialized)
                 if (!onGraphComputer) {
@@ -250,7 +253,11 @@
             if (!annotations.isEmpty()) {
                 // ignore the PERCENT_DURATION_KEY as that is a TinkerPop annotation that is displayed by default
                 annotations.entrySet().stream().filter(kv -> !kv.getKey().equals(PERCENT_DURATION_KEY)).forEach(kv -> {
-                    final String prefix = "    \\_";
+                    final StringBuilder prefixBuilder = new StringBuilder("  ");
+                    for (int i = 0; i < indent; i++) {
+                        prefixBuilder.append("  ");
+                    }
+                    final String prefix = prefixBuilder.append("\\_").toString();
                     final String separator = "=";
                     final String k = prefix + StringUtils.abbreviate(kv.getKey(), 30);
                     final int valueIndentLen = separator.length() + k.length() + indent;
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
index da1c998..42af032 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
@@ -1228,10 +1228,6 @@
             return new IllegalArgumentException(String.format("Edge with id already exists: %s", id));
         }
 
-        public static IllegalArgumentException idArgsMustBeEitherIdOrElement() {
-            return new IllegalArgumentException("id arguments must be either ids or Elements");
-        }
-
         public static IllegalArgumentException argumentCanNotBeNull(final String argument) {
             return new IllegalArgumentException(String.format("The provided argument can not be null: %s", argument));
         }
@@ -1250,6 +1246,8 @@
         public static String SUITE_STRUCTURE_INTEGRATE = "org.apache.tinkerpop.gremlin.structure.StructureIntegrateSuite";
         public static String SUITE_PROCESS_COMPUTER = "org.apache.tinkerpop.gremlin.process.ProcessComputerSuite";
         public static String SUITE_PROCESS_STANDARD = "org.apache.tinkerpop.gremlin.process.ProcessStandardSuite";
+        public static String SUITE_PROCESS_LIMITED_COMPUTER = "org.apache.tinkerpop.gremlin.process.ProcessLimitedComputerSuite";
+        public static String SUITE_PROCESS_LIMITED_STANDARD = "org.apache.tinkerpop.gremlin.process.ProcessLimitedStandardSuite";
 
         /**
          * The test suite class to opt in to.
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
index c9a9a44..48e8733 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
@@ -68,23 +68,6 @@
     }
 
     /**
-     * Determine whether an array of ids are either all elements or ids of elements. This is typically used as a pre-condition check.
-     *
-     * @param clazz the class of the element for which the ids will bind
-     * @param ids   the ids that must be either elements or id objects, else
-     * {@link org.apache.tinkerpop.gremlin.structure.Graph.Exceptions#idArgsMustBeEitherIdOrElement()} is thrown.
-     */
-    public static void validateMixedElementIds(final Class<? extends Element> clazz, final Object... ids) throws IllegalArgumentException {
-        if (ids.length > 1) {
-            final boolean element = clazz.isAssignableFrom(ids[0].getClass());
-            for (int i = 1; i < ids.length; i++) {
-                if (clazz.isAssignableFrom(ids[i].getClass()) != element)
-                    throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();
-            }
-        }
-    }
-
-    /**
      * Determines whether the property key/value for the specified thing can be legally set. This is typically used as
      * a pre-condition check prior to setting a property.
      *
@@ -565,8 +548,9 @@
 
         // it is OK to evaluate equality of ids via toString() now given that the toString() the test suite
         // enforces the value of id.()toString() to be a first class representation of the identifier
-        if (1 == providedIds.length) return id.toString().equals(providedIds[0].toString());
-        else {
+        if (1 == providedIds.length) {
+            return id.toString().equals(providedIds[0].toString());
+        } else {
             for (final Object temp : providedIds) {
                 if (temp.toString().equals(id.toString()))
                     return true;
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java
index 8293195..db756ec 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java
@@ -29,10 +29,10 @@
 public final class NumberHelper {
 
     static final NumberHelper BYTE_NUMBER_HELPER = new NumberHelper(
-            (a, b) -> a.byteValue() + b.byteValue(),
-            (a, b) -> a.byteValue() - b.byteValue(),
-            (a, b) -> a.byteValue() * b.byteValue(),
-            (a, b) -> a.byteValue() / b.byteValue(),
+            (a, b) -> (byte) (a.byteValue() + b.byteValue()),
+            (a, b) -> (byte) (a.byteValue() - b.byteValue()),
+            (a, b) -> (byte) (a.byteValue() * b.byteValue()),
+            (a, b) -> (byte) (a.byteValue() / b.byteValue()),
             (a, b) -> {
                 if (isNumber(a)) {
                     if (isNumber(b)) {
@@ -56,10 +56,10 @@
             (a, b) -> Byte.compare(a.byteValue(), b.byteValue()));
 
     static final NumberHelper SHORT_NUMBER_HELPER = new NumberHelper(
-            (a, b) -> a.shortValue() + b.shortValue(),
-            (a, b) -> a.shortValue() - b.shortValue(),
-            (a, b) -> a.shortValue() * b.shortValue(),
-            (a, b) -> a.shortValue() / b.shortValue(),
+            (a, b) -> (short) (a.shortValue() + b.shortValue()),
+            (a, b) -> (short) (a.shortValue() - b.shortValue()),
+            (a, b) -> (short) (a.shortValue() * b.shortValue()),
+            (a, b) -> (short) (a.shortValue() / b.shortValue()),
             (a, b) -> {
                 if (isNumber(a)) {
                     if (isNumber(b)) {
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/AbortiveMultiIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/AbortiveMultiIterator.java
new file mode 100644
index 0000000..2235822
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/AbortiveMultiIterator.java
@@ -0,0 +1,120 @@
+/*
+ * 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.iterator;
+
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.structure.util.CloseableIterator;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * An {@code Iterator} that checks a {@code Predicate} prior to processing the specified child {@code Iterator}
+ * instances.
+ */
+public final class AbortiveMultiIterator<T> implements Iterator<T>, Serializable, AutoCloseable {
+
+    private final List<Iterator<T>> iterators = new ArrayList<>();
+    private final List<Predicate<Long>> checks = new ArrayList<>();
+    private long counter = 0;
+    private int current = 0;
+
+    /**
+     * Adds an {@code Iterator} that will always be iterated.
+     */
+    public void addIterator(final Iterator<T> iterator) {
+        addIterator(iterator, c -> true);
+    }
+
+    /**
+     * Adds an {@code Iterator} that will iterate only if the {@code check} passes.
+     *
+     * @param check when returning {@code true} processing of the associated {@code Iterator} will proceed
+     */
+    public void addIterator(final Iterator<T> iterator, final Predicate<Long> check) {
+        this.iterators.add(iterator);
+        this.checks.add(check);
+    }
+
+    @Override
+    public boolean hasNext() {
+        if (this.current >= this.iterators.size())
+            return false;
+
+        Iterator<T> currentIterator = this.iterators.get(this.current);
+
+        while (true) {
+            if (currentIterator.hasNext()) {
+                return true;
+            } else {
+                this.current++;
+                if (this.current >= iterators.size() || !checks.get(current).test(counter))
+                    break;
+                currentIterator = iterators.get(this.current);
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void remove() {
+        this.iterators.get(this.current).remove();
+    }
+
+    @Override
+    public T next() {
+        if (this.iterators.isEmpty()) throw FastNoSuchElementException.instance();
+
+        Iterator<T> currentIterator = iterators.get(this.current);
+
+        while (true) {
+            if (currentIterator.hasNext()) {
+                this.counter++;
+                return currentIterator.next();
+            } else {
+                this.current++;
+                if (this.current >= iterators.size() || !checks.get(current).test(counter))
+                    break;
+                currentIterator = iterators.get(current);
+            }
+        }
+        throw FastNoSuchElementException.instance();
+    }
+
+    public void clear() {
+        this.iterators.clear();
+        this.checks.clear();
+        this.counter = 0;
+        this.current = 0;
+    }
+
+    /**
+     * Close the underlying iterators if auto-closeable. Note that when Exception is thrown from any iterator
+     * in the for loop on closing, remaining iterators possibly left unclosed.
+     */
+    @Override
+    public void close() {
+        for (Iterator<T> iterator : this.iterators) {
+            CloseableIterator.closeIterator(iterator);
+        }
+    }
+}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/ImportGremlinPluginTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/ImportGremlinPluginTest.java
index 3bf9757..b2a1a3c 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/ImportGremlinPluginTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/ImportGremlinPluginTest.java
@@ -26,7 +26,9 @@
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -36,8 +38,6 @@
 import org.apache.tinkerpop.gremlin.util.Gremlin;
 import org.junit.Test;
 
-import com.google.common.collect.ImmutableSet;
-
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
@@ -147,12 +147,10 @@
                 .fieldsImports(Collections.singletonList(Math.class.getCanonicalName() + "#*")).create();
 
         final DefaultImportCustomizer customizer = (DefaultImportCustomizer) module.getCustomizers().get()[0];
-        assertThat(customizer.getFieldImports(), is(ImmutableSet.of(Math.class.getField("PI"), Math.class.getField("E"))));
+        assertThat(customizer.getFieldImports(), is(new HashSet<>(
+                Arrays.asList(Math.class.getField("PI"), Math.class.getField("E")))));
     }
 
-
-    
-    
     @Test
     public void shouldThrowExceptionIfInvalidEnumDescriptor() throws Exception {
         final String badDescriptor = "T*id";
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/EdgeLabelVerificationStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/EdgeLabelVerificationStrategyTest.java
index 1b869a4..1e9d52f 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/EdgeLabelVerificationStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/EdgeLabelVerificationStrategyTest.java
@@ -18,9 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import nl.altindag.log.LogCaptor;
 import org.apache.tinkerpop.gremlin.process.traversal.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
@@ -28,20 +26,19 @@
 import org.apache.tinkerpop.gremlin.process.traversal.translator.GroovyTranslator;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
-import java.util.stream.Stream;
 
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 /**
@@ -55,22 +52,21 @@
             "^The provided traversal contains a vertex step without any specified edge label: VertexStep.*")
             .asPredicate();
 
-    private TestLogAppender logAppender;
-    private Level previousLogLevel;
+    private static LogCaptor logCaptor;
 
-    @Before
-    public void setupForEachTest() {
-        final org.apache.log4j.Logger strategyLogger = org.apache.log4j.Logger.getLogger(AbstractWarningVerificationStrategy.class);
-        previousLogLevel = strategyLogger.getLevel();
-        strategyLogger.setLevel(Level.WARN);
-        Logger.getRootLogger().addAppender(logAppender = new TestLogAppender());
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forClass(AbstractWarningVerificationStrategy.class);
     }
 
-    @After
-    public void teardownForEachTest() {
-        final org.apache.log4j.Logger strategyLogger = org.apache.log4j.Logger.getLogger(AbstractWarningVerificationStrategy.class);
-        strategyLogger.setLevel(previousLogLevel);
-        Logger.getRootLogger().removeAppender(logAppender);
+    @Before
+    public void resetLogs() {
+        logCaptor.clearLogs();
+    }
+
+    @AfterClass
+    public static void tearDown() {
+        logCaptor.close();
     }
 
     @Parameterized.Parameters(name = "{0}")
@@ -103,7 +99,7 @@
         final Traversal traversal = this.traversal.asAdmin().clone();
         traversal.asAdmin().setStrategies(strategies);
         traversal.asAdmin().applyStrategies();
-        assertThat(repr, logAppender.isEmpty());
+        assertEquals(0, logCaptor.getLogs().size());
     }
 
     @Test
@@ -123,7 +119,7 @@
                 assertThat(repr, MSG_PREDICATE.test(ise.getMessage()));
             }
         }
-        assertThat(repr, logAppender.isEmpty());
+        assertEquals(0, logCaptor.getLogs().size());
     }
 
     @Test
@@ -135,8 +131,8 @@
         traversal.asAdmin().setStrategies(strategies);
         traversal.asAdmin().applyStrategies();
         if (!allow) {
-            assertThat(String.format("Expected log entry not found in %s for %s", logAppender.messages, repr),
-                    logAppender.messages().anyMatch(MSG_PREDICATE));
+            assertThat(String.format("Expected log entry not found in %s for %s", logCaptor.getLogs(), repr),
+                    logCaptor.getLogs().stream().anyMatch(MSG_PREDICATE));
         }
     }
 
@@ -149,7 +145,7 @@
         traversal.asAdmin().setStrategies(strategies);
         if (allow) {
             traversal.asAdmin().applyStrategies();
-            assertThat(repr, logAppender.isEmpty());
+            assertEquals(0, logCaptor.getLogs().size());
         } else {
             try {
                 traversal.asAdmin().applyStrategies();
@@ -157,36 +153,8 @@
             } catch (VerificationException ise) {
                 assertThat(repr, MSG_PREDICATE.test(ise.getMessage()));
             }
-            assertThat(String.format("Expected log entry not found in %s for %s", logAppender.messages, repr),
-                    logAppender.messages().anyMatch(MSG_PREDICATE));
-        }
-    }
-
-    class TestLogAppender extends AppenderSkeleton {
-
-        private List<String> messages = new ArrayList<>();
-
-        boolean isEmpty() {
-            return messages.isEmpty();
-        }
-
-        Stream<String> messages() {
-            return messages.stream();
-        }
-
-        @Override
-        protected void append(org.apache.log4j.spi.LoggingEvent loggingEvent) {
-            messages.add(loggingEvent.getMessage().toString());
-        }
-
-        @Override
-        public void close() {
-
-        }
-
-        @Override
-        public boolean requiresLayout() {
-            return false;
+            assertThat(String.format("Expected log entry not found in %s for %s", logCaptor.getLogs(), repr),
+                    logCaptor.getLogs().stream().anyMatch(MSG_PREDICATE));
         }
     }
 }
\ No newline at end of file
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategyTest.java
index f037e39..fa08502 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategyTest.java
@@ -18,9 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import nl.altindag.log.LogCaptor;
 import org.apache.tinkerpop.gremlin.process.traversal.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
@@ -28,23 +26,20 @@
 import org.apache.tinkerpop.gremlin.process.traversal.translator.GroovyTranslator;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.structure.T;
-import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
-import java.util.List;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
-import java.util.stream.Stream;
 
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 /**
@@ -58,22 +53,21 @@
             ".*that is setting a property key to a reserved word.*")
             .asPredicate();
 
-    private TestLogAppender logAppender;
-    private Level previousLogLevel;
+    private static LogCaptor logCaptor;
 
-    @Before
-    public void setupForEachTest() {
-        final Logger strategyLogger = Logger.getLogger(AbstractWarningVerificationStrategy.class);
-        previousLogLevel = strategyLogger.getLevel();
-        strategyLogger.setLevel(Level.WARN);
-        Logger.getRootLogger().addAppender(logAppender = new TestLogAppender());
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forClass(AbstractWarningVerificationStrategy.class);
     }
 
-    @After
-    public void teardownForEachTest() {
-        final Logger strategyLogger = Logger.getLogger(AbstractWarningVerificationStrategy.class);
-        strategyLogger.setLevel(previousLogLevel);
-        Logger.getRootLogger().removeAppender(logAppender);
+    @Before
+    public void resetLogs() {
+        logCaptor.clearLogs();
+    }
+
+    @AfterClass
+    public static void tearDown() {
+        logCaptor.close();
     }
 
     @Parameterized.Parameters(name = "{0}")
@@ -105,7 +99,7 @@
         final Traversal traversal = this.traversal.asAdmin().clone();
         traversal.asAdmin().setStrategies(strategies);
         traversal.asAdmin().applyStrategies();
-        assertThat(repr, logAppender.isEmpty(), is(true));
+        assertEquals(0, logCaptor.getLogs().size());
     }
 
     @Test
@@ -128,7 +122,7 @@
                 assertThat(repr, MSG_PREDICATE.test(ise.getMessage()));
             }
         }
-        assertThat(repr, logAppender.isEmpty());
+        assertEquals(0, logCaptor.getLogs().size());
     }
 
     @Test
@@ -143,8 +137,8 @@
         traversal.asAdmin().setStrategies(strategies);
         traversal.asAdmin().applyStrategies();
         if (!allow) {
-            assertThat(String.format("Expected log entry not found in %s for %s", logAppender.messages, repr),
-                    logAppender.messages().anyMatch(MSG_PREDICATE));
+            assertThat(String.format("Expected log entry not found in %s for %s", logCaptor.getLogs(), repr),
+                    logCaptor.getLogs().stream().anyMatch(MSG_PREDICATE));
         }
     }
 
@@ -161,7 +155,7 @@
         traversal.asAdmin().setStrategies(strategies);
         if (allow) {
             traversal.asAdmin().applyStrategies();
-            assertThat(repr, logAppender.isEmpty());
+            assertEquals(0, logCaptor.getLogs().size());
         } else {
             try {
                 traversal.asAdmin().applyStrategies();
@@ -169,36 +163,8 @@
             } catch (VerificationException ise) {
                 assertThat(repr, MSG_PREDICATE.test(ise.getMessage()));
             }
-            assertTrue(String.format("Expected log entry not found in %s for %s", logAppender.messages, repr),
-                    logAppender.messages().anyMatch(MSG_PREDICATE));
-        }
-    }
-
-    class TestLogAppender extends AppenderSkeleton {
-
-        private List<String> messages = new ArrayList<>();
-
-        boolean isEmpty() {
-            return messages.isEmpty();
-        }
-
-        Stream<String> messages() {
-            return messages.stream();
-        }
-
-        @Override
-        protected void append(org.apache.log4j.spi.LoggingEvent loggingEvent) {
-            messages.add(loggingEvent.getMessage().toString());
-        }
-
-        @Override
-        public void close() {
-
-        }
-
-        @Override
-        public boolean requiresLayout() {
-            return false;
+            assertThat(String.format("Expected log entry not found in %s for %s", logCaptor.getLogs(), repr),
+                    logCaptor.getLogs().stream().anyMatch(MSG_PREDICATE));
         }
     }
 }
\ No newline at end of file
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetricsTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetricsTest.java
new file mode 100644
index 0000000..9c4c2d8
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetricsTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.process.traversal.util;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class DefaultTraversalMetricsTest {
+
+    @Test
+    public void shouldPrintIndentationsCorrectly() {
+        final List<MutableMetrics> metrics = new ArrayList<>();
+        final MutableMetrics rootMetrics = new MutableMetrics("1", "GraphStep");
+        metrics.add(rootMetrics);
+
+        final MutableMetrics queryMetrics = new MutableMetrics("1.1", "GraphQuery");
+        queryMetrics.setAnnotation("condition", "name = Bob");
+        rootMetrics.addNested(queryMetrics);
+
+        final MutableMetrics childMetrics = new MutableMetrics("1.1.1", "AND-Query");
+        childMetrics.setAnnotation("index", "gIndex");
+        childMetrics.setAnnotation("query-hint", "ZSORTED");
+        queryMetrics.addNested(childMetrics);
+
+        final MutableMetrics backendMetrics = new MutableMetrics("1.1.1.1", "backend-query");
+        backendMetrics.setAnnotation("query", "gIndex:slice-query");
+        childMetrics.addNested(backendMetrics);
+
+        final DefaultTraversalMetrics profile = new DefaultTraversalMetrics(100, metrics);
+        final String expectedOutput = "Traversal Metrics\n" +
+                "Step                                                               Count  Traversers       Time (ms)    % Dur\n" +
+                "=============================================================================================================\n" +
+                "GraphStep                                                                                      0.000\n" +
+                "  GraphQuery                                                                                   0.000\n" +
+                "    \\_condition=name = Bob\n" +
+                "    AND-Query                                                                                  0.000\n" +
+                "      \\_index=gIndex\n" +
+                "      \\_query-hint=ZSORTED\n" +
+                "      backend-query                                                                            0.000\n" +
+                "        \\_query=gIndex:slice-query\n" +
+                "                                            >TOTAL                     -           -           0.000        -";
+        assertEquals(expectedOutput, profile.toString());
+    }
+}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/NumberHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/NumberHelperTest.java
index 01ad1ca..5b32e19 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/NumberHelperTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/NumberHelperTest.java
@@ -128,17 +128,12 @@
 
     @Test
     public void shouldAddAndReturnCorrectType() {
-
-        // NOTE: The smallest possible number type for return values is Integer; this seems to be a JVM thing and has
-        //       nothing to do with the actual NumberHelper implementation
-
-        // the above NOTE isn't quite true - TINKERPOP-2610
         assertEquals((byte) 1, add((byte) 1, (Byte) null));
         assertNull(add((Byte) null, (byte) 1));
 
         // BYTE
-        assertEquals(2, add((byte) 1, (byte) 1));
-        assertEquals(2, add((byte) 1, (short) 1));
+        assertEquals((byte) 2, add((byte) 1, (byte) 1));
+        assertEquals((short) 2, add((byte) 1, (short) 1));
         assertEquals(2, add((byte) 1, 1));
         assertEquals(2L, add((byte) 1, 1L));
         assertEquals(2F, add((byte) 1, 1F));
@@ -147,7 +142,7 @@
         assertEquals(BigDecimal.ONE.add(BigDecimal.ONE), add((byte) 1, BigDecimal.ONE));
 
         // SHORT
-        assertEquals(2, add((short) 1, (short) 1));
+        assertEquals((short)2, add((short) 1, (short) 1));
         assertEquals(2, add((short) 1, 1));
         assertEquals(2L, add((short) 1, 1L));
         assertEquals(2F, add((short) 1, 1F));
@@ -191,17 +186,12 @@
 
     @Test
     public void shouldSubtractAndReturnCorrectType() {
-
-        // NOTE: The smallest possible number type for return values is Integer; this seems to be a JVM thing and has
-        //       nothing to do with the actual NumberHelper implementation
-
-        // the above NOTE isn't quite true - TINKERPOP-2610
         assertEquals((byte) 1, sub((byte) 1, (Byte) null));
         assertNull(sub((Byte) null, (byte) 1));
 
         // BYTE
-        assertEquals(0, sub((byte) 1, (byte) 1));
-        assertEquals(0, sub((byte) 1, (short) 1));
+        assertEquals((byte) 0, sub((byte) 1, (byte) 1));
+        assertEquals((short) 0, sub((byte) 1, (short) 1));
         assertEquals(0, sub((byte) 1, 1));
         assertEquals(0L, sub((byte) 1, 1L));
         assertEquals(0F, sub((byte) 1, 1F));
@@ -210,7 +200,7 @@
         assertEquals(BigDecimal.ZERO, sub((byte) 1, BigDecimal.ONE));
 
         // SHORT
-        assertEquals(0, sub((short) 1, (short) 1));
+        assertEquals((short) 0, sub((short) 1, (short) 1));
         assertEquals(0, sub((short) 1, 1));
         assertEquals(0L, sub((short) 1, 1L));
         assertEquals(0F, sub((short) 1, 1F));
@@ -254,17 +244,12 @@
 
     @Test
     public void shouldMultiplyAndReturnCorrectType() {
-
-        // NOTE: The smallest possible number type for return values is Integer; this seems to be a JVM thing and has
-        //       nothing to do with the actual NumberHelper implementation
-
-        // the above NOTE isn't quite true - TINKERPOP-2610
         assertEquals((byte) 1, mul((byte) 1, (Byte) null));
         assertNull(mul((Byte) null, (byte) 1));
 
         // BYTE
-        assertEquals(1, mul((byte) 1, (byte) 1));
-        assertEquals(1, mul((byte) 1, (short) 1));
+        assertEquals((byte) 1, mul((byte) 1, (byte) 1));
+        assertEquals((short) 1, mul((byte) 1, (short) 1));
         assertEquals(1, mul((byte) 1, 1));
         assertEquals(1L, mul((byte) 1, 1L));
         assertEquals(1F, mul((byte) 1, 1F));
@@ -273,7 +258,7 @@
         assertEquals(BigDecimal.ONE, mul((byte) 1, BigDecimal.ONE));
 
         // SHORT
-        assertEquals(1, mul((short) 1, (short) 1));
+        assertEquals((short) 1, mul((short) 1, (short) 1));
         assertEquals(1, mul((short) 1, 1));
         assertEquals(1L, mul((short) 1, 1L));
         assertEquals(1F, mul((short) 1, 1F));
@@ -317,17 +302,12 @@
 
     @Test
     public void shouldDivideAndReturnCorrectType() {
-
-        // NOTE: The smallest possible number type for return values is Integer; this seems to be a JVM thing and has
-        //       nothing to do with the actual NumberHelper implementation
-
-        // the above NOTE isn't quite true - TINKERPOP-2610
         assertEquals((byte) 1, div((byte) 1, (Byte) null));
         assertNull(div((Byte) null, (byte) 1));
 
         // BYTE
-        assertEquals(1, div((byte) 1, (byte) 1));
-        assertEquals(1, div((byte) 1, (short) 1));
+        assertEquals((byte) 1, div((byte) 1, (byte) 1));
+        assertEquals((short) 1, div((byte) 1, (short) 1));
         assertEquals(1, div((byte) 1, 1));
         assertEquals(1L, div((byte) 1, 1L));
         assertEquals(1F, div((byte) 1, 1F));
@@ -336,7 +316,7 @@
         assertEquals(BigDecimal.ONE, div((byte) 1, BigDecimal.ONE));
 
         // SHORT
-        assertEquals(1, div((short) 1, (short) 1));
+        assertEquals((short) 1, div((short) 1, (short) 1));
         assertEquals(1, div((short) 1, 1));
         assertEquals(1L, div((short) 1, 1L));
         assertEquals(1F, div((short) 1, 1F));
@@ -380,10 +360,6 @@
 
     @Test
     public void shouldDivideForceFloatingPointAndReturnCorrectType() {
-
-        // NOTE: The smallest possible number type for return values is Integer; this seems to be a JVM thing and has
-        //       nothing to do with the actual NumberHelper implementation
-
         // BYTE
         assertEquals(1F, div((byte) 1, (byte) 1, true));
         assertEquals(1F, div((byte) 1, (short) 1, true));
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/AbortiveMultiIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/AbortiveMultiIteratorTest.java
new file mode 100644
index 0000000..36637da
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/AbortiveMultiIteratorTest.java
@@ -0,0 +1,209 @@
+/*
+ * 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.iterator;
+
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class AbortiveMultiIteratorTest {
+    @Test
+    public void shouldNotHaveNextIfNoIteratorsAreAdded() {
+        final Iterator<String> itty = new AbortiveMultiIterator<>();
+        assertThat(itty.hasNext(), is(false));
+    }
+
+    @Test(expected = FastNoSuchElementException.class)
+    public void shouldThrowFastNoSuchElementExceptionIfNoIteratorsAreAdded() {
+        final Iterator<String> itty = new AbortiveMultiIterator<>();
+        itty.next();
+    }
+
+    @Test
+    public void shouldNotHaveNextIfEmptyIteratorIsAdded() {
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        itty.addIterator(EmptyIterator.instance());
+        assertThat(itty.hasNext(), is(false));
+    }
+
+    @Test(expected = FastNoSuchElementException.class)
+    public void shouldThrowFastNoSuchElementExceptionIfEmptyIteratorIsAdded() {
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        itty.addIterator(EmptyIterator.instance());
+        itty.next();
+    }
+
+    @Test
+    public void shouldNotHaveNextIfEmptyIteratorsAreAdded() {
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(EmptyIterator.instance());
+        assertThat(itty.hasNext(), is(false));
+    }
+
+    @Test(expected = FastNoSuchElementException.class)
+    public void shouldThrowFastNoSuchElementExceptionIfEmptyIteratorsAreAdded() {
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(EmptyIterator.instance());
+        itty.next();
+    }
+
+    @Test
+    public void shouldIterateWhenMultipleIteratorsAreAdded() {
+        final List<String> list = new ArrayList<>();
+        list.add("test1");
+        list.add("test2");
+        list.add("test3");
+
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(list.iterator());
+
+        assertThat(itty.hasNext(), is(true));
+        assertEquals("test1", itty.next());
+        assertEquals("test2", itty.next());
+        assertEquals("test3", itty.next());
+        assertThat(itty.hasNext(), is(false));
+    }
+
+    @Test
+    public void shouldAbortIteration() {
+        final List<String> list1 = new ArrayList<>();
+        list1.add("test1");
+        list1.add("test2");
+        list1.add("test3");
+
+        final List<String> list2 = new ArrayList<>();
+        list2.add("test4");
+        list2.add("test5");
+        list2.add("test6");
+
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(list1.iterator());
+        itty.addIterator(list2.iterator(), c -> c != 3);
+
+        assertThat(itty.hasNext(), is(true));
+        assertEquals("test1", itty.next());
+        assertEquals("test2", itty.next());
+        assertEquals("test3", itty.next());
+        assertThat(itty.hasNext(), is(false));
+    }
+
+    @Test
+    public void shouldAllowFullIteration() {
+        final List<String> list1 = new ArrayList<>();
+        list1.add("test1");
+        list1.add("test2");
+        list1.add("test3");
+
+        final List<String> list2 = new ArrayList<>();
+        list2.add("test4");
+        list2.add("test5");
+        list2.add("test6");
+
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        itty.addIterator(EmptyIterator.instance());
+        itty.addIterator(list1.iterator());
+        itty.addIterator(list2.iterator(), c -> c == 3);
+
+        assertThat(itty.hasNext(), is(true));
+        assertEquals("test1", itty.next());
+        assertEquals("test2", itty.next());
+        assertEquals("test3", itty.next());
+        assertEquals("test4", itty.next());
+        assertEquals("test5", itty.next());
+        assertEquals("test6", itty.next());
+        assertThat(itty.hasNext(), is(false));
+    }
+
+    @Test
+    public void shouldClearIterators() {
+        final List<String> list = new ArrayList<>();
+        list.add("test1");
+        list.add("test2");
+        list.add("test3");
+
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        itty.addIterator(list.iterator());
+
+        itty.clear();
+
+        assertThat(itty.hasNext(), is(false));
+    }
+
+    @Test
+    public void shouldCloseIterators() {
+
+        final AbortiveMultiIterator<String> itty = new AbortiveMultiIterator<>();
+        final DummyAutoCloseableIterator<String> inner1 = new DummyAutoCloseableIterator<>();
+        final DummyAutoCloseableIterator<String> inner2 = new DummyAutoCloseableIterator<>();
+        itty.addIterator(inner1);
+        itty.addIterator(inner2);
+
+        itty.close();
+
+        assertTrue(inner1.isClosed());
+        assertTrue(inner2.isClosed());
+    }
+
+    // Dummy iterator to verify that its close method is called in the test.
+    private static class DummyAutoCloseableIterator<T> implements Iterator<T>, AutoCloseable {
+        private boolean closed;
+
+        public DummyAutoCloseableIterator() {
+            closed = false;
+        }
+
+        @Override
+        public boolean hasNext() {
+            return false;
+        }
+
+        @Override
+        public T next() {
+            return null;
+        }
+
+        @Override
+        public void close() throws Exception {
+            closed = true;
+        }
+
+        public boolean isClosed() {
+            return closed;
+        }
+    }
+}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
index 4b97299..ab3ba01 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
@@ -27,7 +27,6 @@
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -37,7 +36,7 @@
     @Test
     public void shouldNotHaveNextIfNoIteratorsAreAdded() {
         final Iterator<String> itty = new MultiIterator<>();
-        assertFalse(itty.hasNext());
+        assertThat(itty.hasNext(), is(false));
     }
 
     @Test(expected = FastNoSuchElementException.class)
@@ -50,7 +49,7 @@
     public void shouldNotHaveNextIfEmptyIteratorIsAdded() {
         final MultiIterator<String> itty = new MultiIterator<>();
         itty.addIterator(EmptyIterator.instance());
-        assertFalse(itty.hasNext());
+        assertThat(itty.hasNext(), is(false));
     }
 
     @Test(expected = FastNoSuchElementException.class)
@@ -67,7 +66,7 @@
         itty.addIterator(EmptyIterator.instance());
         itty.addIterator(EmptyIterator.instance());
         itty.addIterator(EmptyIterator.instance());
-        assertFalse(itty.hasNext());
+        assertThat(itty.hasNext(), is(false));
     }
 
     @Test(expected = FastNoSuchElementException.class)
@@ -95,7 +94,7 @@
         assertEquals("test1", itty.next());
         assertEquals("test2", itty.next());
         assertEquals("test3", itty.next());
-        assertFalse(itty.hasNext());
+        assertThat(itty.hasNext(), is(false));
     }
 
     @Test
@@ -110,7 +109,7 @@
 
         itty.clear();
 
-        assertFalse(itty.hasNext());
+        assertThat(itty.hasNext(), is(false));
     }
 
     @Test
diff --git a/gremlin-core/src/test/resources/log4j-silent.properties b/gremlin-core/src/test/resources/log4j-silent.properties
deleted file mode 100644
index d639ca7..0000000
--- a/gremlin-core/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,27 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-# need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalTest=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
\ No newline at end of file
diff --git a/gremlin-core/src/test/resources/log4j-test.properties b/gremlin-core/src/test/resources/log4j-test.properties
deleted file mode 100644
index b46385a..0000000
--- a/gremlin-core/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,25 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-# need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalTest=INFO
\ No newline at end of file
diff --git a/gremlin-core/src/test/resources/logback-silent.xml b/gremlin-core/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..59ab036
--- /dev/null
+++ b/gremlin-core/src/test/resources/logback-silent.xml
@@ -0,0 +1,29 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <logger name="org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalTest" level="INFO"/>
+    <logger name="org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.AbstractWarningVerificationStrategy" level="WARN"/>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-core/src/test/resources/logback-test.xml b/gremlin-core/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..5215f9e
--- /dev/null
+++ b/gremlin-core/src/test/resources/logback-test.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <logger name="org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalTest" level="INFO"/>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-dotnet/build/generate.groovy b/gremlin-dotnet/build/generate.groovy
index 4d6de0e..52e15c9 100644
--- a/gremlin-dotnet/build/generate.groovy
+++ b/gremlin-dotnet/build/generate.groovy
@@ -24,9 +24,10 @@
 import org.apache.tinkerpop.gremlin.groovy.jsr223.ast.RepeatASTTransformationCustomizer
 import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyCustomizer
 import org.codehaus.groovy.control.customizers.CompilationCustomizer
-import org.apache.tinkerpop.gremlin.features.FeatureReader
+import org.apache.tinkerpop.gremlin.language.corpus.FeatureReader
 
 import javax.script.SimpleBindings
+import java.nio.file.Paths
 
 import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal
 
@@ -34,7 +35,7 @@
 radishGremlinFile = new File("${projectBaseDir}/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs")
 
 // assumes globally unique scenario names for keys with list of Gremlin traversals as they appear
-gremlins = FeatureReader.parse("${projectBaseDir}")
+gremlins = FeatureReader.parseGrouped(Paths.get("${projectBaseDir}", "gremlin-test", "features").toString())
 
 gremlinGroovyScriptEngine = new GremlinGroovyScriptEngine(new GroovyCustomizer() {
     public CompilationCustomizer create() {
diff --git a/gremlin-dotnet/pom.xml b/gremlin-dotnet/pom.xml
index 8920714..a815239 100644
--- a/gremlin-dotnet/pom.xml
+++ b/gremlin-dotnet/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-dotnet</artifactId>
     <name>Apache TinkerPop :: Gremlin.Net</name>
diff --git a/gremlin-dotnet/src/Gremlin.Net.Template/Gremlin.Net.Template.csproj b/gremlin-dotnet/src/Gremlin.Net.Template/Gremlin.Net.Template.csproj
index 2ab88bd..b8f3493 100644
--- a/gremlin-dotnet/src/Gremlin.Net.Template/Gremlin.Net.Template.csproj
+++ b/gremlin-dotnet/src/Gremlin.Net.Template/Gremlin.Net.Template.csproj
@@ -27,7 +27,7 @@
     <ProjectReference Include="../Gremlin.Net/Gremlin.Net.csproj" />
 
     <!-- do not edit the version directly - maven updates it automatically -->
-    <PackageReference Include="Gremlin.Net" Version="3.5.2-SNAPSHOT" />
+    <PackageReference Include="Gremlin.Net" Version="3.6.0-SNAPSHOT" />
   </ItemGroup>
 
 </Project>
diff --git a/gremlin-dotnet/src/Gremlin.Net.Template/Gremlin.Net.Template.nuspec b/gremlin-dotnet/src/Gremlin.Net.Template/Gremlin.Net.Template.nuspec
index 4f1d20b..4876750 100644
--- a/gremlin-dotnet/src/Gremlin.Net.Template/Gremlin.Net.Template.nuspec
+++ b/gremlin-dotnet/src/Gremlin.Net.Template/Gremlin.Net.Template.nuspec
@@ -5,7 +5,7 @@
         <title>Gremlin.Net Template</title>
 
         <!-- do not edit the version directly - maven updates it automatically -->
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
 
         <description>Gremlin.Net template to create a console application with dotnet new.</description>
         <authors>Apache TinkerPop</authors>
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPoolSettings.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPoolSettings.cs
index 0196598..00bd75e 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPoolSettings.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPoolSettings.cs
@@ -35,8 +35,8 @@
         private int _maxInProcessPerConnection = DefaultMaxInProcessPerConnection;
         private int _reconnectionAttempts = DefaultReconnectionAttempts;
         private TimeSpan _reconnectionBaseDelay = DefaultReconnectionBaseDelay;
-        private const int DefaultPoolSize = 4;
-        private const int DefaultMaxInProcessPerConnection = 32;
+        private const int DefaultPoolSize = 8;
+        private const int DefaultMaxInProcessPerConnection = 16;
         private const int DefaultReconnectionAttempts = 4;
         private static readonly TimeSpan DefaultReconnectionBaseDelay = TimeSpan.FromSeconds(1);
 
@@ -45,7 +45,7 @@
         /// </summary>
         /// <exception cref="ArgumentOutOfRangeException">The specified pool size is less than or equal to zero.</exception>
         /// <remarks>
-        ///     The default value is 4.
+        ///     The default value is 8.
         /// </remarks>
         public int PoolSize
         {
@@ -63,7 +63,7 @@
         /// </summary>
         /// <exception cref="ArgumentOutOfRangeException">The specified number is less than or equal to zero.</exception>
         /// <remarks>
-        ///     The default value is 32. A <see cref="ConnectionPoolBusyException" /> is thrown if this limit is reached
+        ///     The default value is 16. A <see cref="ConnectionPoolBusyException" /> is thrown if this limit is reached
         ///     on all connections when a new request comes in.
         /// </remarks>
         public int MaxInProcessPerConnection
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
index 006cf8a..4f33c24 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
@@ -25,7 +25,6 @@
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using Gremlin.Net.Driver.Messages;
-using Gremlin.Net.Driver;
 using Gremlin.Net.Process.Remote;
 using Gremlin.Net.Process.Traversal;
 using Gremlin.Net.Process.Traversal.Strategy.Decoration;
diff --git a/gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj b/gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj
index 0f963bb..5eea594 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj
+++ b/gremlin-dotnet/src/Gremlin.Net/Gremlin.Net.csproj
@@ -25,7 +25,7 @@
 
   <PropertyGroup Label="Package">
     <!-- do not edit the version directly - maven updates it automatically -->
-    <Version>3.5.2-SNAPSHOT</Version>
+    <Version>3.6.0-SNAPSHOT</Version>
     <Title>Gremlin.Net</Title>
     <Authors>Apache TinkerPop</Authors>
     <Description>Gremlin.Net for Apache TinkerPop™ is a language variant and driver for .NET.
diff --git a/gremlin-dotnet/src/pom.xml b/gremlin-dotnet/src/pom.xml
index 07e92a9..9a6c7f5 100644
--- a/gremlin-dotnet/src/pom.xml
+++ b/gremlin-dotnet/src/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>gremlin-dotnet</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-dotnet-source</artifactId>
     <name>Apache TinkerPop :: Gremlin.Net - Source</name>
@@ -310,9 +310,9 @@
                                 <scope>runtime</scope>
                             </dependency>
                             <dependency>
-                                <groupId>log4j</groupId>
-                                <artifactId>log4j</artifactId>
-                                <version>1.2.17</version>
+                                <groupId>ch.qos.logback</groupId>
+                                <artifactId>logback-classic</artifactId>
+                                <version>${logback.version}</version>
                                 <scope>runtime</scope>
                             </dependency>
                         </dependencies>
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
index 0c17cc3..a2941eb 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
@@ -114,6 +114,11 @@
             {
                 throw new InvalidOperationException("g should be a traversal source");
             }
+
+            if (ScenarioData.CurrentFeature.Tags.Select(t => t.Name).ToList().Contains("@GraphComputerOnly"))
+            {
+                _g = _g.WithComputer();
+            }
             
             _traversal =
                 Gremlin.UseTraversal(ScenarioData.CurrentScenario.Name, _g, _parameters);
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
index ce33709..412a16f 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
@@ -57,6 +57,18 @@
                 {"g_injectXnull_10_5_nullX_sum", IgnoreReason.NoReason},
                 {"g_injectXlistXnull_10_5_nullXX_sumXlocalX", IgnoreReason.NoReason},
                 {
+                    "g_addVXpersonX_propertyXname_joshX_propertyXage_nullX",
+                    IgnoreReason.NoReason
+                },
+                {
+                    "g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX",
+                    IgnoreReason.NoReason
+                },
+                {
+                    "g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX",
+                    IgnoreReason.NoReason
+                },
+                {
                     "g_withBulkXfalseX_withSackX1_sumX_VX1X_localXoutEXknowsX_barrierXnormSackX_inVX_inXknowsX_barrier_sack",
                     IgnoreReason.NoReason
                 },
@@ -125,6 +137,12 @@
                         continue;
                     }
 
+                    if (feature.Tags.Select(t => t.Name).ToList().Contains("@AllowNullPropertyValues"))
+                    {
+                        failedSteps.Add(scenario.Steps.First(), new IgnoreException(IgnoreReason.NullPropertyValuesNotSupportedOnTestGraph));
+                        continue;
+                    }
+
                     StepBlock? currentStep = null;
                     StepDefinition stepDefinition = null;
                     foreach (var step in scenario.Steps)
@@ -143,6 +161,8 @@
                         }
 
                         scenarioData.CurrentScenario = scenario;
+                        scenarioData.CurrentFeature = feature;
+
                         var result = ExecuteStep(stepDefinition, currentStep.Value, step);
                         if (result != null)
                         {
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
index ae83922..7e7d32f 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
@@ -87,7 +87,7 @@
                {"g_VX2X_optionalXinXknowsXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid2"]).Optional<object>(__.In("knows"))}}, 
                {"g_V_hasLabelXpersonX_optionalXoutXknowsX_optionalXoutXcreatedXXX_path", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Optional<object>(__.Out("knows").Optional<object>(__.Out("created"))).Path()}}, 
                {"g_V_optionalXout_optionalXoutXX_path", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Optional<object>(__.Out().Optional<object>(__.Out())).Path()}}, 
-               {"g_VX1X_optionalXaddVXdogXX_label", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V(p["vid1"]).Optional<object>(__.AddV("dog")).Label(), (g,p) =>g.V()}}, 
+               {"g_VX1X_optionalXaddVXdogXX_label", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V(p["vid1"]).Optional<object>(__.AddV("dog")).Label(), (g,p) =>g.V()}}, 
                {"g_V_repeatXoutX_timesX2X_emit_path", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.Out()).Times(2).Emit().Path()}}, 
                {"g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.Out()).Times(2).Repeat(__.In()).Times(2).Values<object>("name")}}, 
                {"g_V_repeatXoutE_inVX_timesX2X_path_by_name_by_label", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.OutE().InV()).Times(2).Path().By("name").By(T.Label)}}, 
@@ -128,6 +128,7 @@
                {"g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","marko").And().Has("name","marko").And().Has("name","marko")}}, 
                {"g_V_coinX1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Coin(1.0)}}, 
                {"g_V_coinX0X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Coin(0.0)}}, 
+               {"g_withStrategiesXSeedStrategyX_V_coinX50X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SeedStrategy(seed: 999999)).V().Coin(0.5)}}, 
                {"g_VX1X_outXcreatedX_inXcreatedX_cyclicPath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out("created").In("created").CyclicPath()}}, 
                {"g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out("created").In("created").CyclicPath().Path()}}, 
                {"g_VX1X_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_cyclicPath_fromXaX_toXbX_path", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).As("a").Out("created").As("b").In("created").As("c").CyclicPath().From("a").To("b").Path()}}, 
@@ -140,7 +141,7 @@
                {"g_V_both_both_name_dedup", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Both().Both().Values<object>("name").Dedup()}}, 
                {"g_V_both_both_dedup", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Both().Both().Dedup()}}, 
                {"g_V_both_both_dedup_byXlabelX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Both().Both().Dedup().By(T.Label)}}, 
-               {"g_V_group_byXlabelX_byXbothE_weight_dedup_foldX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group<object,object>().By(T.Label).By(__.BothE().Values<object>("weight").Dedup().Fold())}}, 
+               {"g_V_group_byXlabelX_byXbothE_weight_dedup_foldX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group<object,object>().By(T.Label).By(__.BothE().Values<object>("weight").Dedup().Order().By(Order.Asc).Fold())}}, 
                {"g_V_asXaX_both_asXbX_dedupXa_bX_byXlabelX_selectXa_bX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").Both().As("b").Dedup("a","b").By(T.Label).Select<object>("a","b")}}, 
                {"g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_dedupXa_bX_path", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").Out("created").As("b").In("created").As("c").Dedup("a","b").Path()}}, 
                {"g_V_outE_asXeX_inV_asXvX_selectXeX_order_byXweight_ascX_selectXvX_valuesXnameX_dedup", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().OutE().As("e").InV().As("v").Select<object>("e").Order().By("weight",Order.Asc).Select<object>("v").Values<object>("name").Dedup()}}, 
@@ -156,7 +157,7 @@
                {"g_V_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().As("a").AddV().As("b").AddE("knows").To("a"), (g,p) =>g.V().Drop(), (g,p) =>g.V(), (g,p) =>g.E()}}, 
                {"g_V_outE_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().As("a").AddV().As("b").AddE("knows").To("a"), (g,p) =>g.V().OutE().Drop(), (g,p) =>g.V(), (g,p) =>g.E()}}, 
                {"g_V_properties_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().Property("name","bob").AddV().Property("name","alice"), (g,p) =>g.V().Properties<object>().Drop(), (g,p) =>g.V(), (g,p) =>g.V().Properties<object>()}}, 
-               {"g_E_propertiesXweightX_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.E().Properties<object>("weight").Drop(), (g,p) =>g.E().Properties<object>()}}, 
+               {"g_E_propertiesXweightX_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.E().Properties<object>("weight").Drop(), (g,p) =>g.E().Properties<object>()}}, 
                {"g_V_properties_propertiesXstartTimeX_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().Property("name","bob").Property(Cardinality.List,"location","ny","startTime",2014,"endTime",2016).Property(Cardinality.List,"location","va","startTime",2016).AddV().Property("name","alice").Property(Cardinality.List,"location","va","startTime",2014,"endTime",2016).Property(Cardinality.List,"location","ny","startTime",2016), (g,p) =>g.V().Properties<object>().Properties<object>("startTime").Drop(), (g,p) =>g.V().Properties<object>().Properties<object>(), (g,p) =>g.V().Properties<object>().Properties<object>("startTime")}}, 
                {"g_V_filterXfalseX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Filter((IPredicate) p["pred1"])}}, 
                {"g_V_filterXtrueX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Filter((IPredicate) p["pred1"])}}, 
@@ -287,7 +288,6 @@
                {"g_V_valuesXnameX_order_tailX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("name").Order().Tail<object>(2)}}, 
                {"g_V_valuesXnameX_order_tail", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("name").Order().Tail<object>()}}, 
                {"g_V_valuesXnameX_order_tailX7X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("name").Order().Tail<object>(7)}}, 
-               {"g_V_repeatXbothX_timesX3X_tailX7X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.Both()).Times(3).Tail<object>(7)}}, 
                {"g_V_repeatXin_outX_timesX3X_tailX7X_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.In().Out()).Times(3).Tail<object>(7).Count()}}, 
                {"g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocal_1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").Out().As("a").Out().As("a").Select<object>("a").By(__.Unfold<object>().Values<object>("name").Fold()).Tail<object>(Scope.Local,1)}}, 
                {"g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").Out().As("a").Out().As("a").Select<object>("a").By(__.Unfold<object>().Values<object>("name").Fold()).Tail<object>(Scope.Local)}}, 
@@ -321,45 +321,53 @@
                {"g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").OutE("created").As("b").InV().As("c").In("created").As("d").Where("a",P.Lt("b").Or(P.Gt("c")).And(P.Neq("d"))).By("age").By("weight").By(__.In("created").Values<object>("age").Min<object>()).Select<object>("a","c","d").By("name")}}, 
                {"g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).As("a").Out().Has("age").Where(P.Gt("a")).By("age").Values<object>("name")}}, 
                {"g_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid3"]).As("a").In().Out().As("b").Where("a",P.Eq("b")).By("age").Values<object>("name")}}, 
-               {"g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V(p["vid1"]).As("a").Out("created").AddE("createdBy").To("a"), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).InE()}}, 
-               {"g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V(p["vid1"]).As("a").Out("created").AddE("createdBy").To("a").Property("weight",2.0), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).BothE(), (g,p) =>g.V(p["vid1"]).InE().Has("weight",2.0)}}, 
-               {"g_V_outE_propertyXweight_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().OutE().Property("weight",null), (g,p) =>g.E().Properties<object>("weight")}}, 
-               {"g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().Aggregate("x").As("a").Select<object>("x").Unfold<object>().AddE("existsWith").To("a").Property("time","now"), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).BothE(), (g,p) =>g.V(p["vid1"]).InE("existsWith"), (g,p) =>g.V(p["vid1"]).OutE("existsWith"), (g,p) =>g.V(p["vid1"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid2"]).BothE(), (g,p) =>g.V(p["vid2"]).InE("existsWith"), (g,p) =>g.V(p["vid2"]).OutE("existsWith"), (g,p) =>g.V(p["vid2"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid3"]).BothE(), (g,p) =>g.V(p["vid3"]).InE("existsWith"), (g,p) =>g.V(p["vid3"]).OutE("existsWith"), (g,p) =>g.V(p["vid3"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid4"]).BothE(), (g,p) =>g.V(p["vid4"]).InE("existsWith"), (g,p) =>g.V(p["vid4"]).OutE("existsWith"), (g,p) =>g.V(p["vid4"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid5"]).BothE(), (g,p) =>g.V(p["vid5"]).InE("existsWith"), (g,p) =>g.V(p["vid5"]).OutE("existsWith"), (g,p) =>g.V(p["vid5"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid6"]).BothE(), (g,p) =>g.V(p["vid6"]).InE("existsWith"), (g,p) =>g.V(p["vid6"]).OutE("existsWith"), (g,p) =>g.V(p["vid6"]).BothE("existsWith").Has("time","now")}}, 
-               {"g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().As("a").Out("created").In("created").Where(P.Neq("a")).As("b").AddE("codeveloper").From("a").To("b").Property("year",2009), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).BothE(), (g,p) =>g.V(p["vid1"]).InE("codeveloper"), (g,p) =>g.V(p["vid1"]).OutE("codeveloper"), (g,p) =>g.V(p["vid1"]).BothE("codeveloper").Has("year",2009), (g,p) =>g.V(p["vid2"]).BothE(), (g,p) =>g.V(p["vid4"]).BothE(), (g,p) =>g.V(p["vid4"]).InE("codeveloper"), (g,p) =>g.V(p["vid4"]).OutE("codeveloper"), (g,p) =>g.V(p["vid4"]).BothE("codeveloper").Has("year",2009), (g,p) =>g.V(p["vid6"]).BothE(), (g,p) =>g.V(p["vid6"]).InE("codeveloper"), (g,p) =>g.V(p["vid6"]).OutE("codeveloper"), (g,p) =>g.V(p["vid6"]).BothE("codeveloper").Has("year",2009)}}, 
-               {"g_V_asXaX_inXcreatedX_addEXcreatedByX_fromXaX_propertyXyear_2009X_propertyXacl_publicX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().As("a").In("created").AddE("createdBy").From("a").Property("year",2009).Property("acl","public"), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).BothE(), (g,p) =>g.V(p["vid1"]).InE("createdBy"), (g,p) =>g.V(p["vid1"]).OutE("createdBy"), (g,p) =>g.V(p["vid1"]).BothE("createdBy").Has("year",2009).Has("acl","public"), (g,p) =>g.V(p["vid2"]).BothE(), (g,p) =>g.V(p["vid3"]).BothE(), (g,p) =>g.V(p["vid3"]).InE("createdBy"), (g,p) =>g.V(p["vid3"]).OutE("createdBy"), (g,p) =>g.V(p["vid3"]).BothE("createdBy").Has("year",2009).Has("acl","public"), (g,p) =>g.V(p["vid4"]).BothE(), (g,p) =>g.V(p["vid4"]).InE("createdBy"), (g,p) =>g.V(p["vid4"]).OutE("createdBy"), (g,p) =>g.V(p["vid4"]).BothE("createdBy").Has("year",2009).Has("acl","public"), (g,p) =>g.V(p["vid5"]).BothE(), (g,p) =>g.V(p["vid5"]).InE("createdBy"), (g,p) =>g.V(p["vid5"]).OutE("createdBy"), (g,p) =>g.V(p["vid5"]).BothE("createdBy").Has("year",2009).Has("acl","public"), (g,p) =>g.V(p["vid6"]).BothE(), (g,p) =>g.V(p["vid6"]).InE("createdBy"), (g,p) =>g.V(p["vid6"]).OutE("createdBy"), (g,p) =>g.V(p["vid6"]).BothE("createdBy").Has("year",2009).Has("acl","public")}}, 
-               {"g_withSideEffectXb_bX_VXaX_addEXknowsX_toXbX_propertyXweight_0_5X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.WithSideEffect("b",(Vertex) p["v6"]).V((Vertex) p["v1"]).AddE("knows").To("b").Property("weight",0.5), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v1"]).BothE(), (g,p) =>g.V((Vertex) p["v1"]).InE("knows"), (g,p) =>g.V((Vertex) p["v1"]).OutE("knows"), (g,p) =>g.V((Vertex) p["v1"]).BothE("knows").Has("weight",0.5), (g,p) =>g.V((Vertex) p["v6"]).BothE(), (g,p) =>g.V((Vertex) p["v6"]).InE("knows"), (g,p) =>g.V((Vertex) p["v6"]).OutE("knows"), (g,p) =>g.V((Vertex) p["v6"]).BothE("knows").Has("weight",0.5)}}, 
+               {"g_V_coworker", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Filter(__.OutE("created")).Aggregate("p").As("p1").Values<object>("name").As("p1n").Select<object>("p").Unfold<object>().Where(P.Neq("p1")).As("p2").Values<object>("name").As("p2n").Select<object>("p2").Out("created").Choose<object>(__.In("created").Where(P.Eq("p1")),__.Values<object>("name"),__.Constant<object>(p["xx1"])).Group<object,object>().By(__.Select<object>("p1n")).By(__.Group<object,object>().By(__.Select<object>("p2n")).By(__.Unfold<object>().Fold().Project<object>("numCoCreated","coCreated").By(__.Count(Scope.Local)).By())).Unfold<object>()}}, 
+               {"g_V_coworker_with_midV", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Filter(__.OutE("created")).As("p1").V().HasLabel("person").Where(P.Neq("p1")).Filter(__.OutE("created")).As("p2").Map<object>(__.Out("created").Where(__.In("created").As("p1")).Values<object>("name").Fold()).Group<object,object>().By(__.Select<object>("p1").By("name")).By(__.Group<object,object>().By(__.Select<object>("p2").By("name")).By(__.Project<object>("numCoCreated","coCreated").By(__.Count(Scope.Local)).By())).Unfold<object>()}}, 
+               {"g_V_playlist_paths", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","Bob_Dylan").In("sungBy").Order().By("name").As("a").Repeat(__.Out().Order().By("name").SimplePath().From("a")).Until(__.Out("writtenBy").Has("name","Johnny_Cash")).Limit<object>(1).As("b").Repeat(__.Out().Order().By("name").As("c").SimplePath().From("b").To("c")).Until(__.Out("sungBy").Has("name","Grateful_Dead")).Limit<object>(1).Path().From("a").Unfold<object>().Project<object>("song","artists").By("name").By(__.Coalesce<object>(__.Out("sungBy","writtenBy").Dedup().Values<object>("name").Order(),__.Constant<object>("Unknown")).Fold())}}, 
+               {"g_V_shortestpath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("v").Both().As("v").Project<object>("src","tgt","p").By(__.Select<object>(Pop.First,"v")).By(__.Select<object>(Pop.Last,"v")).By(__.Select<object>(Pop.All,"v")).As("triple").Group("x").By(__.Select<object>("src","tgt")).By(__.Select<object>("p").Fold()).Select<object>("tgt").Barrier().Repeat(__.Both().As("v").Project<object>("src","tgt","p").By(__.Select<object>(Pop.First,"v")).By(__.Select<object>(Pop.Last,"v")).By(__.Select<object>(Pop.All,"v")).As("t").Filter(__.Select<object>(Pop.All,"p").Count(Scope.Local).As("l").Select<object>(Pop.Last,"t").Select<object>(Pop.All,"p").Dedup(Scope.Local).Count(Scope.Local).Where(P.Eq("l"))).Select<object>(Pop.Last,"t").Not(__.Select<object>(Pop.All,"p").As("p").Count(Scope.Local).As("l").Select<object>(Pop.All,"x").Unfold<object>().Filter(__.Select<object>(Column.Keys).Where(P.Eq("t")).By(__.Select<object>("src","tgt"))).Filter(__.Select<object>(Column.Values).Unfold<object>().Or(__.Count(Scope.Local).Where(P.Lt("l")),__.Where(P.Eq("p"))))).Barrier().Group("x").By(__.Select<object>("src","tgt")).By(__.Select<object>(Pop.All,"p").Fold()).Select<object>("tgt").Barrier()).Cap<object>("x").Select<object>(Column.Values).Unfold<object>().Unfold<object>().Map<object>(__.Unfold<object>().Values<object>("name").Fold())}}, 
+               {"g_V_classic_recommendation", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","DARK STAR").As("a").Out("followedBy").Aggregate("stash").In("followedBy").Where(P.Neq("a").And(P.Without(new List<object> {"stash"}))).GroupCount<object>().Unfold<object>().Project<object>("x","y","z").By(__.Select<object>(Column.Keys).Values<object>("name")).By(__.Select<object>(Column.Keys).Values<object>("performances")).By(__.Select<object>(Column.Values)).Order().By(__.Select<object>("z"),Order.Desc).By(__.Select<object>("y"),Order.Asc).Limit<object>(5).Aggregate(Scope.Local,"m").Select<object>("x")}}, 
+               {"g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V(p["vid1"]).As("a").Out("created").AddE("createdBy").To("a"), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).InE()}}, 
+               {"g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V(p["vid1"]).As("a").Out("created").AddE("createdBy").To("a").Property("weight",2.0), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).BothE(), (g,p) =>g.V(p["vid1"]).InE().Has("weight",2.0)}}, 
+               {"g_V_outE_propertyXweight_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().OutE().Property("weight",null), (g,p) =>g.E().Properties<object>("weight")}}, 
+               {"g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().Aggregate("x").As("a").Select<object>("x").Unfold<object>().AddE("existsWith").To("a").Property("time","now"), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).BothE(), (g,p) =>g.V(p["vid1"]).InE("existsWith"), (g,p) =>g.V(p["vid1"]).OutE("existsWith"), (g,p) =>g.V(p["vid1"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid2"]).BothE(), (g,p) =>g.V(p["vid2"]).InE("existsWith"), (g,p) =>g.V(p["vid2"]).OutE("existsWith"), (g,p) =>g.V(p["vid2"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid3"]).BothE(), (g,p) =>g.V(p["vid3"]).InE("existsWith"), (g,p) =>g.V(p["vid3"]).OutE("existsWith"), (g,p) =>g.V(p["vid3"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid4"]).BothE(), (g,p) =>g.V(p["vid4"]).InE("existsWith"), (g,p) =>g.V(p["vid4"]).OutE("existsWith"), (g,p) =>g.V(p["vid4"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid5"]).BothE(), (g,p) =>g.V(p["vid5"]).InE("existsWith"), (g,p) =>g.V(p["vid5"]).OutE("existsWith"), (g,p) =>g.V(p["vid5"]).BothE("existsWith").Has("time","now"), (g,p) =>g.V(p["vid6"]).BothE(), (g,p) =>g.V(p["vid6"]).InE("existsWith"), (g,p) =>g.V(p["vid6"]).OutE("existsWith"), (g,p) =>g.V(p["vid6"]).BothE("existsWith").Has("time","now")}}, 
+               {"g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().As("a").Out("created").In("created").Where(P.Neq("a")).As("b").AddE("codeveloper").From("a").To("b").Property("year",2009), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).BothE(), (g,p) =>g.V(p["vid1"]).InE("codeveloper"), (g,p) =>g.V(p["vid1"]).OutE("codeveloper"), (g,p) =>g.V(p["vid1"]).BothE("codeveloper").Has("year",2009), (g,p) =>g.V(p["vid2"]).BothE(), (g,p) =>g.V(p["vid4"]).BothE(), (g,p) =>g.V(p["vid4"]).InE("codeveloper"), (g,p) =>g.V(p["vid4"]).OutE("codeveloper"), (g,p) =>g.V(p["vid4"]).BothE("codeveloper").Has("year",2009), (g,p) =>g.V(p["vid6"]).BothE(), (g,p) =>g.V(p["vid6"]).InE("codeveloper"), (g,p) =>g.V(p["vid6"]).OutE("codeveloper"), (g,p) =>g.V(p["vid6"]).BothE("codeveloper").Has("year",2009)}}, 
+               {"g_V_asXaX_inXcreatedX_addEXcreatedByX_fromXaX_propertyXyear_2009X_propertyXacl_publicX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().As("a").In("created").AddE("createdBy").From("a").Property("year",2009).Property("acl","public"), (g,p) =>g.E(), (g,p) =>g.V(p["vid1"]).BothE(), (g,p) =>g.V(p["vid1"]).InE("createdBy"), (g,p) =>g.V(p["vid1"]).OutE("createdBy"), (g,p) =>g.V(p["vid1"]).BothE("createdBy").Has("year",2009).Has("acl","public"), (g,p) =>g.V(p["vid2"]).BothE(), (g,p) =>g.V(p["vid3"]).BothE(), (g,p) =>g.V(p["vid3"]).InE("createdBy"), (g,p) =>g.V(p["vid3"]).OutE("createdBy"), (g,p) =>g.V(p["vid3"]).BothE("createdBy").Has("year",2009).Has("acl","public"), (g,p) =>g.V(p["vid4"]).BothE(), (g,p) =>g.V(p["vid4"]).InE("createdBy"), (g,p) =>g.V(p["vid4"]).OutE("createdBy"), (g,p) =>g.V(p["vid4"]).BothE("createdBy").Has("year",2009).Has("acl","public"), (g,p) =>g.V(p["vid5"]).BothE(), (g,p) =>g.V(p["vid5"]).InE("createdBy"), (g,p) =>g.V(p["vid5"]).OutE("createdBy"), (g,p) =>g.V(p["vid5"]).BothE("createdBy").Has("year",2009).Has("acl","public"), (g,p) =>g.V(p["vid6"]).BothE(), (g,p) =>g.V(p["vid6"]).InE("createdBy"), (g,p) =>g.V(p["vid6"]).OutE("createdBy"), (g,p) =>g.V(p["vid6"]).BothE("createdBy").Has("year",2009).Has("acl","public")}}, 
+               {"g_withSideEffectXb_bX_VXaX_addEXknowsX_toXbX_propertyXweight_0_5X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.WithSideEffect("b",(Vertex) p["v6"]).V((Vertex) p["v1"]).AddE("knows").To("b").Property("weight",0.5), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v1"]).BothE(), (g,p) =>g.V((Vertex) p["v1"]).InE("knows"), (g,p) =>g.V((Vertex) p["v1"]).OutE("knows"), (g,p) =>g.V((Vertex) p["v1"]).BothE("knows").Has("weight",0.5), (g,p) =>g.V((Vertex) p["v6"]).BothE(), (g,p) =>g.V((Vertex) p["v6"]).InE("knows"), (g,p) =>g.V((Vertex) p["v6"]).OutE("knows"), (g,p) =>g.V((Vertex) p["v6"]).BothE("knows").Has("weight",0.5)}}, 
                {"g_addV_asXfirstX_repeatXaddEXnextX_toXaddVX_inVX_timesX5X_addEXnextX_toXselectXfirstXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().As("first").Repeat(__.AddE("next").To(__.AddV()).InV()).Times(5).AddE("next").To(__.Select<object>("first")), (g,p) =>g.V(), (g,p) =>g.E(), (g,p) =>g.E().HasLabel("next"), (g,p) =>g.V().Limit<object>(1).BothE(), (g,p) =>g.V().Limit<object>(1).InE(), (g,p) =>g.V().Limit<object>(1).OutE()}}, 
-               {"g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().Has("name","marko").As("a").OutE("created").As("b").InV().AddE(__.Select<object>("b").Label()).To("a"), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v1"]).BothE(), (g,p) =>g.V((Vertex) p["v1"]).InE("created"), (g,p) =>g.V((Vertex) p["v1"]).In("created").Has("name","lop"), (g,p) =>g.V((Vertex) p["v1"]).OutE("created")}}, 
-               {"g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_descX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.AddE(__.V().OutE().Label().GroupCount<object>().Order(Scope.Local).By(Column.Values,Order.Desc).Select<object>(Column.Keys).Unfold<object>().Limit<object>(1)).From(__.V().Has("name","vadas")).To(__.V().Has("name","lop")), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v2"]).BothE(), (g,p) =>g.V((Vertex) p["v2"]).InE("knows"), (g,p) =>g.V((Vertex) p["v2"]).OutE("created"), (g,p) =>g.V((Vertex) p["v2"]).Out("created").Has("name","lop")}}, 
-               {"g_addEXknowsX_fromXaX_toXbX_propertyXweight_0_1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.AddE("knows").From((Vertex) p["v1"]).To((Vertex) p["v6"]).Property("weight",p["xx1"]), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v1"]).OutE("knows"), (g,p) =>g.V((Vertex) p["v1"]).Out("knows").Has("name","peter")}}, 
-               {"g_VXaX_addEXknowsX_toXbX_propertyXweight_0_1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V((Vertex) p["v1"]).AddE("knows").To((Vertex) p["v6"]).Property("weight",p["xx1"]), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v1"]).OutE("knows"), (g,p) =>g.V((Vertex) p["v1"]).Out("knows").Has("name","peter")}}, 
-               {"g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V(p["vid1"]).As("a").AddV("animal").Property("age",__.Select<object>("a").By("age")).Property("name","puppy"), (g,p) =>g.V().Has("animal","age",29)}}, 
-               {"g_V_addVXanimalX_propertyXage_0X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().AddV("animal").Property("age",0), (g,p) =>g.V().Has("animal","age",0)}}, 
-               {"g_addVXpersonX_propertyXname_stephenX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.AddV("person").Property("name","stephen"), (g,p) =>g.V().Has("person","name","stephen")}}, 
-               {"g_V_hasLabelXpersonX_propertyXname_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().HasLabel("person").Property("name",null), (g,p) =>g.V().Properties<object>("name")}}, 
-               {"g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenmX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.AddV("person").Property(Cardinality.Single,"name","stephen").Property(Cardinality.Single,"name","stephenm"), (g,p) =>g.V().Has("person","name","stephen"), (g,p) =>g.V().Has("person","name","stephenm")}}, 
-               {"get_g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.AddV("person").Property(Cardinality.Single,"name","stephen").Property(Cardinality.Single,"name","stephenm","since",2010), (g,p) =>g.V().Has("person","name","stephen"), (g,p) =>g.V().Has("person","name","stephenm"), (g,p) =>g.V().Has("person","name","stephenm").Properties<object>("name").Has("since",2010)}}, 
-               {"g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().Has("name","marko").Property("friendWeight",__.OutE("knows").Values<object>("weight").Sum<object>(),"acl","private"), (g,p) =>g.V().Has("person","name","marko").Has("friendWeight",1.5), (g,p) =>g.V().Has("person","name","marko").Properties<object>("friendWeight").Has("acl","private"), (g,p) =>g.V().Has("person","name","marko").Properties<object>("friendWeight").Count()}}, 
-               {"g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.AddV("animal").Property("name","mateo").Property("name","gateo").Property("name","cateo").Property("age",5), (g,p) =>g.V().HasLabel("animal").Has("name","mateo").Has("name","gateo").Has("name","cateo").Has("age",5)}}, 
-               {"g_withSideEffectXa_markoX_addV_propertyXname_selectXaXX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.WithSideEffect("a","marko").AddV().Property("name",__.Select<object>("a")).Values<object>("name"), (g,p) =>g.V().Has("name","marko")}}, 
-               {"g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.AddV("person").Property(Cardinality.Single,"name","stephen").Property(Cardinality.Single,"name","stephenm","since",2010), (g,p) =>g.V().Has("name","stephen"), (g,p) =>g.V().Has("name","stephenm"), (g,p) =>g.V().Has("name","stephenm").Properties<object>("name").Has("since",2010)}}, 
-               {"g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().AddV("animal").Property("name",__.Values<object>("name")).Property("name","an animal").Property(__.Values<object>("name"),__.Label()), (g,p) =>g.V().HasLabel("animal").Has("name","marko").Has("name","an animal").Has("marko","person"), (g,p) =>g.V().HasLabel("animal").Has("name","vadas").Has("name","an animal").Has("vadas","person"), (g,p) =>g.V().HasLabel("animal").Has("name","lop").Has("name","an animal").Has("lop","software"), (g,p) =>g.V().HasLabel("animal").Has("name","josh").Has("name","an animal").Has("josh","person"), (g,p) =>g.V().HasLabel("animal").Has("name","ripple").Has("name","an animal").Has("ripple","software"), (g,p) =>g.V().HasLabel("animal").Has("name","peter").Has("name","an animal").Has("peter","person")}}, 
-               {"g_withSideEffectXa_testX_V_hasLabelXsoftwareX_propertyXtemp_selectXaXX_valueMapXname_tempX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.WithSideEffect("a","test").V().HasLabel("software").Property("temp",__.Select<object>("a")).ValueMap<object,object>("name","temp")}}, 
-               {"g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.WithSideEffect("a","name").AddV().Property(__.Select<object>("a"),"marko").Values<object>("name"), (g,p) =>g.V().Has("name","marko")}}, 
-               {"g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().As("a").Has("name","marko").Out("created").As("b").AddV(__.Select<object>("a").Label()).Property("test",__.Select<object>("b").Label()).ValueMap<object,object>().With("~tinkerpop.valueMap.tokens"), (g,p) =>g.V().Has("person","test","software")}}, 
-               {"g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.AddV(__.V().Has("name","marko").Properties<object>("name").Key()).Label()}}, 
+               {"g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().Has("name","marko").As("a").OutE("created").As("b").InV().AddE(__.Select<object>("b").Label()).To("a"), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v1"]).BothE(), (g,p) =>g.V((Vertex) p["v1"]).InE("created"), (g,p) =>g.V((Vertex) p["v1"]).In("created").Has("name","lop"), (g,p) =>g.V((Vertex) p["v1"]).OutE("created")}}, 
+               {"g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_descX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.AddE(__.V().OutE().Label().GroupCount<object>().Order(Scope.Local).By(Column.Values,Order.Desc).Select<object>(Column.Keys).Unfold<object>().Limit<object>(1)).From(__.V().Has("name","vadas")).To(__.V().Has("name","lop")), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v2"]).BothE(), (g,p) =>g.V((Vertex) p["v2"]).InE("knows"), (g,p) =>g.V((Vertex) p["v2"]).OutE("created"), (g,p) =>g.V((Vertex) p["v2"]).Out("created").Has("name","lop")}}, 
+               {"g_addEXknowsX_fromXaX_toXbX_propertyXweight_0_1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.AddE("knows").From((Vertex) p["v1"]).To((Vertex) p["v6"]).Property("weight",p["xx1"]), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v1"]).OutE("knows"), (g,p) =>g.V((Vertex) p["v1"]).Out("knows").Has("name","peter")}}, 
+               {"g_VXaX_addEXknowsX_toXbX_propertyXweight_0_1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V((Vertex) p["v1"]).AddE("knows").To((Vertex) p["v6"]).Property("weight",p["xx1"]), (g,p) =>g.E(), (g,p) =>g.V((Vertex) p["v1"]).OutE("knows"), (g,p) =>g.V((Vertex) p["v1"]).Out("knows").Has("name","peter")}}, 
+               {"g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).AddV("person").Property("name","vadas").Property("age",27), (g,p) =>g.AddE("knows").Property("weight",null).From(__.V().Has("name","marko")).To(__.V().Has("name","vadas")), (g,p) =>g.E().Has("knows","weight",(object) null)}}, 
+               {"g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V(p["vid1"]).As("a").AddV("animal").Property("age",__.Select<object>("a").By("age")).Property("name","puppy"), (g,p) =>g.V().Has("animal","age",29)}}, 
+               {"g_V_addVXanimalX_propertyXage_0X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().AddV("animal").Property("age",0), (g,p) =>g.V().Has("animal","age",0)}}, 
+               {"g_addVXpersonX_propertyXname_stephenX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.AddV("person").Property("name","stephen"), (g,p) =>g.V().Has("person","name","stephen")}}, 
+               {"g_V_hasLabelXpersonX_propertyXname_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().HasLabel("person").Property("name",null), (g,p) =>g.V().Properties<object>("name")}}, 
+               {"g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenmX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.AddV("person").Property(Cardinality.Single,"name","stephen").Property(Cardinality.Single,"name","stephenm"), (g,p) =>g.V().Has("person","name","stephen"), (g,p) =>g.V().Has("person","name","stephenm")}}, 
+               {"get_g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.AddV("person").Property(Cardinality.Single,"name","stephen").Property(Cardinality.Single,"name","stephenm","since",2010), (g,p) =>g.V().Has("person","name","stephen"), (g,p) =>g.V().Has("person","name","stephenm"), (g,p) =>g.V().Has("person","name","stephenm").Properties<object>("name").Has("since",2010)}}, 
+               {"g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().Has("name","marko").Property("friendWeight",__.OutE("knows").Values<object>("weight").Sum<object>(),"acl","private"), (g,p) =>g.V().Has("person","name","marko").Has("friendWeight",1.5), (g,p) =>g.V().Has("person","name","marko").Properties<object>("friendWeight").Has("acl","private"), (g,p) =>g.V().Has("person","name","marko").Properties<object>("friendWeight").Count()}}, 
+               {"g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.AddV("animal").Property("name","mateo").Property("name","gateo").Property("name","cateo").Property("age",5), (g,p) =>g.V().HasLabel("animal").Has("name","mateo").Has("name","gateo").Has("name","cateo").Has("age",5)}}, 
+               {"g_withSideEffectXa_markoX_addV_propertyXname_selectXaXX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.WithSideEffect("a","marko").AddV().Property("name",__.Select<object>("a")).Values<object>("name"), (g,p) =>g.V().Has("name","marko")}}, 
+               {"g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.AddV("person").Property(Cardinality.Single,"name","stephen").Property(Cardinality.Single,"name","stephenm","since",2010), (g,p) =>g.V().Has("name","stephen"), (g,p) =>g.V().Has("name","stephenm"), (g,p) =>g.V().Has("name","stephenm").Properties<object>("name").Has("since",2010)}}, 
+               {"g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().AddV("animal").Property("name",__.Values<object>("name")).Property("name","an animal").Property(__.Values<object>("name"),__.Label()), (g,p) =>g.V().HasLabel("animal").Has("name","marko").Has("name","an animal").Has("marko","person"), (g,p) =>g.V().HasLabel("animal").Has("name","vadas").Has("name","an animal").Has("vadas","person"), (g,p) =>g.V().HasLabel("animal").Has("name","lop").Has("name","an animal").Has("lop","software"), (g,p) =>g.V().HasLabel("animal").Has("name","josh").Has("name","an animal").Has("josh","person"), (g,p) =>g.V().HasLabel("animal").Has("name","ripple").Has("name","an animal").Has("ripple","software"), (g,p) =>g.V().HasLabel("animal").Has("name","peter").Has("name","an animal").Has("peter","person")}}, 
+               {"g_withSideEffectXa_testX_V_hasLabelXsoftwareX_propertyXtemp_selectXaXX_valueMapXname_tempX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.WithSideEffect("a","test").V().HasLabel("software").Property("temp",__.Select<object>("a")).ValueMap<object,object>("name","temp")}}, 
+               {"g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.WithSideEffect("a","name").AddV().Property(__.Select<object>("a"),"marko").Values<object>("name"), (g,p) =>g.V().Has("name","marko")}}, 
+               {"g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().As("a").Has("name","marko").Out("created").As("b").AddV(__.Select<object>("a").Label()).Property("test",__.Select<object>("b").Label()).ValueMap<object,object>().With("~tinkerpop.valueMap.tokens"), (g,p) =>g.V().Has("person","test","software")}}, 
+               {"g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.AddV(__.V().Has("name","marko").Properties<object>("name").Key()).Label()}}, 
                {"g_addVXnullX_propertyXid_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) null).Property(T.Id,null), (g,p) =>g.V().HasLabel("vertex")}}, 
                {"g_addV_propertyXlabel_personX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().Property(T.Label,"person"), (g,p) =>g.V().HasLabel("person")}}, 
+               {"g_addVXpersonX_propertyXname_joshX_propertyXage_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","josh").Property("age",null), (g,p) =>g.V().Has("person","age",(object) null)}}, 
+               {"g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("friendWeight",null,"acl",null), (g,p) =>g.V().Has("person","name","marko").Has("friendWeight",(object) null), (g,p) =>g.V().Has("person","name","marko").Properties<object>("friendWeight").Has("acl",(object) null), (g,p) =>g.V().Has("person","name","marko").Properties<object>("friendWeight").Count()}}, 
                {"g_V_coalesceXoutXfooX_outXbarXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Coalesce<object>(__.Out("foo"),__.Out("bar"))}}, 
                {"g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Coalesce<object>(__.Out("knows"),__.Out("created")).Values<object>("name")}}, 
                {"g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Coalesce<object>(__.Out("created"),__.Out("knows")).Values<object>("name")}}, 
                {"g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Coalesce<object>(__.Out("likes"),__.Out("knows"),__.Out("created")).GroupCount<object>().By("name")}}, 
                {"g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Coalesce<object>(__.OutE("knows"),__.OutE("created")).OtherV().Path().By("name").By(T.Label)}}, 
                {"g_V_outXcreatedX_order_byXnameX_coalesceXname_constantXxXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Out("created").Order().By("name").Coalesce<object>(__.Values<object>("name"),__.Constant<object>("x"))}}, 
-               {"g_V_connectedComponent_hasXcomponentX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().ConnectedComponent().Has("gremlin.connectedComponentVertexProgram.component")}}, 
-               {"g_V_dedup_connectedComponent_hasXcomponentX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Dedup().ConnectedComponent().Has("gremlin.connectedComponentVertexProgram.component")}}, 
-               {"g_V_hasLabelXsoftwareX_connectedComponent_project_byXnameX_byXcomponentX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().HasLabel("software").ConnectedComponent().Project<object>("name","component").By("name").By("gremlin.connectedComponentVertexProgram.component")}}, 
-               {"g_V_connectedComponent_withXEDGES_bothEXknowsXX_withXPROPERTY_NAME_clusterX_project_byXnameX_byXclusterX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().HasLabel("person").ConnectedComponent().With("~tinkerpop.connectedComponent.edges",__.BothE("knows")).With("~tinkerpop.connectedComponent.propertyName","cluster").Project<object>("name","cluster").By("name").By("cluster")}}, 
+               {"g_V_connectedComponent_hasXcomponentX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().ConnectedComponent().Has("gremlin.connectedComponentVertexProgram.component")}}, 
+               {"g_V_dedup_connectedComponent_hasXcomponentX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Dedup().ConnectedComponent().Has("gremlin.connectedComponentVertexProgram.component")}}, 
+               {"g_V_hasLabelXsoftwareX_connectedComponent_project_byXnameX_byXcomponentX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("software").ConnectedComponent().Project<object>("name","component").By("name").By("gremlin.connectedComponentVertexProgram.component")}}, 
+               {"g_V_connectedComponent_withXEDGES_bothEXknowsXX_withXPROPERTY_NAME_clusterX_project_byXnameX_byXclusterX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").ConnectedComponent().With("~tinkerpop.connectedComponent.edges",__.BothE("knows")).With("~tinkerpop.connectedComponent.propertyName","cluster").Project<object>("name","cluster").By("name").By("cluster")}}, 
                {"g_V_constantX123X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Constant<object>(123)}}, 
                {"g_V_constantXnullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Constant<object>(null)}}, 
                {"g_V_chooseXhasLabelXpersonX_valuesXnameX_constantXinhumanXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Choose<object>(__.HasLabel("person"),__.Values<object>("name"),__.Constant<object>("inhuman"))}}, 
@@ -383,7 +391,7 @@
                {"g_VX1X_V_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).V().Values<object>("name")}}, 
                {"g_V_outXknowsX_V_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Out("knows").V().Values<object>("name")}}, 
                {"g_V_hasXname_GarciaX_inXsungByX_asXsongX_V_hasXname_Willie_DixonX_inXwrittenByX_whereXeqXsongXX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("artist","name","Garcia").In("sungBy").As("song").V().Has("artist","name","Willie_Dixon").In("writtenBy").Where(P.Eq("song")).Values<object>("name")}}, 
-               {"g_V_hasLabelXpersonX_asXpX_VXsoftwareX_addInEXuses_pX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property(T.Id,1).Property("name","marko").Property("age",29).As("marko").AddV("person").Property(T.Id,2).Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property(T.Id,3).Property("name","lop").Property("lang","java").As("lop").AddV("person").Property(T.Id,4).Property("name","josh").Property("age",32).As("josh").AddV("software").Property(T.Id,5).Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property(T.Id,6).Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property(T.Id,7).Property("weight",0.5).AddE("knows").From("marko").To("josh").Property(T.Id,8).Property("weight",1.0).AddE("created").From("marko").To("lop").Property(T.Id,9).Property("weight",0.4).AddE("created").From("josh").To("ripple").Property(T.Id,10).Property("weight",1.0).AddE("created").From("josh").To("lop").Property(T.Id,11).Property("weight",0.4).AddE("created").From("peter").To("lop").Property(T.Id,12).Property("weight",0.2), (g,p) =>g.V().HasLabel("person").As("p").V(p["xx1"]).AddE("uses").From("p"), (g,p) =>g.E().HasLabel("uses"), (g,p) =>g.V(p["vid1"]).OutE("uses"), (g,p) =>g.V(p["vid2"]).OutE("uses"), (g,p) =>g.V(p["vid3"]).InE("uses"), (g,p) =>g.V(p["vid4"]).OutE("uses"), (g,p) =>g.V(p["vid5"]).InE("uses"), (g,p) =>g.V(p["vid6"]).OutE("uses")}}, 
+               {"g_V_hasLabelXpersonX_asXpX_VXsoftwareX_addInEXuses_pX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().HasLabel("person").As("p").V(p["xx1"]).AddE("uses").From("p"), (g,p) =>g.E().HasLabel("uses"), (g,p) =>g.V(p["vid1"]).OutE("uses"), (g,p) =>g.V(p["vid2"]).OutE("uses"), (g,p) =>g.V(p["vid3"]).InE("uses"), (g,p) =>g.V(p["vid4"]).OutE("uses"), (g,p) =>g.V(p["vid5"]).InE("uses"), (g,p) =>g.V(p["vid6"]).OutE("uses")}}, 
                {"g_V_hasLabelXsoftwareX_index_unfold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("software").Index<object>().Unfold<object>()}}, 
                {"g_V_hasLabelXsoftwareX_order_byXnameX_index_withXmapX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("software").Order().By("name").Index<object>().With("~tinkerpop.index.indexer",1)}}, 
                {"g_V_hasLabelXsoftwareX_name_fold_orderXlocalX_index_unfold_order_byXtailXlocal_1XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("software").Values<object>("name").Fold().Order(Scope.Local).Index<object>().Unfold<object>().Order().By(__.Tail<object>(Scope.Local,1))}}, 
@@ -489,7 +497,7 @@
                {"g_V_properties_order_byXkey_descX_key", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Properties<object>().Order().By(T.Key,Order.Desc).Key()}}, 
                {"g_V_hasLabelXpersonX_order_byXvalueXageX_descX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Order().By((IFunction) p["l1"],Order.Desc).Values<object>("name")}}, 
                {"g_V_hasLabelXpersonX_group_byXnameX_byXoutE_weight_sumX_orderXlocalX_byXvaluesX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Group<object,object>().By("name").By(__.OutE().Values<object>("weight").Sum<object>()).Order(Scope.Local).By(Column.Values)}}, 
-               {"g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Map<object>(__.BothE().Values<object>("weight").Fold()).Order().By(__.Sum<object>(Scope.Local),Order.Desc)}}, 
+               {"g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Map<object>(__.BothE().Values<object>("weight").Order().By(Order.Asc).Fold()).Order().By(__.Sum<object>(Scope.Local),Order.Desc)}}, 
                {"g_V_group_byXlabelX_byXname_order_byXdescX_foldX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group<object,object>().By(T.Label).By(__.Values<object>("name").Order().By(Order.Desc).Fold())}}, 
                {"g_V_hasLabelXpersonX_group_byXnameX_byXoutE_weight_sumX_unfold_order_byXvalues_descX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Group<object,object>().By("name").By(__.OutE().Values<object>("weight").Sum<object>()).Unfold<object>().Order().By(Column.Values,Order.Desc)}}, 
                {"g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_descX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("v").Map<object>(__.BothE().Values<object>("weight").Fold()).Sum<object>(Scope.Local).As("s").Select<object>("v","s").Order().By(__.Select<object>("s"),Order.Desc)}}, 
@@ -500,15 +508,15 @@
                {"g_V_orXhasLabelXpersonX_hasXsoftware_name_lopXX_order_byXageX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Or(__.HasLabel("person"),__.Has("software","name","lop")).Order().By("age")}}, 
                {"g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalues_descX_byXkeys_ascX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V((Vertex) p["v1"]).HasLabel("person").Map<object>((IFunction) p["l1"]).Order(Scope.Local).By(Column.Values,Order.Desc).By(Column.Keys,Order.Asc)}}, 
                {"g_VX1X_elementMap_orderXlocalX_byXkeys_descXunfold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).ElementMap<object>().Order(Scope.Local).By(Column.Keys,Order.Desc).Unfold<object>()}}, 
-               {"g_V_pageRank_hasXpageRankX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PageRank().Has("gremlin.pageRankVertexProgram.pageRank"), (g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PageRank().Has("gremlin.pageRankVertexProgram.pageRank")}}, 
-               {"g_V_outXcreatedX_pageRank_withXedges_bothEX_withXpropertyName_projectRankX_withXtimes_0X_valueMapXname_projectRankX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Out("created").PageRank().With("~tinkerpop.pageRank.edges",__.BothE()).With("~tinkerpop.pageRank.propertyName","projectRank").With("~tinkerpop.pageRank.times",0).ValueMap<object,object>("name","projectRank")}}, 
-               {"g_V_pageRank_order_byXpageRank_descX_byXnameX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PageRank().Order().By("gremlin.pageRankVertexProgram.pageRank",Order.Desc).By("name").Values<object>("name")}}, 
-               {"g_V_pageRank_order_byXpageRank_descX_name_limitX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PageRank().Order().By("gremlin.pageRankVertexProgram.pageRank",Order.Desc).Values<object>("name").Limit<object>(2)}}, 
-               {"g_V_pageRank_withXedges_outEXknowsXX_withXpropertyName_friendRankX_project_byXnameX_byXvaluesXfriendRankX_mathX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PageRank().With("~tinkerpop.pageRank.edges",__.OutE("knows")).With("~tinkerpop.pageRank.propertyName","friendRank").Project<object>("name","friendRank").By("name").By(__.Values<object>("friendRank").Math("ceil(_ * 100)"))}}, 
-               {"g_V_hasLabelXpersonX_pageRank_withXpropertyName_kpageRankX_project_byXnameX_byXvaluesXpageRankX_mathX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().HasLabel("person").PageRank().With("~tinkerpop.pageRank.propertyName","pageRank").Project<object>("name","pageRank").By("name").By(__.Values<object>("pageRank").Math("ceil(_ * 100)"))}}, 
-               {"g_V_pageRank_withXpropertyName_pageRankX_asXaX_outXknowsX_pageRank_asXbX_selectXa_bX_by_byXmathX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PageRank().With("~tinkerpop.pageRank.propertyName","pageRank").As("a").Out("knows").Values<object>("pageRank").As("b").Select<object>("a","b").By().By(__.Math("ceil(_ * 100)"))}}, 
-               {"g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_withXedges_inEXcreatedX_withXtimes_1X_withXpropertyName_priorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().HasLabel("software").Has("name","ripple").PageRank(1.0).With("~tinkerpop.pageRank.edges",__.InE("created")).With("~tinkerpop.pageRank.times",1).With("~tinkerpop.pageRank.propertyName","priors").In("created").Union<object>(__.Both(),__.Identity()).ValueMap<object,object>("name","priors")}}, 
-               {"g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXpropertyName_pageRankX_withXedges_inEX_withXtimes_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Out("created").Group("m").By(T.Label).PageRank(1.0).With("~tinkerpop.pageRank.propertyName","pageRank").With("~tinkerpop.pageRank.edges",__.InE()).With("~tinkerpop.pageRank.times",1).In("created").Group("m").By("pageRank").Cap<object>("m")}}, 
+               {"g_V_pageRank_hasXpageRankX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().PageRank().Has("gremlin.pageRankVertexProgram.pageRank")}}, 
+               {"g_V_outXcreatedX_pageRank_withXedges_bothEX_withXpropertyName_projectRankX_withXtimes_0X_valueMapXname_projectRankX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Out("created").PageRank().With("~tinkerpop.pageRank.edges",__.BothE()).With("~tinkerpop.pageRank.propertyName","projectRank").With("~tinkerpop.pageRank.times",0).ValueMap<object,object>("name","projectRank")}}, 
+               {"g_V_pageRank_order_byXpageRank_descX_byXnameX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().PageRank().Order().By("gremlin.pageRankVertexProgram.pageRank",Order.Desc).By("name").Values<object>("name")}}, 
+               {"g_V_pageRank_order_byXpageRank_descX_name_limitX2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().PageRank().Order().By("gremlin.pageRankVertexProgram.pageRank",Order.Desc).Values<object>("name").Limit<object>(2)}}, 
+               {"g_V_pageRank_withXedges_outEXknowsXX_withXpropertyName_friendRankX_project_byXnameX_byXvaluesXfriendRankX_mathX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().PageRank().With("~tinkerpop.pageRank.edges",__.OutE("knows")).With("~tinkerpop.pageRank.propertyName","friendRank").Project<object>("name","friendRank").By("name").By(__.Values<object>("friendRank").Math("ceil(_ * 100)"))}}, 
+               {"g_V_hasLabelXpersonX_pageRank_withXpropertyName_kpageRankX_project_byXnameX_byXvaluesXpageRankX_mathX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").PageRank().With("~tinkerpop.pageRank.propertyName","pageRank").Project<object>("name","pageRank").By("name").By(__.Values<object>("pageRank").Math("ceil(_ * 100)"))}}, 
+               {"g_V_pageRank_withXpropertyName_pageRankX_asXaX_outXknowsX_pageRank_asXbX_selectXa_bX_by_byXmathX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().PageRank().With("~tinkerpop.pageRank.propertyName","pageRank").As("a").Out("knows").Values<object>("pageRank").As("b").Select<object>("a","b").By().By(__.Math("ceil(_ * 100)"))}}, 
+               {"g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_withXedges_inEXcreatedX_withXtimes_1X_withXpropertyName_priorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("software").Has("name","ripple").PageRank(1.0).With("~tinkerpop.pageRank.edges",__.InE("created")).With("~tinkerpop.pageRank.times",1).With("~tinkerpop.pageRank.propertyName","priors").In("created").Union<object>(__.Both(),__.Identity()).ValueMap<object,object>("name","priors")}}, 
+               {"g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXpropertyName_pageRankX_withXedges_inEX_withXtimes_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Out("created").Group("m").By(T.Label).PageRank(1.0).With("~tinkerpop.pageRank.propertyName","pageRank").With("~tinkerpop.pageRank.edges",__.InE()).With("~tinkerpop.pageRank.times",1).In("created").Group("m").By("pageRank").Cap<object>("m")}}, 
                {"g_VX1X_name_path", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Values<object>("name").Path()}}, 
                {"g_VX1X_out_path_byXageX_byXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out().Path().By("age").By("name")}}, 
                {"g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.Out()).Times(2).Path().By().By("name").By("lang")}}, 
@@ -519,9 +527,9 @@
                {"g_VX1X_out_path_byXageX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out().Path().By("age")}}, 
                {"g_injectX1_null_nullX_path", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(1,null,null).Path()}}, 
                {"g_injectX1_null_nullX_path_dedup", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(1,null,null).Path().Dedup()}}, 
-               {"g_V_peerPressure_hasXclusterX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PeerPressure().Has("gremlin.peerPressureVertexProgram.cluster"), (g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PeerPressure().Has("gremlin.peerPressureVertexProgram.cluster")}}, 
-               {"g_V_peerPressure_withXpropertyName_clusterX_withXedges_outEXknowsXX_pageRankX1X_byXrankX_withXedges_outEXknowsX_withXtimes_2X_group_byXclusterX_byXrank_sumX_limitX100X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().PeerPressure().With("~tinkerpop.peerPressure.propertyName","cluster").With("~tinkerpop.peerPressure.edges",__.OutE("knows")).PageRank(1.0).With("~tinkerpop.pageRank.propertyName","rank").With("~tinkerpop.pageRank.edges",__.OutE("knows")).With("~tinkerpop.pageRank.times",1).Group<object,object>().By("cluster").By(__.Values<object>("rank").Sum<object>()).Limit<object>(100)}}, 
-               {"g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXedges_outEX_withyXpropertyName_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Has("name","ripple").In("created").PeerPressure().With("~tinkerpop.peerPressure.edges",__.OutE()).With("~tinkerpop.peerPressure.propertyName","cluster").Repeat(__.Union<object>(__.Identity(),__.Both())).Times(2).Dedup().ValueMap<object,object>("name","cluster")}}, 
+               {"g_V_peerPressure_hasXclusterX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().PeerPressure().Has("gremlin.peerPressureVertexProgram.cluster")}}, 
+               {"g_V_peerPressure_withXpropertyName_clusterX_withXedges_outEXknowsXX_pageRankX1X_byXrankX_withXedges_outEXknowsX_withXtimes_2X_group_byXclusterX_byXrank_sumX_limitX100X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().PeerPressure().With("~tinkerpop.peerPressure.propertyName","cluster").With("~tinkerpop.peerPressure.edges",__.OutE("knows")).PageRank(1.0).With("~tinkerpop.pageRank.propertyName","rank").With("~tinkerpop.pageRank.edges",__.OutE("knows")).With("~tinkerpop.pageRank.times",1).Group<object,object>().By("cluster").By(__.Values<object>("rank").Sum<object>()).Limit<object>(100)}}, 
+               {"g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXedges_outEX_withyXpropertyName_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","ripple").In("created").PeerPressure().With("~tinkerpop.peerPressure.edges",__.OutE()).With("~tinkerpop.peerPressure.propertyName","cluster").Repeat(__.Union<object>(__.Identity(),__.Both())).Times(2).Dedup().ValueMap<object,object>("name","cluster")}}, 
                {"g_V_hasLabelXpersonX_projectXa_bX_byXoutE_countX_byXageX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Project<object>("a","b").By(__.OutE().Count()).By("age")}}, 
                {"g_V_outXcreatedX_projectXa_bX_byXnameX_byXinXcreatedX_countX_order_byXselectXbX__descX_selectXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Out("created").Project<object>("a","b").By("name").By(__.In("created").Count()).Order().By(__.Select<object>("b"),Order.Desc).Select<object>("a")}}, 
                {"g_V_valueMap_projectXxX_byXselectXnameXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().ValueMap<object,object>().Project<object>("x").By(__.Select<object>("name"))}}, 
@@ -595,21 +603,21 @@
                {"g_EX11X_propertiesXweightX_asXaX_selectXaX_byXvalueX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.E(p["eid11"]).Properties<object>("weight").As("a").Select<object>("a").By(T.Value)}}, 
                {"g_V_asXaX_selectXaX_byXageX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").Select<object>("a").By("age")}}, 
                {"g_withSideEffectXk_nullX_injectXxX_selectXkX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithSideEffect("k",null).Inject("x").Select<object>("k")}}, 
-               {"g_V_shortestPath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Identity().ShortestPath()}}, 
-               {"g_V_both_dedup_shortestPath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Both().Dedup().ShortestPath()}}, 
-               {"g_V_shortestPath_edgesIncluded", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Identity().ShortestPath().With("~tinkerpop.shortestPath.includeEdges")}}, 
-               {"g_V_shortestPath_directionXINX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Identity().ShortestPath().With("~tinkerpop.shortestPath.edges",Direction.In)}}, 
-               {"g_V_shortestPath_edgesXoutEX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Identity().ShortestPath().With("~tinkerpop.shortestPath.edges",__.OutE())}}, 
-               {"g_V_shortestPath_edgesIncluded_edgesXoutEX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Identity().ShortestPath().With("~tinkerpop.shortestPath.includeEdges").With("~tinkerpop.shortestPath.edges",__.OutE())}}, 
-               {"g_V_hasXname_markoX_shortestPath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Has("name","marko").ShortestPath()}}, 
-               {"g_V_shortestPath_targetXhasXname_markoXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Identity().ShortestPath().With("~tinkerpop.shortestPath.target",__.Has("name","marko"))}}, 
-               {"g_V_shortestPath_targetXvaluesXnameX_isXmarkoXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Identity().ShortestPath().With("~tinkerpop.shortestPath.target",__.Values<object>("name").Is("marko"))}}, 
-               {"g_V_hasXname_markoX_shortestPath_targetXhasLabelXsoftwareXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Has("name","marko").ShortestPath().With("~tinkerpop.shortestPath.target",__.HasLabel("software"))}}, 
-               {"g_V_hasXname_markoX_shortestPath_targetXhasXname_joshXX_distanceXweightX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Has("name","marko").ShortestPath().With("~tinkerpop.shortestPath.target",__.Has("name","josh")).With("~tinkerpop.shortestPath.distance","weight")}}, 
-               {"g_V_hasXname_danielX_shortestPath_targetXhasXname_stephenXX_edgesXbothEXusesXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Has("name","daniel").ShortestPath().With("~tinkerpop.shortestPath.target",__.Has("name","stephen")).With("~tinkerpop.shortestPath.edges",__.BothE("uses"))}}, 
-               {"g_V_hasXsong_name_MIGHT_AS_WELLX_shortestPath_targetXhasXsong_name_MAYBE_YOU_KNOW_HOW_I_FEELXX_edgesXoutEXfollowedByXX_distanceXweightX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Has("song","name","MIGHT AS WELL").ShortestPath().With("~tinkerpop.shortestPath.target",__.Has("song","name","MAYBE YOU KNOW HOW I FEEL")).With("~tinkerpop.shortestPath.edges",__.OutE("followedBy")).With("~tinkerpop.shortestPath.distance","weight")}}, 
-               {"g_V_hasXname_markoX_shortestPath_maxDistanceX1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Has("name","marko").ShortestPath().With("~tinkerpop.shortestPath.maxDistance",1)}}, 
-               {"g_V_hasXname_vadasX_shortestPath_distanceXweightX_maxDistanceX1_3X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new VertexProgramStrategy(graphComputer: "org.apache.tinkerpop.gremlin.process.computer.GraphComputer")).V().Has("name","vadas").ShortestPath().With("~tinkerpop.shortestPath.distance","weight").With("~tinkerpop.shortestPath.maxDistance",1.3)}}, 
+               {"g_V_shortestPath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Identity().ShortestPath()}}, 
+               {"g_V_both_dedup_shortestPath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Both().Dedup().ShortestPath()}}, 
+               {"g_V_shortestPath_edgesIncluded", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Identity().ShortestPath().With("~tinkerpop.shortestPath.includeEdges")}}, 
+               {"g_V_shortestPath_directionXINX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Identity().ShortestPath().With("~tinkerpop.shortestPath.edges",Direction.In)}}, 
+               {"g_V_shortestPath_edgesXoutEX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Identity().ShortestPath().With("~tinkerpop.shortestPath.edges",__.OutE())}}, 
+               {"g_V_shortestPath_edgesIncluded_edgesXoutEX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Identity().ShortestPath().With("~tinkerpop.shortestPath.includeEdges").With("~tinkerpop.shortestPath.edges",__.OutE())}}, 
+               {"g_V_hasXname_markoX_shortestPath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","marko").ShortestPath()}}, 
+               {"g_V_shortestPath_targetXhasXname_markoXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Identity().ShortestPath().With("~tinkerpop.shortestPath.target",__.Has("name","marko"))}}, 
+               {"g_V_shortestPath_targetXvaluesXnameX_isXmarkoXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Identity().ShortestPath().With("~tinkerpop.shortestPath.target",__.Values<object>("name").Is("marko"))}}, 
+               {"g_V_hasXname_markoX_shortestPath_targetXhasLabelXsoftwareXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","marko").ShortestPath().With("~tinkerpop.shortestPath.target",__.HasLabel("software"))}}, 
+               {"g_V_hasXname_markoX_shortestPath_targetXhasXname_joshXX_distanceXweightX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","marko").ShortestPath().With("~tinkerpop.shortestPath.target",__.Has("name","josh")).With("~tinkerpop.shortestPath.distance","weight")}}, 
+               {"g_V_hasXname_danielX_shortestPath_targetXhasXname_stephenXX_edgesXbothEXusesXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","daniel").ShortestPath().With("~tinkerpop.shortestPath.target",__.Has("name","stephen")).With("~tinkerpop.shortestPath.edges",__.BothE("uses"))}}, 
+               {"g_V_hasXsong_name_MIGHT_AS_WELLX_shortestPath_targetXhasXsong_name_MAYBE_YOU_KNOW_HOW_I_FEELXX_edgesXoutEXfollowedByXX_distanceXweightX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("song","name","MIGHT AS WELL").ShortestPath().With("~tinkerpop.shortestPath.target",__.Has("song","name","MAYBE YOU KNOW HOW I FEEL")).With("~tinkerpop.shortestPath.edges",__.OutE("followedBy")).With("~tinkerpop.shortestPath.distance","weight")}}, 
+               {"g_V_hasXname_markoX_shortestPath_maxDistanceX1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","marko").ShortestPath().With("~tinkerpop.shortestPath.maxDistance",1)}}, 
+               {"g_V_hasXname_vadasX_shortestPath_distanceXweightX_maxDistanceX1_3X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","vadas").ShortestPath().With("~tinkerpop.shortestPath.distance","weight").With("~tinkerpop.shortestPath.maxDistance",1.3)}}, 
                {"g_V_age_sum", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Sum<object>()}}, 
                {"g_V_foo_sum", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("foo").Sum<object>()}}, 
                {"g_V_age_fold_sumXlocalX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Fold().Sum<object>(Scope.Local)}}, 
@@ -673,7 +681,7 @@
                {"g_VX1X_out_out_out", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out().Out().Out()}}, 
                {"g_VX1X_out_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out().Values<object>("name")}}, 
                {"g_VX1X_to_XOUT_knowsX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).To(Direction.Out,"knows")}}, 
-               {"g_VX1_2_3_4X_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"],p["vid2"],p["vid3"],p["vid4"]).Values<object>("name")}}, 
+               {"g_VX1_2_3_4X_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").As("ripple").AddV("person").Property("name","peter").Property("age",35).As("peter").AddE("knows").From("marko").To("vadas").Property("weight",0.5).AddE("knows").From("marko").To("josh").Property("weight",1.0).AddE("created").From("marko").To("lop").Property("weight",0.4).AddE("created").From("josh").To("ripple").Property("weight",1.0).AddE("created").From("josh").To("lop").Property("weight",0.4).AddE("created").From("peter").To("lop").Property("weight",0.2), (g,p) =>g.V().Has("software","name","lop").Drop(), (g,p) =>g.V(p["vid1"],p["vid2"],p["vid3"],p["vid4"])}}, 
                {"g_V_hasLabelXpersonX_V_hasLabelXsoftwareX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").V().HasLabel("software").Values<object>("name")}}, 
                {"g_V_hasLabelXloopsX_bothEXselfX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("loops").BothE("self")}}, 
                {"g_V_hasLabelXloopsX_bothXselfX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("loops").Both("self")}}, 
@@ -693,7 +701,7 @@
                {"g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("lang").Group("a").By("lang").By("name").Out().Cap<object>("a")}}, 
                {"g_V_hasXlangX_group_byXlangX_byXcountX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("lang").Group<object,object>().By("lang").By(__.Count())}}, 
                {"g_V_repeatXout_groupXaX_byXnameX_byXcountX_timesX2X_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.Out().Group("a").By("name").By(__.Count())).Times(2).Cap<object>("a")}}, 
-               {"g_V_group_byXoutE_countX_byXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group<object,object>().By(__.OutE().Count()).By("name")}}, 
+               {"g_V_group_byXoutE_countX_byXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Order().By("name").Group<object,object>().By(__.OutE().Count()).By("name")}}, 
                {"g_V_groupXaX_byXlabelX_byXoutE_weight_sumX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group("a").By(T.Label).By(__.OutE().Values<object>("weight").Sum<object>()).Cap<object>("a")}}, 
                {"g_V_repeatXbothXfollowedByXX_timesX2X_group_byXsongTypeX_byXcountX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.Both("followedBy")).Times(2).Group<object,object>().By("songType").By(__.Count())}}, 
                {"g_V_repeatXbothXfollowedByXX_timesX2X_groupXaX_byXsongTypeX_byXcountX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Repeat(__.Both("followedBy")).Times(2).Group("a").By("songType").By(__.Count()).Cap<object>("a")}}, 
@@ -705,7 +713,7 @@
                {"g_V_outXfollowedByX_group_byXsongTypeX_byXbothE_group_byXlabelX_byXweight_sumXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Out("followedBy").Group<object,object>().By("songType").By(__.BothE().Group<object,object>().By(T.Label).By(__.Values<object>("weight").Sum<object>()))}}, 
                {"g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group("m").By("name").By(__.In("knows").Values<object>("name")).Cap<object>("m")}}, 
                {"g_V_group_byXlabelX_byXbothE_groupXaX_byXlabelX_byXweight_sumX_weight_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group<object,object>().By(T.Label).By(__.BothE().Group("a").By(T.Label).By(__.Values<object>("weight").Sum<object>()).Values<object>("weight").Sum<object>())}}, 
-               {"g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithSideEffect("a",p["xx1"]).V().Group("a").By("name").By(__.OutE().Label().Fold()).Cap<object>("a")}}, 
+               {"g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithSideEffect("a",p["xx1"]).V().Group("a").By("name").By(__.OutE().Label().Fold()).Cap<object>("a").Unfold<object>().Group<object,object>().By(Column.Keys).By(__.Select<object>(Column.Values).Order(Scope.Local).By(Order.Asc))}}, 
                {"g_V_hasLabelXpersonX_asXpX_outXcreatedX_group_byXnameX_byXselectXpX_valuesXageX_sumX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").As("p").Out("created").Group<object,object>().By("name").By(__.Select<object>("p").Values<object>("age").Sum<object>())}}, 
                {"g_V_hasLabelXpersonX_asXpX_outXcreatedX_groupXaX_byXnameX_byXselectXpX_valuesXageX_sumX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").As("p").Out("created").Group("a").By("name").By(__.Select<object>("p").Values<object>("age").Sum<object>()).Cap<object>("a")}}, 
                {"g_V_group_byXlabelX_byXlabel_countX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Group<object,object>().By(__.Label()).By(__.Label().Count())}}, 
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/IgnoreException.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/IgnoreException.cs
index 9579626..e025e2f 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/IgnoreException.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/IgnoreException.cs
@@ -60,6 +60,11 @@
         /// <summary>
         /// C# array equality is by reference not contents so the gherkin setup won't assert properly
         /// </summary>
-        ArrayKeysInMapNotAssertingInGherkin
+        ArrayKeysInMapNotAssertingInGherkin,
+
+        /// <summary>
+        /// The GLV suite does not test against a graph that has null property values enabled.
+        /// </summary>
+        NullPropertyValuesNotSupportedOnTestGraph
     }
 }
\ No newline at end of file
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs
index 28979a3..99731fe 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs
@@ -50,6 +50,7 @@
         private readonly RemoteConnectionFactory _connectionFactory;
 
         public Scenario CurrentScenario;
+        public Feature CurrentFeature;
 
         public ScenarioDataPerGraph GetByGraphName(string name)
         {
diff --git a/gremlin-dotnet/test/pom.xml b/gremlin-dotnet/test/pom.xml
index d110391..d6ab999 100644
--- a/gremlin-dotnet/test/pom.xml
+++ b/gremlin-dotnet/test/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>gremlin-dotnet</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-dotnet-tests</artifactId>
     <name>Apache TinkerPop :: Gremlin.Net - Tests</name>
@@ -113,9 +113,14 @@
                                 <version>${project.version}</version>
                             </dependency>
                             <dependency>
-                                <groupId>log4j</groupId>
-                                <artifactId>log4j</artifactId>
-                                <version>${log4j.version}</version>
+                                <groupId>org.apache.tinkerpop</groupId>
+                                <artifactId>gremlin-language</artifactId>
+                                <version>${project.version}</version>
+                            </dependency>
+                            <dependency>
+                                <groupId>ch.qos.logback</groupId>
+                                <artifactId>logback-classic</artifactId>
+                                <version>${logback.version}</version>
                                 <scope>runtime</scope>
                             </dependency>
                             <dependency>
diff --git a/gremlin-driver/pom.xml b/gremlin-driver/pom.xml
index b94709f..9de204b 100644
--- a/gremlin-driver/pom.xml
+++ b/gremlin-driver/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-driver</artifactId>
     <name>Apache TinkerPop :: Gremlin Driver</name>
@@ -37,38 +37,12 @@
             <version>${netty.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy</artifactId>
-            <version>${groovy.version}</version>
-            <classifier>indy</classifier>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy-json</artifactId>
-            <version>${groovy.version}</version>
-            <classifier>indy</classifier>
-            <exclusions>
-                <!-- exclude non-indy type -->
-                <exclusion>
-                    <groupId>org.codehaus.groovy</groupId>
-                    <artifactId>groovy</artifactId>
-                </exclusion>
-            </exclusions>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <optional>true</optional>
         </dependency>
         <!-- TinkerGraph is an optional dependency that is only required if doing deserialization of Graph instances -->
@@ -96,6 +70,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>io.github.hakky54</groupId>
+            <artifactId>logcaptor</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.powermock</groupId>
             <artifactId>powermock-module-junit4</artifactId>
             <scope>test</scope>
@@ -169,8 +148,7 @@
                                 <!-- exclude logging stuff from uberjar - shading prevents proper logger initialization -->
                                 <!-- exclude groovy as it's only needed for json serialization and is an optional dependency -->
                                 <excludes>
-                                    <exclude>log4j:log4j</exclude>
-                                    <exclude>org.slf4j:slf4j-log4j12</exclude>
+                                    <exclude>ch.qos.logback:logback-classic</exclude>
                                     <exclude>org.slf4j:slf4j-api</exclude>
                                     <exclude>org.slf4j:jcl-over-slf4j</exclude>
                                     <exclude>org.codehaus.groovy:groovy</exclude>
diff --git a/gremlin-driver/src/main/bin/config-eval.sh b/gremlin-driver/src/main/bin/config-eval.sh
index 764d732..c247d8c 100644
--- a/gremlin-driver/src/main/bin/config-eval.sh
+++ b/gremlin-driver/src/main/bin/config-eval.sh
@@ -42,4 +42,4 @@
 fi
 
 # Execute the application and return its exit code
-exec $JAVA -Dlog4j.configuration=conf/log4j-driver.properties $JAVA_OPTIONS -cp $CP org.apache.tinkerpop.gremlin.driver.util.ConfigurationEvaluator "$@"
\ No newline at end of file
+exec $JAVA -Dlogback.configurationFile=conf/logback.xml $JAVA_OPTIONS -cp $CP org.apache.tinkerpop.gremlin.driver.util.ConfigurationEvaluator "$@"
\ No newline at end of file
diff --git a/gremlin-driver/src/main/bin/profile-driver.sh b/gremlin-driver/src/main/bin/profile-driver.sh
index 7b4ac1b..60e32e5 100644
--- a/gremlin-driver/src/main/bin/profile-driver.sh
+++ b/gremlin-driver/src/main/bin/profile-driver.sh
@@ -42,4 +42,4 @@
 fi
 
 # Execute the application and return its exit code
-exec $JAVA -Dlog4j.configuration=conf/log4j-driver.properties $JAVA_OPTIONS -cp $CP org.apache.tinkerpop.gremlin.driver.util.ProfilingApplication "$@"
\ No newline at end of file
+exec $JAVA -Dlogback.configurationFile=conf/logback.xml $JAVA_OPTIONS -cp $CP org.apache.tinkerpop.gremlin.driver.util.ProfilingApplication "$@"
\ No newline at end of file
diff --git a/gremlin-driver/src/main/conf/log4j-driver.properties b/gremlin-driver/src/main/conf/log4j-driver.properties
deleted file mode 100644
index 129bf4b..0000000
--- a/gremlin-driver/src/main/conf/log4j-driver.properties
+++ /dev/null
@@ -1,25 +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.
-log4j.rootLogger=OFF, stdout
-log4j.logger.org.apache.tinkerpop.gremlin.driver.Connection=OFF
-log4j.logger.org.apache.tinkerpop.gremlin.driver.ConnectionPool=OFF
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-#log4j.appender.stdout=org.apache.log4j.FileAppender
-#log4j.appender.stdout.file=recless.log
-#log4j.appender.stdout.append=true
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C{1} - %m%n
diff --git a/gremlin-driver/src/main/conf/logback.xml b/gremlin-driver/src/main/conf/logback.xml
new file mode 100644
index 0000000..1813c89
--- /dev/null
+++ b/gremlin-driver/src/main/conf/logback.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C{1} - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.tinkerpop.gremlin.driver.Connection" level="OFF"/>
+    <logger name="org.apache.tinkerpop.gremlin.driver.ConnectionPool" level="OFF"/>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java
index b25045f..1bc1cab 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java
@@ -60,7 +60,7 @@
     public static final int MIN_IN_PROCESS = 1;
     public static final int MAX_WAIT_FOR_CONNECTION = 16000;
     public static final int MAX_WAIT_FOR_CLOSE = 3000;
-    public static final int MAX_CONTENT_LENGTH = 65536;
+    public static final int MAX_CONTENT_LENGTH = 10 * 1024 * 1024;
 
     public static final int RECONNECT_INTERVAL = 1000;
     public static final int RESULT_ITERATION_BATCH_SIZE = 64;
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java
index ca42dbc..11cf84d 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ConnectionPool.java
@@ -142,8 +142,6 @@
 
         if (isClosed()) throw new ConnectionException(host.getHostUri(), host.getAddress(), "Pool is shutdown");
 
-        final Connection leastUsedConn = selectLeastUsed();
-
         if (connections.isEmpty()) {
             logger.debug("Tried to borrow connection but the pool was empty for {} - scheduling pool creation and waiting for connection", host);
             for (int i = 0; i < minPoolSize; i++) {
@@ -158,6 +156,9 @@
             return waitForConnection(timeout, unit);
         }
 
+        // Get the least used valid connection
+        final Connection leastUsedConn = getLeastUsedValidConnection();
+
         if (null == leastUsedConn) {
             if (isClosed())
                 throw new ConnectionException(host.getHostUri(), host.getAddress(), "Pool is shutdown");
@@ -165,32 +166,9 @@
             return waitForConnection(timeout, unit);
         }
 
-        // if the number borrowed on the least used connection exceeds the max allowed and the pool size is
-        // not at maximum then consider opening a connection
-        final int currentPoolSize = connections.size();
-        if (leastUsedConn.borrowed.get() >= maxSimultaneousUsagePerConnection && currentPoolSize < maxPoolSize) {
-            if (logger.isDebugEnabled())
-                logger.debug("Least used {} on {} exceeds maxSimultaneousUsagePerConnection but pool size {} < maxPoolSize - consider new connection",
-                        leastUsedConn.getConnectionInfo(), host, currentPoolSize);
-            considerNewConnection();
-        }
-
-        while (true) {
-            final int borrowed = leastUsedConn.borrowed.get();
-            final int availableInProcess = leastUsedConn.availableInProcess();
-
-            if (borrowed >= maxSimultaneousUsagePerConnection && leastUsedConn.availableInProcess() == 0) {
-                logger.debug("Least used connection selected from pool for {} but borrowed [{}] >= availableInProcess [{}] - wait",
-                        host, borrowed, availableInProcess);
-                return waitForConnection(timeout, unit);
-            }
-
-            if (leastUsedConn.borrowed.compareAndSet(borrowed, borrowed + 1)) {
-                if (logger.isDebugEnabled())
-                    logger.debug("Return least used {} on {}", leastUsedConn.getConnectionInfo(), host);
-                return leastUsedConn;
-            }
-        }
+        if (logger.isDebugEnabled())
+            logger.debug("Return least used {} on {}", leastUsedConn.getConnectionInfo(), host);
+        return leastUsedConn;
     }
 
     public void returnConnection(final Connection connection) throws ConnectionException {
@@ -342,7 +320,7 @@
             return false;
         }
 
-        announceAvailableConnection();
+        announceAllAvailableConnection();
         return true;
     }
 
@@ -393,23 +371,12 @@
             if (isClosed())
                 throw new ConnectionException(host.getHostUri(), host.getAddress(), "Pool is shutdown");
 
-            final Connection leastUsed = selectLeastUsed();
-            if (leastUsed != null) {
-                while (true) {
-                    final int inFlight = leastUsed.borrowed.get();
-                    final int availableInProcess = leastUsed.availableInProcess();
-                    if (inFlight >= availableInProcess) {
-                        logger.debug("Least used {} on {} has requests borrowed [{}] >= availableInProcess [{}] - may timeout waiting for connection",
-                                leastUsed, host, inFlight, availableInProcess);
-                        break;
-                    }
+            final Connection leastUsed = getLeastUsedValidConnection();
 
-                    if (leastUsed.borrowed.compareAndSet(inFlight, inFlight + 1)) {
-                        if (logger.isDebugEnabled())
-                            logger.debug("Return least used {} on {} after waiting", leastUsed.getConnectionInfo(), host);
-                        return leastUsed;
-                    }
-                }
+            if (leastUsed != null) {
+                if (logger.isDebugEnabled())
+                    logger.debug("Return least used {} on {} after waiting", leastUsed.getConnectionInfo(), host);
+                return leastUsed;
             }
 
             remaining = to - TimeUtil.timeSince(start, unit);
@@ -475,16 +442,39 @@
         }
     }
 
-    private Connection selectLeastUsed() {
+    /**
+     * Get the least-used connection from the pool. Also triggers consideration of a new connection if the least-used
+     * connection has hit the usage maximum or no valid connection could be retrieved from the pool.
+     *
+     * @return The least-used connection from the pool. Returns null if no valid connection could be retrieved from the
+     * pool.
+     */
+    private synchronized Connection getLeastUsedValidConnection() {
         int minInFlight = Integer.MAX_VALUE;
         Connection leastBusy = null;
         for (Connection connection : connections) {
             final int inFlight = connection.borrowed.get();
-            if (!connection.isDead() && inFlight < minInFlight) {
+            if (!connection.isDead() && inFlight < minInFlight && inFlight < maxSimultaneousUsagePerConnection) {
                 minInFlight = inFlight;
                 leastBusy = connection;
             }
         }
+
+        if (leastBusy != null) {
+            // Increment borrow count and consider making a new connection if least used connection hits usage maximum
+            if (leastBusy.borrowed.incrementAndGet() >= maxSimultaneousUsagePerConnection
+                    && connections.size() < maxPoolSize) {
+                if (logger.isDebugEnabled())
+                    logger.debug("Least used {} on {} reached maxSimultaneousUsagePerConnection but pool size {} < maxPoolSize - consider new connection",
+                            leastBusy.getConnectionInfo(), host, connections.size());
+                considerNewConnection();
+            }
+        } else if (connections.size() < maxPoolSize) {
+            // A safeguard for scenarios where consideration of a new connection was somehow not triggered by an
+            // existing connection hitting the usage maximum
+            considerNewConnection();
+        }
+
         return leastBusy;
     }
 
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV1d0.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV1d0.java
index 31ccf88..ca96ee5 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV1d0.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV1d0.java
@@ -23,7 +23,6 @@
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import groovy.json.JsonBuilder;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.util.ReferenceCountUtil;
@@ -162,31 +161,10 @@
     public final static class GremlinServerModule extends SimpleModule {
         public GremlinServerModule() {
             super("graphson-gremlin-server");
-            addSerializer(JsonBuilder.class, new JsonBuilderJacksonSerializer());
             addSerializer(ResponseMessage.class, new ResponseMessageSerializer());
         }
     }
 
-    /**
-     * @deprecated As of release 3.5.2, not replaced.
-     */
-    @Deprecated
-    public final static class JsonBuilderJacksonSerializer extends StdSerializer<JsonBuilder> {
-        public JsonBuilderJacksonSerializer() {
-            super(JsonBuilder.class);
-        }
-
-        @Override
-        public void serialize(final JsonBuilder json, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
-                throws IOException, JsonGenerationException {
-            // the JSON from the builder will already be started/ended as array or object...just need to surround it
-            // with appropriate chars to fit into the serialization pattern.
-            jsonGenerator.writeRaw(":");
-            jsonGenerator.writeRaw(json.toString());
-            jsonGenerator.writeRaw(",");
-        }
-    }
-
     public final static class ResponseMessageSerializer extends StdSerializer<ResponseMessage> {
         public ResponseMessageSerializer() {
             super(ResponseMessage.class);
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java
index 1caf284..69aee63 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java
@@ -18,7 +18,6 @@
  */
 package org.apache.tinkerpop.gremlin.driver.ser;
 
-import groovy.json.JsonBuilder;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.util.ReferenceCountUtil;
@@ -31,7 +30,6 @@
 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.GraphSONXModuleV2d0;
-import org.apache.tinkerpop.shaded.jackson.core.JsonGenerationException;
 import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
@@ -155,7 +153,6 @@
             super("graphson-gremlin-server");
 
             // SERIALIZERS
-            addSerializer(JsonBuilder.class, new JsonBuilderJacksonSerializer());
             addSerializer(ResponseMessage.class, new ResponseMessageSerializer());
             addSerializer(RequestMessage.class, new RequestMessageSerializer());
 
@@ -165,26 +162,6 @@
         }
     }
 
-    /**
-     * @deprecated As of release 3.5.2, not replaced.
-     */
-    @Deprecated
-    public final static class JsonBuilderJacksonSerializer extends StdSerializer<JsonBuilder> {
-        public JsonBuilderJacksonSerializer() {
-            super(JsonBuilder.class);
-        }
-
-        @Override
-        public void serialize(final JsonBuilder json, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
-                throws IOException, JsonGenerationException {
-            // the JSON from the builder will already be started/ended as array or object...just need to surround it
-            // with appropriate chars to fit into the serialization pattern.
-            jsonGenerator.writeRaw(":");
-            jsonGenerator.writeRaw(json.toString());
-            jsonGenerator.writeRaw(",");
-        }
-    }
-
     public final static class RequestMessageSerializer extends StdSerializer<RequestMessage> {
         public RequestMessageSerializer() {
             super(RequestMessage.class);
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/JsonBuilderGryoSerializer.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/JsonBuilderGryoSerializer.java
deleted file mode 100644
index 59ec9ff..0000000
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/JsonBuilderGryoSerializer.java
+++ /dev/null
@@ -1,47 +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.ser;
-
-import groovy.json.JsonBuilder;
-import groovy.json.JsonSlurper;
-import org.apache.tinkerpop.shaded.kryo.Kryo;
-import org.apache.tinkerpop.shaded.kryo.Serializer;
-import org.apache.tinkerpop.shaded.kryo.io.Input;
-import org.apache.tinkerpop.shaded.kryo.io.Output;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @deprecated As of release 3.5.2, not replaced.
- */
-@Deprecated
-public final class JsonBuilderGryoSerializer extends Serializer<JsonBuilder> {
-
-    final JsonSlurper slurper = new JsonSlurper();
-
-    @Override
-    public void write(final Kryo kryo, final Output output, final JsonBuilder jsonBuilder) {
-        output.writeString(jsonBuilder.toString());
-    }
-
-    @Override
-    public JsonBuilder read(final Kryo kryo, final Input input, final Class<JsonBuilder> jsonBuilderClass) {
-        final String jsonString = input.readString();
-        return new JsonBuilder(slurper.parseText(jsonString));
-    }
-}
diff --git a/gremlin-driver/src/main/static/LICENSE b/gremlin-driver/src/main/static/LICENSE
index c7f7809..7b2bc04 100644
--- a/gremlin-driver/src/main/static/LICENSE
+++ b/gremlin-driver/src/main/static/LICENSE
@@ -229,6 +229,12 @@
      SLF4J API Module (org.slf4j:slf4j-api:1.7.25 - http://www.slf4j.org)
        - shaded to org.shaded.slf4j
        - for details, see licenses/slf4j
-     SLF4J LOG4J-12 Binding (org.slf4j:slf4j-log4j12:1.7.25 - http://www.slf4j.org)
-       - shaded to org.shaded.slf4j
-       - for details, see licenses/slf4j
+
+========================================================================
+Other Licenses
+========================================================================
+
+The Apache TinkerPop project bundles the following components under the Eclipse Public License 1.0:
+
+     logback-core (ch.qos.logback:logback-core:1.2.3 - https://logback.qos.ch) - for details, see licenses/logback
+     logback-classic (ch.qos.logback:logback-classic:1.2.3 - https://logback.qos.ch) - for details, see licenses/logback
\ No newline at end of file
diff --git a/gremlin-driver/src/main/static/licenses/logback b/gremlin-driver/src/main/static/licenses/logback
new file mode 100644
index 0000000..8953762
--- /dev/null
+++ b/gremlin-driver/src/main/static/licenses/logback
@@ -0,0 +1,14 @@
+Logback LICENSE
+---------------
+
+Logback: the reliable, generic, fast and flexible logging framework.
+Copyright (C) 1999-2015, QOS.ch. All rights reserved.
+
+This program and the accompanying materials are dual-licensed under
+either the terms of the Eclipse Public License v1.0 as published by
+the Eclipse Foundation
+
+  or (per the licensee's choosing)
+
+under the terms of the GNU Lesser General Public License version 2.1
+as published by the Free Software Foundation.
\ No newline at end of file
diff --git a/gremlin-driver/src/main/static/licenses/slf4j b/gremlin-driver/src/main/static/licenses/slf4j
new file mode 100644
index 0000000..e106b98
--- /dev/null
+++ b/gremlin-driver/src/main/static/licenses/slf4j
@@ -0,0 +1,21 @@
+ Copyright (c) 2004-2017 QOS.ch
+ All rights reserved.
+
+ Permission is hereby granted, free  of charge, to any person obtaining
+ a  copy  of this  software  and  associated  documentation files  (the
+ "Software"), to  deal in  the Software without  restriction, including
+ without limitation  the rights to  use, copy, modify,  merge, publish,
+ distribute,  sublicense, and/or sell  copies of  the Software,  and to
+ permit persons to whom the Software  is furnished to do so, subject to
+ the following conditions:
+
+ The  above  copyright  notice  and  this permission  notice  shall  be
+ included in all copies or substantial portions of the Software.
+
+ THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+ EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+ MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientTest.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientTest.java
index 1ca2aeb..d7a693f 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientTest.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ClientTest.java
@@ -23,6 +23,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
@@ -38,6 +39,7 @@
 
 @RunWith(PowerMockRunner.class)
 @PrepareForTest({Client.ClusteredClient.class, Client.SessionedClient.class, Host.class, Cluster.class})
+@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"})
 public class ClientTest {
     @Mock
     private Cluster cluster;
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
index 0eb34f6..a9e5105 100644
--- 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
@@ -18,17 +18,19 @@
  */
 package org.apache.tinkerpop.gremlin.driver;
 
+import nl.altindag.log.LogCaptor;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.AbstractWarningVerificationStrategy;
 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.log4j.Level;
 import org.apache.tinkerpop.gremlin.driver.ser.Serializers;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -43,28 +45,28 @@
 import static org.junit.Assert.assertNotNull;
 
 public class WebSocketClientBehaviorIntegrateTest {
+    private static final Logger logger = LoggerFactory.getLogger(WebSocketClientBehaviorIntegrateTest.class);
+
     @Rule
     public TestName name = new TestName();
 
-    private static final Logger logger = LoggerFactory.getLogger(WebSocketClientBehaviorIntegrateTest.class);
-    private Log4jRecordingAppender recordingAppender = null;
-    private Level previousLogLevel;
+    private static LogCaptor logCaptor;
+
     private SimpleSocketServer server;
 
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forRoot();
+    }
+
+    @AfterClass
+    public static void tearDown() {
+        logCaptor.close();
+    }
+
     @Before
     public void setUp() throws InterruptedException {
-        recordingAppender = new Log4jRecordingAppender();
-        final org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger();
-        if (name.getMethodName().equals("shouldRemoveConnectionFromPoolWhenServerClose_WithPendingRequests") ||
-                name.getMethodName().equals("shouldNotCreateReplacementConnectionWhenClientClosesConnection")) {
-            final org.apache.log4j.Logger connectionPoolLogger = org.apache.log4j.Logger.getLogger(ConnectionPool.class);
-            final org.apache.log4j.Logger connectionLogger = org.apache.log4j.Logger.getLogger(Connection.class);
-            previousLogLevel = connectionPoolLogger.getLevel();
-            connectionPoolLogger.setLevel(Level.DEBUG);
-            connectionLogger.setLevel(Level.DEBUG);
-        }
-
-        rootLogger.addAppender(recordingAppender);
+        logCaptor.clearLogs();
 
         server = new SimpleSocketServer();
         server.start(new TestWSGremlinInitializer());
@@ -73,19 +75,6 @@
     @After
     public void shutdown() {
         server.stop();
-
-        // reset logger
-        final org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger();
-
-        if (name.getMethodName().equals("shouldRemoveConnectionFromPoolWhenServerClose_WithPendingRequests") ||
-                name.getMethodName().equals("shouldNotCreateReplacementConnectionWhenClientClosesConnection")) {
-            final org.apache.log4j.Logger connectionPoolLogger = org.apache.log4j.Logger.getLogger(ConnectionPool.class);
-            final org.apache.log4j.Logger connectionLogger = org.apache.log4j.Logger.getLogger(Connection.class);
-            connectionPoolLogger.setLevel(previousLogLevel);
-            connectionLogger.setLevel(previousLogLevel);
-        }
-
-        rootLogger.removeAppender(recordingAppender);
     }
 
     /**
@@ -226,7 +215,7 @@
         Thread.sleep(2000);
 
         // Assert that we should consider creating a connection only once, since only one connection is being closed.
-        assertEquals(1, recordingAppender.getMessages().stream().filter(str -> str.contains("Considering new connection on")).count());
+        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",
@@ -262,13 +251,9 @@
         Thread.sleep(2000);
 
         assertEquals("OnClose callback should be called but only once", 1,
-                recordingAppender.getMessages().stream()
-                        .filter(str -> str.contains("OnChannelClose callback called for channel"))
-                        .count());
+                logCaptor.getLogs().stream().filter(str -> str.contains("OnChannelClose callback called for channel")).count());
 
         assertEquals("No new connection creation should be started", 0,
-                recordingAppender.getMessages().stream()
-                        .filter(str -> str.contains("Considering new connection on"))
-                        .count());
+                logCaptor.getLogs().stream().filter(str -> str.contains("Considering new connection on")).count());
     }
 }
\ No newline at end of file
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java
index 897b759..e34309c 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java
@@ -21,7 +21,6 @@
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.buffer.UnpooledByteBufAllocator;
-import org.apache.log4j.Level;
 import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
@@ -566,14 +565,8 @@
     @Test
     @SuppressWarnings("deprecation")
     public void shouldFailOnMessageSerializerWithMapperIfNoGremlinServerModule() {
-        org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(AbstractGraphSONMessageSerializerV2d0.class);
-        Level previousLevel = logger.getLevel();
-
-        // Disable temporarily logging for this test
-        logger.setLevel(Level.OFF);
-
-        GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV2d0.build().create(false));
-        GraphSONMessageSerializerV2d0 graphSONMessageSerializerV2d0 = new GraphSONMessageSerializerV2d0(builder.create());
+        final GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV2d0.build().create(false));
+        final GraphSONMessageSerializerV2d0 graphSONMessageSerializerV2d0 = new GraphSONMessageSerializerV2d0(builder.create());
 
         try {
             convert("hello", graphSONMessageSerializerV2d0);
@@ -583,9 +576,6 @@
             assertTrue(e.getCause() instanceof JsonMappingException);
             assertTrue(e.getCause().getCause() instanceof IllegalArgumentException);
         }
-
-        // Put logger level back to its original value
-        logger.setLevel(previousLevel);
     }
 
     private ResponseMessage convert(final Object toSerialize, MessageSerializer<?> serializer) throws SerializationException {
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
index 29de3c3..dce52c7 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
@@ -21,8 +21,6 @@
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.buffer.UnpooledByteBufAllocator;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
 import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
@@ -360,14 +358,8 @@
 
     @Test
     public void shouldFailOnMessageSerializerWithMapperIfNoGremlinServerModule() {
-        Logger logger = Logger.getLogger(AbstractGraphSONMessageSerializerV2d0.class);
-        Level previousLevel = logger.getLevel();
-
-        // Disable temporarily logging for this test
-        logger.setLevel(Level.OFF);
-
-        GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV3d0.build().create(false));
-        GraphSONMessageSerializerV3d0 graphSONMessageSerializerV3d0 = new GraphSONMessageSerializerV3d0(builder.create());
+        final GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV3d0.build().create(false));
+        final GraphSONMessageSerializerV3d0 graphSONMessageSerializerV3d0 = new GraphSONMessageSerializerV3d0(builder.create());
 
         try {
             convert("hello", graphSONMessageSerializerV3d0);
@@ -377,9 +369,6 @@
             assertTrue(e.getCause() instanceof JsonMappingException);
             assertTrue(e.getCause().getCause() instanceof IllegalArgumentException);
         }
-
-        // Put logger level back to its original value
-        logger.setLevel(previousLevel);
     }
 
     private void assertCommon(final ResponseMessage response) {
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppender.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppender.java
deleted file mode 100644
index 89321ed..0000000
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppender.java
+++ /dev/null
@@ -1,86 +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;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Level;
-import org.apache.log4j.PatternLayout;
-import org.apache.log4j.spi.LoggingEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * Provides a way to gather logging events for purpose of testing log output.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class Log4jRecordingAppender extends AppenderSkeleton {
-    private final List<String> messages = new ArrayList<>();
-    private final List<LoggingEvent> events = new ArrayList<>();
-
-    public Log4jRecordingAppender() {
-        super();
-        setLayout(new PatternLayout("%p - %m%n")); // note the EOLN char(s) appended
-    }
-
-    @Override
-    protected void append(final LoggingEvent event) {
-        messages.add(layout.format(event));
-        events.add(event);
-    }
-
-    @Override
-    public void close() {
-    }
-
-    @Override
-    public boolean requiresLayout() {
-        return true;
-    }
-
-    public List<String> getMessages() { return messages; }
-
-    public List<LoggingEvent> getEvents() { return events; }
-
-    public void clear() {
-        messages.clear();
-    }
-
-    /**
-     * @param regex not null
-     * @return true if there is a substring of a message matching the regular expression, where:
-     *         . matches also the EOLN char(s) defined in the layout.
-     *         $ matches the end of the string
-     */
-    public boolean logContainsAny(final String regex) {
-        Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
-        return messages.stream().anyMatch(m -> pattern.matcher( m ).find());
-    }
-
-    public boolean logContainsAny(final String loggerName, final Level level, final String fragment) {
-        return events.stream().anyMatch(m -> m.getLoggerName().equals(loggerName) &&
-                m.getLevel().equals(level) && m.getMessage().toString().contains(fragment));
-    }
-    public boolean logMatchesAny(final String loggerName, final Level level, final String regex) {
-        return events.stream().anyMatch(m -> m.getLoggerName().equals(loggerName) &&
-                m.getLevel().equals(level) && m.getMessage().toString().matches(regex));
-    }
-}
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppenderTest.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppenderTest.java
deleted file mode 100644
index 05cb437..0000000
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppenderTest.java
+++ /dev/null
@@ -1,86 +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;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.LoggerFactory;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class Log4jRecordingAppenderTest {
-    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Log4jRecordingAppenderTest.class);
-    private Log4jRecordingAppender recordingAppender = null;
-    private static final String lineSeparator = System.getProperty("line.separator");
-
-    private Level originalConfiguredLevel = null;
-
-    @Before
-    public void setupForEachTest() {
-        recordingAppender = new Log4jRecordingAppender();
-        final Logger rootLogger = Logger.getRootLogger();
-        if (null == originalConfiguredLevel) originalConfiguredLevel = rootLogger.getLevel();
-        rootLogger.addAppender(recordingAppender);
-        rootLogger.setLevel(Level.ALL);
-
-        logger.error("ERROR");
-        logger.warn("WARN");
-        logger.info("INFO");
-    }
-
-    @After
-    public void teardownForEachTest() {
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.removeAppender(recordingAppender);
-        rootLogger.setLevel(originalConfiguredLevel);
-    }
-
-    @Test
-    public void shouldRecordMessages() {
-        assertEquals(3, recordingAppender.getMessages().size());
-        assertEquals("ERROR - ERROR" + lineSeparator, recordingAppender.getMessages().get(0));
-        assertEquals("WARN - WARN"  + lineSeparator, recordingAppender.getMessages().get(1));
-        assertEquals("INFO - INFO" + lineSeparator, recordingAppender.getMessages().get(2));
-    }
-
-    @Test
-    public void shouldMatchAnyMessages() {
-        assertThat(recordingAppender.logContainsAny("ERROR.*"), is(true));
-    }
-
-    @Test
-    public void shouldMatchNoMessages() {
-        assertThat(recordingAppender.logContainsAny("this is not here"), is(false));
-    }
-
-    @Test
-    public void shouldClearMessages() {
-        assertEquals(3, recordingAppender.getMessages().size());
-        recordingAppender.clear();
-        assertEquals(0, recordingAppender.getMessages().size());
-    }
-}
diff --git a/gremlin-driver/src/test/resources/log4j-silent.properties b/gremlin-driver/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 1825bb0..0000000
--- a/gremlin-driver/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,23 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-driver/src/test/resources/log4j-test.properties b/gremlin-driver/src/test/resources/log4j-test.properties
deleted file mode 100644
index ef436fe..0000000
--- a/gremlin-driver/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,21 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-driver/src/test/resources/logback-silent.xml b/gremlin-driver/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..4c5947d
--- /dev/null
+++ b/gremlin-driver/src/test/resources/logback-silent.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-driver/src/test/resources/logback-test.xml b/gremlin-driver/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..4bbd106
--- /dev/null
+++ b/gremlin-driver/src/test/resources/logback-test.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.tinkerpop.gremlin.driver.Connection" level="DEBUG"/>
+    <logger name="org.apache.tinkerpop.gremlin.driver.ConnectionPool" level="DEBUG"/>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-groovy/pom.xml b/gremlin-groovy/pom.xml
index 2bc1fc7..b24969f 100644
--- a/gremlin-groovy/pom.xml
+++ b/gremlin-groovy/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-groovy</artifactId>
     <name>Apache TinkerPop :: Gremlin Groovy</name>
@@ -32,6 +32,12 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.tinkerpop</groupId>
+            <artifactId>gremlin-annotations</artifactId>
+            <version>${project.version}</version>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
             <groupId>org.apache.ivy</groupId>
             <artifactId>ivy</artifactId>
             <version>2.4.0</version>
@@ -104,8 +110,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -157,6 +163,17 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-failsafe-plugin</artifactId>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <compilerArgs>
+                        <arg>-parameters</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
@@ -180,6 +197,17 @@
                             <sourcepath>${pom.basedir}/src/main/java:${project.build.directory}/generated-sources/annotations:${project.build.directory}/generated-sources/groovy-stubs/main</sourcepath>
                         </configuration>
                     </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <version>3.8.1</version>
+                        <configuration>
+                            <release>8</release>
+                            <compilerArgs>
+                                <arg>-parameters</arg>
+                            </compilerArgs>
+                        </configuration>
+                    </plugin>
                 </plugins>
             </build>
         </profile>
diff --git a/gremlin-groovy/src/test/resources/log4j-silent.properties b/gremlin-groovy/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 1825bb0..0000000
--- a/gremlin-groovy/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,23 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-groovy/src/test/resources/log4j-test.properties b/gremlin-groovy/src/test/resources/log4j-test.properties
deleted file mode 100644
index ef436fe..0000000
--- a/gremlin-groovy/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,21 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-groovy/src/test/resources/logback-silent.xml b/gremlin-groovy/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..4c5947d
--- /dev/null
+++ b/gremlin-groovy/src/test/resources/logback-silent.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-groovy/src/test/resources/logback-test.xml b/gremlin-groovy/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..5d94c3b
--- /dev/null
+++ b/gremlin-groovy/src/test/resources/logback-test.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-javascript/build/generate.groovy b/gremlin-javascript/build/generate.groovy
index 09bd9e7..75e7087 100644
--- a/gremlin-javascript/build/generate.groovy
+++ b/gremlin-javascript/build/generate.groovy
@@ -24,9 +24,10 @@
 import org.apache.tinkerpop.gremlin.groovy.jsr223.ast.RepeatASTTransformationCustomizer
 import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyCustomizer
 import org.codehaus.groovy.control.customizers.CompilationCustomizer
-import org.apache.tinkerpop.gremlin.features.FeatureReader
+import org.apache.tinkerpop.gremlin.language.corpus.FeatureReader
 
 import javax.script.SimpleBindings
+import java.nio.file.Paths
 
 import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal
 
@@ -34,7 +35,7 @@
 radishGremlinFile = new File("${projectBaseDir}/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js")
 
 // assumes globally unique scenario names for keys with list of Gremlin traversals as they appear
-gremlins = FeatureReader.parse("${projectBaseDir}")
+gremlins = FeatureReader.parseGrouped(Paths.get("${projectBaseDir}", "gremlin-test", "features").toString())
 
 gremlinGroovyScriptEngine = new GremlinGroovyScriptEngine(new GroovyCustomizer() {
     public CompilationCustomizer create() {
@@ -73,7 +74,7 @@
     writer.writeLine(
                     'const graphTraversalModule = require(\'../../lib/process/graph-traversal\');\n' +
                     'const traversalModule = require(\'../../lib/process/traversal\');\n' +
-                    'const { TraversalStrategies, VertexProgramStrategy, OptionsStrategy } = require(\'../../lib/process/traversal-strategy\');\n' +
+                    'const { TraversalStrategies, VertexProgramStrategy, OptionsStrategy, SeedStrategy } = require(\'../../lib/process/traversal-strategy\');\n' +
                     'const __ = graphTraversalModule.statics;\n' +
                     'const Barrier = traversalModule.barrier\n' +
                     'const Cardinality = traversalModule.cardinality\n' +
diff --git a/gremlin-javascript/pom.xml b/gremlin-javascript/pom.xml
index c0c91a9..a2edae5 100644
--- a/gremlin-javascript/pom.xml
+++ b/gremlin-javascript/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-javascript</artifactId>
     <name>Apache TinkerPop :: Gremlin Javascript</name>
@@ -66,6 +66,11 @@
                     </dependency>
                     <dependency>
                         <groupId>org.apache.tinkerpop</groupId>
+                        <artifactId>gremlin-language</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.tinkerpop</groupId>
                         <artifactId>neo4j-gremlin</artifactId>
                         <version>${project.version}</version>
                     </dependency>
@@ -75,9 +80,9 @@
                         <version>${commons.io.version}</version>
                     </dependency>
                     <dependency>
-                        <groupId>log4j</groupId>
-                        <artifactId>log4j</artifactId>
-                        <version>${log4j.version}</version>
+                        <groupId>ch.qos.logback</groupId>
+                        <artifactId>logback-classic</artifactId>
+                        <version>${logback.version}</version>
                         <scope>runtime</scope>
                     </dependency>
                     <dependency>
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
index 7539a26..cf561ae 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
@@ -288,6 +288,16 @@
   }
 }
 
+class SeedStrategy extends TraversalStrategy {
+  /**
+   * @param {Object} [options]
+   * @param {number} [options.seed] the seed to provide to the random number generator for the traversal
+   */
+  constructor(options) {
+    super("org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy",{seed: options.seed});
+  }
+}
+
 module.exports = {
   TraversalStrategies: TraversalStrategies,
   TraversalStrategy: TraversalStrategy,
@@ -297,6 +307,7 @@
   HaltedTraverserStrategy: HaltedTraverserStrategy,
   OptionsStrategy: OptionsStrategy,
   PartitionStrategy: PartitionStrategy,
+  SeedStrategy: SeedStrategy,
   SubgraphStrategy: SubgraphStrategy,
   VertexProgramStrategy: VertexProgramStrategy,
   // finalization
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/package-lock.json b/gremlin-javascript/src/main/javascript/gremlin-javascript/package-lock.json
index 69e0b45..b5bcdda 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/package-lock.json
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "gremlin",
-  "version": "3.5.2-alpha1",
+  "version": "3.6.0-alpha1",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json b/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
index d685031..ce4a267 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
@@ -1,6 +1,6 @@
 {
   "name": "gremlin",
-  "version": "3.5.2-alpha1",
+  "version": "3.6.0-alpha1",
   "description": "JavaScript Gremlin Language Variant",
   "author": "Apache TinkerPop team",
   "keywords": [
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
index 07be9f9..7a9c8ee 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
@@ -70,7 +70,8 @@
   'g_withSideEffectXa_setX_V_both_name_aggregateXlocal_aX_capXaX': new IgnoreError(ignoreReason.setNotSupported),
   'g_V_group_byXageX': new IgnoreError(ignoreReason.nullKeysInMapNotSupportedWell),
   'g_V_shortestPath_edgesIncluded': new IgnoreError(ignoreReason.needsFurtherInvestigation),
-  'g_V_shortestPath_edgesIncluded_edgesXoutEX': new IgnoreError(ignoreReason.needsFurtherInvestigation)
+  'g_V_shortestPath_edgesIncluded_edgesXoutEX': new IgnoreError(ignoreReason.needsFurtherInvestigation),
+  'g_V_shortestpath': new IgnoreError(ignoreReason.needsFurtherInvestigation)
 };
 
 Given(/^the (.+) graph$/, function (graphName) {
@@ -80,6 +81,11 @@
   this.graphName = graphName;
   const data = this.getData();
   this.g = traversal().withRemote(data.connection);
+
+  if (this.isGraphComputer) {
+    this.g = this.g.withComputer();
+  }
+
   if (graphName === 'empty') {
     return this.cleanEmptyGraph();
   }
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
index 39f310f..0f38def 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
@@ -26,7 +26,7 @@
 
 const graphTraversalModule = require('../../lib/process/graph-traversal');
 const traversalModule = require('../../lib/process/traversal');
-const { TraversalStrategies, VertexProgramStrategy, OptionsStrategy } = require('../../lib/process/traversal-strategy');
+const { TraversalStrategies, VertexProgramStrategy, OptionsStrategy, SeedStrategy } = require('../../lib/process/traversal-strategy');
 const __ = graphTraversalModule.statics;
 const Barrier = traversalModule.barrier
 const Cardinality = traversalModule.cardinality
@@ -76,7 +76,7 @@
     g_VX2X_optionalXinXknowsXX: [function({g, vid2}) { return g.V(vid2).optional(__.in_("knows")) }], 
     g_V_hasLabelXpersonX_optionalXoutXknowsX_optionalXoutXcreatedXXX_path: [function({g}) { return g.V().hasLabel("person").optional(__.out("knows").optional(__.out("created"))).path() }], 
     g_V_optionalXout_optionalXoutXX_path: [function({g}) { return g.V().optional(__.out().optional(__.out())).path() }], 
-    g_VX1X_optionalXaddVXdogXX_label: [function({g, vid1}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, vid1}) { return g.V(vid1).optional(__.addV("dog")).label() }, function({g, vid1}) { return g.V() }], 
+    g_VX1X_optionalXaddVXdogXX_label: [function({g, vid1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, vid1}) { return g.V(vid1).optional(__.addV("dog")).label() }, function({g, vid1}) { return g.V() }], 
     g_V_repeatXoutX_timesX2X_emit_path: [function({g}) { return g.V().repeat(__.out()).times(2).emit().path() }], 
     g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name: [function({g}) { return g.V().repeat(__.out()).times(2).repeat(__.in_()).times(2).values("name") }], 
     g_V_repeatXoutE_inVX_timesX2X_path_by_name_by_label: [function({g}) { return g.V().repeat(__.outE().inV()).times(2).path().by("name").by(T.label) }], 
@@ -117,6 +117,7 @@
     g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX: [function({g}) { return g.V().has("name","marko").and().has("name","marko").and().has("name","marko") }], 
     g_V_coinX1X: [function({g}) { return g.V().coin(1.0) }], 
     g_V_coinX0X: [function({g}) { return g.V().coin(0.0) }], 
+    g_withStrategiesXSeedStrategyX_V_coinX50X: [function({g}) { return g.withStrategies(new SeedStrategy({seed:999999})).V().coin(0.5) }], 
     g_VX1X_outXcreatedX_inXcreatedX_cyclicPath: [function({g, vid1}) { return g.V(vid1).out("created").in_("created").cyclicPath() }], 
     g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path: [function({g, vid1}) { return g.V(vid1).out("created").in_("created").cyclicPath().path() }], 
     g_VX1X_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_cyclicPath_fromXaX_toXbX_path: [function({g, vid1}) { return g.V(vid1).as("a").out("created").as("b").in_("created").as("c").cyclicPath().from_("a").to("b").path() }], 
@@ -129,7 +130,7 @@
     g_V_both_both_name_dedup: [function({g}) { return g.V().both().both().values("name").dedup() }], 
     g_V_both_both_dedup: [function({g}) { return g.V().both().both().dedup() }], 
     g_V_both_both_dedup_byXlabelX: [function({g}) { return g.V().both().both().dedup().by(T.label) }], 
-    g_V_group_byXlabelX_byXbothE_weight_dedup_foldX: [function({g}) { return g.V().group().by(T.label).by(__.bothE().values("weight").dedup().fold()) }], 
+    g_V_group_byXlabelX_byXbothE_weight_dedup_foldX: [function({g}) { return g.V().group().by(T.label).by(__.bothE().values("weight").dedup().order().by(Order.asc).fold()) }], 
     g_V_asXaX_both_asXbX_dedupXa_bX_byXlabelX_selectXa_bX: [function({g}) { return g.V().as("a").both().as("b").dedup("a","b").by(T.label).select("a","b") }], 
     g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_dedupXa_bX_path: [function({g}) { return g.V().as("a").out("created").as("b").in_("created").as("c").dedup("a","b").path() }], 
     g_V_outE_asXeX_inV_asXvX_selectXeX_order_byXweight_ascX_selectXvX_valuesXnameX_dedup: [function({g}) { return g.V().outE().as("e").inV().as("v").select("e").order().by("weight",Order.asc).select("v").values("name").dedup() }], 
@@ -145,7 +146,7 @@
     g_V_drop: [function({g}) { return g.addV().as("a").addV().as("b").addE("knows").to("a") }, function({g}) { return g.V().drop() }, function({g}) { return g.V() }, function({g}) { return g.E() }], 
     g_V_outE_drop: [function({g}) { return g.addV().as("a").addV().as("b").addE("knows").to("a") }, function({g}) { return g.V().outE().drop() }, function({g}) { return g.V() }, function({g}) { return g.E() }], 
     g_V_properties_drop: [function({g}) { return g.addV().property("name","bob").addV().property("name","alice") }, function({g}) { return g.V().properties().drop() }, function({g}) { return g.V() }, function({g}) { return g.V().properties() }], 
-    g_E_propertiesXweightX_drop: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.E().properties("weight").drop() }, function({g}) { return g.E().properties() }], 
+    g_E_propertiesXweightX_drop: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.E().properties("weight").drop() }, function({g}) { return g.E().properties() }], 
     g_V_properties_propertiesXstartTimeX_drop: [function({g}) { return g.addV().property("name","bob").property(Cardinality.list,"location","ny","startTime",2014,"endTime",2016).property(Cardinality.list,"location","va","startTime",2016).addV().property("name","alice").property(Cardinality.list,"location","va","startTime",2014,"endTime",2016).property(Cardinality.list,"location","ny","startTime",2016) }, function({g}) { return g.V().properties().properties("startTime").drop() }, function({g}) { return g.V().properties().properties() }, function({g}) { return g.V().properties().properties("startTime") }], 
     g_V_filterXfalseX: [function({g, pred1}) { return g.V().filter(pred1) }], 
     g_V_filterXtrueX: [function({g, pred1}) { return g.V().filter(pred1) }], 
@@ -276,7 +277,6 @@
     g_V_valuesXnameX_order_tailX2X: [function({g}) { return g.V().values("name").order().tail(2) }], 
     g_V_valuesXnameX_order_tail: [function({g}) { return g.V().values("name").order().tail() }], 
     g_V_valuesXnameX_order_tailX7X: [function({g}) { return g.V().values("name").order().tail(7) }], 
-    g_V_repeatXbothX_timesX3X_tailX7X: [function({g}) { return g.V().repeat(__.both()).times(3).tail(7) }], 
     g_V_repeatXin_outX_timesX3X_tailX7X_count: [function({g}) { return g.V().repeat(__.in_().out()).times(3).tail(7).count() }], 
     g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocal_1X: [function({g}) { return g.V().as("a").out().as("a").out().as("a").select("a").by(__.unfold().values("name").fold()).tail(Scope.local,1) }], 
     g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocalX: [function({g}) { return g.V().as("a").out().as("a").out().as("a").select("a").by(__.unfold().values("name").fold()).tail(Scope.local) }], 
@@ -310,45 +310,53 @@
     g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX: [function({g}) { return g.V().as("a").outE("created").as("b").inV().as("c").in_("created").as("d").where("a",P.lt("b").or(P.gt("c")).and(P.neq("d"))).by("age").by("weight").by(__.in_("created").values("age").min()).select("a","c","d").by("name") }], 
     g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name: [function({g, vid1}) { return g.V(vid1).as("a").out().has("age").where(P.gt("a")).by("age").values("name") }], 
     g_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name: [function({g, vid3}) { return g.V(vid3).as("a").in_().out().as("b").where("a",P.eq("b")).by("age").values("name") }], 
-    g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX: [function({g, vid1}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, vid1}) { return g.V(vid1).as("a").out("created").addE("createdBy").to("a") }, function({g, vid1}) { return g.E() }, function({g, vid1}) { return g.V(vid1).inE() }], 
-    g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X: [function({g, vid1}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, vid1}) { return g.V(vid1).as("a").out("created").addE("createdBy").to("a").property("weight",2.0) }, function({g, vid1}) { return g.E() }, function({g, vid1}) { return g.V(vid1).bothE() }, function({g, vid1}) { return g.V(vid1).inE().has("weight",2.0) }], 
-    g_V_outE_propertyXweight_nullX: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.V().outE().property("weight",null) }, function({g}) { return g.E().properties("weight") }], 
-    g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX: [function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V().aggregate("x").as("a").select("x").unfold().addE("existsWith").to("a").property("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.E() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).bothE("existsWith").has("time","now") }], 
-    g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X: [function({g, vid1, vid2, vid4, vid6}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, vid1, vid2, vid4, vid6}) { return g.V().as("a").out("created").in_("created").where(P.neq("a")).as("b").addE("codeveloper").from_("a").to("b").property("year",2009) }, function({g, vid1, vid2, vid4, vid6}) { return g.E() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid1).bothE() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid1).inE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid1).outE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid1).bothE("codeveloper").has("year",2009) }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid2).bothE() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid4).bothE() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid4).inE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid4).outE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid4).bothE("codeveloper").has("year",2009) }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid6).bothE() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid6).inE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid6).outE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid6).bothE("codeveloper").has("year",2009) }], 
-    g_V_asXaX_inXcreatedX_addEXcreatedByX_fromXaX_propertyXyear_2009X_propertyXacl_publicX: [function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V().as("a").in_("created").addE("createdBy").from_("a").property("year",2009).property("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.E() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).bothE("createdBy").has("year",2009).has("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).bothE("createdBy").has("year",2009).has("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).bothE("createdBy").has("year",2009).has("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).bothE("createdBy").has("year",2009).has("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).bothE("createdBy").has("year",2009).has("acl","public") }], 
-    g_withSideEffectXb_bX_VXaX_addEXknowsX_toXbX_propertyXweight_0_5X: [function({g, v6, v1}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, v6, v1}) { return g.withSideEffect("b",v6).V(v1).addE("knows").to("b").property("weight",0.5) }, function({g, v6, v1}) { return g.E() }, function({g, v6, v1}) { return g.V(v1).bothE() }, function({g, v6, v1}) { return g.V(v1).inE("knows") }, function({g, v6, v1}) { return g.V(v1).outE("knows") }, function({g, v6, v1}) { return g.V(v1).bothE("knows").has("weight",0.5) }, function({g, v6, v1}) { return g.V(v6).bothE() }, function({g, v6, v1}) { return g.V(v6).inE("knows") }, function({g, v6, v1}) { return g.V(v6).outE("knows") }, function({g, v6, v1}) { return g.V(v6).bothE("knows").has("weight",0.5) }], 
+    g_V_coworker: [function({g, xx1}) { return g.V().hasLabel("person").filter(__.outE("created")).aggregate("p").as("p1").values("name").as("p1n").select("p").unfold().where(P.neq("p1")).as("p2").values("name").as("p2n").select("p2").out("created").choose(__.in_("created").where(P.eq("p1")),__.values("name"),__.constant(xx1)).group().by(__.select("p1n")).by(__.group().by(__.select("p2n")).by(__.unfold().fold().project("numCoCreated","coCreated").by(__.count(Scope.local)).by())).unfold() }], 
+    g_V_coworker_with_midV: [function({g}) { return g.V().hasLabel("person").filter(__.outE("created")).as("p1").V().hasLabel("person").where(P.neq("p1")).filter(__.outE("created")).as("p2").map(__.out("created").where(__.in_("created").as("p1")).values("name").fold()).group().by(__.select("p1").by("name")).by(__.group().by(__.select("p2").by("name")).by(__.project("numCoCreated","coCreated").by(__.count(Scope.local)).by())).unfold() }], 
+    g_V_playlist_paths: [function({g}) { return g.V().has("name","Bob_Dylan").in_("sungBy").order().by("name").as("a").repeat(__.out().order().by("name").simplePath().from_("a")).until(__.out("writtenBy").has("name","Johnny_Cash")).limit(1).as("b").repeat(__.out().order().by("name").as("c").simplePath().from_("b").to("c")).until(__.out("sungBy").has("name","Grateful_Dead")).limit(1).path().from_("a").unfold().project("song","artists").by("name").by(__.coalesce(__.out("sungBy","writtenBy").dedup().values("name").order(),__.constant("Unknown")).fold()) }], 
+    g_V_shortestpath: [function({g}) { return g.V().as("v").both().as("v").project("src","tgt","p").by(__.select(Pop.first,"v")).by(__.select(Pop.last,"v")).by(__.select(Pop.all,"v")).as("triple").group("x").by(__.select("src","tgt")).by(__.select("p").fold()).select("tgt").barrier().repeat(__.both().as("v").project("src","tgt","p").by(__.select(Pop.first,"v")).by(__.select(Pop.last,"v")).by(__.select(Pop.all,"v")).as("t").filter(__.select(Pop.all,"p").count(Scope.local).as("l").select(Pop.last,"t").select(Pop.all,"p").dedup(Scope.local).count(Scope.local).where(P.eq("l"))).select(Pop.last,"t").not(__.select(Pop.all,"p").as("p").count(Scope.local).as("l").select(Pop.all,"x").unfold().filter(__.select(Column.keys).where(P.eq("t")).by(__.select("src","tgt"))).filter(__.select(Column.values).unfold().or(__.count(Scope.local).where(P.lt("l")),__.where(P.eq("p"))))).barrier().group("x").by(__.select("src","tgt")).by(__.select(Pop.all,"p").fold()).select("tgt").barrier()).cap("x").select(Column.values).unfold().unfold().map(__.unfold().values("name").fold()) }], 
+    g_V_classic_recommendation: [function({g}) { return g.V().has("name","DARK STAR").as("a").out("followedBy").aggregate("stash").in_("followedBy").where(P.neq("a").and(P.without(["stash"]))).groupCount().unfold().project("x","y","z").by(__.select(Column.keys).values("name")).by(__.select(Column.keys).values("performances")).by(__.select(Column.values)).order().by(__.select("z"),Order.desc).by(__.select("y"),Order.asc).limit(5).aggregate(Scope.local,"m").select("x") }], 
+    g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX: [function({g, vid1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, vid1}) { return g.V(vid1).as("a").out("created").addE("createdBy").to("a") }, function({g, vid1}) { return g.E() }, function({g, vid1}) { return g.V(vid1).inE() }], 
+    g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X: [function({g, vid1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, vid1}) { return g.V(vid1).as("a").out("created").addE("createdBy").to("a").property("weight",2.0) }, function({g, vid1}) { return g.E() }, function({g, vid1}) { return g.V(vid1).bothE() }, function({g, vid1}) { return g.V(vid1).inE().has("weight",2.0) }], 
+    g_V_outE_propertyXweight_nullX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.V().outE().property("weight",null) }, function({g}) { return g.E().properties("weight") }], 
+    g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX: [function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V().aggregate("x").as("a").select("x").unfold().addE("existsWith").to("a").property("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.E() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).bothE("existsWith").has("time","now") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).inE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).outE("existsWith") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).bothE("existsWith").has("time","now") }], 
+    g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X: [function({g, vid1, vid2, vid4, vid6}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, vid1, vid2, vid4, vid6}) { return g.V().as("a").out("created").in_("created").where(P.neq("a")).as("b").addE("codeveloper").from_("a").to("b").property("year",2009) }, function({g, vid1, vid2, vid4, vid6}) { return g.E() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid1).bothE() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid1).inE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid1).outE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid1).bothE("codeveloper").has("year",2009) }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid2).bothE() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid4).bothE() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid4).inE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid4).outE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid4).bothE("codeveloper").has("year",2009) }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid6).bothE() }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid6).inE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid6).outE("codeveloper") }, function({g, vid1, vid2, vid4, vid6}) { return g.V(vid6).bothE("codeveloper").has("year",2009) }], 
+    g_V_asXaX_inXcreatedX_addEXcreatedByX_fromXaX_propertyXyear_2009X_propertyXacl_publicX: [function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V().as("a").in_("created").addE("createdBy").from_("a").property("year",2009).property("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.E() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).bothE("createdBy").has("year",2009).has("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).bothE("createdBy").has("year",2009).has("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).bothE("createdBy").has("year",2009).has("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).bothE("createdBy").has("year",2009).has("acl","public") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).bothE() }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).inE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).outE("createdBy") }, function({g, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).bothE("createdBy").has("year",2009).has("acl","public") }], 
+    g_withSideEffectXb_bX_VXaX_addEXknowsX_toXbX_propertyXweight_0_5X: [function({g, v6, v1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, v6, v1}) { return g.withSideEffect("b",v6).V(v1).addE("knows").to("b").property("weight",0.5) }, function({g, v6, v1}) { return g.E() }, function({g, v6, v1}) { return g.V(v1).bothE() }, function({g, v6, v1}) { return g.V(v1).inE("knows") }, function({g, v6, v1}) { return g.V(v1).outE("knows") }, function({g, v6, v1}) { return g.V(v1).bothE("knows").has("weight",0.5) }, function({g, v6, v1}) { return g.V(v6).bothE() }, function({g, v6, v1}) { return g.V(v6).inE("knows") }, function({g, v6, v1}) { return g.V(v6).outE("knows") }, function({g, v6, v1}) { return g.V(v6).bothE("knows").has("weight",0.5) }], 
     g_addV_asXfirstX_repeatXaddEXnextX_toXaddVX_inVX_timesX5X_addEXnextX_toXselectXfirstXX: [function({g}) { return g.addV().as("first").repeat(__.addE("next").to(__.addV()).inV()).times(5).addE("next").to(__.select("first")) }, function({g}) { return g.V() }, function({g}) { return g.E() }, function({g}) { return g.E().hasLabel("next") }, function({g}) { return g.V().limit(1).bothE() }, function({g}) { return g.V().limit(1).inE() }, function({g}) { return g.V().limit(1).outE() }], 
-    g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX: [function({g, v1}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, v1}) { return g.V().has("name","marko").as("a").outE("created").as("b").inV().addE(__.select("b").label()).to("a") }, function({g, v1}) { return g.E() }, function({g, v1}) { return g.V(v1).bothE() }, function({g, v1}) { return g.V(v1).inE("created") }, function({g, v1}) { return g.V(v1).in_("created").has("name","lop") }, function({g, v1}) { return g.V(v1).outE("created") }], 
-    g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_descX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX: [function({g, v2}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, v2}) { return g.addE(__.V().outE().label().groupCount().order(Scope.local).by(Column.values,Order.desc).select(Column.keys).unfold().limit(1)).from_(__.V().has("name","vadas")).to(__.V().has("name","lop")) }, function({g, v2}) { return g.E() }, function({g, v2}) { return g.V(v2).bothE() }, function({g, v2}) { return g.V(v2).inE("knows") }, function({g, v2}) { return g.V(v2).outE("created") }, function({g, v2}) { return g.V(v2).out("created").has("name","lop") }], 
-    g_addEXknowsX_fromXaX_toXbX_propertyXweight_0_1X: [function({g, v6, xx1, v1}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, v6, xx1, v1}) { return g.addE("knows").from_(v1).to(v6).property("weight",xx1) }, function({g, v6, xx1, v1}) { return g.E() }, function({g, v6, xx1, v1}) { return g.V(v1).outE("knows") }, function({g, v6, xx1, v1}) { return g.V(v1).out("knows").has("name","peter") }], 
-    g_VXaX_addEXknowsX_toXbX_propertyXweight_0_1X: [function({g, v6, xx1, v1}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, v6, xx1, v1}) { return g.V(v1).addE("knows").to(v6).property("weight",xx1) }, function({g, v6, xx1, v1}) { return g.E() }, function({g, v6, xx1, v1}) { return g.V(v1).outE("knows") }, function({g, v6, xx1, v1}) { return g.V(v1).out("knows").has("name","peter") }], 
-    g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX: [function({g, vid1}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, vid1}) { return g.V(vid1).as("a").addV("animal").property("age",__.select("a").by("age")).property("name","puppy") }, function({g, vid1}) { return g.V().has("animal","age",29) }], 
-    g_V_addVXanimalX_propertyXage_0X: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.V().addV("animal").property("age",0) }, function({g}) { return g.V().has("animal","age",0) }], 
-    g_addVXpersonX_propertyXname_stephenX: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.addV("person").property("name","stephen") }, function({g}) { return g.V().has("person","name","stephen") }], 
-    g_V_hasLabelXpersonX_propertyXname_nullX: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.V().hasLabel("person").property("name",null) }, function({g}) { return g.V().properties("name") }], 
-    g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenmX: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.addV("person").property(Cardinality.single,"name","stephen").property(Cardinality.single,"name","stephenm") }, function({g}) { return g.V().has("person","name","stephen") }, function({g}) { return g.V().has("person","name","stephenm") }], 
-    get_g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.addV("person").property(Cardinality.single,"name","stephen").property(Cardinality.single,"name","stephenm","since",2010) }, function({g}) { return g.V().has("person","name","stephen") }, function({g}) { return g.V().has("person","name","stephenm") }, function({g}) { return g.V().has("person","name","stephenm").properties("name").has("since",2010) }], 
-    g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.V().has("name","marko").property("friendWeight",__.outE("knows").values("weight").sum(),"acl","private") }, function({g}) { return g.V().has("person","name","marko").has("friendWeight",1.5) }, function({g}) { return g.V().has("person","name","marko").properties("friendWeight").has("acl","private") }, function({g}) { return g.V().has("person","name","marko").properties("friendWeight").count() }], 
-    g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.addV("animal").property("name","mateo").property("name","gateo").property("name","cateo").property("age",5) }, function({g}) { return g.V().hasLabel("animal").has("name","mateo").has("name","gateo").has("name","cateo").has("age",5) }], 
-    g_withSideEffectXa_markoX_addV_propertyXname_selectXaXX_name: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.withSideEffect("a","marko").addV().property("name",__.select("a")).values("name") }, function({g}) { return g.V().has("name","marko") }], 
-    g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.addV("person").property(Cardinality.single,"name","stephen").property(Cardinality.single,"name","stephenm","since",2010) }, function({g}) { return g.V().has("name","stephen") }, function({g}) { return g.V().has("name","stephenm") }, function({g}) { return g.V().has("name","stephenm").properties("name").has("since",2010) }], 
-    g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.V().addV("animal").property("name",__.values("name")).property("name","an animal").property(__.values("name"),__.label()) }, function({g}) { return g.V().hasLabel("animal").has("name","marko").has("name","an animal").has("marko","person") }, function({g}) { return g.V().hasLabel("animal").has("name","vadas").has("name","an animal").has("vadas","person") }, function({g}) { return g.V().hasLabel("animal").has("name","lop").has("name","an animal").has("lop","software") }, function({g}) { return g.V().hasLabel("animal").has("name","josh").has("name","an animal").has("josh","person") }, function({g}) { return g.V().hasLabel("animal").has("name","ripple").has("name","an animal").has("ripple","software") }, function({g}) { return g.V().hasLabel("animal").has("name","peter").has("name","an animal").has("peter","person") }], 
-    g_withSideEffectXa_testX_V_hasLabelXsoftwareX_propertyXtemp_selectXaXX_valueMapXname_tempX: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.withSideEffect("a","test").V().hasLabel("software").property("temp",__.select("a")).valueMap("name","temp") }], 
-    g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.withSideEffect("a","name").addV().property(__.select("a"),"marko").values("name") }, function({g}) { return g.V().has("name","marko") }], 
-    g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.V().as("a").has("name","marko").out("created").as("b").addV(__.select("a").label()).property("test",__.select("b").label()).valueMap().with_("~tinkerpop.valueMap.tokens") }, function({g}) { return g.V().has("person","test","software") }], 
-    g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label: [function({g}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g}) { return g.addV(__.V().has("name","marko").properties("name").key()).label() }], 
+    g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX: [function({g, v1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, v1}) { return g.V().has("name","marko").as("a").outE("created").as("b").inV().addE(__.select("b").label()).to("a") }, function({g, v1}) { return g.E() }, function({g, v1}) { return g.V(v1).bothE() }, function({g, v1}) { return g.V(v1).inE("created") }, function({g, v1}) { return g.V(v1).in_("created").has("name","lop") }, function({g, v1}) { return g.V(v1).outE("created") }], 
+    g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_descX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX: [function({g, v2}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, v2}) { return g.addE(__.V().outE().label().groupCount().order(Scope.local).by(Column.values,Order.desc).select(Column.keys).unfold().limit(1)).from_(__.V().has("name","vadas")).to(__.V().has("name","lop")) }, function({g, v2}) { return g.E() }, function({g, v2}) { return g.V(v2).bothE() }, function({g, v2}) { return g.V(v2).inE("knows") }, function({g, v2}) { return g.V(v2).outE("created") }, function({g, v2}) { return g.V(v2).out("created").has("name","lop") }], 
+    g_addEXknowsX_fromXaX_toXbX_propertyXweight_0_1X: [function({g, v6, xx1, v1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, v6, xx1, v1}) { return g.addE("knows").from_(v1).to(v6).property("weight",xx1) }, function({g, v6, xx1, v1}) { return g.E() }, function({g, v6, xx1, v1}) { return g.V(v1).outE("knows") }, function({g, v6, xx1, v1}) { return g.V(v1).out("knows").has("name","peter") }], 
+    g_VXaX_addEXknowsX_toXbX_propertyXweight_0_1X: [function({g, v6, xx1, v1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, v6, xx1, v1}) { return g.V(v1).addE("knows").to(v6).property("weight",xx1) }, function({g, v6, xx1, v1}) { return g.E() }, function({g, v6, xx1, v1}) { return g.V(v1).outE("knows") }, function({g, v6, xx1, v1}) { return g.V(v1).out("knows").has("name","peter") }], 
+    g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).addV("person").property("name","vadas").property("age",27) }, function({g}) { return g.addE("knows").property("weight",null).from_(__.V().has("name","marko")).to(__.V().has("name","vadas")) }, function({g}) { return g.E().has("knows","weight",null) }], 
+    g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX: [function({g, vid1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, vid1}) { return g.V(vid1).as("a").addV("animal").property("age",__.select("a").by("age")).property("name","puppy") }, function({g, vid1}) { return g.V().has("animal","age",29) }], 
+    g_V_addVXanimalX_propertyXage_0X: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.V().addV("animal").property("age",0) }, function({g}) { return g.V().has("animal","age",0) }], 
+    g_addVXpersonX_propertyXname_stephenX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.addV("person").property("name","stephen") }, function({g}) { return g.V().has("person","name","stephen") }], 
+    g_V_hasLabelXpersonX_propertyXname_nullX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.V().hasLabel("person").property("name",null) }, function({g}) { return g.V().properties("name") }], 
+    g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenmX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.addV("person").property(Cardinality.single,"name","stephen").property(Cardinality.single,"name","stephenm") }, function({g}) { return g.V().has("person","name","stephen") }, function({g}) { return g.V().has("person","name","stephenm") }], 
+    get_g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.addV("person").property(Cardinality.single,"name","stephen").property(Cardinality.single,"name","stephenm","since",2010) }, function({g}) { return g.V().has("person","name","stephen") }, function({g}) { return g.V().has("person","name","stephenm") }, function({g}) { return g.V().has("person","name","stephenm").properties("name").has("since",2010) }], 
+    g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.V().has("name","marko").property("friendWeight",__.outE("knows").values("weight").sum(),"acl","private") }, function({g}) { return g.V().has("person","name","marko").has("friendWeight",1.5) }, function({g}) { return g.V().has("person","name","marko").properties("friendWeight").has("acl","private") }, function({g}) { return g.V().has("person","name","marko").properties("friendWeight").count() }], 
+    g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.addV("animal").property("name","mateo").property("name","gateo").property("name","cateo").property("age",5) }, function({g}) { return g.V().hasLabel("animal").has("name","mateo").has("name","gateo").has("name","cateo").has("age",5) }], 
+    g_withSideEffectXa_markoX_addV_propertyXname_selectXaXX_name: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.withSideEffect("a","marko").addV().property("name",__.select("a")).values("name") }, function({g}) { return g.V().has("name","marko") }], 
+    g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.addV("person").property(Cardinality.single,"name","stephen").property(Cardinality.single,"name","stephenm","since",2010) }, function({g}) { return g.V().has("name","stephen") }, function({g}) { return g.V().has("name","stephenm") }, function({g}) { return g.V().has("name","stephenm").properties("name").has("since",2010) }], 
+    g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.V().addV("animal").property("name",__.values("name")).property("name","an animal").property(__.values("name"),__.label()) }, function({g}) { return g.V().hasLabel("animal").has("name","marko").has("name","an animal").has("marko","person") }, function({g}) { return g.V().hasLabel("animal").has("name","vadas").has("name","an animal").has("vadas","person") }, function({g}) { return g.V().hasLabel("animal").has("name","lop").has("name","an animal").has("lop","software") }, function({g}) { return g.V().hasLabel("animal").has("name","josh").has("name","an animal").has("josh","person") }, function({g}) { return g.V().hasLabel("animal").has("name","ripple").has("name","an animal").has("ripple","software") }, function({g}) { return g.V().hasLabel("animal").has("name","peter").has("name","an animal").has("peter","person") }], 
+    g_withSideEffectXa_testX_V_hasLabelXsoftwareX_propertyXtemp_selectXaXX_valueMapXname_tempX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.withSideEffect("a","test").V().hasLabel("software").property("temp",__.select("a")).valueMap("name","temp") }], 
+    g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.withSideEffect("a","name").addV().property(__.select("a"),"marko").values("name") }, function({g}) { return g.V().has("name","marko") }], 
+    g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.V().as("a").has("name","marko").out("created").as("b").addV(__.select("a").label()).property("test",__.select("b").label()).valueMap().with_("~tinkerpop.valueMap.tokens") }, function({g}) { return g.V().has("person","test","software") }], 
+    g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g}) { return g.addV(__.V().has("name","marko").properties("name").key()).label() }], 
     g_addVXnullX_propertyXid_nullX: [function({g}) { return g.addV(null).property(T.id,null) }, function({g}) { return g.V().hasLabel("vertex") }], 
     g_addV_propertyXlabel_personX: [function({g}) { return g.addV().property(T.label,"person") }, function({g}) { return g.V().hasLabel("person") }], 
+    g_addVXpersonX_propertyXname_joshX_propertyXage_nullX: [function({g}) { return g.addV("person").property("name","josh").property("age",null) }, function({g}) { return g.V().has("person","age",null) }], 
+    g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX: [function({g}) { return g.addV("person").property("name","marko").property("friendWeight",null,"acl",null) }, function({g}) { return g.V().has("person","name","marko").has("friendWeight",null) }, function({g}) { return g.V().has("person","name","marko").properties("friendWeight").has("acl",null) }, function({g}) { return g.V().has("person","name","marko").properties("friendWeight").count() }], 
     g_V_coalesceXoutXfooX_outXbarXX: [function({g}) { return g.V().coalesce(__.out("foo"),__.out("bar")) }], 
     g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX: [function({g, vid1}) { return g.V(vid1).coalesce(__.out("knows"),__.out("created")).values("name") }], 
     g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX: [function({g, vid1}) { return g.V(vid1).coalesce(__.out("created"),__.out("knows")).values("name") }], 
     g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX: [function({g}) { return g.V().coalesce(__.out("likes"),__.out("knows"),__.out("created")).groupCount().by("name") }], 
     g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX: [function({g}) { return g.V().coalesce(__.outE("knows"),__.outE("created")).otherV().path().by("name").by(T.label) }], 
     g_V_outXcreatedX_order_byXnameX_coalesceXname_constantXxXX: [function({g}) { return g.V().out("created").order().by("name").coalesce(__.values("name"),__.constant("x")) }], 
-    g_V_connectedComponent_hasXcomponentX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().connectedComponent().has("gremlin.connectedComponentVertexProgram.component") }], 
-    g_V_dedup_connectedComponent_hasXcomponentX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().dedup().connectedComponent().has("gremlin.connectedComponentVertexProgram.component") }], 
-    g_V_hasLabelXsoftwareX_connectedComponent_project_byXnameX_byXcomponentX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().hasLabel("software").connectedComponent().project("name","component").by("name").by("gremlin.connectedComponentVertexProgram.component") }], 
-    g_V_connectedComponent_withXEDGES_bothEXknowsXX_withXPROPERTY_NAME_clusterX_project_byXnameX_byXclusterX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().hasLabel("person").connectedComponent().with_("~tinkerpop.connectedComponent.edges",__.bothE("knows")).with_("~tinkerpop.connectedComponent.propertyName","cluster").project("name","cluster").by("name").by("cluster") }], 
+    g_V_connectedComponent_hasXcomponentX: [function({g}) { return g.V().connectedComponent().has("gremlin.connectedComponentVertexProgram.component") }], 
+    g_V_dedup_connectedComponent_hasXcomponentX: [function({g}) { return g.V().dedup().connectedComponent().has("gremlin.connectedComponentVertexProgram.component") }], 
+    g_V_hasLabelXsoftwareX_connectedComponent_project_byXnameX_byXcomponentX: [function({g}) { return g.V().hasLabel("software").connectedComponent().project("name","component").by("name").by("gremlin.connectedComponentVertexProgram.component") }], 
+    g_V_connectedComponent_withXEDGES_bothEXknowsXX_withXPROPERTY_NAME_clusterX_project_byXnameX_byXclusterX: [function({g}) { return g.V().hasLabel("person").connectedComponent().with_("~tinkerpop.connectedComponent.edges",__.bothE("knows")).with_("~tinkerpop.connectedComponent.propertyName","cluster").project("name","cluster").by("name").by("cluster") }], 
     g_V_constantX123X: [function({g}) { return g.V().constant(123) }], 
     g_V_constantXnullX: [function({g}) { return g.V().constant(null) }], 
     g_V_chooseXhasLabelXpersonX_valuesXnameX_constantXinhumanXX: [function({g}) { return g.V().choose(__.hasLabel("person"),__.values("name"),__.constant("inhuman")) }], 
@@ -372,7 +380,7 @@
     g_VX1X_V_valuesXnameX: [function({g, vid1}) { return g.V(vid1).V().values("name") }], 
     g_V_outXknowsX_V_name: [function({g}) { return g.V().out("knows").V().values("name") }], 
     g_V_hasXname_GarciaX_inXsungByX_asXsongX_V_hasXname_Willie_DixonX_inXwrittenByX_whereXeqXsongXX_name: [function({g}) { return g.V().has("artist","name","Garcia").in_("sungBy").as("song").V().has("artist","name","Willie_Dixon").in_("writtenBy").where(P.eq("song")).values("name") }], 
-    g_V_hasLabelXpersonX_asXpX_VXsoftwareX_addInEXuses_pX: [function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.addV("person").property(T.id,1).property("name","marko").property("age",29).as("marko").addV("person").property(T.id,2).property("name","vadas").property("age",27).as("vadas").addV("software").property(T.id,3).property("name","lop").property("lang","java").as("lop").addV("person").property(T.id,4).property("name","josh").property("age",32).as("josh").addV("software").property(T.id,5).property("name","ripple").property("lang","java").as("ripple").addV("person").property(T.id,6).property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property(T.id,7).property("weight",0.5).addE("knows").from_("marko").to("josh").property(T.id,8).property("weight",1.0).addE("created").from_("marko").to("lop").property(T.id,9).property("weight",0.4).addE("created").from_("josh").to("ripple").property(T.id,10).property("weight",1.0).addE("created").from_("josh").to("lop").property(T.id,11).property("weight",0.4).addE("created").from_("peter").to("lop").property(T.id,12).property("weight",0.2) }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V().hasLabel("person").as("p").V(xx1).addE("uses").from_("p") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.E().hasLabel("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).outE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).outE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).inE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).outE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).inE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).outE("uses") }], 
+    g_V_hasLabelXpersonX_asXpX_VXsoftwareX_addInEXuses_pX: [function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V().hasLabel("person").as("p").V(xx1).addE("uses").from_("p") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.E().hasLabel("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid1).outE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid2).outE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid3).inE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid4).outE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid5).inE("uses") }, function({g, xx1, vid1, vid2, vid3, vid4, vid5, vid6}) { return g.V(vid6).outE("uses") }], 
     g_V_hasLabelXsoftwareX_index_unfold: [function({g}) { return g.V().hasLabel("software").index().unfold() }], 
     g_V_hasLabelXsoftwareX_order_byXnameX_index_withXmapX: [function({g}) { return g.V().hasLabel("software").order().by("name").index().with_("~tinkerpop.index.indexer",1) }], 
     g_V_hasLabelXsoftwareX_name_fold_orderXlocalX_index_unfold_order_byXtailXlocal_1XX: [function({g}) { return g.V().hasLabel("software").values("name").fold().order(Scope.local).index().unfold().order().by(__.tail(Scope.local,1)) }], 
@@ -478,7 +486,7 @@
     g_V_properties_order_byXkey_descX_key: [function({g}) { return g.V().properties().order().by(T.key,Order.desc).key() }], 
     g_V_hasLabelXpersonX_order_byXvalueXageX_descX_name: [function({g, l1}) { return g.V().hasLabel("person").order().by(l1,Order.desc).values("name") }], 
     g_V_hasLabelXpersonX_group_byXnameX_byXoutE_weight_sumX_orderXlocalX_byXvaluesX: [function({g}) { return g.V().hasLabel("person").group().by("name").by(__.outE().values("weight").sum()).order(Scope.local).by(Column.values) }], 
-    g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX: [function({g}) { return g.V().map(__.bothE().values("weight").fold()).order().by(__.sum(Scope.local),Order.desc) }], 
+    g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX: [function({g}) { return g.V().map(__.bothE().values("weight").order().by(Order.asc).fold()).order().by(__.sum(Scope.local),Order.desc) }], 
     g_V_group_byXlabelX_byXname_order_byXdescX_foldX: [function({g}) { return g.V().group().by(T.label).by(__.values("name").order().by(Order.desc).fold()) }], 
     g_V_hasLabelXpersonX_group_byXnameX_byXoutE_weight_sumX_unfold_order_byXvalues_descX: [function({g}) { return g.V().hasLabel("person").group().by("name").by(__.outE().values("weight").sum()).unfold().order().by(Column.values,Order.desc) }], 
     g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_descX: [function({g}) { return g.V().as("v").map(__.bothE().values("weight").fold()).sum(Scope.local).as("s").select("v","s").order().by(__.select("s"),Order.desc) }], 
@@ -489,15 +497,15 @@
     g_V_orXhasLabelXpersonX_hasXsoftware_name_lopXX_order_byXageX: [function({g}) { return g.V().or(__.hasLabel("person"),__.has("software","name","lop")).order().by("age") }], 
     g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalues_descX_byXkeys_ascX: [function({g, l1, v1}) { return g.V(v1).hasLabel("person").map(l1).order(Scope.local).by(Column.values,Order.desc).by(Column.keys,Order.asc) }], 
     g_VX1X_elementMap_orderXlocalX_byXkeys_descXunfold: [function({g, vid1}) { return g.V(vid1).elementMap().order(Scope.local).by(Column.keys,Order.desc).unfold() }], 
-    g_V_pageRank_hasXpageRankX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().pageRank().has("gremlin.pageRankVertexProgram.pageRank") }, function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().pageRank().has("gremlin.pageRankVertexProgram.pageRank") }], 
-    g_V_outXcreatedX_pageRank_withXedges_bothEX_withXpropertyName_projectRankX_withXtimes_0X_valueMapXname_projectRankX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().out("created").pageRank().with_("~tinkerpop.pageRank.edges",__.bothE()).with_("~tinkerpop.pageRank.propertyName","projectRank").with_("~tinkerpop.pageRank.times",0).valueMap("name","projectRank") }], 
-    g_V_pageRank_order_byXpageRank_descX_byXnameX_name: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank",Order.desc).by("name").values("name") }], 
-    g_V_pageRank_order_byXpageRank_descX_name_limitX2X: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank",Order.desc).values("name").limit(2) }], 
-    g_V_pageRank_withXedges_outEXknowsXX_withXpropertyName_friendRankX_project_byXnameX_byXvaluesXfriendRankX_mathX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().pageRank().with_("~tinkerpop.pageRank.edges",__.outE("knows")).with_("~tinkerpop.pageRank.propertyName","friendRank").project("name","friendRank").by("name").by(__.values("friendRank").math("ceil(_ * 100)")) }], 
-    g_V_hasLabelXpersonX_pageRank_withXpropertyName_kpageRankX_project_byXnameX_byXvaluesXpageRankX_mathX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().hasLabel("person").pageRank().with_("~tinkerpop.pageRank.propertyName","pageRank").project("name","pageRank").by("name").by(__.values("pageRank").math("ceil(_ * 100)")) }], 
-    g_V_pageRank_withXpropertyName_pageRankX_asXaX_outXknowsX_pageRank_asXbX_selectXa_bX_by_byXmathX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().pageRank().with_("~tinkerpop.pageRank.propertyName","pageRank").as("a").out("knows").values("pageRank").as("b").select("a","b").by().by(__.math("ceil(_ * 100)")) }], 
-    g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_withXedges_inEXcreatedX_withXtimes_1X_withXpropertyName_priorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().hasLabel("software").has("name","ripple").pageRank(1.0).with_("~tinkerpop.pageRank.edges",__.inE("created")).with_("~tinkerpop.pageRank.times",1).with_("~tinkerpop.pageRank.propertyName","priors").in_("created").union(__.both(),__.identity()).valueMap("name","priors") }], 
-    g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXpropertyName_pageRankX_withXedges_inEX_withXtimes_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().out("created").group("m").by(T.label).pageRank(1.0).with_("~tinkerpop.pageRank.propertyName","pageRank").with_("~tinkerpop.pageRank.edges",__.inE()).with_("~tinkerpop.pageRank.times",1).in_("created").group("m").by("pageRank").cap("m") }], 
+    g_V_pageRank_hasXpageRankX: [function({g}) { return g.V().pageRank().has("gremlin.pageRankVertexProgram.pageRank") }], 
+    g_V_outXcreatedX_pageRank_withXedges_bothEX_withXpropertyName_projectRankX_withXtimes_0X_valueMapXname_projectRankX: [function({g}) { return g.V().out("created").pageRank().with_("~tinkerpop.pageRank.edges",__.bothE()).with_("~tinkerpop.pageRank.propertyName","projectRank").with_("~tinkerpop.pageRank.times",0).valueMap("name","projectRank") }], 
+    g_V_pageRank_order_byXpageRank_descX_byXnameX_name: [function({g}) { return g.V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank",Order.desc).by("name").values("name") }], 
+    g_V_pageRank_order_byXpageRank_descX_name_limitX2X: [function({g}) { return g.V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank",Order.desc).values("name").limit(2) }], 
+    g_V_pageRank_withXedges_outEXknowsXX_withXpropertyName_friendRankX_project_byXnameX_byXvaluesXfriendRankX_mathX: [function({g}) { return g.V().pageRank().with_("~tinkerpop.pageRank.edges",__.outE("knows")).with_("~tinkerpop.pageRank.propertyName","friendRank").project("name","friendRank").by("name").by(__.values("friendRank").math("ceil(_ * 100)")) }], 
+    g_V_hasLabelXpersonX_pageRank_withXpropertyName_kpageRankX_project_byXnameX_byXvaluesXpageRankX_mathX: [function({g}) { return g.V().hasLabel("person").pageRank().with_("~tinkerpop.pageRank.propertyName","pageRank").project("name","pageRank").by("name").by(__.values("pageRank").math("ceil(_ * 100)")) }], 
+    g_V_pageRank_withXpropertyName_pageRankX_asXaX_outXknowsX_pageRank_asXbX_selectXa_bX_by_byXmathX: [function({g}) { return g.V().pageRank().with_("~tinkerpop.pageRank.propertyName","pageRank").as("a").out("knows").values("pageRank").as("b").select("a","b").by().by(__.math("ceil(_ * 100)")) }], 
+    g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_withXedges_inEXcreatedX_withXtimes_1X_withXpropertyName_priorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX: [function({g}) { return g.V().hasLabel("software").has("name","ripple").pageRank(1.0).with_("~tinkerpop.pageRank.edges",__.inE("created")).with_("~tinkerpop.pageRank.times",1).with_("~tinkerpop.pageRank.propertyName","priors").in_("created").union(__.both(),__.identity()).valueMap("name","priors") }], 
+    g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXpropertyName_pageRankX_withXedges_inEX_withXtimes_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX: [function({g}) { return g.V().out("created").group("m").by(T.label).pageRank(1.0).with_("~tinkerpop.pageRank.propertyName","pageRank").with_("~tinkerpop.pageRank.edges",__.inE()).with_("~tinkerpop.pageRank.times",1).in_("created").group("m").by("pageRank").cap("m") }], 
     g_VX1X_name_path: [function({g, vid1}) { return g.V(vid1).values("name").path() }], 
     g_VX1X_out_path_byXageX_byXnameX: [function({g, vid1}) { return g.V(vid1).out().path().by("age").by("name") }], 
     g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX: [function({g}) { return g.V().repeat(__.out()).times(2).path().by().by("name").by("lang") }], 
@@ -508,9 +516,9 @@
     g_VX1X_out_path_byXageX: [function({g, vid1}) { return g.V(vid1).out().path().by("age") }], 
     g_injectX1_null_nullX_path: [function({g}) { return g.inject(1,null,null).path() }], 
     g_injectX1_null_nullX_path_dedup: [function({g}) { return g.inject(1,null,null).path().dedup() }], 
-    g_V_peerPressure_hasXclusterX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().peerPressure().has("gremlin.peerPressureVertexProgram.cluster") }, function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().peerPressure().has("gremlin.peerPressureVertexProgram.cluster") }], 
-    g_V_peerPressure_withXpropertyName_clusterX_withXedges_outEXknowsXX_pageRankX1X_byXrankX_withXedges_outEXknowsX_withXtimes_2X_group_byXclusterX_byXrank_sumX_limitX100X: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().peerPressure().with_("~tinkerpop.peerPressure.propertyName","cluster").with_("~tinkerpop.peerPressure.edges",__.outE("knows")).pageRank(1.0).with_("~tinkerpop.pageRank.propertyName","rank").with_("~tinkerpop.pageRank.edges",__.outE("knows")).with_("~tinkerpop.pageRank.times",1).group().by("cluster").by(__.values("rank").sum()).limit(100) }], 
-    g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXedges_outEX_withyXpropertyName_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().has("name","ripple").in_("created").peerPressure().with_("~tinkerpop.peerPressure.edges",__.outE()).with_("~tinkerpop.peerPressure.propertyName","cluster").repeat(__.union(__.identity(),__.both())).times(2).dedup().valueMap("name","cluster") }], 
+    g_V_peerPressure_hasXclusterX: [function({g}) { return g.V().peerPressure().has("gremlin.peerPressureVertexProgram.cluster") }], 
+    g_V_peerPressure_withXpropertyName_clusterX_withXedges_outEXknowsXX_pageRankX1X_byXrankX_withXedges_outEXknowsX_withXtimes_2X_group_byXclusterX_byXrank_sumX_limitX100X: [function({g}) { return g.V().peerPressure().with_("~tinkerpop.peerPressure.propertyName","cluster").with_("~tinkerpop.peerPressure.edges",__.outE("knows")).pageRank(1.0).with_("~tinkerpop.pageRank.propertyName","rank").with_("~tinkerpop.pageRank.edges",__.outE("knows")).with_("~tinkerpop.pageRank.times",1).group().by("cluster").by(__.values("rank").sum()).limit(100) }], 
+    g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXedges_outEX_withyXpropertyName_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX: [function({g}) { return g.V().has("name","ripple").in_("created").peerPressure().with_("~tinkerpop.peerPressure.edges",__.outE()).with_("~tinkerpop.peerPressure.propertyName","cluster").repeat(__.union(__.identity(),__.both())).times(2).dedup().valueMap("name","cluster") }], 
     g_V_hasLabelXpersonX_projectXa_bX_byXoutE_countX_byXageX: [function({g}) { return g.V().hasLabel("person").project("a","b").by(__.outE().count()).by("age") }], 
     g_V_outXcreatedX_projectXa_bX_byXnameX_byXinXcreatedX_countX_order_byXselectXbX__descX_selectXaX: [function({g}) { return g.V().out("created").project("a","b").by("name").by(__.in_("created").count()).order().by(__.select("b"),Order.desc).select("a") }], 
     g_V_valueMap_projectXxX_byXselectXnameXX: [function({g}) { return g.V().valueMap().project("x").by(__.select("name")) }], 
@@ -584,21 +592,21 @@
     g_EX11X_propertiesXweightX_asXaX_selectXaX_byXvalueX: [function({g, eid11}) { return g.E(eid11).properties("weight").as("a").select("a").by(T.value) }], 
     g_V_asXaX_selectXaX_byXageX: [function({g}) { return g.V().as("a").select("a").by("age") }], 
     g_withSideEffectXk_nullX_injectXxX_selectXkX: [function({g}) { return g.withSideEffect("k",null).inject("x").select("k") }], 
-    g_V_shortestPath: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().identity().shortestPath() }], 
-    g_V_both_dedup_shortestPath: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().both().dedup().shortestPath() }], 
-    g_V_shortestPath_edgesIncluded: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().identity().shortestPath().with_("~tinkerpop.shortestPath.includeEdges") }], 
-    g_V_shortestPath_directionXINX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().identity().shortestPath().with_("~tinkerpop.shortestPath.edges",Direction.IN) }], 
-    g_V_shortestPath_edgesXoutEX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().identity().shortestPath().with_("~tinkerpop.shortestPath.edges",__.outE()) }], 
-    g_V_shortestPath_edgesIncluded_edgesXoutEX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().identity().shortestPath().with_("~tinkerpop.shortestPath.includeEdges").with_("~tinkerpop.shortestPath.edges",__.outE()) }], 
-    g_V_hasXname_markoX_shortestPath: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().has("name","marko").shortestPath() }], 
-    g_V_shortestPath_targetXhasXname_markoXX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().identity().shortestPath().with_("~tinkerpop.shortestPath.target",__.has("name","marko")) }], 
-    g_V_shortestPath_targetXvaluesXnameX_isXmarkoXX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().identity().shortestPath().with_("~tinkerpop.shortestPath.target",__.values("name").is("marko")) }], 
-    g_V_hasXname_markoX_shortestPath_targetXhasLabelXsoftwareXX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().has("name","marko").shortestPath().with_("~tinkerpop.shortestPath.target",__.hasLabel("software")) }], 
-    g_V_hasXname_markoX_shortestPath_targetXhasXname_joshXX_distanceXweightX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().has("name","marko").shortestPath().with_("~tinkerpop.shortestPath.target",__.has("name","josh")).with_("~tinkerpop.shortestPath.distance","weight") }], 
-    g_V_hasXname_danielX_shortestPath_targetXhasXname_stephenXX_edgesXbothEXusesXX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().has("name","daniel").shortestPath().with_("~tinkerpop.shortestPath.target",__.has("name","stephen")).with_("~tinkerpop.shortestPath.edges",__.bothE("uses")) }], 
-    g_V_hasXsong_name_MIGHT_AS_WELLX_shortestPath_targetXhasXsong_name_MAYBE_YOU_KNOW_HOW_I_FEELXX_edgesXoutEXfollowedByXX_distanceXweightX: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().has("song","name","MIGHT AS WELL").shortestPath().with_("~tinkerpop.shortestPath.target",__.has("song","name","MAYBE YOU KNOW HOW I FEEL")).with_("~tinkerpop.shortestPath.edges",__.outE("followedBy")).with_("~tinkerpop.shortestPath.distance","weight") }], 
-    g_V_hasXname_markoX_shortestPath_maxDistanceX1X: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().has("name","marko").shortestPath().with_("~tinkerpop.shortestPath.maxDistance",1) }], 
-    g_V_hasXname_vadasX_shortestPath_distanceXweightX_maxDistanceX1_3X: [function({g}) { return g.withStrategies(new VertexProgramStrategy({graphComputer:"org.apache.tinkerpop.gremlin.process.computer.GraphComputer"})).V().has("name","vadas").shortestPath().with_("~tinkerpop.shortestPath.distance","weight").with_("~tinkerpop.shortestPath.maxDistance",1.3) }], 
+    g_V_shortestPath: [function({g}) { return g.V().identity().shortestPath() }], 
+    g_V_both_dedup_shortestPath: [function({g}) { return g.V().both().dedup().shortestPath() }], 
+    g_V_shortestPath_edgesIncluded: [function({g}) { return g.V().identity().shortestPath().with_("~tinkerpop.shortestPath.includeEdges") }], 
+    g_V_shortestPath_directionXINX: [function({g}) { return g.V().identity().shortestPath().with_("~tinkerpop.shortestPath.edges",Direction.IN) }], 
+    g_V_shortestPath_edgesXoutEX: [function({g}) { return g.V().identity().shortestPath().with_("~tinkerpop.shortestPath.edges",__.outE()) }], 
+    g_V_shortestPath_edgesIncluded_edgesXoutEX: [function({g}) { return g.V().identity().shortestPath().with_("~tinkerpop.shortestPath.includeEdges").with_("~tinkerpop.shortestPath.edges",__.outE()) }], 
+    g_V_hasXname_markoX_shortestPath: [function({g}) { return g.V().has("name","marko").shortestPath() }], 
+    g_V_shortestPath_targetXhasXname_markoXX: [function({g}) { return g.V().identity().shortestPath().with_("~tinkerpop.shortestPath.target",__.has("name","marko")) }], 
+    g_V_shortestPath_targetXvaluesXnameX_isXmarkoXX: [function({g}) { return g.V().identity().shortestPath().with_("~tinkerpop.shortestPath.target",__.values("name").is("marko")) }], 
+    g_V_hasXname_markoX_shortestPath_targetXhasLabelXsoftwareXX: [function({g}) { return g.V().has("name","marko").shortestPath().with_("~tinkerpop.shortestPath.target",__.hasLabel("software")) }], 
+    g_V_hasXname_markoX_shortestPath_targetXhasXname_joshXX_distanceXweightX: [function({g}) { return g.V().has("name","marko").shortestPath().with_("~tinkerpop.shortestPath.target",__.has("name","josh")).with_("~tinkerpop.shortestPath.distance","weight") }], 
+    g_V_hasXname_danielX_shortestPath_targetXhasXname_stephenXX_edgesXbothEXusesXX: [function({g}) { return g.V().has("name","daniel").shortestPath().with_("~tinkerpop.shortestPath.target",__.has("name","stephen")).with_("~tinkerpop.shortestPath.edges",__.bothE("uses")) }], 
+    g_V_hasXsong_name_MIGHT_AS_WELLX_shortestPath_targetXhasXsong_name_MAYBE_YOU_KNOW_HOW_I_FEELXX_edgesXoutEXfollowedByXX_distanceXweightX: [function({g}) { return g.V().has("song","name","MIGHT AS WELL").shortestPath().with_("~tinkerpop.shortestPath.target",__.has("song","name","MAYBE YOU KNOW HOW I FEEL")).with_("~tinkerpop.shortestPath.edges",__.outE("followedBy")).with_("~tinkerpop.shortestPath.distance","weight") }], 
+    g_V_hasXname_markoX_shortestPath_maxDistanceX1X: [function({g}) { return g.V().has("name","marko").shortestPath().with_("~tinkerpop.shortestPath.maxDistance",1) }], 
+    g_V_hasXname_vadasX_shortestPath_distanceXweightX_maxDistanceX1_3X: [function({g}) { return g.V().has("name","vadas").shortestPath().with_("~tinkerpop.shortestPath.distance","weight").with_("~tinkerpop.shortestPath.maxDistance",1.3) }], 
     g_V_age_sum: [function({g}) { return g.V().values("age").sum() }], 
     g_V_foo_sum: [function({g}) { return g.V().values("foo").sum() }], 
     g_V_age_fold_sumXlocalX: [function({g}) { return g.V().values("age").fold().sum(Scope.local) }], 
@@ -662,7 +670,7 @@
     g_VX1X_out_out_out: [function({g, vid1}) { return g.V(vid1).out().out().out() }], 
     g_VX1X_out_name: [function({g, vid1}) { return g.V(vid1).out().values("name") }], 
     g_VX1X_to_XOUT_knowsX: [function({g, vid1}) { return g.V(vid1).to(Direction.OUT,"knows") }], 
-    g_VX1_2_3_4X_name: [function({g, vid4, vid3, vid2, vid1}) { return g.V(vid1,vid2,vid3,vid4).values("name") }], 
+    g_VX1_2_3_4X_name: [function({g, vid4, vid3, vid2, vid1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("peter").addE("knows").from_("marko").to("vadas").property("weight",0.5).addE("knows").from_("marko").to("josh").property("weight",1.0).addE("created").from_("marko").to("lop").property("weight",0.4).addE("created").from_("josh").to("ripple").property("weight",1.0).addE("created").from_("josh").to("lop").property("weight",0.4).addE("created").from_("peter").to("lop").property("weight",0.2) }, function({g, vid4, vid3, vid2, vid1}) { return g.V().has("software","name","lop").drop() }, function({g, vid4, vid3, vid2, vid1}) { return g.V(vid1,vid2,vid3,vid4) }], 
     g_V_hasLabelXpersonX_V_hasLabelXsoftwareX_name: [function({g}) { return g.V().hasLabel("person").V().hasLabel("software").values("name") }], 
     g_V_hasLabelXloopsX_bothEXselfX: [function({g}) { return g.V().hasLabel("loops").bothE("self") }], 
     g_V_hasLabelXloopsX_bothXselfX: [function({g}) { return g.V().hasLabel("loops").both("self") }], 
@@ -682,7 +690,7 @@
     g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX: [function({g}) { return g.V().has("lang").group("a").by("lang").by("name").out().cap("a") }], 
     g_V_hasXlangX_group_byXlangX_byXcountX: [function({g}) { return g.V().has("lang").group().by("lang").by(__.count()) }], 
     g_V_repeatXout_groupXaX_byXnameX_byXcountX_timesX2X_capXaX: [function({g}) { return g.V().repeat(__.out().group("a").by("name").by(__.count())).times(2).cap("a") }], 
-    g_V_group_byXoutE_countX_byXnameX: [function({g}) { return g.V().group().by(__.outE().count()).by("name") }], 
+    g_V_group_byXoutE_countX_byXnameX: [function({g}) { return g.V().order().by("name").group().by(__.outE().count()).by("name") }], 
     g_V_groupXaX_byXlabelX_byXoutE_weight_sumX_capXaX: [function({g}) { return g.V().group("a").by(T.label).by(__.outE().values("weight").sum()).cap("a") }], 
     g_V_repeatXbothXfollowedByXX_timesX2X_group_byXsongTypeX_byXcountX: [function({g}) { return g.V().repeat(__.both("followedBy")).times(2).group().by("songType").by(__.count()) }], 
     g_V_repeatXbothXfollowedByXX_timesX2X_groupXaX_byXsongTypeX_byXcountX_capXaX: [function({g}) { return g.V().repeat(__.both("followedBy")).times(2).group("a").by("songType").by(__.count()).cap("a") }], 
@@ -694,7 +702,7 @@
     g_V_outXfollowedByX_group_byXsongTypeX_byXbothE_group_byXlabelX_byXweight_sumXX: [function({g}) { return g.V().out("followedBy").group().by("songType").by(__.bothE().group().by(T.label).by(__.values("weight").sum())) }], 
     g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX: [function({g}) { return g.V().group("m").by("name").by(__.in_("knows").values("name")).cap("m") }], 
     g_V_group_byXlabelX_byXbothE_groupXaX_byXlabelX_byXweight_sumX_weight_sumX: [function({g}) { return g.V().group().by(T.label).by(__.bothE().group("a").by(T.label).by(__.values("weight").sum()).values("weight").sum()) }], 
-    g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX: [function({g, xx1}) { return g.withSideEffect("a",xx1).V().group("a").by("name").by(__.outE().label().fold()).cap("a") }], 
+    g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX: [function({g, xx1}) { return g.withSideEffect("a",xx1).V().group("a").by("name").by(__.outE().label().fold()).cap("a").unfold().group().by(Column.keys).by(__.select(Column.values).order(Scope.local).by(Order.asc)) }], 
     g_V_hasLabelXpersonX_asXpX_outXcreatedX_group_byXnameX_byXselectXpX_valuesXageX_sumX: [function({g}) { return g.V().hasLabel("person").as("p").out("created").group().by("name").by(__.select("p").values("age").sum()) }], 
     g_V_hasLabelXpersonX_asXpX_outXcreatedX_groupXaX_byXnameX_byXselectXpX_valuesXageX_sumX_capXaX: [function({g}) { return g.V().hasLabel("person").as("p").out("created").group("a").by("name").by(__.select("p").values("age").sum()).cap("a") }], 
     g_V_group_byXlabelX_byXlabel_countX: [function({g}) { return g.V().group().by(__.label()).by(__.label().count()) }], 
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
index b9211c0..9ea5e37 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
@@ -38,6 +38,7 @@
   this.cache = null;
   this.graphName = null;
   this.parameters = {};
+  this.isGraphComputer = false;
 }
 
 TinkerPopWorld.prototype.getData = function () {
@@ -95,6 +96,14 @@
   this.cache = cache;
 });
 
+Before({tags: "@GraphComputerOnly"}, function() {
+  this.isGraphComputer = true;
+})
+
+Before({tags: "@AllowNullPropertyValues"}, function() {
+  return 'skipped'
+})
+
 function getVertices(connection) {
   const g = traversal().withRemote(connection);
   return g.V().group().by('name').by(__.tail()).next().then(it => it.value);
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
index bc19e8a..1bc91a3 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
@@ -29,7 +29,7 @@
 const { Vertex } = require('../../lib/structure/graph');
 const { traversal } = require('../../lib/process/anonymous-traversal');
 const { GraphTraversalSource, GraphTraversal, statics } = require('../../lib/process/graph-traversal');
-const { SubgraphStrategy, ReadOnlyStrategy,
+const { SubgraphStrategy, ReadOnlyStrategy, SeedStrategy,
         ReservedKeysVerificationStrategy, EdgeLabelVerificationStrategy } = require('../../lib/process/traversal-strategy');
 const Bytecode = require('../../lib/process/bytecode');
 const helper = require('../helper');
@@ -170,6 +170,16 @@
     });
   });
   describe("should allow TraversalStrategy definition", function() {
+    it('should allow SeedStrategy', function () {
+      const g = traversal().withRemote(connection).withStrategies(
+        new SeedStrategy({seed: 999999}));
+      g.V().count().next().then(function (item1) {
+        assert.ok(item1);
+        assert.strictEqual(item1.value, 4);
+      }, (err) => assert.fail("tanked: " + err));
+    })
+  });
+  describe("should allow TraversalStrategy definition", function() {
     it('should allow SubgraphStrategy', function() {
       const g = traversal().withRemote(connection).withStrategies(
           new SubgraphStrategy({vertices:__.hasLabel("person"), edges:__.hasLabel("created")}));
diff --git a/gremlin-language/pom.xml b/gremlin-language/pom.xml
index bb50549..a48e6ed 100644
--- a/gremlin-language/pom.xml
+++ b/gremlin-language/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>gremlin-language</artifactId>
@@ -32,6 +32,15 @@
             <artifactId>antlr4</artifactId>
             <version>${antlr4.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.javatuples</groupId>
+            <artifactId>javatuples</artifactId>
+            <version>${java.tuples.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+        </dependency>
         <!-- TESTING -->
         <dependency>
             <groupId>junit</groupId>
@@ -43,11 +52,6 @@
             <artifactId>hamcrest</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-text</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <properties>
diff --git a/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReader.java b/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReader.java
new file mode 100644
index 0000000..ba7c749
--- /dev/null
+++ b/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReader.java
@@ -0,0 +1,120 @@
+/*
+ * 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.language.corpus;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * Reads asciidoc documentation for Gremlin snippets to help build the testing corpus.
+ */
+public class DocumentationReader {
+    private static final Pattern sourceCodePattern = Pattern.compile("\\[gremlin-groovy.*\\].*");
+    private static final Pattern startGremlinPattern = Pattern.compile("^g\\..*");
+
+    /**
+     * Some Gremlin in documentation is just not going to parse.
+     */
+    private static final Set<String> throwAway = new HashSet<>(Arrays.asList("g.inject(g.withComputer().V().shortestPath().with(ShortestPath.distance, 'weight').with(ShortestPath.includeEdges, true).with(ShortestPath.maxDistance, 1).toList().toArray()).map(unfold().values('name','weight').fold())"));
+
+    public static Set<String> parse(final String documentationDir) throws IOException {
+        final Set<String> gremlins = new LinkedHashSet<>();
+        Files.find(Paths.get(documentationDir),
+                Integer.MAX_VALUE,
+                (filePath, fileAttr) -> fileAttr.isRegularFile() && (filePath.toString().endsWith("traversal.asciidoc") || filePath.toString().contains("recipes"))).
+                sorted().
+                forEach(f -> {
+                    String currentGremlin = "";
+                    int openSnippet = 0;
+
+                    try {
+                        final List<String> lines = Files.readAllLines(f, StandardCharsets.UTF_8);
+                        for (String line : lines) {
+                            // trim and remove callouts
+                            String cleanLine = line.replaceAll("<\\d>", "").trim();
+
+                            // remove line comments
+                            int pos = cleanLine.indexOf("//");
+                            if (pos > 0) cleanLine = cleanLine.substring(0, pos).trim();
+
+                            if (sourceCodePattern.matcher(cleanLine).matches() || (openSnippet > 0 && cleanLine.equals("----"))) {
+                                if (openSnippet > 1) {
+                                    openSnippet = 0;
+                                } else {
+                                    openSnippet++;
+                                }
+                            } else if (openSnippet > 0 && (startGremlinPattern.matcher(cleanLine).matches() || isTerminated(currentGremlin))) {
+                                // new line of Gremlin that starts with g.
+                                currentGremlin += cleanLine;
+
+                                // line doesn't continue if there is no period or open paren
+                                if (!isTerminated(currentGremlin)) {
+                                    final String gremlinToAdd = replaceVariables(currentGremlin.trim());
+                                    if (!throwAway.contains(gremlinToAdd))
+                                        gremlins.add(gremlinToAdd);
+                                    currentGremlin = "";
+                                }
+                            }
+                        }
+                    } catch (IOException ioe) {
+                        throw new RuntimeException(ioe);
+                    }
+                });
+
+        return gremlins;
+    }
+
+    private static boolean isTerminated(final String gremlin) {
+        return gremlin.endsWith(".") || gremlin.endsWith("(") || gremlin.endsWith(",");
+    }
+
+    /**
+     * Variables can't be parsed by the grammar so they must be replaced with something concrete.
+     */
+    private static String replaceVariables(final String gremlin) {
+        // convert lambda vars to closures as they will be ignored by the test suite
+        return gremlin.replace("relations", "\"relations\"").
+                replace("places.size()", "6").
+                replace("places", "\"places\"").
+                replace("ids", "\"ids\"").
+                replace("vRexsterJob1", "\"rj1\"").
+                replace("vBlueprintsJob1", "\"bj1\"").
+                replace("weightFilter.clone()", "{it}").
+                replace("weightFilter", "{it}").
+                replace("vBob", "\"bob\"").
+                replace("vMarko", "\"marko\"").
+                replace("vPeter", "\"peter\"").
+                replace("vStephen", "\"stephen\"").
+                replace("input.head()", "\"head\"").
+                replace("input.tail().size()", "6").
+                replace("input.tail()", "\"tail\"").
+                replace("System.out.&println", "{it}").
+                replace("persons", "\"persons\"").
+                replace("marko.value('age')", "11").
+                replace("seedStrategy", "new SeedStrategy(seed: 99999)").
+                replace(".getClass()", "").
+                replace("result.toArray()", "4").
+                replace("vA.value('amount')", "0.0").
+                replace("vA", "\"vA\"");
+    }
+}
diff --git a/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/FeatureReader.java b/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/FeatureReader.java
new file mode 100644
index 0000000..f97bc27
--- /dev/null
+++ b/gremlin-language/src/main/java/org/apache/tinkerpop/gremlin/language/corpus/FeatureReader.java
@@ -0,0 +1,160 @@
+/*
+ * 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.language.corpus;
+
+import org.apache.commons.text.StringEscapeUtils;
+import org.javatuples.Pair;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * Reads the Gherkin feature files of {@code gremlin-test} and extracts Gremlin examples.
+ */
+public class FeatureReader {
+
+    private static final Pattern generalParameterPattern = Pattern.compile("And using the parameter (.+) (defined as|of) (.*)");
+
+    /**
+     * Parses features to a {@code List} of Gremlin strings.
+     *
+     * @param featureDir The root directory where feature files can be found including subdirectories
+     */
+    public static List<String> parseFlat(final String featureDir) throws IOException {
+        return parseFlat(featureDir, Collections.emptyList());
+    }
+
+    /**
+     * Parses features to a {@code List} of Gremlin strings.
+     *
+     * @param featureDir The root directory where feature files can be found including subdirectories
+     * @param parameterMatchers list of pattern/functions that will transform a parameter from its Gherkin form to
+     *                          another format triggering that new formatted string to be inserted into the Gremlin
+     *                          itself
+     */
+    public static List<String> parseFlat(final String featureDir, final List<Pair<Pattern, BiFunction<String, String, String>>> parameterMatchers) throws IOException {
+        return parseGrouped(featureDir, parameterMatchers).values().stream().flatMap(Collection::stream).collect(Collectors.toList());
+    }
+
+    /**
+     * Parses features to a {@code Map} structure of the test name as the key with a {@code List} of Gremlin strings
+     * for the value.
+     *
+     * @param featureDir The root directory where feature files can be found including subdirectories
+     */
+    public static Map<String, List<String>> parseGrouped(final String featureDir) throws IOException {
+        return parseGrouped(featureDir, Collections.emptyList());
+    }
+
+    /**
+     * Parses features to a {@code Map} structure of the test name as the key with a {@code List} of Gremlin strings
+     * for the value.
+     *
+     * @param featureDir The root directory where feature files can be found including subdirectories
+     * @param parameterMatchers list of pattern/functions that will transform a parameter from its Gherkin form to
+     *                          another format triggering that new formatted string to be inserted into the Gremlin
+     *                          itself
+     */
+    public static Map<String, List<String>> parseGrouped(final String featureDir,
+                                                         final List<Pair<Pattern, BiFunction<String, String, String>>> parameterMatchers) throws IOException {
+        final Map<String, List<String>> gremlins = new LinkedHashMap<>();
+        Files.find(Paths.get(featureDir),
+                   Integer.MAX_VALUE,
+                (filePath, fileAttr) -> fileAttr.isRegularFile() && filePath.toString().endsWith(".feature")).
+                sorted().
+                forEach(f -> {
+                    String currentGremlin = "";
+                    boolean openTriples = false;
+                    boolean skipIgnored = false;
+                    String scenarioName = "";
+                    Map<String,String> parameters = new HashMap<>();
+
+                    try {
+                        final List<String> lines = Files.readAllLines(f, StandardCharsets.UTF_8);
+                        for (String line : lines) {
+                            String cleanLine = line.trim();
+                            if (cleanLine.startsWith("Scenario:")) {
+                                scenarioName = cleanLine.split(":")[1].trim();
+                                skipIgnored = false;
+                                parameters.clear();
+                            } else if (!parameterMatchers.isEmpty() && cleanLine.startsWith("And using the parameter")) {
+                                final Matcher m = generalParameterPattern.matcher(cleanLine);
+                                if (m.matches()) {
+                                    parameters.put(m.group(1), matchAndTransform(m.group(1), StringEscapeUtils.unescapeJava(m.group(3)), parameterMatchers));
+                                } else {
+                                    throw new IllegalStateException(String.format("Could not read parameters at: %s", cleanLine));
+                                }
+                            } else if (cleanLine.startsWith("Then nothing should happen because")) {
+                                skipIgnored = true;
+                            } else if (cleanLine.startsWith("And the graph should return")) {
+                                gremlins.computeIfAbsent(scenarioName, k -> new ArrayList<>()).add(applyParametersToGremlin(StringEscapeUtils.unescapeJava(cleanLine.substring(cleanLine.indexOf("\"") + 1, cleanLine.lastIndexOf("\""))), parameters));
+                            } else if (cleanLine.startsWith("\"\"\"")) {
+                                openTriples = !openTriples;
+                                if (!skipIgnored && !openTriples) {
+                                    currentGremlin = applyParametersToGremlin(currentGremlin, parameters);
+                                    gremlins.computeIfAbsent(scenarioName, k -> new ArrayList<>()).add(currentGremlin);
+                                    currentGremlin = "";
+                                }
+                            } else if (openTriples && !skipIgnored) {
+                                currentGremlin += cleanLine;
+                            }
+                        }
+                    } catch (IOException ioe) {
+                        throw new RuntimeException(ioe);
+                    }
+                });
+
+        return gremlins;
+    }
+
+    private static String applyParametersToGremlin(String currentGremlin, Map<String, String> parameters) {
+        for (Map.Entry<String,String> kv : parameters.entrySet()) {
+            currentGremlin = currentGremlin.replace(kv.getKey(), kv.getValue());
+        }
+        return currentGremlin;
+    }
+
+    private static String matchAndTransform(final String k, final String v,
+                                            final List<Pair<Pattern, BiFunction<String, String, String>>> parameterMatchers) {
+        for (Pair<Pattern,BiFunction<String,String,String>> matcherConverter : parameterMatchers) {
+            final Pattern pattern = matcherConverter.getValue0();
+            final Matcher matcher = pattern.matcher(v);
+            if (matcher.find()) {
+                final BiFunction<String,String,String> converter = matcherConverter.getValue1();
+                // when there are no groups there is a direct match
+                return converter.apply(k, matcher.groupCount() == 0 ? "" : matcher.group(1));
+            }
+        }
+
+        throw new IllegalStateException(String.format("Could not match the parameter [%s] pattern of %s", k, v));
+    }
+}
diff --git a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReaderTest.java b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReaderTest.java
new file mode 100644
index 0000000..9a76b95
--- /dev/null
+++ b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/corpus/DocumentationReaderTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.language.corpus;
+
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.number.OrderingComparison.greaterThan;
+import static org.junit.Assert.assertEquals;
+
+public class DocumentationReaderTest {
+    private static final String docsDir = Paths.get("..", "docs", "src").toString();
+
+    @Test
+    public void shouldParseInSameOrder() throws IOException {
+        final Set<String> gremlins = DocumentationReader.parse(docsDir);
+        assertThat(gremlins.size(), greaterThan(0));
+        assertEquals(gremlins, DocumentationReader.parse(docsDir));
+    }
+}
diff --git a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/corpus/FeatureReaderTest.java b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/corpus/FeatureReaderTest.java
new file mode 100644
index 0000000..5929bd1
--- /dev/null
+++ b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/corpus/FeatureReaderTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.language.corpus;
+
+import org.javatuples.Pair;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.regex.Pattern;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.number.OrderingComparison.greaterThan;
+import static org.junit.Assert.assertEquals;
+
+public class FeatureReaderTest {
+
+    private static final String featureDir = Paths.get("..", "gremlin-test", "features").toString();
+
+    @Test
+    public void shouldParseGroupedInSameOrder() throws IOException {
+        final Map<String,List<String>> gremlins = FeatureReader.parseGrouped(featureDir);
+        assertThat(gremlins.size(), greaterThan(0));
+        assertEquals(gremlins, FeatureReader.parseGrouped(featureDir));
+    }
+
+    @Test
+    public void shouldParseGroupedAndEmbed() throws IOException {
+        final String replaceToken = "****replaced****";
+        final List<Pair<Pattern, BiFunction<String, String, String>>> parameterMatchers = new ArrayList<>();
+        parameterMatchers.add(Pair.with(Pattern.compile("(.*)"), (k, v) -> replaceToken));
+        final Map<String,List<String>> gremlins = FeatureReader.parseGrouped(featureDir, parameterMatchers);
+
+        // at least one of these things must have the "replaced" token
+        assertThat(gremlins.values().stream().
+                flatMap(Collection::stream).anyMatch(gremlin -> gremlin.contains(replaceToken)), is(true));
+    }
+
+    @Test
+    public void shouldParseFlatInSameOrder() throws IOException {
+        final List<String> gremlins = FeatureReader.parseFlat(featureDir);
+        assertThat(gremlins.size(), greaterThan(0));
+        assertEquals(gremlins, FeatureReader.parseFlat(featureDir));
+    }
+
+    @Test
+    public void shouldParseFlatAndEmbed() throws IOException {
+        final String replaceToken = "****replaced****";
+        final List<Pair<Pattern, BiFunction<String, String, String>>> parameterMatchers = new ArrayList<>();
+        parameterMatchers.add(Pair.with(Pattern.compile("(.*)"), (k, v) -> replaceToken));
+        final List<String> gremlins = FeatureReader.parseFlat(featureDir, parameterMatchers);
+
+        // at least one of these things must have the "replaced" token
+        assertThat(gremlins.stream().anyMatch(gremlin -> gremlin.contains(replaceToken)), is(true));
+    }
+}
diff --git a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/DocumentationReader.java b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/DocumentationReader.java
deleted file mode 100644
index 1946ffe..0000000
--- a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/DocumentationReader.java
+++ /dev/null
@@ -1,120 +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.language.grammar;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.*;
-import java.util.regex.Pattern;
-
-/**
- * Reads asciidoc documentation for Gremlin snippets to help build the testing corpus.
- */
-public class DocumentationReader {
-    private static final Pattern sourceCodePattern = Pattern.compile("\\[gremlin-groovy.*\\].*");
-    private static final Pattern startGremlinPattern = Pattern.compile("^g\\..*");
-
-    /**
-     * Some Gremlin in documentation is just not going to parse.
-     */
-    private static final Set<String> throwAway = new HashSet<>(Arrays.asList("g.inject(g.withComputer().V().shortestPath().with(ShortestPath.distance, 'weight').with(ShortestPath.includeEdges, true).with(ShortestPath.maxDistance, 1).toList().toArray()).map(unfold().values('name','weight').fold())"));
-
-    public static Set<String> parse(final String projectRoot) throws IOException {
-        final Set<String> gremlins = new LinkedHashSet<>();
-        Files.find(Paths.get(projectRoot, "docs", "src"),
-                Integer.MAX_VALUE,
-                (filePath, fileAttr) -> fileAttr.isRegularFile() && (filePath.toString().endsWith("traversal.asciidoc") || filePath.toString().contains("recipes"))).
-                sorted().
-                forEach(f -> {
-                    String currentGremlin = "";
-                    int openSnippet = 0;
-
-                    try {
-                        final List<String> lines = Files.readAllLines(f, StandardCharsets.UTF_8);
-                        for (String line : lines) {
-                            // trim and remove callouts
-                            String cleanLine = line.replaceAll("<\\d>", "").trim();
-
-                            // remove line comments
-                            int pos = cleanLine.indexOf("//");
-                            if (pos > 0) cleanLine = cleanLine.substring(0, pos).trim();
-
-                            if (sourceCodePattern.matcher(cleanLine).matches() || (openSnippet > 0 && cleanLine.equals("----"))) {
-                                if (openSnippet > 1) {
-                                    openSnippet = 0;
-                                } else {
-                                    openSnippet++;
-                                }
-                            } else if (openSnippet > 0 && (startGremlinPattern.matcher(cleanLine).matches() || isTerminated(currentGremlin))) {
-                                // new line of Gremlin that starts with g.
-                                currentGremlin += cleanLine;
-
-                                // line doesn't continue if there is no period or open paren
-                                if (!isTerminated(currentGremlin)) {
-                                    final String gremlinToAdd = replaceVariables(currentGremlin.trim());
-                                    if (!throwAway.contains(gremlinToAdd))
-                                        gremlins.add(gremlinToAdd);
-                                    currentGremlin = "";
-                                }
-                            }
-                        }
-                    } catch (IOException ioe) {
-                        throw new RuntimeException(ioe);
-                    }
-                });
-
-        return gremlins;
-    }
-
-    private static boolean isTerminated(final String gremlin) {
-        return gremlin.endsWith(".") || gremlin.endsWith("(") || gremlin.endsWith(",");
-    }
-
-    /**
-     * Variables can't be parsed by the grammar so they must be replaced with something concrete.
-     */
-    private static String replaceVariables(final String gremlin) {
-        // convert lambda vars to closures as they will be ignored by the test suite
-        return gremlin.replace("relations", "\"relations\"").
-                replace("places.size()", "6").
-                replace("places", "\"places\"").
-                replace("ids", "\"ids\"").
-                replace("vRexsterJob1", "\"rj1\"").
-                replace("vBlueprintsJob1", "\"bj1\"").
-                replace("weightFilter.clone()", "{it}").
-                replace("weightFilter", "{it}").
-                replace("vBob", "\"bob\"").
-                replace("vMarko", "\"marko\"").
-                replace("vPeter", "\"peter\"").
-                replace("vStephen", "\"stephen\"").
-                replace("input.head()", "\"head\"").
-                replace("input.tail().size()", "6").
-                replace("input.tail()", "\"tail\"").
-                replace("System.out.&println", "{it}").
-                replace("persons", "\"persons\"").
-                replace("marko.value('age')", "11").
-                replace("seedStrategy", "new SeedStrategy(seed: 99999)").
-                replace(".getClass()", "").
-                replace("result.toArray()", "4").
-                replace("vA.value('amount')", "0.0").
-                replace("vA", "\"vA\"");
-    }
-}
diff --git a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/FeatureReader.java b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/FeatureReader.java
deleted file mode 100644
index 6006c7b..0000000
--- a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/FeatureReader.java
+++ /dev/null
@@ -1,95 +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.language.grammar;
-
-import org.apache.commons.text.StringEscapeUtils;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Reads the feature files and extracts Gremlin to help build the parsing test corpus.
- */
-public class FeatureReader {
-
-    public static Set<String> parse(final String projectRoot) throws IOException {
-        final Set<String> gremlins = new LinkedHashSet<>();
-        Files.find(Paths.get(projectRoot, "gremlin-test", "features"),
-                   Integer.MAX_VALUE,
-                (filePath, fileAttr) -> fileAttr.isRegularFile() && filePath.toString().endsWith(".feature")).
-                sorted().
-                forEach(f -> {
-                    String currentGremlin = "";
-                    boolean openTriples = false;
-                    boolean skipIgnored = false;
-
-                    try {
-                        final List<String> lines = Files.readAllLines(f, StandardCharsets.UTF_8);
-                        for (String line : lines) {
-                            String cleanLine = line.trim();
-                            if (cleanLine.startsWith("Then nothing should happen because")) {
-                                skipIgnored = true;
-                            } else if (cleanLine.startsWith("And the graph should return")) {
-                                gremlins.add(replaceVariables(
-                                        StringEscapeUtils.unescapeJava(
-                                                cleanLine.substring(cleanLine.indexOf("\"") + 1, cleanLine.lastIndexOf("\"")))));
-                            } else if (cleanLine.startsWith("\"\"\"")) {
-                                openTriples = !openTriples;
-                                if (!skipIgnored && !openTriples) {
-                                    gremlins.add(replaceVariables(currentGremlin));
-                                    currentGremlin = "";
-                                }
-                            } else if (openTriples && !skipIgnored) {
-                                currentGremlin += cleanLine;
-                            }
-                        }
-                    } catch (IOException ioe) {
-                        throw new RuntimeException(ioe);
-                    }
-                });
-
-        return gremlins;
-    }
-
-    /**
-     * Variables can't be parsed by the grammar so they must be replaced with something concrete.
-     */
-    private static String replaceVariables(final String gremlin) {
-        return gremlin.replace("xx1", "\"1\"").
-                replace("xx2", "\"2\"").
-                replace("xx3", "\"3\"").
-                replace("vid1", "1").
-                replace("vid2", "2").
-                replace("vid3", "3").
-                replace("vid4", "4").
-                replace("vid5", "5").
-                replace("vid6", "6").
-                replace("eid7", "7").
-                replace("eid8", "8").
-                replace("eid9", "9").
-                replace("eid10", "10").
-                replace("eid11", "11").
-                replace("eid12", "12");
-    }
-}
diff --git a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/ReferenceGrammarTest.java b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/ReferenceGrammarTest.java
index e980519..46e0467 100644
--- a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/ReferenceGrammarTest.java
+++ b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/ReferenceGrammarTest.java
@@ -18,14 +18,24 @@
  */
 package org.apache.tinkerpop.gremlin.language.grammar;
 
+import org.apache.tinkerpop.gremlin.language.corpus.DocumentationReader;
+import org.apache.tinkerpop.gremlin.language.corpus.FeatureReader;
+import org.javatuples.Pair;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
+import java.util.function.BiFunction;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assume.assumeThat;
@@ -36,14 +46,37 @@
  */
 @RunWith(Parameterized.class)
 public class ReferenceGrammarTest extends AbstractGrammarTest {
+    private static final String featureDir = Paths.get("..", "gremlin-test", "features").toString();
+    private static final String docsDir = Paths.get("..", "docs", "src").toString();
 
     private static final Pattern vertexPattern = Pattern.compile(".*v\\d.*");
     private static final Pattern edgePattern = Pattern.compile(".*e\\d.*");
 
+    private static final List<Pair<Pattern, BiFunction<String,String,String>>> stringMatcherConverters = new ArrayList<Pair<Pattern, BiFunction<String,String,String>>>() {{
+        add(Pair.with(Pattern.compile("l\\[\\]"), (k,v) -> "[]"));
+        add(Pair.with(Pattern.compile("l\\[(.*)\\]"), (k,v) -> {
+            final String[] items = v.split(",");
+            final String listItems = Stream.of(items).map(String::trim).map(x -> String.format("\"%s\"", x)).collect(Collectors.joining(","));
+            return String.format("[%s]", listItems);
+        }));
+        add(Pair.with(Pattern.compile("v\\[(.+)\\]"), (k,v) -> "\"1\""));
+        add(Pair.with(Pattern.compile("e\\[(.+)\\]"), (k,v) -> "\"1\""));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.?.*"), (k,v) -> v));
+        add(Pair.with(Pattern.compile("m\\[(.*)\\]"), (k,v) -> v.replace('{','[').replace('}', ']')));
+        add(Pair.with(Pattern.compile("t\\[(.*)\\]"), (k,v) -> String.format("T.%s", v)));
+        add(Pair.with(Pattern.compile("D\\[(.*)\\]"), (k,v) -> String.format("Direction.%s", v)));
+
+        // the grammar doesn't support all the Gremlin we have in the gherkin set, so try to coerce it into
+        // something that can be parsed so that we get maximum exercise over the parser itself.
+        add(Pair.with(Pattern.compile("c\\[(.*)\\]"), (k,v) -> k.equals("c1") || k.equals("c2") ? "Order.desc" : "__.identity()"));  // closure -> Comparator || Traversal
+        add(Pair.with(Pattern.compile("s\\[\\]"), (k,v) -> "[]"));  // set -> list
+        add(Pair.with(Pattern.compile("s\\[(.*)\\]"), (k,v) -> "[]"));  // set -> list
+    }};
+
     @Parameterized.Parameters(name = "{0}")
     public static Iterable<String> queries() throws IOException {
-        final Set<String> gremlins = new LinkedHashSet<>(DocumentationReader.parse("../"));
-        gremlins.addAll(FeatureReader.parse("../"));
+        final Set<String> gremlins = new LinkedHashSet<>(DocumentationReader.parse(docsDir));
+        gremlins.addAll(FeatureReader.parseGrouped(featureDir, stringMatcherConverters).values().stream().flatMap(Collection::stream).collect(Collectors.toList()));
         return gremlins;
     }
 
@@ -52,11 +85,6 @@
 
     @Test
     public void test_parse() {
-        assumeThat("Lambdas are not supported", query.contains("l1"), is(false));
-        assumeThat("Lambdas are not supported", query.contains("l2"), is(false));
-        assumeThat("Lambdas are not supported", query.contains("pred1"), is(false));
-        assumeThat("Lambdas are not supported", query.contains("c1"), is(false));
-        assumeThat("Lambdas are not supported", query.contains("c2"), is(false));
         assumeThat("Lambdas are not supported", query.contains("Lambda.function("), is(false));
         // start of a closure
         assumeThat("Lambdas are not supported", query.contains("{"), is(false));
diff --git a/gremlin-python/build/generate.groovy b/gremlin-python/build/generate.groovy
index 701d47b..843454a 100644
--- a/gremlin-python/build/generate.groovy
+++ b/gremlin-python/build/generate.groovy
@@ -24,9 +24,10 @@
 import org.apache.tinkerpop.gremlin.groovy.jsr223.ast.RepeatASTTransformationCustomizer
 import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyCustomizer
 import org.codehaus.groovy.control.customizers.CompilationCustomizer
-import org.apache.tinkerpop.gremlin.features.FeatureReader
+import org.apache.tinkerpop.gremlin.language.corpus.FeatureReader
 
 import javax.script.SimpleBindings
+import java.nio.file.Paths
 
 import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal
 
@@ -34,7 +35,7 @@
 radishGremlinFile = new File("${projectBaseDir}/gremlin-python/src/main/python/radish/gremlin.py")
 
 // assumes globally unique scenario names for keys with list of Gremlin traversals as they appear
-gremlins = FeatureReader.parse("${projectBaseDir}")
+gremlins = FeatureReader.parseGrouped(Paths.get("${projectBaseDir}", "gremlin-test", "features").toString())
 
 gremlinGroovyScriptEngine = new GremlinGroovyScriptEngine(new GroovyCustomizer() {
     public CompilationCustomizer create() {
diff --git a/gremlin-python/pom.xml b/gremlin-python/pom.xml
index 87dcaf8..fd9ff26 100644
--- a/gremlin-python/pom.xml
+++ b/gremlin-python/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-python</artifactId>
     <name>Apache TinkerPop :: Gremlin Python</name>
@@ -261,6 +261,11 @@
                                 <version>${project.version}</version>
                             </dependency>
                             <dependency>
+                                <groupId>org.apache.tinkerpop</groupId>
+                                <artifactId>gremlin-language</artifactId>
+                                <version>${project.version}</version>
+                            </dependency>
+                            <dependency>
                                 <groupId>org.codehaus.groovy</groupId>
                                 <artifactId>groovy-all</artifactId>
                                 <version>${groovy.version}</version>
@@ -268,9 +273,9 @@
                                 <scope>runtime</scope>
                             </dependency>
                             <dependency>
-                                <groupId>log4j</groupId>
-                                <artifactId>log4j</artifactId>
-                                <version>${log4j.version}</version>
+                                <groupId>ch.qos.logback</groupId>
+                                <artifactId>logback-classic</artifactId>
+                                <version>${logback.version}</version>
                                 <scope>runtime</scope>
                             </dependency>
                         </dependencies>
diff --git a/gremlin-python/src/main/python/gremlin_python/driver/client.py b/gremlin-python/src/main/python/gremlin_python/driver/client.py
index 6900b53..db08497 100644
--- a/gremlin-python/src/main/python/gremlin_python/driver/client.py
+++ b/gremlin-python/src/main/python/gremlin_python/driver/client.py
@@ -69,7 +69,8 @@
                 self._message_serializer,
                 username=self._username,
                 password=self._password,
-                kerberized_service=kerberized_service)
+                kerberized_service=kerberized_service,
+                max_content_length=transport_kwargs["max_content_length"])
         self._protocol_factory = protocol_factory
         if self._sessionEnabled:
             if pool_size is None:
@@ -77,7 +78,7 @@
             elif pool_size != 1:
                 raise Exception("PoolSize must be 1 on session mode!")
         if pool_size is None:
-            pool_size = 4
+            pool_size = 8
         self._pool_size = pool_size
         # This is until concurrent.futures backport 3.1.0 release
         if max_workers is None:
diff --git a/gremlin-python/src/main/python/gremlin_python/driver/driver_remote_connection.py b/gremlin-python/src/main/python/gremlin_python/driver/driver_remote_connection.py
index abc4a2c..2d80680 100644
--- a/gremlin-python/src/main/python/gremlin_python/driver/driver_remote_connection.py
+++ b/gremlin-python/src/main/python/gremlin_python/driver/driver_remote_connection.py
@@ -28,7 +28,7 @@
 
 class DriverRemoteConnection(RemoteConnection):
 
-    def __init__(self, url, traversal_source = "g", protocol_factory=None,
+    def __init__(self, url, traversal_source="g", protocol_factory=None,
                  transport_factory=None, pool_size=None, max_workers=None,
                  username="", password="", kerberized_service='',
                  message_serializer=None, graphson_reader=None,
diff --git a/gremlin-python/src/main/python/gremlin_python/driver/protocol.py b/gremlin-python/src/main/python/gremlin_python/driver/protocol.py
index 74773b8..2f67171 100644
--- a/gremlin-python/src/main/python/gremlin_python/driver/protocol.py
+++ b/gremlin-python/src/main/python/gremlin_python/driver/protocol.py
@@ -67,15 +67,20 @@
 
 class GremlinServerWSProtocol(AbstractBaseProtocol):
 
-    MAX_CONTENT_LENGTH = 65536
     QOP_AUTH_BIT = 1
     _kerberos_context = None
+    _max_content_length = 10 * 1024 * 1024
 
-    def __init__(self, message_serializer, username='', password='', kerberized_service=''):
+    def __init__(self,
+                 message_serializer,
+                 username='', password='',
+                 kerberized_service='',
+                 max_content_length=10 * 1024 * 1024):
         self._message_serializer = message_serializer
         self._username = username
         self._password = password
         self._kerberized_service = kerberized_service
+        self._max_content_length = max_content_length
 
     def connection_made(self, transport):
         super(GremlinServerWSProtocol, self).connection_made(transport)
@@ -177,7 +182,7 @@
 
         name_length = len(self._username)
         fmt = '!I' + str(name_length) + 's'
-        word = self.QOP_AUTH_BIT << 24 | self.MAX_CONTENT_LENGTH
+        word = self.QOP_AUTH_BIT << 24 | self._max_content_length
         out = struct.pack(fmt, word, self._username.encode("utf-8"),)
         encoded = base64.b64encode(out).decode('ascii')
         kerberos.authGSSClientWrap(self._kerberos_context, encoded)
diff --git a/gremlin-python/src/main/python/radish/feature_steps.py b/gremlin-python/src/main/python/radish/feature_steps.py
index fe1ea44..eb225bd 100644
--- a/gremlin-python/src/main/python/radish/feature_steps.py
+++ b/gremlin-python/src/main/python/radish/feature_steps.py
@@ -79,7 +79,15 @@
 def translate_traversal(step):
     step.context.ignore = step.text in ignores
     p = step.context.traversal_params if hasattr(step.context, "traversal_params") else {}
-    p['g'] = step.context.g
+    localg = step.context.g
+    tagset = [ tag.name for tag in step.all_tags ]
+
+    if not step.context.ignore:
+        step.context.ignore = "AllowNullPropertyValues" in tagset
+
+    if "GraphComputerOnly" in tagset:
+        localg = step.context.g.withComputer()
+    p['g'] = localg
     step.context.traversal = step.context.traversals.pop(0)(**p)
 
 
@@ -130,6 +138,9 @@
 
 @then("the result should have a count of {count:d}")
 def assert_count(step, count):
+    if step.context.ignore:
+        return
+
     assert_that(len(list(step.context.result)), equal_to(count))
 
 
diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py
index 5372cb8..ec11b31 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -61,7 +61,7 @@
     'g_VX2X_optionalXinXknowsXX': [(lambda g, vid2=None:g.V(vid2).optional(__.in_('knows')))], 
     'g_V_hasLabelXpersonX_optionalXoutXknowsX_optionalXoutXcreatedXXX_path': [(lambda g:g.V().hasLabel('person').optional(__.out('knows').optional(__.out('created'))).path())], 
     'g_V_optionalXout_optionalXoutXX_path': [(lambda g:g.V().optional(__.out().optional(__.out())).path())], 
-    'g_VX1X_optionalXaddVXdogXX_label': [(lambda g, vid1=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, vid1=None:g.V(vid1).optional(__.addV('dog')).label()), (lambda g, vid1=None:g.V())], 
+    'g_VX1X_optionalXaddVXdogXX_label': [(lambda g, vid1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, vid1=None:g.V(vid1).optional(__.addV('dog')).label()), (lambda g, vid1=None:g.V())], 
     'g_V_repeatXoutX_timesX2X_emit_path': [(lambda g:g.V().repeat(__.out()).times(2).emit().path())], 
     'g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name': [(lambda g:g.V().repeat(__.out()).times(2).repeat(__.in_()).times(2).name)], 
     'g_V_repeatXoutE_inVX_timesX2X_path_by_name_by_label': [(lambda g:g.V().repeat(__.outE().inV()).times(2).path().by('name').by(T.label))], 
@@ -102,6 +102,7 @@
     'g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX': [(lambda g:g.V().has('name','marko').and_().has('name','marko').and_().has('name','marko'))], 
     'g_V_coinX1X': [(lambda g:g.V().coin(float(1.0)))], 
     'g_V_coinX0X': [(lambda g:g.V().coin(float(0.0)))], 
+    'g_withStrategiesXSeedStrategyX_V_coinX50X': [(lambda g:g.withStrategies(*[TraversalStrategy('SeedStrategy',{'seed':999999,'strategy':'org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy'}, 'org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy')]).V().coin(float(0.5)))], 
     'g_VX1X_outXcreatedX_inXcreatedX_cyclicPath': [(lambda g, vid1=None:g.V(vid1).out('created').in_('created').cyclicPath())], 
     'g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path': [(lambda g, vid1=None:g.V(vid1).out('created').in_('created').cyclicPath().path())], 
     'g_VX1X_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_cyclicPath_fromXaX_toXbX_path': [(lambda g, vid1=None:g.V(vid1).as_('a').out('created').as_('b').in_('created').as_('c').cyclicPath().from_('a').to('b').path())], 
@@ -114,7 +115,7 @@
     'g_V_both_both_name_dedup': [(lambda g:g.V().both().both().name.dedup())], 
     'g_V_both_both_dedup': [(lambda g:g.V().both().both().dedup())], 
     'g_V_both_both_dedup_byXlabelX': [(lambda g:g.V().both().both().dedup().by(T.label))], 
-    'g_V_group_byXlabelX_byXbothE_weight_dedup_foldX': [(lambda g:g.V().group().by(T.label).by(__.bothE().weight.dedup().fold()))], 
+    'g_V_group_byXlabelX_byXbothE_weight_dedup_foldX': [(lambda g:g.V().group().by(T.label).by(__.bothE().weight.dedup().order().by(Order.asc).fold()))], 
     'g_V_asXaX_both_asXbX_dedupXa_bX_byXlabelX_selectXa_bX': [(lambda g:g.V().as_('a').both().as_('b').dedup('a','b').by(T.label).select('a','b'))], 
     'g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_dedupXa_bX_path': [(lambda g:g.V().as_('a').out('created').as_('b').in_('created').as_('c').dedup('a','b').path())], 
     'g_V_outE_asXeX_inV_asXvX_selectXeX_order_byXweight_ascX_selectXvX_valuesXnameX_dedup': [(lambda g:g.V().outE().as_('e').inV().as_('v').select('e').order().by('weight',Order.asc).select('v').name.dedup())], 
@@ -130,7 +131,7 @@
     'g_V_drop': [(lambda g:g.addV().as_('a').addV().as_('b').addE('knows').to('a')), (lambda g:g.V().drop()), (lambda g:g.V()), (lambda g:g.E())], 
     'g_V_outE_drop': [(lambda g:g.addV().as_('a').addV().as_('b').addE('knows').to('a')), (lambda g:g.V().outE().drop()), (lambda g:g.V()), (lambda g:g.E())], 
     'g_V_properties_drop': [(lambda g:g.addV().property('name','bob').addV().property('name','alice')), (lambda g:g.V().properties().drop()), (lambda g:g.V()), (lambda g:g.V().properties())], 
-    'g_E_propertiesXweightX_drop': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.E().properties('weight').drop()), (lambda g:g.E().properties())], 
+    'g_E_propertiesXweightX_drop': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.E().properties('weight').drop()), (lambda g:g.E().properties())], 
     'g_V_properties_propertiesXstartTimeX_drop': [(lambda g:g.addV().property('name','bob').property(Cardinality.list_,'location','ny','startTime',2014,'endTime',2016).property(Cardinality.list_,'location','va','startTime',2016).addV().property('name','alice').property(Cardinality.list_,'location','va','startTime',2014,'endTime',2016).property(Cardinality.list_,'location','ny','startTime',2016)), (lambda g:g.V().properties().properties('startTime').drop()), (lambda g:g.V().properties().properties()), (lambda g:g.V().properties().properties('startTime'))], 
     'g_V_filterXfalseX': [(lambda g, pred1=None:g.V().filter(pred1))], 
     'g_V_filterXtrueX': [(lambda g, pred1=None:g.V().filter(pred1))], 
@@ -261,7 +262,6 @@
     'g_V_valuesXnameX_order_tailX2X': [(lambda g:g.V().name.order().tail(2))], 
     'g_V_valuesXnameX_order_tail': [(lambda g:g.V().name.order().tail())], 
     'g_V_valuesXnameX_order_tailX7X': [(lambda g:g.V().name.order().tail(7))], 
-    'g_V_repeatXbothX_timesX3X_tailX7X': [(lambda g:g.V().repeat(__.both()).times(3).tail(7))], 
     'g_V_repeatXin_outX_timesX3X_tailX7X_count': [(lambda g:g.V().repeat(__.in_().out()).times(3).tail(7).count())], 
     'g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocal_1X': [(lambda g:g.V().as_('a').out().as_('a').out().as_('a').select('a').by(__.unfold().name.fold()).tail(Scope.local,1))], 
     'g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocalX': [(lambda g:g.V().as_('a').out().as_('a').out().as_('a').select('a').by(__.unfold().name.fold()).tail(Scope.local))], 
@@ -295,45 +295,53 @@
     'g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX': [(lambda g:g.V().as_('a').outE('created').as_('b').inV().as_('c').in_('created').as_('d').where('a',P.lt('b').or_(P.gt('c')).and_(P.neq('d'))).by('age').by('weight').by(__.in_('created').age.min()).select('a','c','d').by('name'))], 
     'g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name': [(lambda g, vid1=None:g.V(vid1).as_('a').out().has('age').where(P.gt('a')).by('age').name)], 
     'g_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name': [(lambda g, vid3=None:g.V(vid3).as_('a').in_().out().as_('b').where('a',P.eq('b')).by('age').name)], 
-    'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX': [(lambda g, vid1=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, vid1=None:g.V(vid1).as_('a').out('created').addE('createdBy').to('a')), (lambda g, vid1=None:g.E()), (lambda g, vid1=None:g.V(vid1).inE())], 
-    'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X': [(lambda g, vid1=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, vid1=None:g.V(vid1).as_('a').out('created').addE('createdBy').to('a').property('weight',float(2.0))), (lambda g, vid1=None:g.E()), (lambda g, vid1=None:g.V(vid1).bothE()), (lambda g, vid1=None:g.V(vid1).inE().has('weight',float(2.0)))], 
-    'g_V_outE_propertyXweight_nullX': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.V().outE().property('weight',None)), (lambda g:g.E().properties('weight'))], 
-    'g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX': [(lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V().aggregate('x').as_('a').select('x').unfold().addE('existsWith').to('a').property('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.E()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).bothE('existsWith').has('time','now'))], 
-    'g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X': [(lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V().as_('a').out('created').in_('created').where(P.neq('a')).as_('b').addE('codeveloper').from_('a').to('b').property('year',2009)), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.E()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid1).bothE()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid1).inE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid1).outE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid1).bothE('codeveloper').has('year',2009)), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid2).bothE()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid4).bothE()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid4).inE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid4).outE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid4).bothE('codeveloper').has('year',2009)), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid6).bothE()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid6).inE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid6).outE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid6).bothE('codeveloper').has('year',2009))], 
-    'g_V_asXaX_inXcreatedX_addEXcreatedByX_fromXaX_propertyXyear_2009X_propertyXacl_publicX': [(lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V().as_('a').in_('created').addE('createdBy').from_('a').property('year',2009).property('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.E()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).bothE('createdBy').has('year',2009).has('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).bothE('createdBy').has('year',2009).has('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).bothE('createdBy').has('year',2009).has('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).bothE('createdBy').has('year',2009).has('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).bothE('createdBy').has('year',2009).has('acl','public'))], 
-    'g_withSideEffectXb_bX_VXaX_addEXknowsX_toXbX_propertyXweight_0_5X': [(lambda g, v6=None,v1=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, v6=None,v1=None:g.withSideEffect('b',v6).V(v1).addE('knows').to('b').property('weight',float(0.5))), (lambda g, v6=None,v1=None:g.E()), (lambda g, v6=None,v1=None:g.V(v1).bothE()), (lambda g, v6=None,v1=None:g.V(v1).inE('knows')), (lambda g, v6=None,v1=None:g.V(v1).outE('knows')), (lambda g, v6=None,v1=None:g.V(v1).bothE('knows').has('weight',float(0.5))), (lambda g, v6=None,v1=None:g.V(v6).bothE()), (lambda g, v6=None,v1=None:g.V(v6).inE('knows')), (lambda g, v6=None,v1=None:g.V(v6).outE('knows')), (lambda g, v6=None,v1=None:g.V(v6).bothE('knows').has('weight',float(0.5)))], 
+    'g_V_coworker': [(lambda g, xx1=None:g.V().hasLabel('person').filter(__.outE('created')).aggregate('p').as_('p1').name.as_('p1n').select('p').unfold().where(P.neq('p1')).as_('p2').name.as_('p2n').select('p2').out('created').choose(__.in_('created').where(P.eq('p1')),__.name,__.constant(xx1)).group().by(__.select('p1n')).by(__.group().by(__.select('p2n')).by(__.unfold().fold().project('numCoCreated','coCreated').by(__.count(Scope.local)).by())).unfold())], 
+    'g_V_coworker_with_midV': [(lambda g:g.V().hasLabel('person').filter(__.outE('created')).as_('p1').V().hasLabel('person').where(P.neq('p1')).filter(__.outE('created')).as_('p2').map(__.out('created').where(__.in_('created').as_('p1')).name.fold()).group().by(__.select('p1').by('name')).by(__.group().by(__.select('p2').by('name')).by(__.project('numCoCreated','coCreated').by(__.count(Scope.local)).by())).unfold())], 
+    'g_V_playlist_paths': [(lambda g:g.V().has('name','Bob_Dylan').in_('sungBy').order().by('name').as_('a').repeat(__.out().order().by('name').simplePath().from_('a')).until(__.out('writtenBy').has('name','Johnny_Cash'))[0:1].as_('b').repeat(__.out().order().by('name').as_('c').simplePath().from_('b').to('c')).until(__.out('sungBy').has('name','Grateful_Dead'))[0:1].path().from_('a').unfold().project('song','artists').by('name').by(__.coalesce(__.out('sungBy','writtenBy').dedup().name.order(),__.constant('Unknown')).fold()))], 
+    'g_V_shortestpath': [(lambda g:g.V().as_('v').both().as_('v').project('src','tgt','p').by(__.select(Pop.first,'v')).by(__.select(Pop.last,'v')).by(__.select(Pop.all_,'v')).as_('triple').group('x').by(__.select('src','tgt')).by(__.select('p').fold()).select('tgt').barrier().repeat(__.both().as_('v').project('src','tgt','p').by(__.select(Pop.first,'v')).by(__.select(Pop.last,'v')).by(__.select(Pop.all_,'v')).as_('t').filter(__.select(Pop.all_,'p').count(Scope.local).as_('l').select(Pop.last,'t').select(Pop.all_,'p').dedup(Scope.local).count(Scope.local).where(P.eq('l'))).select(Pop.last,'t').not_(__.select(Pop.all_,'p').as_('p').count(Scope.local).as_('l').select(Pop.all_,'x').unfold().filter(__.select(Column.keys).where(P.eq('t')).by(__.select('src','tgt'))).filter(__.select(Column.values).unfold().or_(__.count(Scope.local).where(P.lt('l')),__.where(P.eq('p'))))).barrier().group('x').by(__.select('src','tgt')).by(__.select(Pop.all_,'p').fold()).select('tgt').barrier()).cap('x').select(Column.values).unfold().unfold().map(__.unfold().name.fold()))], 
+    'g_V_classic_recommendation': [(lambda g:g.V().has('name','DARK STAR').as_('a').out('followedBy').aggregate('stash').in_('followedBy').where(P.neq('a').and_(P.without(['stash']))).groupCount().unfold().project('x','y','z').by(__.select(Column.keys).name).by(__.select(Column.keys).performances).by(__.select(Column.values)).order().by(__.select('z'),Order.desc).by(__.select('y'),Order.asc)[0:5].aggregate(Scope.local,'m').select('x'))], 
+    'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX': [(lambda g, vid1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, vid1=None:g.V(vid1).as_('a').out('created').addE('createdBy').to('a')), (lambda g, vid1=None:g.E()), (lambda g, vid1=None:g.V(vid1).inE())], 
+    'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X': [(lambda g, vid1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, vid1=None:g.V(vid1).as_('a').out('created').addE('createdBy').to('a').property('weight',float(2.0))), (lambda g, vid1=None:g.E()), (lambda g, vid1=None:g.V(vid1).bothE()), (lambda g, vid1=None:g.V(vid1).inE().has('weight',float(2.0)))], 
+    'g_V_outE_propertyXweight_nullX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.V().outE().property('weight',None)), (lambda g:g.E().properties('weight'))], 
+    'g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX': [(lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V().aggregate('x').as_('a').select('x').unfold().addE('existsWith').to('a').property('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.E()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).bothE('existsWith').has('time','now')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).inE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).outE('existsWith')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).bothE('existsWith').has('time','now'))], 
+    'g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X': [(lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V().as_('a').out('created').in_('created').where(P.neq('a')).as_('b').addE('codeveloper').from_('a').to('b').property('year',2009)), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.E()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid1).bothE()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid1).inE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid1).outE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid1).bothE('codeveloper').has('year',2009)), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid2).bothE()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid4).bothE()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid4).inE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid4).outE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid4).bothE('codeveloper').has('year',2009)), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid6).bothE()), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid6).inE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid6).outE('codeveloper')), (lambda g, vid1=None,vid2=None,vid4=None,vid6=None:g.V(vid6).bothE('codeveloper').has('year',2009))], 
+    'g_V_asXaX_inXcreatedX_addEXcreatedByX_fromXaX_propertyXyear_2009X_propertyXacl_publicX': [(lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V().as_('a').in_('created').addE('createdBy').from_('a').property('year',2009).property('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.E()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).bothE('createdBy').has('year',2009).has('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).bothE('createdBy').has('year',2009).has('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).bothE('createdBy').has('year',2009).has('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).bothE('createdBy').has('year',2009).has('acl','public')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).bothE()), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).inE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).outE('createdBy')), (lambda g, vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).bothE('createdBy').has('year',2009).has('acl','public'))], 
+    'g_withSideEffectXb_bX_VXaX_addEXknowsX_toXbX_propertyXweight_0_5X': [(lambda g, v6=None,v1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, v6=None,v1=None:g.withSideEffect('b',v6).V(v1).addE('knows').to('b').property('weight',float(0.5))), (lambda g, v6=None,v1=None:g.E()), (lambda g, v6=None,v1=None:g.V(v1).bothE()), (lambda g, v6=None,v1=None:g.V(v1).inE('knows')), (lambda g, v6=None,v1=None:g.V(v1).outE('knows')), (lambda g, v6=None,v1=None:g.V(v1).bothE('knows').has('weight',float(0.5))), (lambda g, v6=None,v1=None:g.V(v6).bothE()), (lambda g, v6=None,v1=None:g.V(v6).inE('knows')), (lambda g, v6=None,v1=None:g.V(v6).outE('knows')), (lambda g, v6=None,v1=None:g.V(v6).bothE('knows').has('weight',float(0.5)))], 
     'g_addV_asXfirstX_repeatXaddEXnextX_toXaddVX_inVX_timesX5X_addEXnextX_toXselectXfirstXX': [(lambda g:g.addV().as_('first').repeat(__.addE('next').to(__.addV()).inV()).times(5).addE('next').to(__.select('first'))), (lambda g:g.V()), (lambda g:g.E()), (lambda g:g.E().hasLabel('next')), (lambda g:g.V()[0:1].bothE()), (lambda g:g.V()[0:1].inE()), (lambda g:g.V()[0:1].outE())], 
-    'g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX': [(lambda g, v1=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, v1=None:g.V().has('name','marko').as_('a').outE('created').as_('b').inV().addE(__.select('b').label()).to('a')), (lambda g, v1=None:g.E()), (lambda g, v1=None:g.V(v1).bothE()), (lambda g, v1=None:g.V(v1).inE('created')), (lambda g, v1=None:g.V(v1).in_('created').has('name','lop')), (lambda g, v1=None:g.V(v1).outE('created'))], 
-    'g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_descX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX': [(lambda g, v2=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, v2=None:g.addE(__.V().outE().label().groupCount().order(Scope.local).by(Column.values,Order.desc).select(Column.keys).unfold()[0:1]).from_(__.V().has('name','vadas')).to(__.V().has('name','lop'))), (lambda g, v2=None:g.E()), (lambda g, v2=None:g.V(v2).bothE()), (lambda g, v2=None:g.V(v2).inE('knows')), (lambda g, v2=None:g.V(v2).outE('created')), (lambda g, v2=None:g.V(v2).out('created').has('name','lop'))], 
-    'g_addEXknowsX_fromXaX_toXbX_propertyXweight_0_1X': [(lambda g, v6=None,xx1=None,v1=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, v6=None,xx1=None,v1=None:g.addE('knows').from_(v1).to(v6).property('weight',xx1)), (lambda g, v6=None,xx1=None,v1=None:g.E()), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).outE('knows')), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).out('knows').has('name','peter'))], 
-    'g_VXaX_addEXknowsX_toXbX_propertyXweight_0_1X': [(lambda g, v6=None,xx1=None,v1=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).addE('knows').to(v6).property('weight',xx1)), (lambda g, v6=None,xx1=None,v1=None:g.E()), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).outE('knows')), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).out('knows').has('name','peter'))], 
-    'g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX': [(lambda g, vid1=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, vid1=None:g.V(vid1).as_('a').addV('animal').property('age',__.select('a').by('age')).property('name','puppy')), (lambda g, vid1=None:g.V().has('animal','age',29))], 
-    'g_V_addVXanimalX_propertyXage_0X': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.V().addV('animal').property('age',0)), (lambda g:g.V().has('animal','age',0))], 
-    'g_addVXpersonX_propertyXname_stephenX': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.addV('person').property('name','stephen')), (lambda g:g.V().has('person','name','stephen'))], 
-    'g_V_hasLabelXpersonX_propertyXname_nullX': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.V().hasLabel('person').property('name',None)), (lambda g:g.V().properties('name'))], 
-    'g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenmX': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.addV('person').property(Cardinality.single,'name','stephen').property(Cardinality.single,'name','stephenm')), (lambda g:g.V().has('person','name','stephen')), (lambda g:g.V().has('person','name','stephenm'))], 
-    'get_g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.addV('person').property(Cardinality.single,'name','stephen').property(Cardinality.single,'name','stephenm','since',2010)), (lambda g:g.V().has('person','name','stephen')), (lambda g:g.V().has('person','name','stephenm')), (lambda g:g.V().has('person','name','stephenm').properties('name').has('since',2010))], 
-    'g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.V().has('name','marko').property('friendWeight',__.outE('knows').weight.sum(),'acl','private')), (lambda g:g.V().has('person','name','marko').has('friendWeight',float(1.5))), (lambda g:g.V().has('person','name','marko').properties('friendWeight').has('acl','private')), (lambda g:g.V().has('person','name','marko').properties('friendWeight').count())], 
-    'g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.addV('animal').property('name','mateo').property('name','gateo').property('name','cateo').property('age',5)), (lambda g:g.V().hasLabel('animal').has('name','mateo').has('name','gateo').has('name','cateo').has('age',5))], 
-    'g_withSideEffectXa_markoX_addV_propertyXname_selectXaXX_name': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.withSideEffect('a','marko').addV().property('name',__.select('a')).name), (lambda g:g.V().has('name','marko'))], 
-    'g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.addV('person').property(Cardinality.single,'name','stephen').property(Cardinality.single,'name','stephenm','since',2010)), (lambda g:g.V().has('name','stephen')), (lambda g:g.V().has('name','stephenm')), (lambda g:g.V().has('name','stephenm').properties('name').has('since',2010))], 
-    'g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.V().addV('animal').property('name',__.name).property('name','an animal').property(__.name,__.label())), (lambda g:g.V().hasLabel('animal').has('name','marko').has('name','an animal').has('marko','person')), (lambda g:g.V().hasLabel('animal').has('name','vadas').has('name','an animal').has('vadas','person')), (lambda g:g.V().hasLabel('animal').has('name','lop').has('name','an animal').has('lop','software')), (lambda g:g.V().hasLabel('animal').has('name','josh').has('name','an animal').has('josh','person')), (lambda g:g.V().hasLabel('animal').has('name','ripple').has('name','an animal').has('ripple','software')), (lambda g:g.V().hasLabel('animal').has('name','peter').has('name','an animal').has('peter','person'))], 
-    'g_withSideEffectXa_testX_V_hasLabelXsoftwareX_propertyXtemp_selectXaXX_valueMapXname_tempX': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.withSideEffect('a','test').V().hasLabel('software').property('temp',__.select('a')).valueMap('name','temp'))], 
-    'g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.withSideEffect('a','name').addV().property(__.select('a'),'marko').name), (lambda g:g.V().has('name','marko'))], 
-    'g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.V().as_('a').has('name','marko').out('created').as_('b').addV(__.select('a').label()).property('test',__.select('b').label()).valueMap().with_('~tinkerpop.valueMap.tokens')), (lambda g:g.V().has('person','test','software'))], 
-    'g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label': [(lambda g:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g:g.addV(__.V().has('name','marko').properties('name').key()).label())], 
+    'g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX': [(lambda g, v1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, v1=None:g.V().has('name','marko').as_('a').outE('created').as_('b').inV().addE(__.select('b').label()).to('a')), (lambda g, v1=None:g.E()), (lambda g, v1=None:g.V(v1).bothE()), (lambda g, v1=None:g.V(v1).inE('created')), (lambda g, v1=None:g.V(v1).in_('created').has('name','lop')), (lambda g, v1=None:g.V(v1).outE('created'))], 
+    'g_addEXV_outE_label_groupCount_orderXlocalX_byXvalues_descX_selectXkeysX_unfold_limitX1XX_fromXV_hasXname_vadasXX_toXV_hasXname_lopXX': [(lambda g, v2=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, v2=None:g.addE(__.V().outE().label().groupCount().order(Scope.local).by(Column.values,Order.desc).select(Column.keys).unfold()[0:1]).from_(__.V().has('name','vadas')).to(__.V().has('name','lop'))), (lambda g, v2=None:g.E()), (lambda g, v2=None:g.V(v2).bothE()), (lambda g, v2=None:g.V(v2).inE('knows')), (lambda g, v2=None:g.V(v2).outE('created')), (lambda g, v2=None:g.V(v2).out('created').has('name','lop'))], 
+    'g_addEXknowsX_fromXaX_toXbX_propertyXweight_0_1X': [(lambda g, v6=None,xx1=None,v1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, v6=None,xx1=None,v1=None:g.addE('knows').from_(v1).to(v6).property('weight',xx1)), (lambda g, v6=None,xx1=None,v1=None:g.E()), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).outE('knows')), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).out('knows').has('name','peter'))], 
+    'g_VXaX_addEXknowsX_toXbX_propertyXweight_0_1X': [(lambda g, v6=None,xx1=None,v1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).addE('knows').to(v6).property('weight',xx1)), (lambda g, v6=None,xx1=None,v1=None:g.E()), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).outE('knows')), (lambda g, v6=None,xx1=None,v1=None:g.V(v1).out('knows').has('name','peter'))], 
+    'g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX': [(lambda g:g.addV('person').property('name','marko').property('age',29).addV('person').property('name','vadas').property('age',27)), (lambda g:g.addE('knows').property('weight',None).from_(__.V().has('name','marko')).to(__.V().has('name','vadas'))), (lambda g:g.E().has('knows','weight',None))], 
+    'g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX': [(lambda g, vid1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, vid1=None:g.V(vid1).as_('a').addV('animal').property('age',__.select('a').by('age')).property('name','puppy')), (lambda g, vid1=None:g.V().has('animal','age',29))], 
+    'g_V_addVXanimalX_propertyXage_0X': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.V().addV('animal').property('age',0)), (lambda g:g.V().has('animal','age',0))], 
+    'g_addVXpersonX_propertyXname_stephenX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.addV('person').property('name','stephen')), (lambda g:g.V().has('person','name','stephen'))], 
+    'g_V_hasLabelXpersonX_propertyXname_nullX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.V().hasLabel('person').property('name',None)), (lambda g:g.V().properties('name'))], 
+    'g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenmX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.addV('person').property(Cardinality.single,'name','stephen').property(Cardinality.single,'name','stephenm')), (lambda g:g.V().has('person','name','stephen')), (lambda g:g.V().has('person','name','stephenm'))], 
+    'get_g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.addV('person').property(Cardinality.single,'name','stephen').property(Cardinality.single,'name','stephenm','since',2010)), (lambda g:g.V().has('person','name','stephen')), (lambda g:g.V().has('person','name','stephenm')), (lambda g:g.V().has('person','name','stephenm').properties('name').has('since',2010))], 
+    'g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.V().has('name','marko').property('friendWeight',__.outE('knows').weight.sum(),'acl','private')), (lambda g:g.V().has('person','name','marko').has('friendWeight',float(1.5))), (lambda g:g.V().has('person','name','marko').properties('friendWeight').has('acl','private')), (lambda g:g.V().has('person','name','marko').properties('friendWeight').count())], 
+    'g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.addV('animal').property('name','mateo').property('name','gateo').property('name','cateo').property('age',5)), (lambda g:g.V().hasLabel('animal').has('name','mateo').has('name','gateo').has('name','cateo').has('age',5))], 
+    'g_withSideEffectXa_markoX_addV_propertyXname_selectXaXX_name': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.withSideEffect('a','marko').addV().property('name',__.select('a')).name), (lambda g:g.V().has('name','marko'))], 
+    'g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.addV('person').property(Cardinality.single,'name','stephen').property(Cardinality.single,'name','stephenm','since',2010)), (lambda g:g.V().has('name','stephen')), (lambda g:g.V().has('name','stephenm')), (lambda g:g.V().has('name','stephenm').properties('name').has('since',2010))], 
+    'g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.V().addV('animal').property('name',__.name).property('name','an animal').property(__.name,__.label())), (lambda g:g.V().hasLabel('animal').has('name','marko').has('name','an animal').has('marko','person')), (lambda g:g.V().hasLabel('animal').has('name','vadas').has('name','an animal').has('vadas','person')), (lambda g:g.V().hasLabel('animal').has('name','lop').has('name','an animal').has('lop','software')), (lambda g:g.V().hasLabel('animal').has('name','josh').has('name','an animal').has('josh','person')), (lambda g:g.V().hasLabel('animal').has('name','ripple').has('name','an animal').has('ripple','software')), (lambda g:g.V().hasLabel('animal').has('name','peter').has('name','an animal').has('peter','person'))], 
+    'g_withSideEffectXa_testX_V_hasLabelXsoftwareX_propertyXtemp_selectXaXX_valueMapXname_tempX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.withSideEffect('a','test').V().hasLabel('software').property('temp',__.select('a')).valueMap('name','temp'))], 
+    'g_withSideEffectXa_nameX_addV_propertyXselectXaX_markoX_name': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.withSideEffect('a','name').addV().property(__.select('a'),'marko').name), (lambda g:g.V().has('name','marko'))], 
+    'g_V_asXaX_hasXname_markoX_outXcreatedX_asXbX_addVXselectXaX_labelX_propertyXtest_selectXbX_labelX_valueMap_withXtokensX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.V().as_('a').has('name','marko').out('created').as_('b').addV(__.select('a').label()).property('test',__.select('b').label()).valueMap().with_('~tinkerpop.valueMap.tokens')), (lambda g:g.V().has('person','test','software'))], 
+    'g_addVXV_hasXname_markoX_propertiesXnameX_keyX_label': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g:g.addV(__.V().has('name','marko').properties('name').key()).label())], 
     'g_addVXnullX_propertyXid_nullX': [(lambda g:g.addV(None).property(T.id,None)), (lambda g:g.V().hasLabel('vertex'))], 
     'g_addV_propertyXlabel_personX': [(lambda g:g.addV().property(T.label,'person')), (lambda g:g.V().hasLabel('person'))], 
+    'g_addVXpersonX_propertyXname_joshX_propertyXage_nullX': [(lambda g:g.addV('person').property('name','josh').property('age',None)), (lambda g:g.V().has('person','age',None))], 
+    'g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX': [(lambda g:g.addV('person').property('name','marko').property('friendWeight',None,'acl',None)), (lambda g:g.V().has('person','name','marko').has('friendWeight',None)), (lambda g:g.V().has('person','name','marko').properties('friendWeight').has('acl',None)), (lambda g:g.V().has('person','name','marko').properties('friendWeight').count())], 
     'g_V_coalesceXoutXfooX_outXbarXX': [(lambda g:g.V().coalesce(__.out('foo'),__.out('bar')))], 
     'g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX': [(lambda g, vid1=None:g.V(vid1).coalesce(__.out('knows'),__.out('created')).name)], 
     'g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX': [(lambda g, vid1=None:g.V(vid1).coalesce(__.out('created'),__.out('knows')).name)], 
     'g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX': [(lambda g:g.V().coalesce(__.out('likes'),__.out('knows'),__.out('created')).groupCount().by('name'))], 
     'g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX': [(lambda g:g.V().coalesce(__.outE('knows'),__.outE('created')).otherV().path().by('name').by(T.label))], 
     'g_V_outXcreatedX_order_byXnameX_coalesceXname_constantXxXX': [(lambda g:g.V().out('created').order().by('name').coalesce(__.name,__.constant('x')))], 
-    'g_V_connectedComponent_hasXcomponentX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().connectedComponent().has('gremlin.connectedComponentVertexProgram.component'))], 
-    'g_V_dedup_connectedComponent_hasXcomponentX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().dedup().connectedComponent().has('gremlin.connectedComponentVertexProgram.component'))], 
-    'g_V_hasLabelXsoftwareX_connectedComponent_project_byXnameX_byXcomponentX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().hasLabel('software').connectedComponent().project('name','component').by('name').by('gremlin.connectedComponentVertexProgram.component'))], 
-    'g_V_connectedComponent_withXEDGES_bothEXknowsXX_withXPROPERTY_NAME_clusterX_project_byXnameX_byXclusterX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().hasLabel('person').connectedComponent().with_('~tinkerpop.connectedComponent.edges',__.bothE('knows')).with_('~tinkerpop.connectedComponent.propertyName','cluster').project('name','cluster').by('name').by('cluster'))], 
+    'g_V_connectedComponent_hasXcomponentX': [(lambda g:g.V().connectedComponent().has('gremlin.connectedComponentVertexProgram.component'))], 
+    'g_V_dedup_connectedComponent_hasXcomponentX': [(lambda g:g.V().dedup().connectedComponent().has('gremlin.connectedComponentVertexProgram.component'))], 
+    'g_V_hasLabelXsoftwareX_connectedComponent_project_byXnameX_byXcomponentX': [(lambda g:g.V().hasLabel('software').connectedComponent().project('name','component').by('name').by('gremlin.connectedComponentVertexProgram.component'))], 
+    'g_V_connectedComponent_withXEDGES_bothEXknowsXX_withXPROPERTY_NAME_clusterX_project_byXnameX_byXclusterX': [(lambda g:g.V().hasLabel('person').connectedComponent().with_('~tinkerpop.connectedComponent.edges',__.bothE('knows')).with_('~tinkerpop.connectedComponent.propertyName','cluster').project('name','cluster').by('name').by('cluster'))], 
     'g_V_constantX123X': [(lambda g:g.V().constant(123))], 
     'g_V_constantXnullX': [(lambda g:g.V().constant(None))], 
     'g_V_chooseXhasLabelXpersonX_valuesXnameX_constantXinhumanXX': [(lambda g:g.V().choose(__.hasLabel('person'),__.name,__.constant('inhuman')))], 
@@ -357,7 +365,7 @@
     'g_VX1X_V_valuesXnameX': [(lambda g, vid1=None:g.V(vid1).V().name)], 
     'g_V_outXknowsX_V_name': [(lambda g:g.V().out('knows').V().name)], 
     'g_V_hasXname_GarciaX_inXsungByX_asXsongX_V_hasXname_Willie_DixonX_inXwrittenByX_whereXeqXsongXX_name': [(lambda g:g.V().has('artist','name','Garcia').in_('sungBy').as_('song').V().has('artist','name','Willie_Dixon').in_('writtenBy').where(P.eq('song')).name)], 
-    'g_V_hasLabelXpersonX_asXpX_VXsoftwareX_addInEXuses_pX': [(lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.addV('person').property(T.id,1).property('name','marko').property('age',29).as_('marko').addV('person').property(T.id,2).property('name','vadas').property('age',27).as_('vadas').addV('software').property(T.id,3).property('name','lop').property('lang','java').as_('lop').addV('person').property(T.id,4).property('name','josh').property('age',32).as_('josh').addV('software').property(T.id,5).property('name','ripple').property('lang','java').as_('ripple').addV('person').property(T.id,6).property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property(T.id,7).property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property(T.id,8).property('weight',float(1.0)).addE('created').from_('marko').to('lop').property(T.id,9).property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property(T.id,10).property('weight',float(1.0)).addE('created').from_('josh').to('lop').property(T.id,11).property('weight',float(0.4)).addE('created').from_('peter').to('lop').property(T.id,12).property('weight',float(0.2))), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V().hasLabel('person').as_('p').V(xx1).addE('uses').from_('p')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.E().hasLabel('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).outE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).outE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).inE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).outE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).inE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).outE('uses'))], 
+    'g_V_hasLabelXpersonX_asXpX_VXsoftwareX_addInEXuses_pX': [(lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V().hasLabel('person').as_('p').V(xx1).addE('uses').from_('p')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.E().hasLabel('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid1).outE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid2).outE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid3).inE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid4).outE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid5).inE('uses')), (lambda g, xx1=None,vid1=None,vid2=None,vid3=None,vid4=None,vid5=None,vid6=None:g.V(vid6).outE('uses'))], 
     'g_V_hasLabelXsoftwareX_index_unfold': [(lambda g:g.V().hasLabel('software').index().unfold())], 
     'g_V_hasLabelXsoftwareX_order_byXnameX_index_withXmapX': [(lambda g:g.V().hasLabel('software').order().by('name').index().with_('~tinkerpop.index.indexer',1))], 
     'g_V_hasLabelXsoftwareX_name_fold_orderXlocalX_index_unfold_order_byXtailXlocal_1XX': [(lambda g:g.V().hasLabel('software').name.fold().order(Scope.local).index().unfold().order().by(__.tail(Scope.local,1)))], 
@@ -463,7 +471,7 @@
     'g_V_properties_order_byXkey_descX_key': [(lambda g:g.V().properties().order().by(T.key,Order.desc).key())], 
     'g_V_hasLabelXpersonX_order_byXvalueXageX_descX_name': [(lambda g, l1=None:g.V().hasLabel('person').order().by(l1,Order.desc).name)], 
     'g_V_hasLabelXpersonX_group_byXnameX_byXoutE_weight_sumX_orderXlocalX_byXvaluesX': [(lambda g:g.V().hasLabel('person').group().by('name').by(__.outE().weight.sum()).order(Scope.local).by(Column.values))], 
-    'g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX': [(lambda g:g.V().map(__.bothE().weight.fold()).order().by(__.sum(Scope.local),Order.desc))], 
+    'g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX': [(lambda g:g.V().map(__.bothE().weight.order().by(Order.asc).fold()).order().by(__.sum(Scope.local),Order.desc))], 
     'g_V_group_byXlabelX_byXname_order_byXdescX_foldX': [(lambda g:g.V().group().by(T.label).by(__.name.order().by(Order.desc).fold()))], 
     'g_V_hasLabelXpersonX_group_byXnameX_byXoutE_weight_sumX_unfold_order_byXvalues_descX': [(lambda g:g.V().hasLabel('person').group().by('name').by(__.outE().weight.sum()).unfold().order().by(Column.values,Order.desc))], 
     'g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_descX': [(lambda g:g.V().as_('v').map(__.bothE().weight.fold()).sum(Scope.local).as_('s').select('v','s').order().by(__.select('s'),Order.desc))], 
@@ -474,15 +482,15 @@
     'g_V_orXhasLabelXpersonX_hasXsoftware_name_lopXX_order_byXageX': [(lambda g:g.V().or_(__.hasLabel('person'),__.has('software','name','lop')).order().by('age'))], 
     'g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalues_descX_byXkeys_ascX': [(lambda g, l1=None,v1=None:g.V(v1).hasLabel('person').map(l1).order(Scope.local).by(Column.values,Order.desc).by(Column.keys,Order.asc))], 
     'g_VX1X_elementMap_orderXlocalX_byXkeys_descXunfold': [(lambda g, vid1=None:g.V(vid1).elementMap().order(Scope.local).by(Column.keys,Order.desc).unfold())], 
-    'g_V_pageRank_hasXpageRankX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().pageRank().has('gremlin.pageRankVertexProgram.pageRank')), (lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().pageRank().has('gremlin.pageRankVertexProgram.pageRank'))], 
-    'g_V_outXcreatedX_pageRank_withXedges_bothEX_withXpropertyName_projectRankX_withXtimes_0X_valueMapXname_projectRankX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().out('created').pageRank().with_('~tinkerpop.pageRank.edges',__.bothE()).with_('~tinkerpop.pageRank.propertyName','projectRank').with_('~tinkerpop.pageRank.times',0).valueMap('name','projectRank'))], 
-    'g_V_pageRank_order_byXpageRank_descX_byXnameX_name': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().pageRank().order().by('gremlin.pageRankVertexProgram.pageRank',Order.desc).by('name').name)], 
-    'g_V_pageRank_order_byXpageRank_descX_name_limitX2X': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().pageRank().order().by('gremlin.pageRankVertexProgram.pageRank',Order.desc).name[0:2])], 
-    'g_V_pageRank_withXedges_outEXknowsXX_withXpropertyName_friendRankX_project_byXnameX_byXvaluesXfriendRankX_mathX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().pageRank().with_('~tinkerpop.pageRank.edges',__.outE('knows')).with_('~tinkerpop.pageRank.propertyName','friendRank').project('name','friendRank').by('name').by(__.friendRank.math('ceil(_ * 100)')))], 
-    'g_V_hasLabelXpersonX_pageRank_withXpropertyName_kpageRankX_project_byXnameX_byXvaluesXpageRankX_mathX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().hasLabel('person').pageRank().with_('~tinkerpop.pageRank.propertyName','pageRank').project('name','pageRank').by('name').by(__.values('pageRank').math('ceil(_ * 100)')))], 
-    'g_V_pageRank_withXpropertyName_pageRankX_asXaX_outXknowsX_pageRank_asXbX_selectXa_bX_by_byXmathX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().pageRank().with_('~tinkerpop.pageRank.propertyName','pageRank').as_('a').out('knows').values('pageRank').as_('b').select('a','b').by().by(__.math('ceil(_ * 100)')))], 
-    'g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_withXedges_inEXcreatedX_withXtimes_1X_withXpropertyName_priorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().hasLabel('software').has('name','ripple').pageRank(float(1.0)).with_('~tinkerpop.pageRank.edges',__.inE('created')).with_('~tinkerpop.pageRank.times',1).with_('~tinkerpop.pageRank.propertyName','priors').in_('created').union(__.both(),__.identity()).valueMap('name','priors'))], 
-    'g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXpropertyName_pageRankX_withXedges_inEX_withXtimes_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().out('created').group('m').by(T.label).pageRank(float(1.0)).with_('~tinkerpop.pageRank.propertyName','pageRank').with_('~tinkerpop.pageRank.edges',__.inE()).with_('~tinkerpop.pageRank.times',1).in_('created').group('m').by('pageRank').cap('m'))], 
+    'g_V_pageRank_hasXpageRankX': [(lambda g:g.V().pageRank().has('gremlin.pageRankVertexProgram.pageRank'))], 
+    'g_V_outXcreatedX_pageRank_withXedges_bothEX_withXpropertyName_projectRankX_withXtimes_0X_valueMapXname_projectRankX': [(lambda g:g.V().out('created').pageRank().with_('~tinkerpop.pageRank.edges',__.bothE()).with_('~tinkerpop.pageRank.propertyName','projectRank').with_('~tinkerpop.pageRank.times',0).valueMap('name','projectRank'))], 
+    'g_V_pageRank_order_byXpageRank_descX_byXnameX_name': [(lambda g:g.V().pageRank().order().by('gremlin.pageRankVertexProgram.pageRank',Order.desc).by('name').name)], 
+    'g_V_pageRank_order_byXpageRank_descX_name_limitX2X': [(lambda g:g.V().pageRank().order().by('gremlin.pageRankVertexProgram.pageRank',Order.desc).name[0:2])], 
+    'g_V_pageRank_withXedges_outEXknowsXX_withXpropertyName_friendRankX_project_byXnameX_byXvaluesXfriendRankX_mathX': [(lambda g:g.V().pageRank().with_('~tinkerpop.pageRank.edges',__.outE('knows')).with_('~tinkerpop.pageRank.propertyName','friendRank').project('name','friendRank').by('name').by(__.friendRank.math('ceil(_ * 100)')))], 
+    'g_V_hasLabelXpersonX_pageRank_withXpropertyName_kpageRankX_project_byXnameX_byXvaluesXpageRankX_mathX': [(lambda g:g.V().hasLabel('person').pageRank().with_('~tinkerpop.pageRank.propertyName','pageRank').project('name','pageRank').by('name').by(__.values('pageRank').math('ceil(_ * 100)')))], 
+    'g_V_pageRank_withXpropertyName_pageRankX_asXaX_outXknowsX_pageRank_asXbX_selectXa_bX_by_byXmathX': [(lambda g:g.V().pageRank().with_('~tinkerpop.pageRank.propertyName','pageRank').as_('a').out('knows').values('pageRank').as_('b').select('a','b').by().by(__.math('ceil(_ * 100)')))], 
+    'g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_withXedges_inEXcreatedX_withXtimes_1X_withXpropertyName_priorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX': [(lambda g:g.V().hasLabel('software').has('name','ripple').pageRank(float(1.0)).with_('~tinkerpop.pageRank.edges',__.inE('created')).with_('~tinkerpop.pageRank.times',1).with_('~tinkerpop.pageRank.propertyName','priors').in_('created').union(__.both(),__.identity()).valueMap('name','priors'))], 
+    'g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXpropertyName_pageRankX_withXedges_inEX_withXtimes_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX': [(lambda g:g.V().out('created').group('m').by(T.label).pageRank(float(1.0)).with_('~tinkerpop.pageRank.propertyName','pageRank').with_('~tinkerpop.pageRank.edges',__.inE()).with_('~tinkerpop.pageRank.times',1).in_('created').group('m').by('pageRank').cap('m'))], 
     'g_VX1X_name_path': [(lambda g, vid1=None:g.V(vid1).name.path())], 
     'g_VX1X_out_path_byXageX_byXnameX': [(lambda g, vid1=None:g.V(vid1).out().path().by('age').by('name'))], 
     'g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX': [(lambda g:g.V().repeat(__.out()).times(2).path().by().by('name').by('lang'))], 
@@ -493,9 +501,9 @@
     'g_VX1X_out_path_byXageX': [(lambda g, vid1=None:g.V(vid1).out().path().by('age'))], 
     'g_injectX1_null_nullX_path': [(lambda g:g.inject(1,None,None).path())], 
     'g_injectX1_null_nullX_path_dedup': [(lambda g:g.inject(1,None,None).path().dedup())], 
-    'g_V_peerPressure_hasXclusterX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().peerPressure().has('gremlin.peerPressureVertexProgram.cluster')), (lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().peerPressure().has('gremlin.peerPressureVertexProgram.cluster'))], 
-    'g_V_peerPressure_withXpropertyName_clusterX_withXedges_outEXknowsXX_pageRankX1X_byXrankX_withXedges_outEXknowsX_withXtimes_2X_group_byXclusterX_byXrank_sumX_limitX100X': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().peerPressure().with_('~tinkerpop.peerPressure.propertyName','cluster').with_('~tinkerpop.peerPressure.edges',__.outE('knows')).pageRank(float(1.0)).with_('~tinkerpop.pageRank.propertyName','rank').with_('~tinkerpop.pageRank.edges',__.outE('knows')).with_('~tinkerpop.pageRank.times',1).group().by('cluster').by(__.rank.sum())[0:100])], 
-    'g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXedges_outEX_withyXpropertyName_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().has('name','ripple').in_('created').peerPressure().with_('~tinkerpop.peerPressure.edges',__.outE()).with_('~tinkerpop.peerPressure.propertyName','cluster').repeat(__.union(__.identity(),__.both())).times(2).dedup().valueMap('name','cluster'))], 
+    'g_V_peerPressure_hasXclusterX': [(lambda g:g.V().peerPressure().has('gremlin.peerPressureVertexProgram.cluster'))], 
+    'g_V_peerPressure_withXpropertyName_clusterX_withXedges_outEXknowsXX_pageRankX1X_byXrankX_withXedges_outEXknowsX_withXtimes_2X_group_byXclusterX_byXrank_sumX_limitX100X': [(lambda g:g.V().peerPressure().with_('~tinkerpop.peerPressure.propertyName','cluster').with_('~tinkerpop.peerPressure.edges',__.outE('knows')).pageRank(float(1.0)).with_('~tinkerpop.pageRank.propertyName','rank').with_('~tinkerpop.pageRank.edges',__.outE('knows')).with_('~tinkerpop.pageRank.times',1).group().by('cluster').by(__.rank.sum())[0:100])], 
+    'g_V_hasXname_rippleX_inXcreatedX_peerPressure_withXedges_outEX_withyXpropertyName_clusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX': [(lambda g:g.V().has('name','ripple').in_('created').peerPressure().with_('~tinkerpop.peerPressure.edges',__.outE()).with_('~tinkerpop.peerPressure.propertyName','cluster').repeat(__.union(__.identity(),__.both())).times(2).dedup().valueMap('name','cluster'))], 
     'g_V_hasLabelXpersonX_projectXa_bX_byXoutE_countX_byXageX': [(lambda g:g.V().hasLabel('person').project('a','b').by(__.outE().count()).by('age'))], 
     'g_V_outXcreatedX_projectXa_bX_byXnameX_byXinXcreatedX_countX_order_byXselectXbX__descX_selectXaX': [(lambda g:g.V().out('created').project('a','b').by('name').by(__.in_('created').count()).order().by(__.select('b'),Order.desc).select('a'))], 
     'g_V_valueMap_projectXxX_byXselectXnameXX': [(lambda g:g.V().valueMap().project('x').by(__.select('name')))], 
@@ -569,21 +577,21 @@
     'g_EX11X_propertiesXweightX_asXaX_selectXaX_byXvalueX': [(lambda g, eid11=None:g.E(eid11).properties('weight').as_('a').select('a').by(T.value))], 
     'g_V_asXaX_selectXaX_byXageX': [(lambda g:g.V().as_('a').select('a').by('age'))], 
     'g_withSideEffectXk_nullX_injectXxX_selectXkX': [(lambda g:g.withSideEffect('k',None).inject('x').select('k'))], 
-    'g_V_shortestPath': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().identity().shortestPath())], 
-    'g_V_both_dedup_shortestPath': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().both().dedup().shortestPath())], 
-    'g_V_shortestPath_edgesIncluded': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().identity().shortestPath().with_('~tinkerpop.shortestPath.includeEdges'))], 
-    'g_V_shortestPath_directionXINX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().identity().shortestPath().with_('~tinkerpop.shortestPath.edges',Direction.IN))], 
-    'g_V_shortestPath_edgesXoutEX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().identity().shortestPath().with_('~tinkerpop.shortestPath.edges',__.outE()))], 
-    'g_V_shortestPath_edgesIncluded_edgesXoutEX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().identity().shortestPath().with_('~tinkerpop.shortestPath.includeEdges').with_('~tinkerpop.shortestPath.edges',__.outE()))], 
-    'g_V_hasXname_markoX_shortestPath': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().has('name','marko').shortestPath())], 
-    'g_V_shortestPath_targetXhasXname_markoXX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().identity().shortestPath().with_('~tinkerpop.shortestPath.target',__.has('name','marko')))], 
-    'g_V_shortestPath_targetXvaluesXnameX_isXmarkoXX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().identity().shortestPath().with_('~tinkerpop.shortestPath.target',__.name.is_('marko')))], 
-    'g_V_hasXname_markoX_shortestPath_targetXhasLabelXsoftwareXX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().has('name','marko').shortestPath().with_('~tinkerpop.shortestPath.target',__.hasLabel('software')))], 
-    'g_V_hasXname_markoX_shortestPath_targetXhasXname_joshXX_distanceXweightX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().has('name','marko').shortestPath().with_('~tinkerpop.shortestPath.target',__.has('name','josh')).with_('~tinkerpop.shortestPath.distance','weight'))], 
-    'g_V_hasXname_danielX_shortestPath_targetXhasXname_stephenXX_edgesXbothEXusesXX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().has('name','daniel').shortestPath().with_('~tinkerpop.shortestPath.target',__.has('name','stephen')).with_('~tinkerpop.shortestPath.edges',__.bothE('uses')))], 
-    'g_V_hasXsong_name_MIGHT_AS_WELLX_shortestPath_targetXhasXsong_name_MAYBE_YOU_KNOW_HOW_I_FEELXX_edgesXoutEXfollowedByXX_distanceXweightX': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().has('song','name','MIGHT AS WELL').shortestPath().with_('~tinkerpop.shortestPath.target',__.has('song','name','MAYBE YOU KNOW HOW I FEEL')).with_('~tinkerpop.shortestPath.edges',__.outE('followedBy')).with_('~tinkerpop.shortestPath.distance','weight'))], 
-    'g_V_hasXname_markoX_shortestPath_maxDistanceX1X': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().has('name','marko').shortestPath().with_('~tinkerpop.shortestPath.maxDistance',1))], 
-    'g_V_hasXname_vadasX_shortestPath_distanceXweightX_maxDistanceX1_3X': [(lambda g:g.withStrategies(*[TraversalStrategy('VertexProgramStrategy',{'graphComputer':'org.apache.tinkerpop.gremlin.process.computer.GraphComputer'}, 'org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V().has('name','vadas').shortestPath().with_('~tinkerpop.shortestPath.distance','weight').with_('~tinkerpop.shortestPath.maxDistance',float(1.3)))], 
+    'g_V_shortestPath': [(lambda g:g.V().identity().shortestPath())], 
+    'g_V_both_dedup_shortestPath': [(lambda g:g.V().both().dedup().shortestPath())], 
+    'g_V_shortestPath_edgesIncluded': [(lambda g:g.V().identity().shortestPath().with_('~tinkerpop.shortestPath.includeEdges'))], 
+    'g_V_shortestPath_directionXINX': [(lambda g:g.V().identity().shortestPath().with_('~tinkerpop.shortestPath.edges',Direction.IN))], 
+    'g_V_shortestPath_edgesXoutEX': [(lambda g:g.V().identity().shortestPath().with_('~tinkerpop.shortestPath.edges',__.outE()))], 
+    'g_V_shortestPath_edgesIncluded_edgesXoutEX': [(lambda g:g.V().identity().shortestPath().with_('~tinkerpop.shortestPath.includeEdges').with_('~tinkerpop.shortestPath.edges',__.outE()))], 
+    'g_V_hasXname_markoX_shortestPath': [(lambda g:g.V().has('name','marko').shortestPath())], 
+    'g_V_shortestPath_targetXhasXname_markoXX': [(lambda g:g.V().identity().shortestPath().with_('~tinkerpop.shortestPath.target',__.has('name','marko')))], 
+    'g_V_shortestPath_targetXvaluesXnameX_isXmarkoXX': [(lambda g:g.V().identity().shortestPath().with_('~tinkerpop.shortestPath.target',__.name.is_('marko')))], 
+    'g_V_hasXname_markoX_shortestPath_targetXhasLabelXsoftwareXX': [(lambda g:g.V().has('name','marko').shortestPath().with_('~tinkerpop.shortestPath.target',__.hasLabel('software')))], 
+    'g_V_hasXname_markoX_shortestPath_targetXhasXname_joshXX_distanceXweightX': [(lambda g:g.V().has('name','marko').shortestPath().with_('~tinkerpop.shortestPath.target',__.has('name','josh')).with_('~tinkerpop.shortestPath.distance','weight'))], 
+    'g_V_hasXname_danielX_shortestPath_targetXhasXname_stephenXX_edgesXbothEXusesXX': [(lambda g:g.V().has('name','daniel').shortestPath().with_('~tinkerpop.shortestPath.target',__.has('name','stephen')).with_('~tinkerpop.shortestPath.edges',__.bothE('uses')))], 
+    'g_V_hasXsong_name_MIGHT_AS_WELLX_shortestPath_targetXhasXsong_name_MAYBE_YOU_KNOW_HOW_I_FEELXX_edgesXoutEXfollowedByXX_distanceXweightX': [(lambda g:g.V().has('song','name','MIGHT AS WELL').shortestPath().with_('~tinkerpop.shortestPath.target',__.has('song','name','MAYBE YOU KNOW HOW I FEEL')).with_('~tinkerpop.shortestPath.edges',__.outE('followedBy')).with_('~tinkerpop.shortestPath.distance','weight'))], 
+    'g_V_hasXname_markoX_shortestPath_maxDistanceX1X': [(lambda g:g.V().has('name','marko').shortestPath().with_('~tinkerpop.shortestPath.maxDistance',1))], 
+    'g_V_hasXname_vadasX_shortestPath_distanceXweightX_maxDistanceX1_3X': [(lambda g:g.V().has('name','vadas').shortestPath().with_('~tinkerpop.shortestPath.distance','weight').with_('~tinkerpop.shortestPath.maxDistance',float(1.3)))], 
     'g_V_age_sum': [(lambda g:g.V().age.sum())], 
     'g_V_foo_sum': [(lambda g:g.V().foo.sum())], 
     'g_V_age_fold_sumXlocalX': [(lambda g:g.V().age.fold().sum(Scope.local))], 
@@ -647,7 +655,7 @@
     'g_VX1X_out_out_out': [(lambda g, vid1=None:g.V(vid1).out().out().out())], 
     'g_VX1X_out_name': [(lambda g, vid1=None:g.V(vid1).out().name)], 
     'g_VX1X_to_XOUT_knowsX': [(lambda g, vid1=None:g.V(vid1).to(Direction.OUT,'knows'))], 
-    'g_VX1_2_3_4X_name': [(lambda g, vid4=None,vid3=None,vid2=None,vid1=None:g.V(vid1,vid2,vid3,vid4).name)], 
+    'g_VX1_2_3_4X_name': [(lambda g, vid4=None,vid3=None,vid2=None,vid1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter').addE('knows').from_('marko').to('vadas').property('weight',float(0.5)).addE('knows').from_('marko').to('josh').property('weight',float(1.0)).addE('created').from_('marko').to('lop').property('weight',float(0.4)).addE('created').from_('josh').to('ripple').property('weight',float(1.0)).addE('created').from_('josh').to('lop').property('weight',float(0.4)).addE('created').from_('peter').to('lop').property('weight',float(0.2))), (lambda g, vid4=None,vid3=None,vid2=None,vid1=None:g.V().has('software','name','lop').drop()), (lambda g, vid4=None,vid3=None,vid2=None,vid1=None:g.V(vid1,vid2,vid3,vid4))], 
     'g_V_hasLabelXpersonX_V_hasLabelXsoftwareX_name': [(lambda g:g.V().hasLabel('person').V().hasLabel('software').name)], 
     'g_V_hasLabelXloopsX_bothEXselfX': [(lambda g:g.V().hasLabel('loops').bothE('self'))], 
     'g_V_hasLabelXloopsX_bothXselfX': [(lambda g:g.V().hasLabel('loops').both('self'))], 
@@ -667,7 +675,7 @@
     'g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX': [(lambda g:g.V().has('lang').group('a').by('lang').by('name').out().cap('a'))], 
     'g_V_hasXlangX_group_byXlangX_byXcountX': [(lambda g:g.V().has('lang').group().by('lang').by(__.count()))], 
     'g_V_repeatXout_groupXaX_byXnameX_byXcountX_timesX2X_capXaX': [(lambda g:g.V().repeat(__.out().group('a').by('name').by(__.count())).times(2).cap('a'))], 
-    'g_V_group_byXoutE_countX_byXnameX': [(lambda g:g.V().group().by(__.outE().count()).by('name'))], 
+    'g_V_group_byXoutE_countX_byXnameX': [(lambda g:g.V().order().by('name').group().by(__.outE().count()).by('name'))], 
     'g_V_groupXaX_byXlabelX_byXoutE_weight_sumX_capXaX': [(lambda g:g.V().group('a').by(T.label).by(__.outE().weight.sum()).cap('a'))], 
     'g_V_repeatXbothXfollowedByXX_timesX2X_group_byXsongTypeX_byXcountX': [(lambda g:g.V().repeat(__.both('followedBy')).times(2).group().by('songType').by(__.count()))], 
     'g_V_repeatXbothXfollowedByXX_timesX2X_groupXaX_byXsongTypeX_byXcountX_capXaX': [(lambda g:g.V().repeat(__.both('followedBy')).times(2).group('a').by('songType').by(__.count()).cap('a'))], 
@@ -679,7 +687,7 @@
     'g_V_outXfollowedByX_group_byXsongTypeX_byXbothE_group_byXlabelX_byXweight_sumXX': [(lambda g:g.V().out('followedBy').group().by('songType').by(__.bothE().group().by(T.label).by(__.weight.sum())))], 
     'g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX': [(lambda g:g.V().group('m').by('name').by(__.in_('knows').name).cap('m'))], 
     'g_V_group_byXlabelX_byXbothE_groupXaX_byXlabelX_byXweight_sumX_weight_sumX': [(lambda g:g.V().group().by(T.label).by(__.bothE().group('a').by(T.label).by(__.weight.sum()).weight.sum()))], 
-    'g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX': [(lambda g, xx1=None:g.withSideEffect('a',xx1).V().group('a').by('name').by(__.outE().label().fold()).cap('a'))], 
+    'g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX': [(lambda g, xx1=None:g.withSideEffect('a',xx1).V().group('a').by('name').by(__.outE().label().fold()).cap('a').unfold().group().by(Column.keys).by(__.select(Column.values).order(Scope.local).by(Order.asc)))], 
     'g_V_hasLabelXpersonX_asXpX_outXcreatedX_group_byXnameX_byXselectXpX_valuesXageX_sumX': [(lambda g:g.V().hasLabel('person').as_('p').out('created').group().by('name').by(__.select('p').age.sum()))], 
     'g_V_hasLabelXpersonX_asXpX_outXcreatedX_groupXaX_byXnameX_byXselectXpX_valuesXageX_sumX_capXaX': [(lambda g:g.V().hasLabel('person').as_('p').out('created').group('a').by('name').by(__.select('p').age.sum()).cap('a'))], 
     'g_V_group_byXlabelX_byXlabel_countX': [(lambda g:g.V().group().by(__.label()).by(__.label().count()))], 
diff --git a/gremlin-server/conf/gremlin-server-classic.yaml b/gremlin-server/conf/gremlin-server-classic.yaml
index 15b2397..726c007 100644
--- a/gremlin-server/conf/gremlin-server-classic.yaml
+++ b/gremlin-server/conf/gremlin-server-classic.yaml
@@ -38,6 +38,6 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
diff --git a/gremlin-server/conf/gremlin-server-modern-readonly.yaml b/gremlin-server/conf/gremlin-server-modern-readonly.yaml
index 705163f..1f81f9e 100644
--- a/gremlin-server/conf/gremlin-server-modern-readonly.yaml
+++ b/gremlin-server/conf/gremlin-server-modern-readonly.yaml
@@ -38,6 +38,6 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
diff --git a/gremlin-server/conf/gremlin-server-modern.yaml b/gremlin-server/conf/gremlin-server-modern.yaml
index e9ace56..70fb2ee 100644
--- a/gremlin-server/conf/gremlin-server-modern.yaml
+++ b/gremlin-server/conf/gremlin-server-modern.yaml
@@ -39,6 +39,6 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
diff --git a/gremlin-server/conf/gremlin-server-neo4j.yaml b/gremlin-server/conf/gremlin-server-neo4j.yaml
index 6f838af..6b9de38 100644
--- a/gremlin-server/conf/gremlin-server-neo4j.yaml
+++ b/gremlin-server/conf/gremlin-server-neo4j.yaml
@@ -55,7 +55,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/gremlin-server/conf/gremlin-server-rest-modern.yaml b/gremlin-server/conf/gremlin-server-rest-modern.yaml
index 9230820..a34b14e 100644
--- a/gremlin-server/conf/gremlin-server-rest-modern.yaml
+++ b/gremlin-server/conf/gremlin-server-rest-modern.yaml
@@ -35,6 +35,6 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
diff --git a/gremlin-server/conf/gremlin-server-rest-secure.yaml b/gremlin-server/conf/gremlin-server-rest-secure.yaml
index 8dc6191..fa58e9c 100644
--- a/gremlin-server/conf/gremlin-server-rest-secure.yaml
+++ b/gremlin-server/conf/gremlin-server-rest-secure.yaml
@@ -50,7 +50,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/gremlin-server/conf/gremlin-server-secure.yaml b/gremlin-server/conf/gremlin-server-secure.yaml
index 93c4323..41e0a83 100644
--- a/gremlin-server/conf/gremlin-server-secure.yaml
+++ b/gremlin-server/conf/gremlin-server-secure.yaml
@@ -54,7 +54,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/gremlin-server/conf/gremlin-server-spark.yaml b/gremlin-server/conf/gremlin-server-spark.yaml
index 8634eab..ea4cb807 100644
--- a/gremlin-server/conf/gremlin-server-spark.yaml
+++ b/gremlin-server/conf/gremlin-server-spark.yaml
@@ -68,7 +68,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/gremlin-server/conf/gremlin-server.yaml b/gremlin-server/conf/gremlin-server.yaml
index 4f210c8..f6e9f85 100644
--- a/gremlin-server/conf/gremlin-server.yaml
+++ b/gremlin-server/conf/gremlin-server.yaml
@@ -45,7 +45,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 65536
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/gremlin-server/conf/log4j-server.properties b/gremlin-server/conf/log4j-server.properties
deleted file mode 100644
index 8bf809c..0000000
--- a/gremlin-server/conf/log4j-server.properties
+++ /dev/null
@@ -1,32 +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.
-
-log4j.rootLogger=INFO, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C{1} - %m%n
-
-log4j.logger.org.apache.tinkerpop.gremlin.driver.Connection=OFF
-log4j.logger.org.apache.tinkerpop.gremlin.driver.ConnectionPool=OFF
-log4j.logger.org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph=ERROR
-log4j.logger.org.apache.hadoop.mapred.JobClient=INFO
-log4j.logger.org.apache.hadoop.mapreduce.Job=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.MapReduceGraphComputer=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.spark.process.computer.SparkGraphComputer=INFO
-log4j.logger.org.apache.spark.metrics.MetricsSystem=ERROR
-log4j.logger.com.jcabi.manifests.Manifests=OFF
diff --git a/gremlin-server/conf/logback.xml b/gremlin-server/conf/logback.xml
new file mode 100644
index 0000000..bc29ebc
--- /dev/null
+++ b/gremlin-server/conf/logback.xml
@@ -0,0 +1,36 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C{1} - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph" level="INFO"/>
+    <logger name="org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.MapReduceGraphComputer" level="INFO"/>
+    <logger name="org.apache.hadoop.mapreduce.Job" level="INFO"/>
+    <logger name="org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph" level="ERROR"/>
+    <logger name="org.apache.spark.metrics.MetricsSystem" level="ERROR"/>
+    <logger name="org.apache.tinkerpop.gremlin.spark.process.computer.SparkGraphComputer" level="INFO"/>
+    <logger name="org.apache.hadoop.mapred.JobClient" level="INFO"/>
+    <logger name="org.apache.tinkerpop.gremlin.driver.Connection" level="OFF"/>
+    <logger name="org.apache.tinkerpop.gremlin.driver.ConnectionPool" level="OFF"/>
+    <logger name="com.jcabi.manifests.Manifests" level="OFF"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-server/pom.xml b/gremlin-server/pom.xml
index d32329a..b971cb3 100644
--- a/gremlin-server/pom.xml
+++ b/gremlin-server/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-server</artifactId>
     <name>Apache TinkerPop :: Gremlin Server</name>
@@ -46,13 +46,8 @@
             <artifactId>commons-collections</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <optional>true</optional>
         </dependency>
         <!-- METRICS -->
@@ -100,6 +95,11 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>io.github.hakky54</groupId>
+            <artifactId>logcaptor</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
     <build>
         <directory>${basedir}/target</directory>
@@ -350,6 +350,16 @@
                                 </configuration>
                             </execution>
                             <execution>
+                                <id>docker-image-tag-latest</id>
+                                <goals>
+                                    <goal>tag</goal>
+                                </goals>
+                                <configuration>
+                                    <tag>latest</tag>
+                                    <skip>${only.when.is.prerelease.version}</skip>
+                                </configuration>
+                            </execution>
+                            <execution>
                                 <id>docker-image-push</id>
                                 <phase>deploy</phase>
                                 <goals>
@@ -371,6 +381,17 @@
                                     <skip>${only.when.is.prerelease.version}</skip>
                                 </configuration>
                             </execution>
+                            <execution>
+                                <id>docker-image-push-latest</id>
+                                <phase>deploy</phase>
+                                <goals>
+                                    <goal>push</goal>
+                                </goals>
+                                <configuration>
+                                    <tag>latest</tag>
+                                    <skip>${only.when.is.prerelease.version}</skip>
+                                </configuration>
+                            </execution>
                         </executions>
                         <configuration>
                             <repository>tinkerpop/gremlin-server</repository>
diff --git a/gremlin-server/src/main/bin/gremlin-server.bat b/gremlin-server/src/main/bin/gremlin-server.bat
index 73df2a3..8b94c9c 100644
--- a/gremlin-server/src/main/bin/gremlin-server.bat
+++ b/gremlin-server/src/main/bin/gremlin-server.bat
@@ -41,7 +41,7 @@
 :server
 
 :: Launch the application
-java -Dlog4j.configuration=conf/log4j-server.properties %JAVA_OPTIONS% %JAVA_ARGS% -cp "%LIBDIR%/*;%EXTDIR%;" org.apache.tinkerpop.gremlin.server.GremlinServer %*
+java -Dlogback.configurationFile=conf/log4back.xml %JAVA_OPTIONS% %JAVA_ARGS% -cp "%LIBDIR%/*;%EXTDIR%;" org.apache.tinkerpop.gremlin.server.GremlinServer %*
 
 :install
 
@@ -55,4 +55,4 @@
 
 :after_loop
 
-java -Dlog4j.configuration=conf/log4j-server.properties %JAVA_OPTIONS% %JAVA_ARGS% -cp "%LIBDIR%/*;%EXTDIR%;" org.apache.tinkerpop.gremlin.server.util.GremlinServerInstall %RESTVAR%
+java -Dlogback.configurationFile=conf/log4back.xml %JAVA_OPTIONS% %JAVA_ARGS% -cp "%LIBDIR%/*;%EXTDIR%;" org.apache.tinkerpop.gremlin.server.util.GremlinServerInstall %RESTVAR%
diff --git a/gremlin-server/src/main/bin/gremlin-server.sh b/gremlin-server/src/main/bin/gremlin-server.sh
index c114c64..41e446b 100755
--- a/gremlin-server/src/main/bin/gremlin-server.sh
+++ b/gremlin-server/src/main/bin/gremlin-server.sh
@@ -80,7 +80,7 @@
 fi
 
 # absolute file path requires 'file:'
-LOG4J_CONF="file:$GREMLIN_HOME/conf/log4j-server.properties"
+LOGBACK_CONF="file:$GREMLIN_HOME/conf/logback.xml"
 
 # Find Java
 if [[ "$JAVA_HOME" = "" ]] ; then
@@ -166,7 +166,7 @@
       exit 1
     fi
 
-    $JAVA -Dlog4j.configuration=$LOG4J_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_SERVER_CMD "$GREMLIN_YAML" >> "$LOG_FILE" 2>&1 &
+    $JAVA -Dlogback.configurationFile=$LOGBACK_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_SERVER_CMD "$GREMLIN_YAML" >> "$LOG_FILE" 2>&1 &
     PID=$!
     disown $PID
     echo $PID > "$PID_FILE"
@@ -184,7 +184,7 @@
       exit 1
     fi
 
-    su -c "$JAVA -Dlog4j.configuration=$LOG4J_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_SERVER_CMD \"$GREMLIN_YAML\" >> \"$LOG_FILE\" 2>&1 & echo \$! "  "$RUNAS" > "$PID_FILE"
+    su -c "$JAVA -Dlogback.configurationFile=$LOGBACK_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_SERVER_CMD \"$GREMLIN_YAML\" >> \"$LOG_FILE\" 2>&1 & echo \$! "  "$RUNAS" > "$PID_FILE"
     chown "$RUNAS" "$PID_FILE"
   fi
 
@@ -209,7 +209,7 @@
   fi
 
   if [[ -z "$RUNAS" ]]; then
-    $JAVA -Dlog4j.configuration=$LOG4J_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_SERVER_CMD "$GREMLIN_YAML"
+    $JAVA -Dlogback.configurationFile=$LOGBACK_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_SERVER_CMD "$GREMLIN_YAML"
     exit 0
   else
     echo Starting in foreground not supported with RUNAS
@@ -231,9 +231,9 @@
 
   DEPS="$@"
   if [[ -z "$RUNAS" ]]; then
-    $JAVA -Dlog4j.configuration=$LOG4J_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_INSTALL_CMD $DEPS
+    $JAVA -Dlogback.configurationFile=$LOGBACK_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_INSTALL_CMD $DEPS
   else
-    su -c "$JAVA -Dlog4j.configuration=$LOG4J_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_INSTALL_CMD $DEPS "  "$RUNAS"
+    su -c "$JAVA -Dlogback.configurationFile=$LOGBACK_CONF $JAVA_OPTIONS -cp $CLASSPATH $GREMLIN_INSTALL_CMD $DEPS "  "$RUNAS"
   fi
 
 }
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GremlinServer.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GremlinServer.java
index d022ffb..2cec205 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GremlinServer.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/GremlinServer.java
@@ -339,7 +339,7 @@
     }
 
     public static void main(final String[] args) throws Exception {
-        // add to vm options: -Dlog4j.configuration=file:conf/log4j.properties
+        // add to vm options: -Dlogback.configurationFile=file:conf/logback.xml
         printHeader();
         final String file;
         if (args.length > 0)
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 149372f..4dcbd78 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
@@ -143,7 +143,7 @@
      * return a 413 - Request Entity Too Large status code.  A response exceeding this size will raise an internal
      * exception.
      */
-    public int maxContentLength = 1024 * 64;
+    public int maxContentLength = 1024 * 1024 * 10;
 
     /**
      * Maximum number of request components that can be aggregated for a message.
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
index 3e4788f..0eeacce 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
@@ -38,16 +38,14 @@
 import org.apache.tinkerpop.gremlin.server.Settings;
 import org.apache.tinkerpop.gremlin.server.auth.AuthenticatedUser;
 import org.apache.tinkerpop.gremlin.server.handler.Frame;
+import org.apache.tinkerpop.gremlin.server.handler.SessionException;
 import org.apache.tinkerpop.gremlin.server.handler.StateKey;
 import org.apache.tinkerpop.gremlin.server.op.AbstractOpProcessor;
 import org.apache.tinkerpop.gremlin.server.op.OpProcessorException;
 import org.apache.tinkerpop.gremlin.server.util.MetricManager;
 import org.apache.tinkerpop.gremlin.server.util.TraverserIterator;
 import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
 import org.apache.tinkerpop.gremlin.util.function.ThrowingConsumer;
-import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,7 +73,6 @@
 public class TraversalOpProcessor extends AbstractOpProcessor {
     private static final Logger logger = LoggerFactory.getLogger(TraversalOpProcessor.class);
     private static final Logger auditLogger = LoggerFactory.getLogger(GremlinServer.AUDIT_LOGGER_NAME);
-    private static final ObjectMapper mapper = GraphSONMapper.build().version(GraphSONVersion.V2_0).create().createMapper();
     public static final String OP_PROCESSOR_NAME = "traversal";
     public static final Timer traversalOpTimer = MetricManager.INSTANCE.getTimer(name(GremlinServer.class, "op", "traversal"));
 
@@ -131,6 +128,13 @@
             throw new OpProcessorException(msg, ResponseMessage.build(message).code(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS).statusMessage(msg).create());
         }
 
+        // matches functionality in the UnifiedHandler
+        if (!(message.optionalArgs(Tokens.ARGS_GREMLIN).get() instanceof Bytecode)) {
+            final String msg = String.format("A message with [%s] op code requires a [%s] argument that is of type %s.",
+                    Tokens.OPS_BYTECODE, Tokens.ARGS_GREMLIN, Bytecode.class.getSimpleName());
+            throw new OpProcessorException(msg, ResponseMessage.build(message).code(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS).statusMessage(msg).create());
+        }
+
         return validatedAliases(message).get();
     }
 
@@ -155,11 +159,9 @@
         final Settings settings = context.getSettings();
         logger.debug("Traversal request {} for in thread {}", msg.getRequestId(), Thread.currentThread().getName());
 
-        // right now the TraversalOpProcessor can take a direct GraphSON representation of Bytecode or directly take
-        // deserialized Bytecode object.
+        // validateTraversalRequest() ensures that this is of type Bytecode
         final Object bytecodeObj = msg.getArgs().get(Tokens.ARGS_GREMLIN);
-        final Bytecode bytecode = bytecodeObj instanceof Bytecode ? (Bytecode) bytecodeObj :
-                mapper.readValue(bytecodeObj.toString(), Bytecode.class);
+        final Bytecode bytecode = (Bytecode) bytecodeObj;
 
         // earlier validation in selection of this op method should free us to cast this without worry
         final Map<String, String> aliases = (Map<String, String>) msg.optionalArgs(Tokens.ARGS_ALIASES).get();
diff --git a/gremlin-server/src/main/static/LICENSE b/gremlin-server/src/main/static/LICENSE
index f3da4f7..02b8fe9 100644
--- a/gremlin-server/src/main/static/LICENSE
+++ b/gremlin-server/src/main/static/LICENSE
@@ -225,7 +225,6 @@
 
      JCL 1.1.1 implemented over SLF4J (org.slf4j:jcl-over-slf4j:1.7.25 - http://www.slf4j.org) - for details, see licenses/slf4j
      SLF4J API Module (org.slf4j:slf4j-api:1.7.25 - http://www.slf4j.org) - for details, see licenses/slf4j
-     SLF4J LOG4J-12 Binding (org.slf4j:slf4j-log4j12:1.7.25 - http://www.slf4j.org) - for details, see licenses/slf4j
      Foundation stylesheet for CodeRay (http://foundation.zurb.com) - for details, see licenses/foundation
      normalize.css 2.1.2 (http://necolas.github.io/normalize.css/) - for details, see licenses/normalize
 
@@ -236,3 +235,8 @@
 The Apache TinkerPop project bundles the following components under the ISC License:
 
      jBCrypt (org.mindrot:jbcrypt:0.4 - https://github.com/djmdjm/jBCrypt) - for details, see licenses/jbcrypt
+
+The Apache TinkerPop project bundles the following components under the Eclipse Public License 1.0:
+
+     logback-core (ch.qos.logback:logback-core:1.2.3 - https://logback.qos.ch) - for details, see licenses/logback
+     logback-classic (ch.qos.logback:logback-classic:1.2.3 - https://logback.qos.ch) - for details, see licenses/logback
\ No newline at end of file
diff --git a/gremlin-server/src/main/static/licenses/logback b/gremlin-server/src/main/static/licenses/logback
new file mode 100644
index 0000000..8953762
--- /dev/null
+++ b/gremlin-server/src/main/static/licenses/logback
@@ -0,0 +1,14 @@
+Logback LICENSE
+---------------
+
+Logback: the reliable, generic, fast and flexible logging framework.
+Copyright (C) 1999-2015, QOS.ch. All rights reserved.
+
+This program and the accompanying materials are dual-licensed under
+either the terms of the Eclipse Public License v1.0 as published by
+the Eclipse Foundation
+
+  or (per the licensee's choosing)
+
+under the terms of the GNU Lesser General Public License version 2.1
+as published by the Free Software Foundation.
\ No newline at end of file
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 962cfc2..c10270b 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
@@ -18,50 +18,62 @@
  */
 package org.apache.tinkerpop.gremlin.driver;
 
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
 import io.netty.handler.codec.CorruptedFrameException;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import nl.altindag.log.LogCaptor;
+import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.ser.Serializers;
 import org.apache.tinkerpop.gremlin.server.AbstractGremlinServerIntegrationTest;
 import org.apache.tinkerpop.gremlin.server.TestClientFactory;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
+import org.hamcrest.core.Is;
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 
 public class ClientConnectionIntegrateTest extends AbstractGremlinServerIntegrationTest {
-    private Log4jRecordingAppender recordingAppender = null;
-    private Level previousLogLevel;
+
+    private static LogCaptor logCaptor;
+    private Level previousLevel;
+
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forClass(Connection.class);
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() {
+        logCaptor.close();
+    }
 
     @Before
     public void setupForEachTest() {
-        recordingAppender = new Log4jRecordingAppender();
-        final Logger rootLogger = Logger.getRootLogger();
+        final Logger lc = (Logger) LoggerFactory.getLogger(Connection.class);
+        previousLevel = lc.getLevel();
+        lc.setLevel(Level.DEBUG);
 
-        if (name.getMethodName().equals("shouldCloseConnectionDeadDueToUnRecoverableError")) {
-            final org.apache.log4j.Logger connectionLogger = org.apache.log4j.Logger.getLogger(Connection.class);
-            previousLogLevel = connectionLogger.getLevel();
-            connectionLogger.setLevel(Level.DEBUG);
-        }
-
-        rootLogger.addAppender(recordingAppender);
+        logCaptor.clearLogs();
     }
 
     @After
-    public void teardownForEachTest() {
-        final Logger rootLogger = Logger.getRootLogger();
-
-        if (name.getMethodName().equals("shouldCloseConnectionDeadDueToUnRecoverableError")) {
-            final org.apache.log4j.Logger connectionLogger = org.apache.log4j.Logger.getLogger(Connection.class);
-            connectionLogger.setLevel(previousLogLevel);
-        }
-
-        rootLogger.removeAppender(recordingAppender);
+    public void afterEachTest() {
+        final Logger lc = (Logger) LoggerFactory.getLogger(Connection.class);
+        lc.setLevel(previousLevel);
     }
 
     /**
@@ -106,7 +118,107 @@
 
         // Assert that the connection has been destroyed. Specifically check for the string with
         // isDead=true indicating the connection that was closed due to CorruptedFrameException.
-        assertThat(recordingAppender.logContainsAny("^(?!.*(isDead=false)).*isDead=true.*destroyed successfully.$"), is(true));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "^(?!.*(isDead=false)).*isDead=true.*destroyed successfully.$")), Is.is(true));
 
     }
+
+    @Test
+    public void shouldBalanceConcurrentRequestsAcrossConnections() throws InterruptedException {
+        final int connPoolSize = 16;
+        final Cluster cluster = TestClientFactory.build()
+                .minConnectionPoolSize(connPoolSize)
+                .maxConnectionPoolSize(connPoolSize)
+                .create();
+        final Client.ClusteredClient client = cluster.connect();
+        client.init();
+        final ExecutorService executorServiceForTesting = cluster.executor();
+
+        try {
+            final RequestMessage.Builder request = client.buildMessage(RequestMessage.build(Tokens.OPS_EVAL))
+                    .add(Tokens.ARGS_GREMLIN, "Thread.sleep(5000)");
+            final Callable<Connection> sendQueryCallable = () -> client.chooseConnection(request.create());
+            final List<Callable<Connection>> listOfTasks = new ArrayList<>();
+            for (int i = 0; i < connPoolSize; i++) {
+                listOfTasks.add(sendQueryCallable);
+            }
+
+            HashMap<String, Integer> channelsSize = new HashMap<>();
+
+            final List<Future<Connection>> executorSubmitFutures = executorServiceForTesting.invokeAll(listOfTasks);
+            executorSubmitFutures.parallelStream().map(fut -> {
+                try {
+                    return fut.get();
+                } catch (InterruptedException | ExecutionException e) {
+                    fail(e.getMessage());
+                    return null;
+                }
+            }).forEach(conn -> {
+                String id = conn.getChannelId();
+                channelsSize.put(id, channelsSize.getOrDefault(id, 0) + 1);
+            });
+
+            assertNotEquals(channelsSize.entrySet().size(), 0);
+            channelsSize.entrySet().forEach(entry -> {
+                assertEquals(1, (entry.getValue()).intValue());
+            });
+
+        } finally {
+            executorServiceForTesting.shutdown();
+            client.close();
+            cluster.close();
+        }
+    }
+
+    @Test
+    public void overLimitOperationsShouldDelegateToSingleNewConnection() throws InterruptedException {
+        final int operations = 6;
+        final int usagePerConnection = 3;
+        final Cluster cluster = TestClientFactory.build()
+                .minConnectionPoolSize(1)
+                .maxConnectionPoolSize(operations)
+                .minSimultaneousUsagePerConnection(1)
+                .maxSimultaneousUsagePerConnection(usagePerConnection)
+                .create();
+        final Client.ClusteredClient client = cluster.connect();
+        client.init();
+        final ExecutorService executorServiceForTesting = cluster.executor();
+
+        try {
+            final RequestMessage.Builder request = client.buildMessage(RequestMessage.build(Tokens.OPS_EVAL))
+                    .add(Tokens.ARGS_GREMLIN, "Thread.sleep(5000)");
+            final Callable<Connection> sendQueryCallable = () -> client.chooseConnection(request.create());
+            final List<Callable<Connection>> listOfTasks = new ArrayList<>();
+            for (int i = 0; i < operations; i++) {
+                listOfTasks.add(sendQueryCallable);
+            }
+
+            HashMap<String, Integer> connectionBorrowCount = new HashMap<>();
+
+            final List<Future<Connection>> executorSubmitFutures = executorServiceForTesting.invokeAll(listOfTasks);
+            executorSubmitFutures.parallelStream().map(fut -> {
+                try {
+                    return fut.get();
+                } catch (InterruptedException | ExecutionException e) {
+                    fail(e.getMessage());
+                    return null;
+                }
+            }).forEach(conn -> {
+                synchronized (this) {
+                    String id = conn.getChannelId();
+                    connectionBorrowCount.put(id, connectionBorrowCount.getOrDefault(id, 0) + 1);
+                }
+            });
+
+            assertEquals(2, connectionBorrowCount.size());
+            for (int finalBorrowCount : connectionBorrowCount.values()) {
+                assertEquals(usagePerConnection, finalBorrowCount);
+            }
+
+        } finally {
+            executorServiceForTesting.shutdown();
+            client.close();
+            cluster.close();
+        }
+    }
 }
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/ContextTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/ContextTest.java
index c7ff19f..56cb718 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/ContextTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/ContextTest.java
@@ -19,15 +19,14 @@
 package org.apache.tinkerpop.gremlin.server;
 
 import io.netty.channel.ChannelHandlerContext;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import nl.altindag.log.LogCaptor;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 import org.apache.tinkerpop.gremlin.server.handler.Frame;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
-import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -37,11 +36,29 @@
 import java.util.UUID;
 import java.util.function.BiFunction;
 
-import static org.junit.Assert.assertTrue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
 
 @RunWith(Parameterized.class)
 public class ContextTest {
 
+    private static LogCaptor logCaptor;
+
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forRoot();
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() {
+        logCaptor.close();
+    }
+
+    @Before
+    public void setupForEachTest() {
+        logCaptor.clearLogs();
+    }
+
     @Parameterized.Parameter(value = 0)
     public BiFunction<Context, ResponseStatusCode, Void> writeInvoker;
 
@@ -49,9 +66,6 @@
     private final RequestMessage request = RequestMessage.build("test").create();
     private final Settings settings = new Settings();
     private final Context context = new Context(request, ctx, settings, null, null, null);
-    private final Log4jRecordingAppender recordingAppender = new Log4jRecordingAppender();
-
-    private Level originalLogLevel;
 
     @Parameterized.Parameters(name = "{0}")
     public static Iterable<Object[]> data() {
@@ -86,21 +100,6 @@
         });
     }
 
-    @Before
-    public void addRecordingAppender() {
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.addAppender(recordingAppender);
-        originalLogLevel = rootLogger.getLevel();
-        rootLogger.setLevel(Level.ALL);
-    }
-
-    @After
-    public void removeRecordingAppender() {
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.setLevel(originalLogLevel);
-        rootLogger.removeAppender(recordingAppender);
-    }
-
     @Test
     public void shouldAllowMultipleNonFinalResponses() {
         writeInvoker.apply(context, ResponseStatusCode.AUTHENTICATE);
@@ -127,8 +126,10 @@
         Mockito.verify(ctx, Mockito.times(2)).flush();
 
         writeInvoker.apply(context, ResponseStatusCode.SERVER_ERROR_TIMEOUT);
-        assertTrue(recordingAppender.logContainsAny(".*" + request.getRequestId() + ".*"));
-        assertTrue(recordingAppender.logContainsAny(".*" + ResponseStatusCode.SERVER_ERROR_TIMEOUT + "$"));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches(".*" + request.getRequestId() + ".*")), is(true));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches(".*" + ResponseStatusCode.SERVER_ERROR_TIMEOUT + "$")), is(true));
 
         // ensure there were no other writes to the channel
         Mockito.verify(ctx, Mockito.times(2)).write(Mockito.any());
@@ -142,8 +143,10 @@
         Mockito.verify(ctx, Mockito.times(1)).flush();
 
         writeInvoker.apply(context, ResponseStatusCode.PARTIAL_CONTENT);
-        assertTrue(recordingAppender.logContainsAny(".*" + request.getRequestId() + ".*"));
-        assertTrue(recordingAppender.logContainsAny(".*" + ResponseStatusCode.PARTIAL_CONTENT + "$"));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches(".*" + request.getRequestId() + ".*")), is(true));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches(".*" + ResponseStatusCode.PARTIAL_CONTENT + "$")), is(true));
 
         // ensure there were no other writes to the channel
         Mockito.verify(ctx, Mockito.times(1)).write(Mockito.any());
@@ -159,8 +162,10 @@
         Frame frame = Mockito.mock(Frame.class);
         context.writeAndFlush(ResponseStatusCode.SUCCESS, frame);
 
-        assertTrue(recordingAppender.logContainsAny(".*" + request.getRequestId() + ".*"));
-        assertTrue(recordingAppender.logContainsAny(".*" + ResponseStatusCode.SUCCESS + "$"));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches(".*" + request.getRequestId() + ".*")), is(true));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches(".*" + ResponseStatusCode.SUCCESS + "$")), is(true));
 
         // ensure there were no other writes to the channel
         Mockito.verify(ctx, Mockito.times(1)).write(Mockito.any());
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 ba0dec6..9299a21 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
@@ -18,8 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.server;
 
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import nl.altindag.log.LogCaptor;
 import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.log4j.Level;
 import org.apache.tinkerpop.gremlin.TestHelper;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
@@ -37,7 +39,6 @@
 import org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1;
 import org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0;
 import org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0;
-import org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer;
 import org.apache.tinkerpop.gremlin.driver.ser.Serializers;
 import org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin;
 import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
@@ -48,18 +49,17 @@
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
-import groovy.json.JsonBuilder;
 import org.apache.tinkerpop.gremlin.util.TimeUtil;
 import org.apache.tinkerpop.gremlin.util.function.FunctionUtils;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
-import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.awt.Color;
@@ -109,44 +109,47 @@
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegrationTest {
-    private static final Logger logger = LoggerFactory.getLogger(GremlinDriverIntegrateTest.class);
+    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(GremlinDriverIntegrateTest.class);
 
-    private Log4jRecordingAppender recordingAppender = null;
+    private static LogCaptor logCaptor;
     private Level previousLogLevel;
 
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forRoot();
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() {
+        logCaptor.close();
+    }
+
     @Before
     public void setupForEachTest() {
-        recordingAppender = new Log4jRecordingAppender();
-        final org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger();
-
         if (name.getMethodName().equals("shouldKeepAliveForWebSockets") ||
                 name.getMethodName().equals("shouldKeepAliveForWebSocketsWithNoInFlightRequests")) {
-            final org.apache.log4j.Logger webSocketClientHandlerLogger = org.apache.log4j.Logger.getLogger(WebSocketClientHandler.class);
+            final Logger webSocketClientHandlerLogger = (Logger) LoggerFactory.getLogger(WebSocketClientHandler.class);
             previousLogLevel = webSocketClientHandlerLogger.getLevel();
             webSocketClientHandlerLogger.setLevel(Level.DEBUG);
         } else if (name.getMethodName().equals("shouldEventuallySucceedAfterMuchFailure")) {
-            final org.apache.log4j.Logger opExecutorHandlerLogger = org.apache.log4j.Logger.getLogger(OpExecutorHandler.class);
+            final Logger opExecutorHandlerLogger = (Logger) LoggerFactory.getLogger(OpExecutorHandler.class);
             previousLogLevel = opExecutorHandlerLogger.getLevel();
             opExecutorHandlerLogger.setLevel(Level.ERROR);
         }
 
-        rootLogger.addAppender(recordingAppender);
+        logCaptor.clearLogs();
     }
 
     @After
-    public void teardownForEachTest() {
-        final org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger();
-
+    public void afterEachTest() {
         if (name.getMethodName().equals("shouldKeepAliveForWebSockets") ||
                 name.getMethodName().equals("shouldKeepAliveForWebSocketsWithNoInFlightRequests")) {
-            final org.apache.log4j.Logger webSocketClientHandlerLogger = org.apache.log4j.Logger.getLogger(WebSocketClientHandler.class);
+            final Logger webSocketClientHandlerLogger = (Logger) LoggerFactory.getLogger(WebSocketClientHandler.class);
             webSocketClientHandlerLogger.setLevel(previousLogLevel);
         } else if (name.getMethodName().equals("shouldEventuallySucceedAfterMuchFailure")) {
-            final org.apache.log4j.Logger opExecutorHandlerLogger = org.apache.log4j.Logger.getLogger(OpExecutorHandler.class);
+            final Logger opExecutorHandlerLogger = (Logger) LoggerFactory.getLogger(OpExecutorHandler.class);
             opExecutorHandlerLogger.setLevel(previousLogLevel);
         }
-
-        rootLogger.removeAppender(recordingAppender);
     }
 
     /**
@@ -171,11 +174,11 @@
                 }
                 break;
             case "shouldFailWithBadClientSideSerialization":
-                final List<String> custom = Arrays.asList(
-                        JsonBuilder.class.getName() + ";" + JsonBuilderGryoSerializer.class.getName(),
-                        java.awt.Color.class.getName());
-                settings.serializers.stream().filter(s -> s.config.containsKey("custom"))
-                        .findFirst().get().config.put("custom", custom);
+                // add custom gryo config for Color
+                final List<String> custom = Collections.singletonList(
+                        Color.class.getName());
+                settings.serializers.stream().filter(s -> s.className.contains("Gryo"))
+                        .forEach(s -> s.config.put("custom", custom));
                 break;
             case "shouldExecuteScriptInSessionOnTransactionalGraph":
             case "shouldExecuteSessionlessScriptOnTransactionalGraph":
@@ -312,7 +315,7 @@
             }
 
             // there really shouldn't be more than 3 of these sent. should definitely be at least one though
-            final long messages = recordingAppender.getMessages().stream().filter(m -> m.contains("Sending ping frame to the server")).count();
+            final long messages = logCaptor.getLogs().stream().filter(m -> m.contains("Sending ping frame to the server")).count();
             assertThat(messages, allOf(greaterThan(0L), lessThanOrEqualTo(3L)));
         } finally {
             cluster.close();
@@ -343,7 +346,7 @@
             }
 
             // there really shouldn't be more than 3 of these sent. should definitely be at least one though
-            final long messages = recordingAppender.getMessages().stream().filter(m -> m.contains("Sending ping frame to the server")).count();
+            final long messages = logCaptor.getLogs().stream().filter(m -> m.contains("Sending ping frame to the server")).count();
             assertThat(messages, allOf(greaterThan(0L), lessThanOrEqualTo(3L)));
         } finally {
             cluster.close();
@@ -961,42 +964,6 @@
     }
 
     @Test
-    public void shouldDeserializeWithCustomClassesV1() throws Exception {
-        final Map<String, Object> m = new HashMap<>();
-        m.put("custom", Collections.singletonList(String.format("%s;%s", JsonBuilder.class.getCanonicalName(), JsonBuilderGryoSerializer.class.getCanonicalName())));
-        final GryoMessageSerializerV1d0 serializer = new GryoMessageSerializerV1d0();
-        serializer.configure(m, null);
-
-        final Cluster cluster = TestClientFactory.build().serializer(serializer).create();
-        final Client client = cluster.connect();
-
-        try {
-            final List<Result> json = client.submit("b = new groovy.json.JsonBuilder();b.people{person {fname 'stephen'\nlname 'mallette'}};b").all().join();
-            assertEquals("{\"people\":{\"person\":{\"fname\":\"stephen\",\"lname\":\"mallette\"}}}", json.get(0).getString());
-        } finally {
-            cluster.close();
-        }
-    }
-
-    @Test
-    public void shouldDeserializeWithCustomClassesV3() throws Exception {
-        final Map<String, Object> m = new HashMap<>();
-        m.put("custom", Collections.singletonList(String.format("%s;%s", JsonBuilder.class.getCanonicalName(), JsonBuilderGryoSerializer.class.getCanonicalName())));
-        final GryoMessageSerializerV3d0 serializer = new GryoMessageSerializerV3d0();
-        serializer.configure(m, null);
-
-        final Cluster cluster = TestClientFactory.build().serializer(serializer).create();
-        final Client client = cluster.connect();
-
-        try {
-            final List<Result> json = client.submit("b = new groovy.json.JsonBuilder();b.people{person {fname 'stephen'\nlname 'mallette'}};b").all().join();
-            assertEquals("{\"people\":{\"person\":{\"fname\":\"stephen\",\"lname\":\"mallette\"}}}", json.get(0).getString());
-        } finally {
-            cluster.close();
-        }
-    }
-
-    @Test
     public void shouldWorkWithGraphSONV1Serialization() throws Exception {
         final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V1D0).create();
         final Client client = cluster.connect();
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 770854a..fc4f475 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
@@ -84,19 +84,16 @@
         final MessageSerializer<Kryo> gryoMessageSerializerV3d0 = new GryoMessageSerializerV3d0();
         final Map<String,Object> gryoV3d0Config = new HashMap<>();
         gryoV3d0Config.put("ioRegistries", Collections.singletonList(TinkerIoRegistryV3d0.class.getName()));
-        gryoV3d0Config.put("custom", Collections.singletonList("groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer"));
         gryoMessageSerializerV3d0.configure(gryoV3d0Config, null);
 
         final MessageSerializer<Kryo> gryoMessageSerializerV1d0 = new GryoMessageSerializerV1d0();
         final Map<String,Object> gryoV1d0Config = new HashMap<>();
         gryoV1d0Config.put("ioRegistries", Collections.singletonList(TinkerIoRegistryV3d0.class.getName()));
-        gryoV1d0Config.put("custom", Collections.singletonList("groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer"));
         gryoMessageSerializerV1d0.configure(gryoV1d0Config, null);
 
         final MessageSerializer<Kryo> gryoLiteMessageSerializerV1d0 = new GryoLiteMessageSerializerV1d0();
         final Map<String,Object> gryoLiteV1d0Config = new HashMap<>();
         gryoLiteV1d0Config.put("ioRegistries", Collections.singletonList(TinkerIoRegistryV3d0.class.getName()));
-        gryoLiteV1d0Config.put("custom", Collections.singletonList("groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer"));
         gryoLiteMessageSerializerV1d0.configure(gryoLiteV1d0Config, null);
 
         return Arrays.asList(new Object[][]{
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogDeprecatedIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogDeprecatedIntegrateTest.java
index b337991..d459926 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogDeprecatedIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogDeprecatedIntegrateTest.java
@@ -18,13 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.server;
 
+import nl.altindag.log.LogCaptor;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggingEvent;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
 import org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection;
@@ -36,20 +35,19 @@
 import org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer;
 import org.apache.tinkerpop.gremlin.server.handler.SaslAndHttpBasicAuthenticationHandler;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
 import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Base64;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Stream;
 
-import static org.apache.log4j.Level.INFO;
-import static org.apache.tinkerpop.gremlin.server.GremlinServer.AUDIT_LOGGER_NAME;
 import static org.apache.tinkerpop.gremlin.server.GremlinServerAuthKrb5IntegrateTest.TESTCONSOLE;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -62,8 +60,7 @@
  * @author Marc de Lignie
  */
 public class GremlinServerAuditLogDeprecatedIntegrateTest extends AbstractGremlinServerIntegrationTest {
-    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(GremlinServerAuditLogDeprecatedIntegrateTest.class);
-    private Log4jRecordingAppender recordingAppender = null;
+    private static final Logger logger = LoggerFactory.getLogger(GremlinServerAuditLogDeprecatedIntegrateTest.class);
 
     private final ObjectMapper mapper = new ObjectMapper();
     private final Base64.Encoder encoder = Base64.getUrlEncoder();
@@ -74,12 +71,25 @@
 
     private KdcFixture kdcServer;
 
+    private static LogCaptor logCaptor;
+
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forRoot();
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() {
+        logCaptor.close();
+    }
+
+    @Before
+    public void setupForEachTest() {
+        logCaptor.clearLogs();
+    }
+
     @Override
     public void setUp() throws Exception {
-        recordingAppender = new Log4jRecordingAppender();
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.addAppender(recordingAppender);
-
         try {
             final String moduleBaseDir = System.getProperty("basedir", ".");
             final String authConfigName = moduleBaseDir + "/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-console-jaas.conf";
@@ -94,8 +104,6 @@
 
     @Override
     public void tearDown() throws Exception {
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.removeAppender(recordingAppender);
         kdcServer.close();
         System.clearProperty("java.security.auth.login.config");
         super.tearDown();
@@ -165,9 +173,12 @@
 
         // WebSocketChannelizer does not add SaslAuthenticationHandler for AllowAllAuthenticator,
         // so no authenticated user log line available
-        assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO, "User with address .+? requested: 1\\+1"));
-        assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO, "User with address .+? requested: 1\\+2"));
-        assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO, "User with address .+? requested: 1\\+3"));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+1")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+2")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+3")));
     }
 
     @Test
@@ -192,20 +203,14 @@
         Thread.sleep(1000);
 
         final String simpleAuthenticatorName = SimpleAuthenticator.class.getSimpleName();
-
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains(simpleAuthenticatorName)).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User %s with address .+? authenticated by %s", username, simpleAuthenticatorName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+1")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+2")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+3")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", username, simpleAuthenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+1")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+2")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+3")));
     }
 
     @Test
@@ -225,19 +230,15 @@
         stopServer();
         Thread.sleep(1000);
 
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains("Krb5Authenticator")).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User %s with address .+? authenticated by Krb5Authenticator", kdcServer.clientPrincipalName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+1")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+2")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+3")));
+        final String authenticatorName = Krb5Authenticator.class.getSimpleName();
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", kdcServer.clientPrincipalName, authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+1")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+2")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+3")));
     }
 
     @Test
@@ -257,15 +258,15 @@
         stopServer();
         Thread.sleep(1000);
 
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        assertFalse(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? authenticated by Krb5Authenticator")));
-        assertFalse(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+1")));
-        assertFalse(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+2")));
-        assertFalse(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-            item.getMessage().toString().matches("User with address .+? requested: 1\\+3")));
+        final String authenticatorName = Krb5Authenticator.class.getSimpleName();
+        assertFalse(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", kdcServer.clientPrincipalName, authenticatorName))));
+        assertFalse(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+1")));
+        assertFalse(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+2")));
+        assertFalse(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1\\+3")));
     }
 
     @Test
@@ -286,17 +287,11 @@
         stopServer();
         Thread.sleep(1000);
 
-        final String simpleAuthenticatorName = SimpleAuthenticator.class.getSimpleName();
-
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains(simpleAuthenticatorName)).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User stephen with address .+? authenticated by %s", simpleAuthenticatorName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1-1")));
+        final String authenticatorName = SimpleAuthenticator.class.getSimpleName();
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User stephen with address .+? authenticated by %s", authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User with address .+? requested: 1-1")));
     }
 
     @Test
@@ -318,17 +313,11 @@
         stopServer();
         Thread.sleep(1000);
 
-        final String simpleAuthenticatorName = SimpleAuthenticator.class.getSimpleName();
-
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains(simpleAuthenticatorName)).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User %s with address .+? authenticated by %s", username, simpleAuthenticatorName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: \\[\\[], \\[V\\(\\), count\\(\\)]]")));
+        final String authenticatorName = SimpleAuthenticator.class.getSimpleName();
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", username, authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User with address .+? requested: \\[\\[], \\[V\\(\\), count\\(\\)]]")));
     }
 
     @Test
@@ -360,27 +349,23 @@
         stopServer();
         Thread.sleep(1000);
 
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains("Krb5Authenticator")).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User %s with address .+? authenticated by Krb5Authenticator", kdcServer.clientPrincipalName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+1")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+2")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 1\\+3")));
+        final String authenticatorName = Krb5Authenticator.class.getSimpleName();
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", kdcServer.clientPrincipalName, authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User with address .+? requested: 1\\+1")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User with address .+? requested: 1\\+2")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User with address .+? requested: 1\\+3")));
 
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches(String.format("User %s with address .+? authenticated by Krb5Authenticator", kdcServer.clientPrincipalName2))));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 11\\+11")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 11\\+12")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User with address .+? requested: 11\\+13")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", kdcServer.clientPrincipalName2, authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User with address .+? requested: 11\\+11")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User with address .+? requested: 11\\+12")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User with address .+? requested: 11\\+13")));
     }
 }
\ No newline at end of file
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java
index bc981ed..1bc22d4 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuditLogIntegrateTest.java
@@ -18,13 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.server;
 
+import nl.altindag.log.LogCaptor;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggingEvent;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
 import org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection;
@@ -37,19 +36,18 @@
 import org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer;
 import org.apache.tinkerpop.gremlin.server.handler.SaslAndHttpBasicAuthenticationHandler;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
 import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.LoggerFactory;
 
 import java.util.Base64;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Stream;
 
-import static org.apache.log4j.Level.INFO;
 import static org.apache.tinkerpop.gremlin.server.GremlinServer.AUDIT_LOGGER_NAME;
 import static org.apache.tinkerpop.gremlin.server.GremlinServerAuthKrb5IntegrateTest.TESTCONSOLE;
 import static org.junit.Assert.assertEquals;
@@ -64,7 +62,8 @@
  */
 public class GremlinServerAuditLogIntegrateTest extends AbstractGremlinServerIntegrationTest {
     private static final org.slf4j.Logger logger = LoggerFactory.getLogger(GremlinServerAuditLogIntegrateTest.class);
-    private Log4jRecordingAppender recordingAppender = null;
+
+    private static LogCaptor logCaptor;
 
     private final ObjectMapper mapper = new ObjectMapper();
     private final Base64.Encoder encoder = Base64.getUrlEncoder();
@@ -75,12 +74,23 @@
 
     private KdcFixture kdcServer;
 
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forName(AUDIT_LOGGER_NAME);
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() {
+        logCaptor.close();
+    }
+
+    @Before
+    public void setupForEachTest() {
+        logCaptor.clearLogs();
+    }
+
     @Override
     public void setUp() throws Exception {
-        recordingAppender = new Log4jRecordingAppender();
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.addAppender(recordingAppender);
-
         try {
             final String moduleBaseDir = System.getProperty("basedir", ".");
             final String authConfigName = moduleBaseDir + "/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-console-jaas.conf";
@@ -95,8 +105,6 @@
 
     @Override
     public void tearDown() throws Exception {
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.removeAppender(recordingAppender);
         kdcServer.close();
         System.clearProperty("java.security.auth.login.config");
         super.tearDown();
@@ -166,12 +174,12 @@
 
         // WebSocketChannelizer does not add SaslAuthenticationHandler for AllowAllAuthenticator,
         // so no authenticated user log line available
-        assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO, String.format(
-                "User %s with address .+? requested: 1\\+1", AuthenticatedUser.ANONYMOUS_USERNAME)));
-        assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO, String.format(
-                "User %s with address .+? requested: 1\\+2", AuthenticatedUser.ANONYMOUS_USERNAME)));
-        assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO, String.format(
-                "User %s with address .+? requested: 1\\+3", AuthenticatedUser.ANONYMOUS_USERNAME)));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(String.format(
+                "User %s with address .+? requested: 1\\+1", AuthenticatedUser.ANONYMOUS_USERNAME))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(String.format(
+                "User %s with address .+? requested: 1\\+2", AuthenticatedUser.ANONYMOUS_USERNAME))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(String.format(
+                "User %s with address .+? requested: 1\\+3", AuthenticatedUser.ANONYMOUS_USERNAME))));
     }
 
     @Test
@@ -196,20 +204,14 @@
         Thread.sleep(1000);
 
         final String simpleAuthenticatorName = SimpleAuthenticator.class.getSimpleName();
-
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains(simpleAuthenticatorName)).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User %s with address .+? authenticated by %s", username, simpleAuthenticatorName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User stephen with address .+? requested: 1\\+1")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User stephen with address .+? requested: 1\\+2")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User stephen with address .+? requested: 1\\+3")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", username, simpleAuthenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User stephen with address .+? requested: 1\\+1")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User stephen with address .+? requested: 1\\+2")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User stephen with address .+? requested: 1\\+3")));
     }
 
     @Test
@@ -228,19 +230,15 @@
         stopServer();
         Thread.sleep(1000);
 
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains("Krb5Authenticator")).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User %s with address .+? authenticated by Krb5Authenticator", kdcServer.clientPrincipalName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+1")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+2")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+3")));
+        final String authenticatorName = Krb5Authenticator.class.getSimpleName();
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", kdcServer.clientPrincipalName, authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User drankye with address .+? requested: 1\\+1")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User drankye with address .+? requested: 1\\+2")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User drankye with address .+? requested: 1\\+3")));
     }
 
     @Test
@@ -259,15 +257,15 @@
         stopServer();
         Thread.sleep(1000);
 
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        assertFalse(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? authenticated by Krb5Authenticator")));
-        assertFalse(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+1")));
-        assertFalse(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+2")));
-        assertFalse(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-            item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+3")));
+        final String authenticatorName = Krb5Authenticator.class.getSimpleName();
+        assertFalse(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", kdcServer.clientPrincipalName, authenticatorName))));
+        assertFalse(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User drankye with address .+? requested: 1\\+1")));
+        assertFalse(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User drankye with address .+? requested: 1\\+2")));
+        assertFalse(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User drankye with address .+? requested: 1\\+3")));
     }
 
     @Test
@@ -288,17 +286,11 @@
         stopServer();
         Thread.sleep(1000);
 
-        final String simpleAuthenticatorName = SimpleAuthenticator.class.getSimpleName();
-
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains(simpleAuthenticatorName)).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User stephen with address .+? authenticated by %s", simpleAuthenticatorName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User stephen with address .+? requested: 2-1")));
+        final String authenticatorName = SimpleAuthenticator.class.getSimpleName();
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User stephen with address .+? authenticated by %s", authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User stephen with address .+? requested: 2-1")));
     }
 
     @Test
@@ -320,17 +312,11 @@
         stopServer();
         Thread.sleep(1000);
 
-        final String simpleAuthenticatorName = SimpleAuthenticator.class.getSimpleName();
-
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains(simpleAuthenticatorName)).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User %s with address .+? authenticated by %s", username, simpleAuthenticatorName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User .+? with address .+? requested: \\[\\[], \\[V\\(\\), count\\(\\)]]")));
+        final String authenticatorName = SimpleAuthenticator.class.getSimpleName();
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", username, authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User .+? with address .+? requested: \\[\\[], \\[V\\(\\), count\\(\\)]]")));
     }
 
     @Test
@@ -362,27 +348,23 @@
         stopServer();
         Thread.sleep(1000);
 
-        final List<LoggingEvent> log = recordingAppender.getEvents();
-        final Stream<LoggingEvent> auditEvents = log.stream().filter(event -> event.getLoggerName().equals(AUDIT_LOGGER_NAME));
-        final LoggingEvent authEvent = auditEvents
-                .filter(event -> event.getMessage().toString().contains("Krb5Authenticator")).iterator().next();
-        final String authMsg = authEvent.getMessage().toString();
-        assertTrue(authEvent.getLevel() == INFO &&
-                authMsg.matches(String.format("User %s with address .+? authenticated by Krb5Authenticator", kdcServer.clientPrincipalName)));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+1")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+2")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye with address .+? requested: 1\\+3")));
+        final String authenticatorName = Krb5Authenticator.class.getSimpleName();
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", kdcServer.clientPrincipalName, authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User drankye with address .+? requested: 1\\+1")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User drankye with address .+? requested: 1\\+2")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User drankye with address .+? requested: 1\\+3")));
 
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches(String.format("User %s with address .+? authenticated by Krb5Authenticator", kdcServer.clientPrincipalName2))));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye2 with address .+? requested: 11\\+11")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye2 with address .+? requested: 11\\+12")));
-        assertTrue(log.stream().anyMatch(item -> item.getLevel() == INFO &&
-                item.getMessage().toString().matches("User drankye2 with address .+? requested: 11\\+13")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                String.format("User %s with address .+? authenticated by %s", kdcServer.clientPrincipalName2, authenticatorName))));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User drankye2 with address .+? requested: 11\\+11")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User drankye2 with address .+? requested: 11\\+12")));
+        assertTrue(logCaptor.getLogs().stream().anyMatch(m ->
+                m.matches("User drankye2 with address .+? requested: 11\\+13")));
     }
 }
\ No newline at end of file
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 2244fb6..6307a03 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
@@ -19,7 +19,6 @@
 package org.apache.tinkerpop.gremlin.server;
 
 import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.log4j.Level;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
 import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
@@ -53,16 +52,9 @@
     static final String TESTCONSOLE_NOT_LOGGED_IN = "UserNotLoggedIn";
 
     private KdcFixture kdcServer;
-    private Level previousLogLevel;
 
     @Override
     public void setUp() throws Exception {
-        // this logger is noisy for travis and we don't assert anything and the error is already tracked on
-        // the server so we can trim the logs a bit with this.
-        final org.apache.log4j.Logger handlerLogger = org.apache.log4j.Logger.getLogger(
-                "org.apache.tinkerpop.gremlin.driver.Handler$GremlinResponseHandler");
-        previousLogLevel = handlerLogger.getLevel();
-        handlerLogger.setLevel(Level.OFF);
 
         try {
             final String projectBaseDir = System.getProperty("basedir", ".");
@@ -78,10 +70,6 @@
 
     @Override
     public void tearDown() throws Exception {
-        final org.apache.log4j.Logger handlerLogger = org.apache.log4j.Logger.getLogger(
-                "org.apache.tinkerpop.gremlin.driver.Handler$GremlinResponseHandler");
-        handlerLogger.setLevel(previousLogLevel);
-
         kdcServer.close();
         System.clearProperty("java.security.auth.login.config");
         super.tearDown();
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthzIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthzIntegrateTest.java
index 00eacda..b3069fd 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthzIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerAuthzIntegrateTest.java
@@ -18,12 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.server;
 
+import nl.altindag.log.LogCaptor;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
-import org.apache.log4j.Logger;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
 import org.apache.tinkerpop.gremlin.driver.exception.ResponseException;
@@ -31,26 +31,28 @@
 import org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection;
 import org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.AbstractWarningVerificationStrategy;
 import org.apache.tinkerpop.gremlin.server.auth.AllowAllAuthenticator;
 import org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator;
 import org.apache.tinkerpop.gremlin.server.authz.AllowListAuthorizer;
 import org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer;
 import org.apache.tinkerpop.gremlin.server.handler.SaslAndHttpBasicAuthenticationHandler;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
 import org.apache.tinkerpop.gremlin.util.function.Lambda;
 import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import java.util.Base64;
 import java.util.HashMap;
 import java.util.Objects;
 
-import static org.apache.log4j.Level.INFO;
-import static org.apache.tinkerpop.gremlin.server.GremlinServer.AUDIT_LOGGER_NAME;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 /**
@@ -60,25 +62,24 @@
  * @author Marc de Lignie
  */
 public class GremlinServerAuthzIntegrateTest extends AbstractGremlinServerIntegrationTest {
+    private static LogCaptor logCaptor;
 
-    private Log4jRecordingAppender recordingAppender;
     private final ObjectMapper mapper = new ObjectMapper();
     private final Base64.Encoder encoder = Base64.getUrlEncoder();
 
-    @Override
-    public void setUp() throws Exception {
-        recordingAppender = new Log4jRecordingAppender();
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.addAppender(recordingAppender);
-        super.setUp();
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forRoot();
     }
 
-    @Override
-    public void tearDown() throws Exception {
-        super.tearDown();
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.removeAppender(recordingAppender);
-        super.tearDown();
+    @Before
+    public void resetLogs() {
+        logCaptor.clearLogs();
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+        logCaptor.close();
     }
 
     /**
@@ -176,9 +177,9 @@
             stopServer();
             Thread.sleep(1000);
 
-            assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO,
+            assertThat(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
                     "User stephen with address .+? attempted an unauthorized request for bytecode operation: " +
-                            "\\[\\[], \\[V\\(\\), map\\(lambda\\[it.get\\(\\).value\\('name'\\)]\\), count\\(\\)]]"));
+                    "\\[\\[], \\[V\\(\\), map\\(lambda\\[it.get\\(\\).value\\('name'\\)]\\), count\\(\\)]]")), is(true));
         } finally {
             cluster.close();
         }
@@ -237,8 +238,8 @@
             stopServer();
             Thread.sleep(1000);
 
-            assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO,
-                    "User stephen with address .+? attempted an unauthorized request for eval operation: 1\\+1"));
+            assertThat(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                    "User stephen with address .+? attempted an unauthorized request for eval operation: 1\\+1")), is(true));
         } finally {
             cluster.close();
         }
@@ -337,8 +338,8 @@
         stopServer();
         Thread.sleep(1000);
 
-        assertTrue(recordingAppender.logMatchesAny(AUDIT_LOGGER_NAME, INFO,
-                "User stephen with address .+? attempted an unauthorized http request: 3-1"));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                "User stephen with address .+? attempted an unauthorized http request: 3-1")), is(true));
     }
 
     @Test
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 fcda9b9..2f88ddc 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
@@ -18,11 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.server;
 
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import nl.altindag.log.LogCaptor;
 import org.apache.commons.configuration2.BaseConfiguration;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
 import org.apache.tinkerpop.gremlin.TestHelper;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
@@ -40,29 +41,29 @@
 import org.apache.tinkerpop.gremlin.groovy.jsr223.GroovyCompilerGremlinPlugin;
 import org.apache.tinkerpop.gremlin.groovy.jsr223.customizer.SimpleSandboxExtension;
 import org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin;
+import org.apache.tinkerpop.gremlin.server.handler.OpSelectorHandler;
 import org.apache.tinkerpop.gremlin.server.handler.UnifiedHandler;
 import org.apache.tinkerpop.gremlin.structure.RemoteGraph;
 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.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.server.handler.OpSelectorHandler;
 import org.apache.tinkerpop.gremlin.server.op.AbstractEvalOpProcessor;
 import org.apache.tinkerpop.gremlin.server.op.standard.StandardOpProcessor;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
 import org.apache.tinkerpop.gremlin.util.function.Lambda;
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.Matchers;
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -104,7 +105,6 @@
     private Level previousLogLevel;
     private static final org.slf4j.Logger logger = LoggerFactory.getLogger(GremlinServerIntegrateTest.class);
 
-    private Log4jRecordingAppender recordingAppender = null;
     private final Supplier<Graph> graphGetter = () -> server.getServerGremlinExecutor().getGraphManager().getGraph("graph");
     private final Configuration conf = new BaseConfiguration() {{
         setProperty(Graph.GRAPH, RemoteGraph.class.getName());
@@ -115,36 +115,42 @@
         setProperty("clusterConfiguration.hosts", "localhost");
     }};
 
+    private static LogCaptor logCaptor;
+
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forRoot();
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() {
+        logCaptor.close();
+    }
+
     @Before
     public void setupForEachTest() {
-        recordingAppender = new Log4jRecordingAppender();
-        final Logger rootLogger = Logger.getRootLogger();
 
         if (name.getMethodName().equals("shouldPingChannelIfClientDies") ||
                 name.getMethodName().equals("shouldCloseChannelIfClientDoesntRespond")) {
-            final org.apache.log4j.Logger opSelectorHandlerLogger = org.apache.log4j.Logger.getLogger(OpSelectorHandler.class);
-            final org.apache.log4j.Logger unifiedHandlerLogger = org.apache.log4j.Logger.getLogger(UnifiedHandler.class);
+            final Logger opSelectorHandlerLogger = (Logger) LoggerFactory.getLogger(OpSelectorHandler.class);
+            final Logger unifiedHandlerLogger = (Logger) LoggerFactory.getLogger(UnifiedHandler.class);
             previousLogLevel = opSelectorHandlerLogger.getLevel();
             opSelectorHandlerLogger.setLevel(Level.INFO);
             unifiedHandlerLogger.setLevel(Level.INFO);
         }
 
-        rootLogger.addAppender(recordingAppender);
+        logCaptor.clearLogs();
     }
 
     @After
     public void teardownForEachTest() {
-        final Logger rootLogger = Logger.getRootLogger();
-
         if (name.getMethodName().equals("shouldPingChannelIfClientDies")||
                 name.getMethodName().equals("shouldCloseChannelIfClientDoesntRespond")) {
-            final org.apache.log4j.Logger opSelectorHandlerLogger = org.apache.log4j.Logger.getLogger(OpSelectorHandler.class);
+            final Logger opSelectorHandlerLogger = (Logger) LoggerFactory.getLogger(OpSelectorHandler.class);
             opSelectorHandlerLogger.setLevel(previousLogLevel);
-            final org.apache.log4j.Logger unifiedHandlerLogger = org.apache.log4j.Logger.getLogger(UnifiedHandler.class);
+            final Logger unifiedHandlerLogger = (Logger) LoggerFactory.getLogger(UnifiedHandler.class);
             unifiedHandlerLogger.setLevel(previousLogLevel);
         }
-
-        rootLogger.removeAppender(recordingAppender);
     }
 
     /**
@@ -330,7 +336,8 @@
         // will autoclose the channel
         Thread.sleep(2000);
 
-        assertThat(recordingAppender.logContainsAny(".*Closing channel - client is disconnected after idle period of .*$"), is(true));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                ".*Closing channel - client is disconnected after idle period of .*$")), is(true));
 
         client.close();
     }
@@ -350,7 +357,8 @@
         // stop the server to be sure that logs flush
         stopServer();
 
-        assertThat(recordingAppender.logContainsAny(".*Checking channel - sending ping to client after idle period of .*$"), is(true));
+        assertThat(logCaptor.getLogs().stream().anyMatch(m -> m.matches(
+                ".*Checking channel - sending ping to client after idle period of .*$")), is(true));
     }
 
     @Test
@@ -561,7 +569,8 @@
             assertThat(faulty.get(), is(false));
             assertThat(expected.get(), is(true));
 
-            assertThat(recordingAppender.getMessages().stream().anyMatch(m -> m.contains("Pausing response writing as writeBufferHighWaterMark exceeded on")), is(true));
+            assertThat(logCaptor.getLogs().stream().anyMatch(m -> m.contains(
+                    "Pausing response writing as writeBufferHighWaterMark exceeded on")), is(true));
         } catch (Exception ex) {
             fail("Shouldn't have tossed an exception");
         } finally {
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java
index 588d36b..af7f788 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerSessionIntegrateTest.java
@@ -18,12 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.server;
 
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import nl.altindag.log.LogCaptor;
 import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
 import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.Cluster;
-import org.apache.tinkerpop.gremlin.driver.RequestOptions;
 import org.apache.tinkerpop.gremlin.driver.Result;
 import org.apache.tinkerpop.gremlin.driver.ResultSet;
 import org.apache.tinkerpop.gremlin.driver.Tokens;
@@ -35,10 +35,12 @@
 import org.apache.tinkerpop.gremlin.server.channel.UnifiedChannelizer;
 import org.apache.tinkerpop.gremlin.server.op.session.Session;
 import org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor;
-import org.apache.tinkerpop.gremlin.util.Log4jRecordingAppender;
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -63,31 +65,39 @@
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public class GremlinServerSessionIntegrateTest extends AbstractGremlinServerIntegrationTest {
-    private Log4jRecordingAppender recordingAppender = null;
+    private static LogCaptor logCaptor;
     private Level originalLevel;
 
+    @BeforeClass
+    public static void setupLogCaptor() {
+        logCaptor = LogCaptor.forRoot();
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() {
+        logCaptor.close();
+    }
+
     @Before
     public void setupForEachTest() {
-        recordingAppender = new Log4jRecordingAppender();
-        final Logger rootLogger = Logger.getRootLogger();
-        originalLevel = rootLogger.getLevel();
         final String nameOfTest = name.getMethodName();
         switch (nameOfTest) {
             case "shouldCloseSessionOnceOnRequest":
             case "shouldHaveTheSessionTimeout":
             case "shouldCloseSessionOnClientClose":
-                final org.apache.log4j.Logger sessionLogger = org.apache.log4j.Logger.getLogger(Session.class);
+                final Logger sessionLogger = (Logger) LoggerFactory.getLogger(Session.class);
+                originalLevel = sessionLogger.getLevel();
                 sessionLogger.setLevel(Level.DEBUG);
                 break;
         }
-        rootLogger.addAppender(recordingAppender);
+
+        logCaptor.clearLogs();
     }
 
     @After
     public void teardownForEachTest() {
-        final org.apache.log4j.Logger sessionLogger = org.apache.log4j.Logger.getLogger(Session.class);
+        final Logger sessionLogger = (Logger) LoggerFactory.getLogger(Session.class);
         sessionLogger.setLevel(originalLevel);
-        sessionLogger.removeAppender(recordingAppender);
     }
 
     /**
@@ -269,8 +279,8 @@
         if (isUsingUnifiedChannelizer()) {
             assertThat(((UnifiedChannelizer) server.getChannelizer()).getUnifiedHandler().isActiveSession(name.getMethodName()), is(false));
         } else {
-            assertThat(recordingAppender.getMessages(), hasItem("DEBUG - Skipped attempt to close open graph transactions on shouldCloseSessionOnClientClose - close was forced\n"));
-            assertThat(recordingAppender.getMessages(), hasItem("DEBUG - Session shouldCloseSessionOnClientClose closed\n"));
+            assertThat(logCaptor.getLogs(), hasItem("Skipped attempt to close open graph transactions on shouldCloseSessionOnClientClose - close was forced"));
+            assertThat(logCaptor.getLogs(), hasItem("Session shouldCloseSessionOnClientClose closed"));
         }
 
         // try to reconnect to that session and make sure no state is there
@@ -476,8 +486,8 @@
         if (isUsingUnifiedChannelizer()) {
             assertThat(((UnifiedChannelizer) server.getChannelizer()).getUnifiedHandler().isActiveSession(name.getMethodName()), is(false));
         } else {
-            assertEquals(1, recordingAppender.getMessages().stream()
-                    .filter(msg -> msg.equals("DEBUG - Session shouldCloseSessionOnceOnRequest closed\n")).count());
+            assertEquals(1, logCaptor.getLogs().stream()
+                    .filter(msg -> msg.equals("Session shouldCloseSessionOnceOnRequest closed")).count());
         }
     }
 
@@ -530,8 +540,8 @@
             assertThat(((UnifiedChannelizer) server.getChannelizer()).getUnifiedHandler().isActiveSession(name.getMethodName()), is(false));
         } else {
             // there will be one for the timeout and a second for closing the cluster
-            assertEquals(2, recordingAppender.getMessages().stream()
-                    .filter(msg -> msg.equals("DEBUG - Session shouldHaveTheSessionTimeout closed\n")).count());
+            assertEquals(2, logCaptor.getLogs().stream()
+                    .filter(msg -> msg.equals("Session shouldHaveTheSessionTimeout closed")).count());
         }
     }
 
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppender.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppender.java
deleted file mode 100644
index 9a59c06..0000000
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppender.java
+++ /dev/null
@@ -1,85 +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;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Level;
-import org.apache.log4j.PatternLayout;
-import org.apache.log4j.spi.LoggingEvent;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * Provides a way to gather logging events for purpose of testing log output.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class Log4jRecordingAppender extends AppenderSkeleton {
-    private final List<String> messages = new ArrayList<>();
-    private final List<LoggingEvent> events = new ArrayList<>();
-
-    public Log4jRecordingAppender() {
-        super();
-        setLayout(new PatternLayout("%p - %m%n")); // note the EOLN char(s) appended
-    }
-
-    @Override
-    protected void append(final LoggingEvent event) {
-        messages.add(layout.format(event));
-        events.add(event);
-    }
-
-    @Override
-    public void close() {
-    }
-
-    @Override
-    public boolean requiresLayout() {
-        return true;
-    }
-
-    public List<String> getMessages() { return messages; }
-
-    public List<LoggingEvent> getEvents() { return events; }
-
-    public void clear() {
-        messages.clear();
-    }
-
-    /**
-     * @param regex not null
-     * @return true if there is a substring of a message matching the regular expression, where:
-     *         . matches also the EOLN char(s) defined in the layout.
-     *         $ matches the end of the string
-     */
-    public boolean logContainsAny(final String regex) {
-        Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
-        return messages.stream().anyMatch(m -> pattern.matcher( m ).find());
-    }
-
-    public boolean logContainsAny(final String loggerName, final Level level, final String fragment) {
-        return events.stream().anyMatch(m -> m.getLoggerName().equals(loggerName) &&
-                m.getLevel().equals(level) && m.getMessage().toString().contains(fragment));
-    }
-    public boolean logMatchesAny(final String loggerName, final Level level, final String regex) {
-        return events.stream().anyMatch(m -> m.getLoggerName().equals(loggerName) &&
-                m.getLevel().equals(level) && m.getMessage().toString().matches(regex));
-    }
-}
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppenderTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppenderTest.java
deleted file mode 100644
index 05cb437..0000000
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/util/Log4jRecordingAppenderTest.java
+++ /dev/null
@@ -1,86 +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;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.LoggerFactory;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class Log4jRecordingAppenderTest {
-    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Log4jRecordingAppenderTest.class);
-    private Log4jRecordingAppender recordingAppender = null;
-    private static final String lineSeparator = System.getProperty("line.separator");
-
-    private Level originalConfiguredLevel = null;
-
-    @Before
-    public void setupForEachTest() {
-        recordingAppender = new Log4jRecordingAppender();
-        final Logger rootLogger = Logger.getRootLogger();
-        if (null == originalConfiguredLevel) originalConfiguredLevel = rootLogger.getLevel();
-        rootLogger.addAppender(recordingAppender);
-        rootLogger.setLevel(Level.ALL);
-
-        logger.error("ERROR");
-        logger.warn("WARN");
-        logger.info("INFO");
-    }
-
-    @After
-    public void teardownForEachTest() {
-        final Logger rootLogger = Logger.getRootLogger();
-        rootLogger.removeAppender(recordingAppender);
-        rootLogger.setLevel(originalConfiguredLevel);
-    }
-
-    @Test
-    public void shouldRecordMessages() {
-        assertEquals(3, recordingAppender.getMessages().size());
-        assertEquals("ERROR - ERROR" + lineSeparator, recordingAppender.getMessages().get(0));
-        assertEquals("WARN - WARN"  + lineSeparator, recordingAppender.getMessages().get(1));
-        assertEquals("INFO - INFO" + lineSeparator, recordingAppender.getMessages().get(2));
-    }
-
-    @Test
-    public void shouldMatchAnyMessages() {
-        assertThat(recordingAppender.logContainsAny("ERROR.*"), is(true));
-    }
-
-    @Test
-    public void shouldMatchNoMessages() {
-        assertThat(recordingAppender.logContainsAny("this is not here"), is(false));
-    }
-
-    @Test
-    public void shouldClearMessages() {
-        assertEquals(3, recordingAppender.getMessages().size());
-        recordingAppender.clear();
-        assertEquals(0, recordingAppender.getMessages().size());
-    }
-}
diff --git a/gremlin-server/src/test/resources/log4j-silent.properties b/gremlin-server/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 1825bb0..0000000
--- a/gremlin-server/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,23 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-server/src/test/resources/log4j-test.properties b/gremlin-server/src/test/resources/log4j-test.properties
deleted file mode 100644
index 4485712..0000000
--- a/gremlin-server/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,28 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-log4j.logger.org.apache.tinkerpop.gremlin.server.AbstractChannelizer=ERROR
-log4j.logger.org.apache.tinkerpop.gremlin.server.AbstractGremlinServerIntegrationTest=INFO
-log4j.logger.org.apache.tinkerpop.gremlin.server.op.AbstractEvalOpProcessor=ERROR
-log4j.logger.org.apache.tinkerpop.gremlin.server.handler.MultiTaskSession=ERROR
-log4j.logger.org.apache.tinkerpop.gremlin.server.handler.SingleTaskSession=ERROR
-log4j.logger.audit.org.apache.tinkerpop.gremlin.server=INFO
diff --git a/gremlin-server/src/test/resources/logback-silent.xml b/gremlin-server/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..4e7e08b
--- /dev/null
+++ b/gremlin-server/src/test/resources/logback-silent.xml
@@ -0,0 +1,27 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.tinkerpop.gremlin.server.Context" level="WARN"/>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-server/src/test/resources/logback-test.xml b/gremlin-server/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..b115427
--- /dev/null
+++ b/gremlin-server/src/test/resources/logback-test.xml
@@ -0,0 +1,36 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.tinkerpop.gremlin.server.handler.MultiTaskSession" level="ERROR"/>
+    <logger name="org.apache.tinkerpop.gremlin.server.op.AbstractEvalOpProcessor" level="ERROR"/>
+    <logger name="org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor" level="ERROR"/>
+    <logger name="org.apache.tinkerpop.gremlin.server.AbstractGremlinServerIntegrationTest" level="INFO"/>
+    <logger name="audit.org.apache.tinkerpop.gremlin.server" level="INFO"/>
+    <logger name="org.apache.tinkerpop.gremlin.server.handler.SingleTaskSession" level="ERROR"/>
+    <logger name="org.apache.tinkerpop.gremlin.server.AbstractChannelizer" level="ERROR"/>
+    <!-- this logger is noisy and we don't assert anything and the error is already tracked on the server so we can
+         trim the logs a bit with this. -->
+    <logger name="org.apache.tinkerpop.gremlin.driver.Handler$GremlinResponseHandler" level="OFF"/>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
index 35a19d7..2fa1a8f 100644
--- a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
+++ b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
@@ -47,9 +47,9 @@
                org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
                org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/generate-all.groovy]}}}}
 serializers:
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0], custom: [groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0]}}
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0]}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true}}
   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0] }}
@@ -69,7 +69,7 @@
 maxInitialLineLength: 4096
 maxHeaderSize: 8192
 maxChunkSize: 8192
-maxContentLength: 1000000
+maxContentLength: 10485760
 maxAccumulationBufferComponents: 1024
 resultIterationBatchSize: 64
 writeBufferLowWaterMark: 32768
diff --git a/gremlin-shaded/pom.xml b/gremlin-shaded/pom.xml
index 2bdbcd1..9af591f 100644
--- a/gremlin-shaded/pom.xml
+++ b/gremlin-shaded/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-shaded</artifactId>
     <name>Apache TinkerPop :: Gremlin Shaded</name>
diff --git a/gremlin-test/features/branch/Branch.feature b/gremlin-test/features/branch/Branch.feature
index c8a5b42..9045029 100644
--- a/gremlin-test/features/branch/Branch.feature
+++ b/gremlin-test/features/branch/Branch.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassBranch @StepBranch
 Feature: Step - branch()
 
   Scenario: g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX
diff --git a/gremlin-test/features/branch/Choose.feature b/gremlin-test/features/branch/Choose.feature
index fdd98c4..9696563 100644
--- a/gremlin-test/features/branch/Choose.feature
+++ b/gremlin-test/features/branch/Choose.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassBranch @StepChoose
 Feature: Step - choose()
 
   Scenario: g_V_chooseXout_countX_optionX2L_nameX_optionX3L_ageX
@@ -140,6 +141,7 @@
       | result |
       | m[{"young":"d[1].l", "old":"d[3].l"}] |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectX1X_chooseXisX1X__constantX10Xfold__foldX
     Given the empty graph
     And using the parameter xx1 defined as "d[10].i"
@@ -153,6 +155,7 @@
       | result |
       | l[d[10].i] |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectX2X_chooseXisX1X__constantX10Xfold__foldX
     Given the empty graph
     And using the parameter xx1 defined as "d[10].i"
diff --git a/gremlin-test/features/branch/Local.feature b/gremlin-test/features/branch/Local.feature
index 509c622..315235e 100644
--- a/gremlin-test/features/branch/Local.feature
+++ b/gremlin-test/features/branch/Local.feature
@@ -15,8 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassBranch @StepLocal
 Feature: Step - local()
 
+  @MultiMetaProperties
   Scenario: g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value
     Given the crew graph
     And the traversal of
@@ -44,10 +46,10 @@
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"a":"marko","b":"d[3].i"}] |
-      | m[{"a":"josh","b":"d[5].i"}]  |
-      | m[{"a":"josh","b":"d[3].i"}]  |
-      | m[{"a":"peter","b":"d[3].i"}] |
+      | m[{"a":"marko","b":"v[lop].id"}] |
+      | m[{"a":"josh","b":"v[ripple].id"}]  |
+      | m[{"a":"josh","b":"v[lop].id"}]  |
+      | m[{"a":"peter","b":"v[lop].id"}] |
 
   Scenario: g_V_localXoutE_countX
     Given the modern graph
@@ -166,6 +168,7 @@
       | marko |
       | marko |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_localXmatchXproject__created_person__person_name_nameX_selectXname_projectX_by_byXnameX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/branch/Optional.feature b/gremlin-test/features/branch/Optional.feature
index 67fc137..7ac8ff4 100644
--- a/gremlin-test/features/branch/Optional.feature
+++ b/gremlin-test/features/branch/Optional.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassBranch @StepChoose
 Feature: Step - choose()
 
   Scenario: g_VX2X_optionalXoutXknowsXX
@@ -41,6 +42,7 @@
       | result |
       | v[marko] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_hasLabelXpersonX_optionalXoutXknowsX_optionalXoutXcreatedXXX_path
     Given the modern graph
     And the traversal of
@@ -59,7 +61,8 @@
       | p[v[vadas]] |
       | p[v[josh]] |
       | p[v[peter]] |
-    
+
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_optionalXout_optionalXoutXX_path
     Given the modern graph
     And the traversal of
@@ -80,22 +83,23 @@
       | p[v[ripple]] |
       | p[v[peter],v[lop]] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_VX1X_optionalXaddVXdogXX_label
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter vid1 defined as "v[marko].id"
     And the traversal of
diff --git a/gremlin-test/features/branch/Repeat.feature b/gremlin-test/features/branch/Repeat.feature
index 55d24da..cfc8d6b 100644
--- a/gremlin-test/features/branch/Repeat.feature
+++ b/gremlin-test/features/branch/Repeat.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassBranch @StepRepeat
 Feature: Step - repeat()
 
   Scenario: g_V_repeatXoutX_timesX2X_emit_path
@@ -47,6 +48,7 @@
       | marko |
       | marko |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_repeatXoutE_inVX_timesX2X_path_by_name_by_label
     Given the modern graph
     And the traversal of
@@ -222,6 +224,7 @@
       | result |
       | m[{"ripple":"d[3].l","vadas":"d[3].l","josh":"d[4].l","lop":"d[10].l","marko":"d[4].l"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_hasXname_markoX_repeatXoutE_inV_simplePathX_untilXhasXname_rippleXX_path_byXnameX_byXlabelX
     Given the modern graph
     And the traversal of
@@ -237,6 +240,7 @@
       | created |
       | ripple  |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_hasXloop_name_loopX_repeatXinX_timesX5X_path_by_name
     Given the sink graph
     And the traversal of
@@ -253,112 +257,116 @@
       | loop  |
       | loop  |
 
-Scenario: g_V_repeatXout_repeatXoutX_timesX1XX_timesX1X_limitX1X_path_by_name
-    Given the modern graph
-    And the traversal of
-      """
-      g.V().repeat(__.out().repeat(__.out()).times(1)).times(1).limit(1).path().by("name")
-      """
-    When iterated next
-    Then the result should be unordered
-      | result |
-      | marko |
-      | josh |
-      | ripple |
-
-Scenario: g_V_repeatXoutXknowsXX_untilXrepeatXoutXcreatedXX_emitXhasXname_lopXXX_path_byXnameX
-    Given the modern graph
-    And the traversal of
-      """
-      g.V().repeat(__.out("knows")).until(__.repeat(__.out("created")).emit(__.has("name", "lop"))).path().by("name")
-      """
-    When iterated next
-    Then the result should be unordered
-      | result |
-      | marko |
-      | josh |
-
-Scenario: g_V_repeatXrepeatXout_createdXX_untilXhasXname_rippleXXXemit_lang
-  Given the modern graph
-  And the traversal of
-    """
-    g.V().repeat(__.repeat(__.out("created")).until(__.has("name", "ripple"))).emit().values("lang")
-    """
-  When iterated to list
-  Then the result should be unordered
-    | result |
-    | java |
-
-Scenario: g_V_untilXconstantXtrueXX_repeatXrepeatXout_createdXX_untilXhasXname_rippleXXXemit_lang
-  Given the modern graph
-  And the traversal of
-    """
-    g.V().until(__.constant(true)).repeat(__.repeat(__.out("created")).until(__.has("name", "ripple"))).emit().values("lang")
-    """
-  When iterated to list
-  Then the result should be unordered
-    | result |
-    | java |
-    | java |
-
-Scenario: g_V_emit_repeatXa_outXknows_filterXloops_isX0XX_lang
-  Given the modern graph
-  And the traversal of
-    """
-    g.V().emit().repeat("a", __.out("knows").filter(__.loops("a").is(0))).values("lang")
-    """
-  When iterated to list
-  Then the result should be unordered
-    | result |
-    | java |
-    | java |
-
-Scenario: g_VX3X_repeatXbothX_createdXX_untilXloops_is_40XXemit_repeatXin_knowsXX_emit_loopsXisX1Xdedup_values
-    Given the modern graph
-    And using the parameter vid3 defined as "v[lop].id"
-    And the traversal of
-      """
-      g.V(vid3).repeat(__.both("created")).until(__.loops().is(40)).emit(__.repeat(__.in("knows")).emit(__.loops().is(1))).dedup().values("name")
-      """
-    When iterated to list
+  @GraphComputerVerificationReferenceOnly
+  Scenario: g_V_repeatXout_repeatXoutX_timesX1XX_timesX1X_limitX1X_path_by_name
+      Given the modern graph
+      And the traversal of
+        """
+        g.V().repeat(__.out().repeat(__.out()).times(1)).times(1).limit(1).path().by("name")
+        """
+      When iterated next
       Then the result should be unordered
         | result |
+        | marko |
         | josh |
-        | lop |
         | ripple |
-
-Scenario: g_VX1X_repeatXrepeatXunionXout_uses_out_traversesXX_whereXloops_isX0X_timesX1X_timeX2X_name
-    Given the crew graph
-    And using the parameter vid1 defined as "v[marko].id"
-    And the traversal of
-      """
-      g.V(vid1).repeat(__.repeat(__.union(__.out("uses"), __.out("traverses")).where(__.loops().is(0))).times(1)).times(2).values("name")
-      """
-    When iterated to list
+  @GraphComputerVerificationReferenceOnly
+  Scenario: g_V_repeatXoutXknowsXX_untilXrepeatXoutXcreatedXX_emitXhasXname_lopXXX_path_byXnameX
+      Given the modern graph
+      And the traversal of
+        """
+        g.V().repeat(__.out("knows")).until(__.repeat(__.out("created")).emit(__.has("name", "lop"))).path().by("name")
+        """
+      When iterated next
       Then the result should be unordered
         | result |
-        | tinkergraph |
+        | marko |
+        | josh |
 
-Scenario: g_V_repeatXa_outXknows_repeatXb_outXcreatedX_filterXloops_isX0XX_emit_lang
-  Given the modern graph
-  And the traversal of
-    """
-    g.V().repeat("a", __.out("knows").repeat("b", __.out("created").filter(__.loops("a").is(0))).emit()).emit().values("lang")
-    """
-  When iterated to list
-  Then the result should be unordered
-    | result |
-    | java |
-    | java |
+  Scenario: g_V_repeatXrepeatXout_createdXX_untilXhasXname_rippleXXXemit_lang
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().repeat(__.repeat(__.out("created")).until(__.has("name", "ripple"))).emit().values("lang")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | java |
 
-Scenario: g_VX6X_repeatXa_bothXcreatedX_simplePathX_emitXrepeatXb_bothXknowsXX_untilXloopsXbX_asXb_whereXloopsXaX_asXbX_hasXname_vadasXX_dedup_name
-  Given the modern graph
-  And using the parameter vid6 defined as "v[peter].id"
-  And the traversal of
-    """
-    g.V(vid6).repeat("a", __.both("created").simplePath()).emit(__.repeat("b", __.both("knows")).until(__.loops("b").as("b").where(__.loops("a").as("b"))).has("name", "vadas")).dedup().values("name")
-    """
-  When iterated to list
-  Then the result should be unordered
-    | result |
-    | josh |
+  Scenario: g_V_untilXconstantXtrueXX_repeatXrepeatXout_createdXX_untilXhasXname_rippleXXXemit_lang
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().until(__.constant(true)).repeat(__.repeat(__.out("created")).until(__.has("name", "ripple"))).emit().values("lang")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | java |
+      | java |
+
+  Scenario: g_V_emit_repeatXa_outXknows_filterXloops_isX0XX_lang
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().emit().repeat("a", __.out("knows").filter(__.loops("a").is(0))).values("lang")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | java |
+      | java |
+
+  @GraphComputerVerificationReferenceOnly
+  Scenario: g_VX3X_repeatXbothX_createdXX_untilXloops_is_40XXemit_repeatXin_knowsXX_emit_loopsXisX1Xdedup_values
+      Given the modern graph
+      And using the parameter vid3 defined as "v[lop].id"
+      And the traversal of
+        """
+        g.V(vid3).repeat(__.both("created")).until(__.loops().is(40)).emit(__.repeat(__.in("knows")).emit(__.loops().is(1))).dedup().values("name")
+        """
+      When iterated to list
+        Then the result should be unordered
+          | result |
+          | josh |
+          | lop |
+          | ripple |
+
+  @MultiMetaProperties
+  Scenario: g_VX1X_repeatXrepeatXunionXout_uses_out_traversesXX_whereXloops_isX0X_timesX1X_timeX2X_name
+      Given the crew graph
+      And using the parameter vid1 defined as "v[marko].id"
+      And the traversal of
+        """
+        g.V(vid1).repeat(__.repeat(__.union(__.out("uses"), __.out("traverses")).where(__.loops().is(0))).times(1)).times(2).values("name")
+        """
+      When iterated to list
+        Then the result should be unordered
+          | result |
+          | tinkergraph |
+
+  Scenario: g_V_repeatXa_outXknows_repeatXb_outXcreatedX_filterXloops_isX0XX_emit_lang
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().repeat("a", __.out("knows").repeat("b", __.out("created").filter(__.loops("a").is(0))).emit()).emit().values("lang")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | java |
+      | java |
+
+  @GraphComputerVerificationReferenceOnly
+  Scenario: g_VX6X_repeatXa_bothXcreatedX_simplePathX_emitXrepeatXb_bothXknowsXX_untilXloopsXbX_asXb_whereXloopsXaX_asXbX_hasXname_vadasXX_dedup_name
+    Given the modern graph
+    And using the parameter vid6 defined as "v[peter].id"
+    And the traversal of
+      """
+      g.V(vid6).repeat("a", __.both("created").simplePath()).emit(__.repeat("b", __.both("knows")).until(__.loops("b").as("b").where(__.loops("a").as("b"))).has("name", "vadas")).dedup().values("name")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | josh |
diff --git a/gremlin-test/features/branch/Union.feature b/gremlin-test/features/branch/Union.feature
index 24d7e4d..0f60240 100644
--- a/gremlin-test/features/branch/Union.feature
+++ b/gremlin-test/features/branch/Union.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassBranch @StepUnion
 Feature: Step - union()
 
   Scenario: g_V_unionXout__inX_name
diff --git a/gremlin-test/features/filter/And.feature b/gremlin-test/features/filter/And.feature
index f137841..3ced5db 100644
--- a/gremlin-test/features/filter/And.feature
+++ b/gremlin-test/features/filter/And.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepAnd
 Feature: Step - and()
 
   Scenario: g_V_andXhasXage_gt_27X__outE_count_gte_2X_name
@@ -41,6 +42,7 @@
       | josh |
       | peter  |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Coin.feature b/gremlin-test/features/filter/Coin.feature
index b9e8ac8..8def707 100644
--- a/gremlin-test/features/filter/Coin.feature
+++ b/gremlin-test/features/filter/Coin.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepCoin
 Feature: Step - coin()
 
   Scenario: g_V_coinX1X
@@ -40,4 +41,16 @@
       g.V().coin(0.0)
       """
     When iterated to list
-    Then the result should be empty
\ No newline at end of file
+    Then the result should be empty
+
+  @GraphComputerVerificationStrategyNotSupported
+  Scenario: g_withStrategiesXSeedStrategyX_V_coinX50X
+    Given the modern graph
+    And the traversal of
+      """
+      g.withStrategies(new SeedStrategy(seed: 999999)).V().coin(0.5)
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | v[marko] |
\ No newline at end of file
diff --git a/gremlin-test/features/filter/CyclicPath.feature b/gremlin-test/features/filter/CyclicPath.feature
index 497f3b5..2de63ef 100644
--- a/gremlin-test/features/filter/CyclicPath.feature
+++ b/gremlin-test/features/filter/CyclicPath.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepCyclicPath
 Feature: Step - cyclicPath()
 
   Scenario: g_VX1X_outXcreatedX_inXcreatedX_cyclicPath
@@ -51,6 +52,7 @@
     When iterated to list
     Then the result should be empty
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectX0X_V_both_coalesceXhasXname_markoX_both_constantX0XX_cyclicPath_path
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Dedup.feature b/gremlin-test/features/filter/Dedup.feature
index a85dcfc..0cf9c21 100644
--- a/gremlin-test/features/filter/Dedup.feature
+++ b/gremlin-test/features/filter/Dedup.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepDedup
 Feature: Step - dedup()
 
   Scenario: g_V_out_in_valuesXnameX_fold_dedupXlocalX_unfold
@@ -69,9 +70,10 @@
       g.V().both().has(T.label, "software").dedup().by("lang").values("name")
       """
     When iterated to list
-    Then the result should be unordered
+    Then the result should be of
       | result |
       | lop |
+      | ripple |
 
   Scenario: g_V_both_name_order_byXa_bX_dedup_value
     Given the modern graph
@@ -135,13 +137,14 @@
     Given the modern graph
     And the traversal of
       """
-      g.V().group().by(T.label).by(__.bothE().values("weight").dedup().fold())
+      g.V().group().by(T.label).by(__.bothE().values("weight").dedup().order().by(Order.asc).fold())
       """
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"software":[1.0,0.4,0.2],"person":[0.5,1.0,0.4,0.2]}] |
+      | m[{"software":[0.2,0.4,1.0],"person":[0.2,0.4,0.5,1.0]}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_both_asXbX_dedupXa_bX_byXlabelX_selectXa_bX
     Given the modern graph
     And the traversal of
@@ -149,11 +152,20 @@
       g.V().as("a").both().as("b").dedup("a", "b").by(T.label).select("a", "b")
       """
     When iterated to list
-    Then the result should be unordered
+    Then the result should be of
       | result |
       | m[{"a":"v[marko]","b":"v[lop]"}] |
       | m[{"a":"v[marko]","b":"v[vadas]"}] |
+      | m[{"a":"v[marko]","b":"v[josh]"}] |
+      | m[{"a":"v[vadas]","b":"v[marko]"}] |
       | m[{"a":"v[lop]","b":"v[marko]"}] |
+      | m[{"a":"v[lop]","b":"v[josh]"}] |
+      | m[{"a":"v[lop]","b":"v[peter]"}] |
+      | m[{"a":"v[josh]","b":"v[ripple]"}] |
+      | m[{"a":"v[josh]","b":"v[lop]"}] |
+      | m[{"a":"v[josh]","b":"v[marko]"}] |
+      | m[{"a":"v[ripple]","b":"v[josh]"}] |
+      | m[{"a":"v[peter]","b":"v[lop]"}] |
 
   Scenario: g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_dedupXa_bX_path
     Given the modern graph
@@ -236,6 +248,7 @@
       | d[0].l |
 
   # https://issues.apache.org/jira/browse/TINKERPOP-2529
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_both_group_by_byXout_dedup_foldX_unfold_selectXvaluesX_unfold_out_order_byXnameX_limitX1X_valuesXnameX
     Given the modern graph
     And the traversal of
@@ -274,6 +287,7 @@
       | result |
       | d[12].l |
 
+  @MultiMetaProperties
   Scenario: g_V_both_properties_properties_dedup_count
     Given the crew graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Drop.feature b/gremlin-test/features/filter/Drop.feature
index 144399e..7ae64e3 100644
--- a/gremlin-test/features/filter/Drop.feature
+++ b/gremlin-test/features/filter/Drop.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepDrop
 Feature: Step - drop()
 
   Scenario: g_V_drop
@@ -66,18 +67,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -87,6 +88,7 @@
     Then the result should be empty
     And the graph should return 0 for count of "g.E().properties()"
 
+  @MultiMetaProperties
   Scenario: g_V_properties_propertiesXstartTimeX_drop
     Given the empty graph
     And the graph initializer of
diff --git a/gremlin-test/features/filter/Filter.feature b/gremlin-test/features/filter/Filter.feature
index c85bb22..6aa368b 100644
--- a/gremlin-test/features/filter/Filter.feature
+++ b/gremlin-test/features/filter/Filter.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepFilter
 Feature: Step - filter()
 
   Scenario: g_V_filterXfalseX
diff --git a/gremlin-test/features/filter/Has.feature b/gremlin-test/features/filter/Has.feature
index f2b087f..4c71add 100644
--- a/gremlin-test/features/filter/Has.feature
+++ b/gremlin-test/features/filter/Has.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepHas
 Feature: Step - has()
 
   Scenario: g_V_outXcreatedX_hasXname__mapXlengthX_isXgtX3XXX_name
@@ -283,6 +284,7 @@
       | e[marko-knows->vadas] |
       | e[marko-knows->josh] |
 
+  @MultiMetaProperties
   Scenario: g_E_hasLabelXuses_traversesX
     Given the crew graph
     And the traversal of
@@ -368,6 +370,7 @@
       | result |
       | e[josh-created->ripple] |
 
+  @MultiMetaProperties
   Scenario: g_V_hasXlocationX
     Given the crew graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Is.feature b/gremlin-test/features/filter/Is.feature
index 9a68d18..04f8c5c 100644
--- a/gremlin-test/features/filter/Is.feature
+++ b/gremlin-test/features/filter/Is.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepIs
 Feature: Step - coin()
 
   Scenario: g_V_valuesXageX_isX32X
diff --git a/gremlin-test/features/filter/Or.feature b/gremlin-test/features/filter/Or.feature
index b294532..5cd4333 100644
--- a/gremlin-test/features/filter/Or.feature
+++ b/gremlin-test/features/filter/Or.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepOr
 Feature: Step - or()
 
   Scenario: g_V_orXhasXage_gt_27X__outE_count_gte_2X_name
diff --git a/gremlin-test/features/filter/Range.feature b/gremlin-test/features/filter/Range.feature
index 62f62a5..c3dc520 100644
--- a/gremlin-test/features/filter/Range.feature
+++ b/gremlin-test/features/filter/Range.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepRange
 Feature: Step - range()
 
   Scenario: g_VX1X_out_limitX2X
@@ -170,6 +171,7 @@
       | m[{"b":"josh"}] |
       | m[{"b":"josh"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X
     Given the modern graph
     And the traversal of
@@ -182,6 +184,7 @@
       | l[josh,ripple] |
       | l[josh,lop] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X
     Given the modern graph
     And the traversal of
@@ -207,6 +210,7 @@
       | josh |
       | peter |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X
     Given the modern graph
     And the traversal of
@@ -227,6 +231,7 @@
       | result |
       | l[d[0.4].d,d[0.5].d,d[1.0].d,d[1.0].d] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_in_asXaX_in_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_limitXlocal_1X
     Given the modern graph
     And the traversal of
@@ -239,6 +244,7 @@
       | lop    |
       | ripple |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_in_asXaX_in_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_limitXlocal_2X
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Sample.feature b/gremlin-test/features/filter/Sample.feature
index eb7d3a3..70bb82f 100644
--- a/gremlin-test/features/filter/Sample.feature
+++ b/gremlin-test/features/filter/Sample.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepSample
 Feature: Step - sample()
 
   Scenario: g_E_sampleX1X
diff --git a/gremlin-test/features/filter/SimplePath.feature b/gremlin-test/features/filter/SimplePath.feature
index 244637b..0020651 100644
--- a/gremlin-test/features/filter/SimplePath.feature
+++ b/gremlin-test/features/filter/SimplePath.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepSimplePath
 Feature: Step - simplePath()
 
   Scenario: g_VX1X_outXcreatedX_inXcreatedX_simplePath
@@ -58,6 +59,7 @@
       | p[v[peter],v[lop],v[josh],v[ripple]] |
       | p[v[peter],v[lop],v[josh],v[marko]] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXbX_out_asXcX_simplePath_byXlabelX_fromXbX_toXcX_path_byXnameX
     Given the modern graph
     And the traversal of
@@ -70,6 +72,7 @@
       | p[marko,josh,ripple] |
       | p[marko,josh,lop]    |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectX0X_V_both_coalesceXhasXname_markoX_both_constantX0XX_simplePath_path
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Tail.feature b/gremlin-test/features/filter/Tail.feature
index 2db579c..a2ae496 100644
--- a/gremlin-test/features/filter/Tail.feature
+++ b/gremlin-test/features/filter/Tail.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepTail
 Feature: Step - tail()
 
   Scenario: g_V_valuesXnameX_order_tailXglobal_2X
@@ -69,21 +70,11 @@
       | vadas  |
 
   Scenario: g_V_repeatXbothX_timesX3X_tailX7X
-    Given the modern graph
-    And the traversal of
+    Given an unsupported test
+    Then nothing should happen because
       """
-      g.V().repeat(__.both()).times(3).tail(7)
+      This test is not easily asserted given limitations on ordering.
       """
-    When iterated to list
-    Then the result should be unordered
-      | result |
-      | v[peter] |
-      | v[peter] |
-      | v[peter] |
-      | v[peter] |
-      | v[marko] |
-      | v[marko] |
-      | v[marko] |
 
   Scenario: g_V_repeatXin_outX_timesX3X_tailX7X_count
     Given the modern graph
@@ -96,6 +87,7 @@
       | result |
       | d[7].l |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocal_1X
     Given the modern graph
     And the traversal of
@@ -108,6 +100,7 @@
       | ripple |
       | lop |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocalX
     Given the modern graph
     And the traversal of
@@ -144,6 +137,7 @@
       | m[{"c":"ripple"}] |
       | m[{"c":"lop"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_tailXlocal_1X
     Given the modern graph
     And the traversal of
@@ -156,6 +150,7 @@
       | ripple |
       | lop |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_tailXlocalX
     Given the modern graph
     And the traversal of
@@ -168,6 +163,7 @@
       | ripple |
       | lop |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXlimitXlocal_0XX_tailXlocal_1X
     Given the modern graph
     And the traversal of
@@ -177,6 +173,7 @@
     When iterated to list
     Then the result should be empty
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_tailXlocal_2X
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Where.feature b/gremlin-test/features/filter/Where.feature
index f4e8f9b..156d124 100644
--- a/gremlin-test/features/filter/Where.feature
+++ b/gremlin-test/features/filter/Where.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassFilter @StepWhere
 Feature: Step - where()
 
   Scenario: g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX
@@ -116,6 +117,7 @@
       | josh |
       | peter |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXasXbX_outXcreatedX_hasXname_rippleXX_valuesXage_nameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -208,6 +210,7 @@
       | lop |
       | ripple |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_selectXa_bX
     Given the modern graph
     And the traversal of
@@ -233,6 +236,7 @@
       | vadas |
       | josh |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_selectXa_bX
     Given the modern graph
     And the traversal of
@@ -257,6 +261,7 @@
       | m[{"a": "v[marko]", "b": "v[lop]", "c": "v[josh]", "d": "v[vadas]"}] |
       | m[{"a": "v[peter]", "b": "v[lop]", "c": "v[josh]", "d": "v[vadas]"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXbX_whereXin_count_isXeqX3XX_or_whereXoutXcreatedX_and_hasXlabel_personXXX_selectXa_bX
     Given the modern graph
     And the traversal of
@@ -271,6 +276,7 @@
       | m[{"a": "v[josh]", "b": "v[lop]"}] |
       | m[{"a": "v[peter]", "b": "v[lop]"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXa_gtXbXX_byXageX_selectXa_bX_byXnameX
     Given the modern graph
     And the traversal of
@@ -284,6 +290,7 @@
       | m[{"a": "peter", "b": "marko"}] |
       | m[{"a": "peter", "b": "josh"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_whereXa_gtXbX_orXeqXbXXX_byXageX_byXweightX_byXweightX_selectXa_cX_byXnameX
     Given the modern graph
     And the traversal of
@@ -298,6 +305,7 @@
       | m[{"a": "josh", "c": "lop"}] |
       | m[{"a": "peter", "c": "lop"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX
     Given the modern graph
     And the traversal of
@@ -312,6 +320,7 @@
       | m[{"a": "peter", "c": "lop", "d": "marko"}] |
       | m[{"a": "peter", "c": "lop", "d": "josh"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -325,6 +334,7 @@
       | josh |
 
   # comparison of null "age" values in where()
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name
     Given the modern graph
     And using the parameter vid3 defined as "v[lop].id"
diff --git a/gremlin-test/features/integrated/Miscellaneous.feature b/gremlin-test/features/integrated/Miscellaneous.feature
new file mode 100644
index 0000000..9ec56f4
--- /dev/null
+++ b/gremlin-test/features/integrated/Miscellaneous.feature
@@ -0,0 +1,75 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - miscellaneous
+
+  Scenario: g_V_coworker
+    Given the modern graph
+    And using the parameter xx1 defined as "l[]"
+    And the traversal of
+      """
+      g.V().hasLabel("person").
+        filter(__.outE("created")).
+        aggregate("p").as("p1").
+        values("name").as("p1n").
+        select("p").unfold().
+        where(neq("p1")).as("p2").values("name").as("p2n").
+        select("p2").
+        out("created").
+        choose(__.in("created").where(eq("p1")), values("name"), constant(xx1)).
+        group().
+          by(__.select("p1n")).
+          by(__.group().
+                  by(__.select("p2n")).
+                  by(__.unfold().fold().
+                     project("numCoCreated", "coCreated").
+                       by(__.count(local)).by())).
+        unfold()
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | m[{"peter": {"josh": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "marko": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+      | m[{"josh": {"peter": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "marko": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+      | m[{"marko": {"peter": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "josh": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+
+  @GraphComputerVerificationMidVNotSupported
+  Scenario: g_V_coworker_with_midV
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().hasLabel("person").
+        filter(__.outE("created")).as("p1").
+        V().hasLabel("person").
+        where(P.neq("p1")).
+        filter(__.outE("created")).as("p2").
+        map(__.out("created").where(__.in("created").as("p1")).values("name").fold()).
+        group().
+          by(__.select("p1").by("name")).
+          by(__.group().by(select("p2").by("name")).
+          by(__.project("numCoCreated", "coCreated").
+                  by(__.count(local)).by())).
+        unfold()
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | m[{"peter": {"josh": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "marko": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+      | m[{"josh": {"peter": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "marko": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+      | m[{"marko": {"peter": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "josh": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+
diff --git a/gremlin-test/features/integrated/Paths.feature b/gremlin-test/features/integrated/Paths.feature
new file mode 100644
index 0000000..5bbd74f
--- /dev/null
+++ b/gremlin-test/features/integrated/Paths.feature
@@ -0,0 +1,109 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - paths
+
+  @GraphComputerVerificationStarGraphExceeded
+  Scenario: g_V_playlist_paths
+    Given the grateful graph
+    And the traversal of
+      """
+      g.V().has("name", "Bob_Dylan").
+        in("sungBy").order().by('name').as("a").
+        repeat(__.out().order().by('name').simplePath().from("a")).
+          until(__.out("writtenBy").has("name", "Johnny_Cash")).limit(1).as("b").
+        repeat(__.out().order().by('name').as("c").simplePath().from("b").to("c")).
+          until(__.out("sungBy").has("name", "Grateful_Dead")).limit(1).
+        path().from("a").unfold().
+        project("song", "artists").
+          by("name").
+          by(__.coalesce(__.out("sungBy", "writtenBy").dedup().values("name").order(), __.constant("Unknown")).fold())
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | m[{"song": "CHIMES OF FREEDOM", "artists": ["Bob_Dylan"]}] |
+      | m[{"song": "QUEEN JANE", "artists": ["Unknown"]}] |
+      | m[{"song": "ALTHEA", "artists": ["Garcia","Hunter"]}] |
+      | m[{"song": "BIG RIVER", "artists": ["Johnny_Cash","Weir"]}] |
+      | m[{"song": "HES GONE", "artists": ["Garcia","Hunter"]}] |
+      | m[{"song": "CAUTION", "artists": ["Grateful_Dead"]}] |
+
+  @GraphComputerVerificationReferenceOnly
+  Scenario: g_V_shortestpath
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().as("v").both().as("v").
+        project("src", "tgt", "p").
+          by(__.select(first, "v")).
+          by(__.select(last, "v")).
+          by(__.select(Pop.all, "v")).as("triple").
+        group("x").
+          by(__.select("src", "tgt")).
+          by(__.select("p").fold()).select("tgt").barrier().
+        repeat(__.both().as("v").
+                project("src", "tgt", "p").
+                  by(__.select(first, "v")).
+                  by(__.select(last, "v")).
+                  by(__.select(Pop.all, "v")).as("t").
+                filter(__.select(Pop.all, "p").count(local).as("l").
+                       select(Pop.last, "t").select(Pop.all, "p").dedup(Scope.local).count(Scope.local).where(P.eq("l"))).
+                select(Pop.last, "t").
+                not(__.select(Pop.all, "p").as("p").count(local).as("l").
+                    select(Pop.all, "x").unfold().filter(select(keys).where(P.eq("t")).by(select("src", "tgt"))).
+                    filter(__.select(Column.values).unfold().or(__.count(Scope.local).where(P.lt("l")), __.where(P.eq("p"))))).
+                barrier().
+                group("x").
+                  by(__.select("src", "tgt")).
+                  by(__.select(Pop.all, "p").fold()).select("tgt").barrier()).
+        cap("x").select(Column.values).unfold().unfold().map(__.unfold().values("name").fold())
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | l[josh,marko,vadas]|
+      | l[ripple,josh,lop]|
+      | l[josh,lop]|
+      | l[peter,lop,marko]|
+      | l[ripple,josh,marko]|
+      | l[josh,marko]|
+      | l[marko,lop]|
+      | l[lop,marko]|
+      | l[josh,lop,peter]|
+      | l[peter,lop,josh]|
+      | l[vadas,marko]|
+      | l[ripple,josh]|
+      | l[marko]|
+      | l[josh]|
+      | l[ripple]|
+      | l[josh,ripple]|
+      | l[peter,lop]|
+      | l[vadas,marko,josh]|
+      | l[lop,josh,ripple]|
+      | l[marko,josh]|
+      | l[lop,marko,vadas]|
+      | l[lop]|
+      | l[peter]|
+      | l[vadas]|
+      | l[marko,josh,ripple]|
+      | l[marko,vadas]|
+      | l[vadas,marko,lop]|
+      | l[lop,peter]|
+      | l[lop,josh]|
+      | l[marko,lop,peter]|
diff --git a/gremlin-test/features/integrated/Recommendation.feature b/gremlin-test/features/integrated/Recommendation.feature
new file mode 100644
index 0000000..eff27fa
--- /dev/null
+++ b/gremlin-test/features/integrated/Recommendation.feature
@@ -0,0 +1,45 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - recommendation
+
+  Scenario: g_V_classic_recommendation
+    Given the grateful graph
+    And the traversal of
+      """
+      g.V().has("name", "DARK STAR").as("a").out("followedBy").aggregate("stash").
+        in("followedBy").where(P.neq("a").and(P.not(P.within("stash")))).
+        groupCount().
+        unfold().
+        project("x", "y", "z").
+          by(__.select(keys).values("name")).
+          by(__.select(keys).values("performances")).
+          by(__.select(values)).
+        order().
+          by(__.select("z"), Order.desc).
+          by(__.select("y"), Order.asc).
+        limit(5).aggregate(local,"m").select("x")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | LET IT GROW |
+      | UNCLE JOHNS BAND |
+      | I KNOW YOU RIDER |
+      | SHIP OF FOOLS |
+      | GOOD LOVING |
\ No newline at end of file
diff --git a/gremlin-test/features/map/AddEdge.feature b/gremlin-test/features/map/AddEdge.feature
index 4795cbf..db0e58a 100644
--- a/gremlin-test/features/map/AddEdge.feature
+++ b/gremlin-test/features/map/AddEdge.feature
@@ -15,24 +15,25 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepAddE
 Feature: Step - addE()
 
   Scenario: g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter vid1 defined as "v[marko].id"
     And the traversal of
@@ -48,46 +49,46 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter vid1 defined as "v[marko].id"
     And the traversal of
       """
-      g.V(vid1).as("a").out("created").addE("createdBy").to("a").property("weight", 2.0)
+      g.V(vid1).as("a").out("created").addE("createdBy").to("a").property("weight", 2.0d)
       """
     When iterated to list
     Then the result should have a count of 1
     And the graph should return 7 for count of "g.E()"
     And the graph should return 4 for count of "g.V(vid1).bothE()"
-    And the graph should return 1 for count of "g.V(vid1).inE().has(\"weight\", 2.0)"
+    And the graph should return 1 for count of "g.V(vid1).inE().has(\"weight\", 2.0d)"
 
   Scenario: g_V_outE_propertyXweight_nullX
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -101,18 +102,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter vid1 defined as "v[marko].id"
     And using the parameter vid2 defined as "v[vadas].id"
@@ -156,18 +157,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter vid1 defined as "v[marko].id"
     And using the parameter vid2 defined as "v[vadas].id"
@@ -198,18 +199,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter vid1 defined as "v[marko].id"
     And using the parameter vid2 defined as "v[vadas].id"
@@ -250,18 +251,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter v1 defined as "v[marko]"
     And using the parameter v6 defined as "v[peter]"
@@ -300,18 +301,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter v1 defined as "v[marko]"
     And the traversal of
@@ -330,18 +331,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter v2 defined as "v[vadas]"
     And the traversal of
@@ -360,18 +361,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter v1 defined as "v[marko]"
     And using the parameter v6 defined as "v[peter]"
@@ -390,18 +391,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter v1 defined as "v[marko]"
     And using the parameter v6 defined as "v[peter]"
@@ -414,4 +415,20 @@
     Then the result should have a count of 1
     And the graph should return 7 for count of "g.E()"
     And the graph should return 3 for count of "g.V(v1).outE(\"knows\")"
-    And the graph should return 1 for count of "g.V(v1).out(\"knows\").has(\"name\",\"peter\")"
\ No newline at end of file
+    And the graph should return 1 for count of "g.V(v1).out(\"knows\").has(\"name\",\"peter\")"
+
+  @AllowNullPropertyValues
+  Scenario: g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX
+    Given the empty graph
+    And the graph initializer of
+      """
+      g.addV("person").property("name", "marko").property("age", 29).
+        addV("person").property("name", "vadas").property("age", 27)
+      """
+    And the traversal of
+      """
+      g.addE("knows").property("weight", null).from(V().has("name","marko")).to(V().has("name","vadas"))
+      """
+    When iterated to list
+    Then the result should have a count of 1
+    And the graph should return 1 for count of "g.E().has(\"knows\",\"weight\",null)"
\ No newline at end of file
diff --git a/gremlin-test/features/map/AddVertex.feature b/gremlin-test/features/map/AddVertex.feature
index 01fc14a..c149d89 100644
--- a/gremlin-test/features/map/AddVertex.feature
+++ b/gremlin-test/features/map/AddVertex.feature
@@ -15,24 +15,25 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepAddV
 Feature: Step - addV()
 
   Scenario: g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter vid1 defined as "v[marko].id"
     And the traversal of
@@ -47,18 +48,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -72,18 +73,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -97,18 +98,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -118,22 +119,23 @@
     Then the result should have a count of 4
     And the graph should return 2 for count of "g.V().properties(\"name\")"
 
+  @MultiMetaProperties
   Scenario: g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenmX
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -144,22 +146,23 @@
     And the graph should return 0 for count of "g.V().has(\"person\",\"name\",\"stephen\")"
     And the graph should return 1 for count of "g.V().has(\"person\",\"name\",\"stephenm\")"
 
+  @MultiMetaProperties
   Scenario: get_g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -171,22 +174,23 @@
     And the graph should return 1 for count of "g.V().has(\"person\",\"name\",\"stephenm\")"
     And the graph should return 1 for count of "g.V().has(\"person\",\"name\",\"stephenm\").properties(\"name\").has(\"since\",2010)"
 
+  @MultiMetaProperties
   Scenario: g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -198,22 +202,23 @@
     And the graph should return 1 for count of "g.V().has(\"person\",\"name\",\"marko\").properties(\"friendWeight\").has(\"acl\",\"private\")"
     And the graph should return 1 for count of "g.V().has(\"person\",\"name\",\"marko\").properties(\"friendWeight\").count()"
 
+  @MultiMetaProperties
   Scenario: g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -227,18 +232,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -250,22 +255,23 @@
       | marko |
     And the graph should return 2 for count of "g.V().has(\"name\",\"marko\")"
 
+  @MultiMetaProperties
   Scenario: g_addVXpersonX_propertyXsingle_name_stephenX_propertyXsingle_name_stephenm_since_2010X
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -277,22 +283,23 @@
     And the graph should return 1 for count of "g.V().has(\"name\",\"stephenm\")"
     And the graph should return 1 for count of "g.V().has(\"name\",\"stephenm\").properties(\"name\").has(\"since\",2010)"
 
+  @MultiMetaProperties
   Scenario: g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -311,18 +318,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -338,18 +345,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -365,18 +372,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -390,18 +397,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And the traversal of
       """
@@ -431,3 +438,27 @@
     When iterated to list
     Then the result should have a count of 1
     And the graph should return 1 for count of "g.V().hasLabel(\"person\")"
+
+  @AllowNullPropertyValues
+  Scenario: g_addVXpersonX_propertyXname_joshX_propertyXage_nullX
+    Given the empty graph
+    And the traversal of
+      """
+      g.addV("person").property("name", "josh").property("age", null)
+      """
+    When iterated to list
+    Then the result should have a count of 1
+    And the graph should return 1 for count of "g.V().has(\"person\",\"age\",null)"
+
+  @AllowNullPropertyValues @MultiMetaProperties
+  Scenario: g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX
+    Given the empty graph
+    And the traversal of
+      """
+      g.addV("person").property("name", "marko").property("friendWeight", null, "acl", null)
+      """
+    When iterated to list
+    Then the result should have a count of 1
+    And the graph should return 1 for count of "g.V().has(\"person\",\"name\",\"marko\").has(\"friendWeight\", null)"
+    And the graph should return 1 for count of "g.V().has(\"person\",\"name\",\"marko\").properties(\"friendWeight\").has(\"acl\",null)"
+    And the graph should return 1 for count of "g.V().has(\"person\",\"name\",\"marko\").properties(\"friendWeight\").count()"
\ No newline at end of file
diff --git a/gremlin-test/features/map/Coalesce.feature b/gremlin-test/features/map/Coalesce.feature
index 06688c0..dd5820b 100644
--- a/gremlin-test/features/map/Coalesce.feature
+++ b/gremlin-test/features/map/Coalesce.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepCoalesce
 Feature: Step - coalesce()
 
   Scenario: g_V_coalesceXoutXfooX_outXbarXX
@@ -62,6 +63,7 @@
       | result |
       | m[{"ripple":"d[1].l", "vadas":"d[1].l", "josh":"d[1].l", "lop":"d[2].l"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX
     Given the modern graph
     And the traversal of
@@ -84,7 +86,7 @@
       g.V().out("created").order().by("name").coalesce(__.values("name"), __.constant("x"))
       """
     When iterated to list
-    Then the result should be ordered
+    Then the result should be unordered
       | result |
       | lop |
       | lop |
diff --git a/gremlin-test/features/map/ConnectedComponent.feature b/gremlin-test/features/map/ConnectedComponent.feature
index 0f95488..95b5cb7 100644
--- a/gremlin-test/features/map/ConnectedComponent.feature
+++ b/gremlin-test/features/map/ConnectedComponent.feature
@@ -15,13 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@GraphComputerOnly @StepClassMap @StepConnectedComponent
 Feature: Step - connectedComponent()
-                
+
   Scenario: g_V_connectedComponent_hasXcomponentX
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().connectedComponent().has("gremlin.connectedComponentVertexProgram.component")
+      g.V().connectedComponent().has("gremlin.connectedComponentVertexProgram.component")
       """
     When iterated to list
     Then the result should be unordered
@@ -37,7 +38,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().dedup().connectedComponent().has("gremlin.connectedComponentVertexProgram.component")
+      g.V().dedup().connectedComponent().has("gremlin.connectedComponentVertexProgram.component")
       """
     When iterated to list
     Then the result should be unordered
@@ -53,7 +54,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().hasLabel("software").connectedComponent().project("name","component").by("name").by("gremlin.connectedComponentVertexProgram.component")
+      g.V().hasLabel("software").connectedComponent().project("name","component").by("name").by("gremlin.connectedComponentVertexProgram.component")
       """
     When iterated to list
     Then the result should be unordered
@@ -65,7 +66,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().hasLabel("person").connectedComponent().with("~tinkerpop.connectedComponent.edges", __.bothE("knows")).with("~tinkerpop.connectedComponent.propertyName", "cluster").project("name","cluster").by("name").by("cluster")
+      g.V().hasLabel("person").connectedComponent().with("~tinkerpop.connectedComponent.edges", __.bothE("knows")).with("~tinkerpop.connectedComponent.propertyName", "cluster").project("name","cluster").by("name").by("cluster")
       """
     When iterated to list
     Then the result should be unordered
diff --git a/gremlin-test/features/map/Constant.feature b/gremlin-test/features/map/Constant.feature
index ed25b25..ddbfa2a 100644
--- a/gremlin-test/features/map/Constant.feature
+++ b/gremlin-test/features/map/Constant.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepConstant
 Feature: Step - constant()
 
   Scenario: g_V_constantX123X
diff --git a/gremlin-test/features/map/Count.feature b/gremlin-test/features/map/Count.feature
index 6e47ab7..7db93d2 100644
--- a/gremlin-test/features/map/Count.feature
+++ b/gremlin-test/features/map/Count.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepCount
 Feature: Step - count()
 
   Scenario: g_V_count
@@ -72,6 +73,7 @@
       | result |
       | d[0].l |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_whereXinXkknowsX_outXcreatedX_count_is_0XX_name
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/map/ElementMap.feature b/gremlin-test/features/map/ElementMap.feature
index 2fb18d1..a720058 100644
--- a/gremlin-test/features/map/ElementMap.feature
+++ b/gremlin-test/features/map/ElementMap.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepElementMap
 Feature: Step - elementMap()
 
   Scenario: g_V_elementMap
@@ -49,6 +50,7 @@
       | m[{"t[id]": "v[lop].id", "t[label]": "software", "name": "lop"}] |
       | m[{"t[id]": "v[ripple].id", "t[label]": "software", "name": "ripple"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_EX11X_elementMap
     Given the modern graph
     And using the parameter eid11 defined as "e[josh-created->lop].id"
diff --git a/gremlin-test/features/map/FlatMap.feature b/gremlin-test/features/map/FlatMap.feature
index 7384ee3..6924a10 100644
--- a/gremlin-test/features/map/FlatMap.feature
+++ b/gremlin-test/features/map/FlatMap.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepFlatMap
 Feature: Step - flatMap()
 
   Scenario: g_V_asXaX_flatMapXselectXaXX
diff --git a/gremlin-test/features/map/Fold.feature b/gremlin-test/features/map/Fold.feature
index c4c0f80..d595472 100644
--- a/gremlin-test/features/map/Fold.feature
+++ b/gremlin-test/features/map/Fold.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepFold
 Feature: Step - fold()
 
   Scenario: g_V_fold
diff --git a/gremlin-test/features/map/Graph.feature b/gremlin-test/features/map/Graph.feature
index d3e0fff..d86ae75 100644
--- a/gremlin-test/features/map/Graph.feature
+++ b/gremlin-test/features/map/Graph.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepV
 Feature: Step - V()
 
   Scenario: g_VX1X_V_valuesXnameX
@@ -73,18 +74,18 @@
     Given the empty graph
     And the graph initializer of
       """
-      g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko").
-        addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas").
-        addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop").
-        addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh").
-        addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple").
-        addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter').
-        addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5).
-        addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0).
-        addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4).
-        addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0).
-        addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4).
-        addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2)
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
       """
     And using the parameter xx1 defined as "l[v[lop],v[ripple]]"
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/Index.feature b/gremlin-test/features/map/Index.feature
index 04c190b..3886709 100644
--- a/gremlin-test/features/map/Index.feature
+++ b/gremlin-test/features/map/Index.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepIndex
 Feature: Step - index()
 
   Scenario: g_V_hasLabelXsoftwareX_index_unfold
diff --git a/gremlin-test/features/map/Loops.feature b/gremlin-test/features/map/Loops.feature
index d1c0b9e..fe3701a 100644
--- a/gremlin-test/features/map/Loops.feature
+++ b/gremlin-test/features/map/Loops.feature
@@ -15,8 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepLoops
 Feature: Step - loops()
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX3XX_hasXname_peterX_path_byXnameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -30,6 +32,7 @@
       | p[marko,lop,peter] |
       | p[marko,josh,lop,peter] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX2XX_hasXname_peterX_path_byXnameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -42,6 +45,7 @@
       | result |
       | p[marko,lop,peter] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_and_loops_isX3XX_hasXname_peterX_path_byXnameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/Map.feature b/gremlin-test/features/map/Map.feature
index d9acfed..cc2d8c7 100644
--- a/gremlin-test/features/map/Map.feature
+++ b/gremlin-test/features/map/Map.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepMap
 Feature: Step - map()
 
   Scenario: g_VX1X_mapXnameX
@@ -61,6 +62,7 @@
       | d[5].i |
       | d[4].i |
 
+  @RemoteOnly
   Scenario: g_VX1X_out_mapXlambdaXnameXX_mapXlambdaXlengthXX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/Match.feature b/gremlin-test/features/map/Match.feature
index fc60608..be926fc 100644
--- a/gremlin-test/features/map/Match.feature
+++ b/gremlin-test/features/map/Match.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepMatch
 Feature: Step - match()
 
   Scenario: g_V_valueMap_matchXa_selectXnameX_bX
@@ -58,12 +59,12 @@
     When iterated to list
     Then the result should be unordered
       | result |
-      | d[3].i |
-      | d[2].i |
-      | d[4].i |
-      | d[5].i |
-      | d[3].i |
-      | d[3].i |
+      | v[lop].id |
+      | v[vadas].id |
+      | v[josh].id |
+      | v[ripple].id |
+      | v[lop].id |
+      | v[lop].id |
 
   Scenario: g_V_matchXa_knows_b__b_created_cX
     Given the modern graph
@@ -123,6 +124,7 @@
       | m[{"a":"v[marko]","b":"v[josh]","c":"v[ripple]","d":"v[vadas]"}] |
       | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]","d":"v[vadas]"}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_matchXa_created_lop_b__b_0created_29_c__c_whereXrepeatXoutX_timesX2XXX
     Given the modern graph
     And the traversal of
@@ -161,6 +163,7 @@
       | m[{"a":"v[marko]","b":"v[vadas]"}] |
       | m[{"a":"v[marko]","b":"v[josh]"}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXa_b_cX
     Given the modern graph
     And the traversal of
@@ -259,10 +262,10 @@
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"a":1,"b":3,"c":4}] |
-      | m[{"a":1,"b":3,"c":6}] |
-      | m[{"a":4,"b":3,"c":1}] |
-      | m[{"a":4,"b":3,"c":6}] |
+      | m[{"a":"v[marko].id","b":"v[lop].id","c":"v[josh].id"}] |
+      | m[{"a":"v[marko].id","b":"v[lop].id","c":"v[peter].id"}] |
+      | m[{"a":"v[josh].id","b":"v[lop].id","c":"v[marko].id"}] |
+      | m[{"a":"v[josh].id","b":"v[lop].id","c":"v[peter].id"}] |
 
   Scenario: g_V_matchXa__a_both_b__b_both_cX_dedupXa_bX
     Given the modern graph
@@ -272,20 +275,38 @@
                   __.as("b").both().as("c")).dedup("a", "b")
       """
     When iterated to list
-    Then the result should be unordered
+    Then the result should be of
       | result |
       | m[{"a":"v[marko]","b":"v[lop]","c":"v[marko]"}] |
+      | m[{"a":"v[marko]","b":"v[lop]","c":"v[josh]"}] |
+      | m[{"a":"v[marko]","b":"v[lop]","c":"v[peter]"}] |
       | m[{"a":"v[marko]","b":"v[vadas]","c":"v[marko]"}] |
       | m[{"a":"v[marko]","b":"v[josh]","c":"v[ripple]"}] |
+      | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]"}] |
+      | m[{"a":"v[marko]","b":"v[josh]","c":"v[marko]"}] |
       | m[{"a":"v[vadas]","b":"v[marko]","c":"v[lop]"}] |
+      | m[{"a":"v[vadas]","b":"v[marko]","c":"v[vadas]"}] |
+      | m[{"a":"v[vadas]","b":"v[marko]","c":"v[josh]"}] |
       | m[{"a":"v[lop]","b":"v[marko]","c":"v[lop]"}] |
+      | m[{"a":"v[lop]","b":"v[marko]","c":"v[vadas]"}] |
+      | m[{"a":"v[lop]","b":"v[marko]","c":"v[josh]"}] |
       | m[{"a":"v[lop]","b":"v[josh]","c":"v[ripple]"}] |
+      | m[{"a":"v[lop]","b":"v[josh]","c":"v[lop]"}] |
+      | m[{"a":"v[lop]","b":"v[josh]","c":"v[marko]"}] |
       | m[{"a":"v[lop]","b":"v[peter]","c":"v[lop]"}] |
       | m[{"a":"v[josh]","b":"v[ripple]","c":"v[josh]"}] |
       | m[{"a":"v[josh]","b":"v[lop]","c":"v[marko]"}] |
+      | m[{"a":"v[josh]","b":"v[lop]","c":"v[josh]"}] |
+      | m[{"a":"v[josh]","b":"v[lop]","c":"v[peter]"}] |
       | m[{"a":"v[josh]","b":"v[marko]","c":"v[lop]"}] |
+      | m[{"a":"v[josh]","b":"v[marko]","c":"v[vadas]"}] |
+      | m[{"a":"v[josh]","b":"v[marko]","c":"v[josh]"}] |
       | m[{"a":"v[ripple]","b":"v[josh]","c":"v[ripple]"}] |
+      | m[{"a":"v[ripple]","b":"v[josh]","c":"v[lop]"}] |
+      | m[{"a":"v[ripple]","b":"v[josh]","c":"v[marko]"}] |
       | m[{"a":"v[peter]","b":"v[lop]","c":"v[marko]"}] |
+      | m[{"a":"v[peter]","b":"v[lop]","c":"v[josh]"}] |
+      | m[{"a":"v[peter]","b":"v[lop]","c":"v[peter]"}] |
 
   Scenario: g_V_matchXa_knows_b__b_created_lop__b_matchXb_created_d__d_0created_cX_selectXcX_cX_selectXa_b_cX
     Given the modern graph
@@ -317,6 +338,7 @@
       | m[{"a":"v[marko]","b":"v[vadas]","c":"v[lop]"}] |
       | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_matchXwhereXandXa_created_b__b_0created_count_isXeqX3XXXX__a_both_b__whereXb_inXX
     Given the modern graph
     And the traversal of
@@ -347,6 +369,7 @@
       | m[{"a":"josh","b":"ripple"}] |
       | m[{"a":"peter","b":"lop"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_matchXa_both_b__b_both_cX_dedupXa_bX_byXlabelX
     Given the modern graph
     And the traversal of
@@ -355,11 +378,38 @@
                   __.as("b").both().as("c")).dedup("a", "b").by(T.label)
       """
     When iterated to list
-    Then the result should be unordered
+    Then the result should be of
       | result |
       | m[{"a":"v[marko]","b":"v[lop]","c":"v[marko]"}] |
+      | m[{"a":"v[marko]","b":"v[lop]","c":"v[josh]"}] |
+      | m[{"a":"v[marko]","b":"v[lop]","c":"v[peter]"}] |
       | m[{"a":"v[marko]","b":"v[vadas]","c":"v[marko]"}] |
+      | m[{"a":"v[marko]","b":"v[josh]","c":"v[ripple]"}] |
+      | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]"}] |
+      | m[{"a":"v[marko]","b":"v[josh]","c":"v[marko]"}] |
+      | m[{"a":"v[vadas]","b":"v[marko]","c":"v[lop]"}] |
+      | m[{"a":"v[vadas]","b":"v[marko]","c":"v[vadas]"}] |
+      | m[{"a":"v[vadas]","b":"v[marko]","c":"v[josh]"}] |
       | m[{"a":"v[lop]","b":"v[marko]","c":"v[lop]"}] |
+      | m[{"a":"v[lop]","b":"v[marko]","c":"v[vadas]"}] |
+      | m[{"a":"v[lop]","b":"v[marko]","c":"v[josh]"}] |
+      | m[{"a":"v[lop]","b":"v[josh]","c":"v[ripple]"}] |
+      | m[{"a":"v[lop]","b":"v[josh]","c":"v[lop]"}] |
+      | m[{"a":"v[lop]","b":"v[josh]","c":"v[marko]"}] |
+      | m[{"a":"v[lop]","b":"v[peter]","c":"v[lop]"}] |
+      | m[{"a":"v[josh]","b":"v[ripple]","c":"v[josh]"}] |
+      | m[{"a":"v[josh]","b":"v[lop]","c":"v[marko]"}] |
+      | m[{"a":"v[josh]","b":"v[lop]","c":"v[josh]"}] |
+      | m[{"a":"v[josh]","b":"v[lop]","c":"v[peter]"}] |
+      | m[{"a":"v[josh]","b":"v[marko]","c":"v[lop]"}] |
+      | m[{"a":"v[josh]","b":"v[marko]","c":"v[vadas]"}] |
+      | m[{"a":"v[josh]","b":"v[marko]","c":"v[josh]"}] |
+      | m[{"a":"v[ripple]","b":"v[josh]","c":"v[ripple]"}] |
+      | m[{"a":"v[ripple]","b":"v[josh]","c":"v[lop]"}] |
+      | m[{"a":"v[ripple]","b":"v[josh]","c":"v[marko]"}] |
+      | m[{"a":"v[peter]","b":"v[lop]","c":"v[marko]"}] |
+      | m[{"a":"v[peter]","b":"v[lop]","c":"v[josh]"}] |
+      | m[{"a":"v[peter]","b":"v[lop]","c":"v[peter]"}] |
 
   Scenario: g_V_matchXa_created_b__b_0created_aX
     Given the modern graph
diff --git a/gremlin-test/features/map/Math.feature b/gremlin-test/features/map/Math.feature
index 64ba078..768f37c 100644
--- a/gremlin-test/features/map/Math.feature
+++ b/gremlin-test/features/map/Math.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepMath
 Feature: Step - math()
 
   Scenario: g_V_outE_mathX0_minus_itX_byXweightX
@@ -47,6 +48,7 @@
       | d[54.0].d |
       | d[70.0].d |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX
     Given the modern graph
     And the traversal of
@@ -74,6 +76,7 @@
       | d[132.0].d |
       | d[135.0].d |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXcreatedX_asXbX_mathXb_plus_aX_byXinXcreatedX_countX_byXageX
     Given the modern graph
     And the traversal of
@@ -88,6 +91,7 @@
       | d[35.0].d |
       | d[38.0].d |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_withSackX1X_injectX1X_repeatXsackXsumX_byXconstantX1XXX_timesX5X_emit_mathXsin__X_byXsackX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/map/Max.feature b/gremlin-test/features/map/Max.feature
index 4288563..0d85cce 100644
--- a/gremlin-test/features/map/Max.feature
+++ b/gremlin-test/features/map/Max.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepMax
 Feature: Step - max()
 
   Scenario: g_V_age_max
diff --git a/gremlin-test/features/map/Mean.feature b/gremlin-test/features/map/Mean.feature
index bb2617d..cb1b2de 100644
--- a/gremlin-test/features/map/Mean.feature
+++ b/gremlin-test/features/map/Mean.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepMean
 Feature: Step - mean()
 
   Scenario: g_V_age_mean
@@ -116,6 +117,7 @@
       | result |
       | null |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectXnull_10_20_nullX_mean
     Given the modern graph
     And using the parameter xx1 defined as "d[10].i"
@@ -129,6 +131,7 @@
       | result |
       | d[15].d |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectXlistXnull_10_20_nullXX_meanXlocalX
     Given the modern graph
     And using the parameter xx1 defined as "l[null,d[10].i,d[20].i,null]"
diff --git a/gremlin-test/features/map/Min.feature b/gremlin-test/features/map/Min.feature
index 8d90a64..193e340 100644
--- a/gremlin-test/features/map/Min.feature
+++ b/gremlin-test/features/map/Min.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepMin
 Feature: Step - min()
 
   Scenario: g_V_age_min
@@ -145,6 +146,7 @@
       | result |
       | m[{"ripple":"d[1.0].d","lop":"d[0.2].d"}] |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_V_foo_injectX9999999999X_min
     Given the modern graph
     And using the parameter xx1 defined as "d[9999999999].l"
diff --git a/gremlin-test/features/map/Order.feature b/gremlin-test/features/map/Order.feature
index ddb0c52..fde6fec 100644
--- a/gremlin-test/features/map/Order.feature
+++ b/gremlin-test/features/map/Order.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepOrder
 Feature: Step - order()
 
   Scenario: g_V_name_order
@@ -198,14 +199,14 @@
     Given the modern graph
     And the traversal of
       """
-      g.V().map(__.bothE().values("weight").fold()).order().by(__.sum(Scope.local), Order.desc)
+      g.V().map(__.bothE().values("weight").order().by(Order.asc).fold()).order().by(__.sum(Scope.local), Order.desc)
       """
     When iterated to list
     Then the result should be ordered
       | result |
-      | l[d[1.0].d,d[0.4].d,d[1.0].d] |
+      | l[d[0.4].d,d[1.0].d,d[1.0].d] |
       | l[d[0.4].d,d[0.5].d,d[1.0].d] |
-      | l[d[0.4].d,d[0.4].d,d[0.2].d] |
+      | l[d[0.2].d,d[0.4].d,d[0.4].d] |
       | l[d[1.0].d]                   |
       | l[d[0.5].d]                   |
       | l[d[0.2].d]                   |
diff --git a/gremlin-test/features/map/PageRank.feature b/gremlin-test/features/map/PageRank.feature
index 479a309..a0f003e 100644
--- a/gremlin-test/features/map/PageRank.feature
+++ b/gremlin-test/features/map/PageRank.feature
@@ -15,13 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@GraphComputerOnly @StepClassMap @StepPageRank
 Feature: Step - pageRank()
-                
+
   Scenario: g_V_pageRank_hasXpageRankX
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().has("gremlin.pageRankVertexProgram.pageRank")
+      g.V().pageRank().has("gremlin.pageRankVertexProgram.pageRank")
       """
     When iterated to list
     Then the result should be unordered
@@ -32,13 +33,12 @@
       | v[josh] |
       | v[ripple] |
       | v[peter] |
-    And the graph should return 6 for count of "g.withComputer().V().pageRank().has(\"gremlin.pageRankVertexProgram.pageRank\")"
 
   Scenario: g_V_outXcreatedX_pageRank_withXedges_bothEX_withXpropertyName_projectRankX_withXtimes_0X_valueMapXname_projectRankX
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().out("created").pageRank().with("~tinkerpop.pageRank.edges",__.bothE()).with("~tinkerpop.pageRank.propertyName","projectRank").with("~tinkerpop.pageRank.times",0).valueMap("name", "projectRank")
+      g.V().out("created").pageRank().with("~tinkerpop.pageRank.edges",__.bothE()).with("~tinkerpop.pageRank.propertyName","projectRank").with("~tinkerpop.pageRank.times",0).valueMap("name", "projectRank")
       """
     When iterated to list
     Then the result should be unordered
@@ -52,7 +52,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank", Order.desc).by("name").values("name")
+      g.V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank", Order.desc).by("name").values("name")
       """
     When iterated to list
     Then the result should be ordered
@@ -68,7 +68,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank", Order.desc).values("name").limit(2)
+      g.V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank", Order.desc).values("name").limit(2)
       """
     When iterated to list
     Then the result should be ordered
@@ -80,7 +80,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().with("~tinkerpop.pageRank.edges",__.outE("knows")).with("~tinkerpop.pageRank.propertyName","friendRank").project("name", "friendRank").by("name").by(__.values("friendRank").math("ceil(_ * 100)"))
+      g.V().pageRank().with("~tinkerpop.pageRank.edges",__.outE("knows")).with("~tinkerpop.pageRank.propertyName","friendRank").project("name", "friendRank").by("name").by(__.values("friendRank").math("ceil(_ * 100)"))
       """
     When iterated to list
     Then the result should be unordered
@@ -96,7 +96,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().hasLabel("person").pageRank().with("~tinkerpop.pageRank.propertyName","pageRank").project("name", "pageRank").by("name").by(__.values("pageRank").math("ceil(_ * 100)"))
+      g.V().hasLabel("person").pageRank().with("~tinkerpop.pageRank.propertyName","pageRank").project("name", "pageRank").by("name").by(__.values("pageRank").math("ceil(_ * 100)"))
       """
     When iterated to list
     Then the result should be unordered
@@ -110,7 +110,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().with("~tinkerpop.pageRank.propertyName","pageRank").as("a").out("knows").values("pageRank").as("b").select("a", "b").by().by(__.math("ceil(_ * 100)"))
+      g.V().pageRank().with("~tinkerpop.pageRank.propertyName","pageRank").as("a").out("knows").values("pageRank").as("b").select("a", "b").by().by(__.math("ceil(_ * 100)"))
       """
     When iterated to list
     Then the result should be unordered
@@ -122,7 +122,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().hasLabel("software").has("name", "ripple").pageRank(1.0).with("~tinkerpop.pageRank.edges",__.inE("created")).with("~tinkerpop.pageRank.times",1).with("~tinkerpop.pageRank.propertyName","priors").in("created").union(__.both(), __.identity()).valueMap("name", "priors")
+      g.V().hasLabel("software").has("name", "ripple").pageRank(1.0).with("~tinkerpop.pageRank.edges",__.inE("created")).with("~tinkerpop.pageRank.times",1).with("~tinkerpop.pageRank.propertyName","priors").in("created").union(__.both(), __.identity()).valueMap("name", "priors")
       """
     When iterated to list
     Then the result should be unordered
@@ -136,7 +136,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().out("created").group("m").by(T.label).pageRank(1.0).with("~tinkerpop.pageRank.propertyName", "pageRank").with("~tinkerpop.pageRank.edges",__.inE()).with("~tinkerpop.pageRank.times", 1).in("created").group("m").by("pageRank").cap("m")
+      g.V().out("created").group("m").by(T.label).pageRank(1.0).with("~tinkerpop.pageRank.propertyName", "pageRank").with("~tinkerpop.pageRank.edges",__.inE()).with("~tinkerpop.pageRank.times", 1).in("created").group("m").by("pageRank").cap("m")
       """
     When iterated next
     Then the result should have a count of 3
\ No newline at end of file
diff --git a/gremlin-test/features/map/Path.feature b/gremlin-test/features/map/Path.feature
index 1f49128..e4e9f2e 100644
--- a/gremlin-test/features/map/Path.feature
+++ b/gremlin-test/features/map/Path.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepPath
 Feature: Step - path()
 
   Scenario: g_VX1X_name_path
@@ -29,6 +30,7 @@
       | result |
       | p[v[marko],marko] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_out_path_byXageX_byXnameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -43,6 +45,7 @@
       | p[d[29].i,vadas] |
       | p[d[29].i,josh] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX
     Given the modern graph
     And the traversal of
@@ -55,6 +58,7 @@
       | p[v[marko],josh,java] |
       | p[v[marko],josh,java] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_out_out_path_byXnameX_byXageX
     Given the modern graph
     And the traversal of
@@ -92,6 +96,7 @@
       | p[v[marko],e[marko-created->lop],v[lop],e[josh-created->lop],v[josh]] |
       | p[v[marko],e[marko-created->lop],v[lop],e[peter-created->lop],v[peter]] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXbX_out_asXcX_path_fromXbX_toXcX_byXnameX
     Given the modern graph
     And the traversal of
@@ -104,6 +109,7 @@
       | p[josh,ripple] |
       | p[josh,lop] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_out_path_byXageX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/PeerPressure.feature b/gremlin-test/features/map/PeerPressure.feature
index 4b73300..ed01125 100644
--- a/gremlin-test/features/map/PeerPressure.feature
+++ b/gremlin-test/features/map/PeerPressure.feature
@@ -15,13 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@GraphComputerOnly @StepClassMap @StepPeerPressure
 Feature: Step - peerPressure()
                 
   Scenario: g_V_peerPressure_hasXclusterX
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().peerPressure().has("gremlin.peerPressureVertexProgram.cluster")
+      g.V().peerPressure().has("gremlin.peerPressureVertexProgram.cluster")
       """
     When iterated to list
     Then the result should be unordered
@@ -32,13 +33,12 @@
       | v[josh] |
       | v[ripple] |
       | v[peter] |
-    And the graph should return 6 for count of "g.withComputer().V().peerPressure().has(\"gremlin.peerPressureVertexProgram.cluster\")"
 
   Scenario: g_V_peerPressure_withXpropertyName_clusterX_withXedges_outEXknowsXX_pageRankX1X_byXrankX_withXedges_outEXknowsX_withXtimes_2X_group_byXclusterX_byXrank_sumX_limitX100X
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().peerPressure().with("~tinkerpop.peerPressure.propertyName","cluster").with("~tinkerpop.peerPressure.edges",__.outE("knows")).pageRank(1.0).with("~tinkerpop.pageRank.propertyName", "rank").with("~tinkerpop.pageRank.edges", __.outE("knows")).with("~tinkerpop.pageRank.times", 1).group().by("cluster").by(__.values("rank").sum()).limit(100)
+      g.V().peerPressure().with("~tinkerpop.peerPressure.propertyName","cluster").with("~tinkerpop.peerPressure.edges",__.outE("knows")).pageRank(1.0).with("~tinkerpop.pageRank.propertyName", "rank").with("~tinkerpop.pageRank.edges", __.outE("knows")).with("~tinkerpop.pageRank.times", 1).group().by("cluster").by(__.values("rank").sum()).limit(100)
       """
     When iterated to list
     Then the result should be unordered
@@ -49,7 +49,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name", "ripple").in("created").peerPressure().with("~tinkerpop.peerPressure.edges",__.outE()).with("~tinkerpop.peerPressure.propertyName", "cluster").repeat(__.union(__.identity(), __.both())).times(2).dedup().valueMap("name", "cluster")
+      g.V().has("name", "ripple").in("created").peerPressure().with("~tinkerpop.peerPressure.edges",__.outE()).with("~tinkerpop.peerPressure.propertyName", "cluster").repeat(__.union(__.identity(), __.both())).times(2).dedup().valueMap("name", "cluster")
       """
     When iterated to list
     Then the result should be unordered
diff --git a/gremlin-test/features/map/Project.feature b/gremlin-test/features/map/Project.feature
index 1749693..bbcf9a4 100644
--- a/gremlin-test/features/map/Project.feature
+++ b/gremlin-test/features/map/Project.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepProject
 Feature: Step - project()
 
   Scenario: g_V_hasLabelXpersonX_projectXa_bX_byXoutE_countX_byXageX
diff --git a/gremlin-test/features/map/Properties.feature b/gremlin-test/features/map/Properties.feature
index d4d07ce..cf67239 100644
--- a/gremlin-test/features/map/Properties.feature
+++ b/gremlin-test/features/map/Properties.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepProperties
 Feature: Step - properties()
 
   Scenario: g_V_hasXageX_propertiesXnameX
diff --git a/gremlin-test/features/map/Select.feature b/gremlin-test/features/map/Select.feature
index 6da8ac6..a69dcc4 100644
--- a/gremlin-test/features/map/Select.feature
+++ b/gremlin-test/features/map/Select.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepSelect
 Feature: Step - select()
 
   Scenario: g_VX1X_asXaX_outXknowsX_asXbX_selectXa_bX
@@ -125,6 +126,7 @@
       | m[{"a": "lop", "b": "lop"}] |
       | m[{"a": "peter", "b": "peter"}] |
 
+  @MultiMetaProperties
   Scenario: g_V_hasXname_gremlinX_inEXusesX_order_byXskill_ascX_asXaX_outV_asXbX_selectXa_bX_byXskillX_byXnameX
     Given the crew graph
     And the traversal of
@@ -340,6 +342,7 @@
       | result |
       | m[{"ripple":"d[1].l", "lop":"d[6].l"}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_untilXout_outX_repeatXin_asXaXX_selectXaX_byXtailXlocalX_nameX
     Given the modern graph
     And the traversal of
@@ -369,6 +372,7 @@
       | d[0.4].d |
       | d[0.2].d |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_hasLabelXsoftwareX_asXnameX_asXlanguageX_asXcreatorsX_selectXname_language_creatorsX_byXnameX_byXlangX_byXinXcreatedX_name_fold_orderXlocalXX
     Given the modern graph
     And the traversal of
@@ -410,6 +414,7 @@
       | d[2].l |
       | d[1].l |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_untilXout_outX_repeatXin_asXaX_in_asXbXX_selectXa_bX_byXnameX
     Given the modern graph
     And the traversal of
@@ -460,6 +465,7 @@
       | v[marko] |
       | v[marko] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXknowsX_asXbX_localXselectXa_bX_byXnameXX
     Given the modern graph
     And the traversal of
@@ -520,6 +526,7 @@
       | d[2].l |
       | d[2].l |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_groupXmX_by_byXbothE_countX_barrier_selectXmX_selectXselectXaXX
     Given the modern graph
     And the traversal of
@@ -536,6 +543,7 @@
       | d[1].l |
       | d[1].l |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_groupXmX_by_byXbothE_countX_barrier_selectXmX_selectXselectXaXX_byXmathX_plus_XX
     Given the modern graph
     And the traversal of
@@ -552,6 +560,7 @@
       | d[2].d |
       | d[2].d |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXknowsX_asXaX_selectXall_constantXaXX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/map/ShortestPath.feature b/gremlin-test/features/map/ShortestPath.feature
index 9ae01b2..1393812 100644
--- a/gremlin-test/features/map/ShortestPath.feature
+++ b/gremlin-test/features/map/ShortestPath.feature
@@ -15,13 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@GraphComputerOnly @StepClassMap @StepShortestPath
 Feature: Step - shortestPath()
 
   Scenario: g_V_shortestPath
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath()
+      g.V().shortestPath()
       """
     When iterated to list
     Then the result should be unordered
@@ -67,7 +68,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().both().dedup().shortestPath()
+      g.V().both().dedup().shortestPath()
       """
     When iterated to list
     Then the result should be unordered
@@ -113,7 +114,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.includeEdges")
+      g.V().shortestPath().with("~tinkerpop.shortestPath.includeEdges")
       """
     When iterated to list
     Then the result should be unordered
@@ -159,7 +160,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.edges", Direction.IN)
+      g.V().shortestPath().with("~tinkerpop.shortestPath.edges", Direction.IN)
       """
     When iterated to list
     Then the result should be unordered
@@ -182,7 +183,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.edges", __.outE())
+      g.V().shortestPath().with("~tinkerpop.shortestPath.edges", __.outE())
       """
     When iterated to list
     Then the result should be unordered
@@ -205,7 +206,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().
+      g.V().shortestPath().
           with("~tinkerpop.shortestPath.includeEdges").
           with("~tinkerpop.shortestPath.edges", __.outE())
       """
@@ -230,7 +231,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","marko").shortestPath()
+      g.V().has("name","marko").shortestPath()
       """
     When iterated to list
     Then the result should be unordered
@@ -246,7 +247,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.target", __.has("name","marko"))
+      g.V().shortestPath().with("~tinkerpop.shortestPath.target", __.has("name","marko"))
       """
     When iterated to list
     Then the result should be unordered
@@ -262,7 +263,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.target", __.values("name").is("marko"))
+      g.V().shortestPath().with("~tinkerpop.shortestPath.target", __.values("name").is("marko"))
       """
     When iterated to list
     Then the result should be unordered
@@ -278,7 +279,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","marko").shortestPath().with("~tinkerpop.shortestPath.target", __.hasLabel("software"))
+      g.V().has("name","marko").shortestPath().with("~tinkerpop.shortestPath.target", __.hasLabel("software"))
       """
     When iterated to list
     Then the result should be unordered
@@ -290,7 +291,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","marko").shortestPath().
+      g.V().has("name","marko").shortestPath().
           with("~tinkerpop.shortestPath.target", __.has("name","josh")).
           with("~tinkerpop.shortestPath.distance", "weight")
       """
@@ -299,11 +300,12 @@
       | result                     |
       | p[v[marko],v[lop],v[josh]] |
 
+  @MultiMetaProperties
   Scenario: g_V_hasXname_danielX_shortestPath_targetXhasXname_stephenXX_edgesXbothEXusesXX
     Given the crew graph
     And the traversal of
       """
-      g.withComputer().V().has("name","daniel").shortestPath().
+      g.V().has("name","daniel").shortestPath().
           with("~tinkerpop.shortestPath.target", __.has("name","stephen")).
           with("~tinkerpop.shortestPath.edges", __.bothE("uses"))
       """
@@ -317,7 +319,7 @@
     Given the grateful graph
     And the traversal of
       """
-      g.withComputer().V().has("song","name","MIGHT AS WELL").
+      g.V().has("song","name","MIGHT AS WELL").
         shortestPath().
           with("~tinkerpop.shortestPath.target", __.has("song","name","MAYBE YOU KNOW HOW I FEEL")).
           with("~tinkerpop.shortestPath.edges", __.outE("followedBy")).
@@ -333,7 +335,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","marko").shortestPath().with("~tinkerpop.shortestPath.maxDistance", 1)
+      g.V().has("name","marko").shortestPath().with("~tinkerpop.shortestPath.maxDistance", 1)
       """
     When iterated to list
     Then the result should be unordered
@@ -347,7 +349,7 @@
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","vadas").shortestPath().
+      g.V().has("name","vadas").shortestPath().
           with("~tinkerpop.shortestPath.distance", "weight").
           with("~tinkerpop.shortestPath.maxDistance", 1.3)
       """
diff --git a/gremlin-test/features/map/Sum.feature b/gremlin-test/features/map/Sum.feature
index f2993df..44e59f7 100644
--- a/gremlin-test/features/map/Sum.feature
+++ b/gremlin-test/features/map/Sum.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepSum
 Feature: Step - sum()
 
   Scenario: g_V_age_sum
@@ -116,6 +117,7 @@
       | result |
       | null |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectXnull_10_5_nullX_sum
     Given the modern graph
     And using the parameter xx1 defined as "d[10].i"
@@ -129,6 +131,7 @@
       | result |
       | d[15].l |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectXlistXnull_10_5_nullXX_sumXlocalX
     Given the modern graph
     And using the parameter xx1 defined as "l[null,d[10].i,d[5].i,null]"
diff --git a/gremlin-test/features/map/Unfold.feature b/gremlin-test/features/map/Unfold.feature
index 5360471..b687db9 100644
--- a/gremlin-test/features/map/Unfold.feature
+++ b/gremlin-test/features/map/Unfold.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepUnfold
 Feature: Step - unfold()
 
   Scenario: g_V_localXoutE_foldX_unfold
@@ -56,6 +57,7 @@
       | name   |
       | age    |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_repeatXboth_simplePathX_untilXhasIdX6XX_path_byXnameX_unfold
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/ValueMap.feature b/gremlin-test/features/map/ValueMap.feature
index 0b43aa4..bedd50a 100644
--- a/gremlin-test/features/map/ValueMap.feature
+++ b/gremlin-test/features/map/ValueMap.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepValueMap
 Feature: Step - valueMap()
 
   Scenario: g_V_valueMap
@@ -183,6 +184,7 @@
       | m[{"name": ["josh"], "age": [32], "t[label]":"person", "t[id]":"v[josh].id"}] |
       | m[{"name": ["peter"], "age": [35], "t[label]":"person", "t[id]":"v[peter].id"}] |
 
+  @MultiMetaProperties
   Scenario: g_VX1X_valueMapXname_locationX_byXunfoldX_by
     Given the crew graph
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/Vertex.feature b/gremlin-test/features/map/Vertex.feature
index 62ac798..37738bb 100644
--- a/gremlin-test/features/map/Vertex.feature
+++ b/gremlin-test/features/map/Vertex.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassMap @StepVertex
 Feature: Step - V(), E(), out(), in(), both(), inE(), outE(), bothE()
 
   Scenario: g_VXlistX1_2_3XX_name
@@ -135,7 +136,7 @@
     Given the modern graph
     And using the parameter eid11 defined as "e[josh-created->lop].id"
     And the traversal of
-    """
+      """
       g.E(eid11)
       """
     When iterated to list
@@ -147,7 +148,7 @@
     Given the modern graph
     And using the parameter eid11 defined as "e[josh-created->lop].sid"
     And the traversal of
-    """
+      """
       g.E(eid11)
       """
     When iterated to list
@@ -159,7 +160,7 @@
     Given the modern graph
     And using the parameter e11 defined as "e[josh-created->lop]"
     And the traversal of
-    """
+      """
       g.E(e11)
       """
     When iterated to list
@@ -172,7 +173,7 @@
     And using the parameter e7 defined as "e[marko-knows->vadas]"
     And using the parameter e11 defined as "e[josh-created->lop]"
     And the traversal of
-    """
+      """
       g.E(e7,e11)
       """
     When iterated to list
@@ -185,7 +186,7 @@
     Given the modern graph
     And using the parameter xx1 defined as "l[e[marko-knows->vadas],e[josh-created->lop]]"
     And the traversal of
-    """
+      """
       g.E(xx1)
       """
     When iterated to list
@@ -198,7 +199,7 @@
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
     And the traversal of
-    """
+      """
       g.V(vid1).outE()
       """
     When iterated to list
@@ -212,7 +213,7 @@
     Given the modern graph
     And using the parameter vid2 defined as "v[vadas].id"
     And the traversal of
-    """
+      """
       g.V(vid2).inE()
       """
     When iterated to list
@@ -224,7 +225,7 @@
     Given the modern graph
     And using the parameter vid4 defined as "v[josh].id"
     And the traversal of
-    """
+      """
       g.V(vid4).bothE("created")
       """
     When iterated to list
@@ -237,7 +238,7 @@
     Given the modern graph
     And using the parameter vid4 defined as "v[josh].id"
     And the traversal of
-    """
+      """
       g.V(vid4).bothE()
       """
     When iterated to list
@@ -502,26 +503,41 @@
       | v[vadas] |
       | v[josh] |
 
-  # this test deviates from the setup of the java test, but the intent is the same. the java test drops lop and then
-  # tries to query it as part of the group of ids. here, rather than drop, we simply use an id that doesn't exist
-  # which is simulated by an edge identifier.
+
+
+  # the point here is to test g.V() where an id is not present. to do this with the gherkin structure
+  # the test establishes the modern graph, does a drop() of "lop" and then tries to query the 4 vertices
+  # and we assert the count of 3
   Scenario: g_VX1_2_3_4X_name
-    Given the modern graph
+    Given the empty graph
+    And the graph initializer of
+      """
+      g.addV("person").property("name", "marko").property("age", 29).as("marko").
+        addV("person").property("name", "vadas").property("age", 27).as("vadas").
+        addV("software").property("name", "lop").property("lang", "java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", "java").as("ripple").
+        addV("person").property("name", "peter").property("age", 35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
+      """
     And using the parameter vid1 defined as "v[marko].id"
     And using the parameter vid2 defined as "v[vadas].id"
-    And using the parameter vid3 defined as "e[marko-knows->josh].id"
+    And using the parameter vid3 defined as "v[lop].id"
     And using the parameter vid4 defined as "v[josh].id"
     And the traversal of
       """
-      g.V(vid1, vid2, vid3, vid4).values("name")
+      g.V().has('software','name','lop').drop()
       """
     When iterated to list
-    Then the result should be unordered
-      | result |
-      | marko |
-      | vadas |
-      | josh |
+    Then the result should be empty
+    And the graph should return 3 for count of "g.V(vid1, vid2, vid3, vid4)"
 
+  @GraphComputerVerificationMidVNotSupported
   Scenario: g_V_hasLabelXpersonX_V_hasLabelXsoftwareX_name
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/sideEffect/Aggregate.feature b/gremlin-test/features/sideEffect/Aggregate.feature
index 38a609a..1f00ba2 100644
--- a/gremlin-test/features/sideEffect/Aggregate.feature
+++ b/gremlin-test/features/sideEffect/Aggregate.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepAggregate
 Feature: Step - aggregate()
 
   Scenario: g_V_valueXnameX_aggregateXxX_capXxX
diff --git a/gremlin-test/features/sideEffect/Group.feature b/gremlin-test/features/sideEffect/Group.feature
index a8cf455..e7c83a7 100644
--- a/gremlin-test/features/sideEffect/Group.feature
+++ b/gremlin-test/features/sideEffect/Group.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepGroup
 Feature: Step - group()
 
   Scenario: g_V_group_byXnameX
@@ -98,12 +99,12 @@
     Given the modern graph
     And the traversal of
       """
-      g.V().group().by(__.outE().count()).by("name")
+      g.V().order().by("name").group().by(__.outE().count()).by("name")
       """
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"d[0].l":["vadas","lop","ripple"],"d[1].l":["peter"],"d[2].l":["josh"],"d[3].l":["marko"]}] |
+      | m[{"d[0].l":["lop","ripple","vadas"],"d[1].l":["peter"],"d[2].l":["josh"],"d[3].l":["marko"]}] |
 
   Scenario: g_V_groupXaX_byXlabelX_byXoutE_weight_sumX_capXaX
     Given the modern graph
@@ -217,6 +218,7 @@
       | result |
       | m[{"cover":{"followedBy":"d[777982].l"}, "":{"followedBy":"d[179350].l"}, "original":{"followedBy":"d[2185613].l"}}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX
     Given the modern graph
     And the traversal of
@@ -239,18 +241,20 @@
       | result |
       | m[{"software":"d[2.0].d", "person":"d[5.0].d"}] |
 
+  # The post-ordering really isn't really right but works around TINKERPOP-2600
   Scenario: g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX
     Given the modern graph
-    And using the parameter xx1 defined as "m[{\"marko\":[666], \"noone\":[\"blah\"]}]"
+    And using the parameter xx1 defined as "m[{\"marko\":[\"666\"], \"noone\":[\"blah\"]}]"
     And the traversal of
       """
-      g.withSideEffect("a", xx1).V().group("a").by("name").by(__.outE().label().fold()).cap("a")
+      g.withSideEffect("a", xx1).V().group("a").by("name").by(__.outE().label().fold()).cap("a").unfold().group().by(keys).by(select(values).order(Scope.local).by(Order.asc))
       """
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"ripple":[], "peter":["created"], "noone":["blah"], "vadas":[], "josh":["created", "created"], "lop":[], "marko":[666, "created", "knows", "knows"]}] |
+      | m[{"ripple":[], "peter":["created"], "noone":["blah"], "vadas":[], "josh":["created", "created"], "lop":[], "marko":["666", "created", "knows", "knows"]}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_hasLabelXpersonX_asXpX_outXcreatedX_group_byXnameX_byXselectXpX_valuesXageX_sumX
     Given the modern graph
     And the traversal of
@@ -262,6 +266,7 @@
       | result |
       | m[{"ripple":"d[32].l", "lop":"d[96].l"}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_hasLabelXpersonX_asXpX_outXcreatedX_groupXaX_byXnameX_byXselectXpX_valuesXageX_sumX_capXaX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/sideEffect/GroupCount.feature b/gremlin-test/features/sideEffect/GroupCount.feature
index 53acd6d..98de286 100644
--- a/gremlin-test/features/sideEffect/GroupCount.feature
+++ b/gremlin-test/features/sideEffect/GroupCount.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepCount
 Feature: Step - groupCount()
 
   Scenario: g_V_outXcreatedX_groupCount_byXnameX
diff --git a/gremlin-test/features/sideEffect/Inject.feature b/gremlin-test/features/sideEffect/Inject.feature
index bf5a23f..a186095 100644
--- a/gremlin-test/features/sideEffect/Inject.feature
+++ b/gremlin-test/features/sideEffect/Inject.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepInject
 Feature: Step - inject()
 
   Scenario: g_VX1X_out_injectXv2X_name
@@ -139,6 +140,7 @@
     When iterated to list
     Then the result should be empty
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_VX1X_valuesXageX_injectXnull_nullX
     Given the modern graph
     And using the parameter xx1 defined as "v[marko].id"
@@ -153,6 +155,7 @@
       | null |
       | null |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_VX1X_valuesXageX_injectXnullX
     Given the modern graph
     And using the parameter xx1 defined as "v[marko].id"
@@ -166,7 +169,7 @@
       | d[29].i |
       | null |
 
-
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_VX1X_valuesXageX_inject
     Given the modern graph
     And using the parameter xx1 defined as "v[marko].id"
diff --git a/gremlin-test/features/sideEffect/Read.feature b/gremlin-test/features/sideEffect/Read.feature
index ae96102..924f85e 100644
--- a/gremlin-test/features/sideEffect/Read.feature
+++ b/gremlin-test/features/sideEffect/Read.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepRead
 Feature: Step - read()
 
   Scenario: g_io_readXkryoX
diff --git a/gremlin-test/features/sideEffect/Sack.feature b/gremlin-test/features/sideEffect/Sack.feature
index 6c4627d..0ce1ad0 100644
--- a/gremlin-test/features/sideEffect/Sack.feature
+++ b/gremlin-test/features/sideEffect/Sack.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepSack
 Feature: Step - sack()
 
   Scenario: g_withSackXhelloX_V_outE_sackXassignX_byXlabelX_inV_sack
@@ -56,6 +57,7 @@
       | d[2.0].m |
       | d[1.4].m |
 
+  @GraphComputerVerificationOneBulk
   Scenario: g_withBulkXfalseX_withSackX1_sumX_VX1X_localXoutEXknowsX_barrierXnormSackX_inVX_inXknowsX_barrier_sack
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -68,6 +70,7 @@
       | result |
       | d[1.0].m |
 
+  @GraphComputerVerificationOneBulk
   Scenario: g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/sideEffect/SideEffectCap.feature b/gremlin-test/features/sideEffect/SideEffectCap.feature
index dae07da..29f26eb 100644
--- a/gremlin-test/features/sideEffect/SideEffectCap.feature
+++ b/gremlin-test/features/sideEffect/SideEffectCap.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepCap
 Feature: Step - cap()
 
   Scenario: g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX
diff --git a/gremlin-test/features/sideEffect/Store.feature b/gremlin-test/features/sideEffect/Store.feature
index deb1264..bf20cea 100644
--- a/gremlin-test/features/sideEffect/Store.feature
+++ b/gremlin-test/features/sideEffect/Store.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepStore
 Feature: Step - store()
 
   Scenario: g_V_storeXa_nameX_out_capXaX
diff --git a/gremlin-test/features/sideEffect/Write.feature b/gremlin-test/features/sideEffect/Write.feature
index 9a774e8..79dc086 100644
--- a/gremlin-test/features/sideEffect/Write.feature
+++ b/gremlin-test/features/sideEffect/Write.feature
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
+@StepClassSideEffect @StepWrite
 Feature: Step - write()
 
   Scenario: g_io_writeXkryoX
diff --git a/gremlin-test/pom.xml b/gremlin-test/pom.xml
index a917e01..265c57a 100644
--- a/gremlin-test/pom.xml
+++ b/gremlin-test/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-test</artifactId>
     <name>Apache TinkerPop :: Gremlin Test</name>
@@ -48,8 +48,40 @@
             <artifactId>hamcrest</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
+            <groupId>io.cucumber</groupId>
+            <artifactId>cucumber-java</artifactId>
+            <version>6.11.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apiguardian</groupId>
+                    <artifactId>apiguardian-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apiguardian</groupId>
+            <artifactId>apiguardian-api</artifactId>
+            <version>1.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.cucumber</groupId>
+            <artifactId>cucumber-junit</artifactId>
+            <version>6.11.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.cucumber</groupId>
+            <artifactId>cucumber-guice</artifactId>
+            <version>6.11.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+            <version>4.2.3</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <optional>true</optional>
         </dependency>
         <dependency>
@@ -98,6 +130,14 @@
                     <descriptorRefs>
                         <descriptorRef>jar-with-dependencies</descriptorRef>
                     </descriptorRefs>
+                    <descriptors>
+                        <descriptor>src/assembly/standalone.xml</descriptor>
+                        <descriptor>src/assembly/distribution.xml</descriptor>
+                    </descriptors>
+                    <finalName>apache-tinkerpop-${project.artifactId}-${project.version}</finalName>
+                    <outputDirectory>target</outputDirectory>
+                    <workDirectory>target/assembly/work</workDirectory>
+                    <tarLongFileMode>warn</tarLongFileMode>
                 </configuration>
             </plugin>
         </plugins>
@@ -119,7 +159,9 @@
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
                         <configuration>
-                            <argLine>-Dlog4j.configuration=${log4j-test.properties} -Dbuild.dir=${project.build.directory} -Dis.testing=true -Djava.net.preferIPv4Stack=true ${suresafeArgs}
+                            <argLine>-Dlogback.configurationFile=${logback-test.properties}
+                                -Dbuild.dir=${project.build.directory} -Dis.testing=true -Djava.net.preferIPv4Stack=true
+                                ${suresafeArgs}
                             </argLine>
                             <excludes>
                                 <exclude>TraversalInterruptionTest.java</exclude>
diff --git a/gremlin-test/src/assembly/distribution.xml b/gremlin-test/src/assembly/distribution.xml
new file mode 100644
index 0000000..5a6989b
--- /dev/null
+++ b/gremlin-test/src/assembly/distribution.xml
@@ -0,0 +1,42 @@
+<!--
+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.
+-->
+<assembly>
+    <id>distribution</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+    <fileSets>
+        <fileSet>
+            <directory>target/apache-tinkerpop-${project.artifactId}-${project.version}-standalone/data</directory>
+            <outputDirectory>data</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>target/apache-tinkerpop-${project.artifactId}-${project.version}-standalone/features</directory>
+            <outputDirectory>features</outputDirectory>
+        </fileSet>
+    </fileSets>
+    <files>
+        <file>
+            <source>src/main/static/LICENSE</source>
+            <outputDirectory></outputDirectory>
+        </file>
+        <file>
+            <source>src/main/static/NOTICE</source>
+            <outputDirectory></outputDirectory>
+        </file>
+    </files>
+</assembly>
diff --git a/gremlin-test/src/assembly/standalone.xml b/gremlin-test/src/assembly/standalone.xml
new file mode 100644
index 0000000..a2e53e5
--- /dev/null
+++ b/gremlin-test/src/assembly/standalone.xml
@@ -0,0 +1,48 @@
+<!--
+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.
+-->
+<assembly>
+    <id>standalone</id>
+    <formats>
+        <format>dir</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <fileSets>
+        <fileSet>
+            <directory>features</directory>
+            <outputDirectory>/features</outputDirectory>
+            <includes>
+                <include>**/*.feature</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>../data</directory>
+            <outputDirectory>/data</outputDirectory>
+        </fileSet>
+    </fileSets>
+
+    <files>
+        <file>
+            <source>src/main/static/LICENSE</source>
+            <outputDirectory></outputDirectory>
+        </file>
+        <file>
+            <source>src/main/static/NOTICE</source>
+            <outputDirectory></outputDirectory>
+        </file>
+    </files>
+</assembly>
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractFileGraphProvider.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractFileGraphProvider.java
index cedbf38..499822f 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractFileGraphProvider.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractFileGraphProvider.java
@@ -19,16 +19,9 @@
 package org.apache.tinkerpop.gremlin;
 
 import org.apache.commons.configuration2.Configuration;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.io.Storage;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONResourceAccess;
-import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoResourceAccess;
-import org.apache.tinkerpop.gremlin.structure.io.script.ScriptResourceAccess;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import java.util.Random;
 
 /**
@@ -43,51 +36,6 @@
 
     protected boolean graphSONInput = false;
 
-    public static Map<String, String> PATHS = new HashMap<>();
-    static {
-        try {
-            final List<String> kryoResources = Arrays.asList(
-                    "tinkerpop-modern-v3d0.kryo",
-                    "grateful-dead-v3d0.kryo",
-                    "tinkerpop-classic-v3d0.kryo",
-                    "tinkerpop-crew-v3d0.kryo",
-                    "tinkerpop-sink-v3d0.kryo");
-            for (final String fileName : kryoResources) {
-                PATHS.put(fileName,
-                        Storage.toPath(TestHelper.generateTempFileFromResource(GryoResourceAccess.class, fileName, "")));
-            }
-
-            final List<String> graphsonResources = Arrays.asList(
-                    "tinkerpop-modern-typed-v2d0.json",
-                    "tinkerpop-modern-v3d0.json",
-                    "grateful-dead-typed-v2d0.json",
-                    "grateful-dead-v3d0.json",
-                    "tinkerpop-classic-typed-v2d0.json",
-                    "tinkerpop-classic-v3d0.json",
-                    "tinkerpop-crew-typed-v2d0.json",
-                    "tinkerpop-crew-v3d0.json",
-                    "tinkerpop-sink-v3d0.json");
-            for (final String fileName : graphsonResources) {
-                PATHS.put(fileName,
-                        Storage.toPath(TestHelper.generateTempFileFromResource(GraphSONResourceAccess.class, fileName, "")));
-            }
-
-            final List<String> scriptResources = Arrays.asList(
-                    "tinkerpop-classic.txt",
-                    "script-input.groovy",
-                    "script-output.groovy",
-                    "grateful-dead.txt",
-                    "script-input-grateful-dead.groovy",
-                    "script-output-grateful-dead.groovy");
-            for (final String fileName : scriptResources) {
-                PATHS.put(fileName,
-                        Storage.toPath(TestHelper.generateTempFileFromResource(ScriptResourceAccess.class, fileName, "")));
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
     @Override
     public void clear(final Graph graph, final Configuration configuration) throws Exception {
         if (graph != null)
@@ -95,20 +43,6 @@
     }
 
     protected String getInputLocation(final Graph g, final LoadGraphWith.GraphData graphData) {
-        final String type = this.graphSONInput ? "-v3d0.json" : "-v3d0.kryo";
-
-        if (graphData.equals(LoadGraphWith.GraphData.GRATEFUL))
-            return PATHS.get("grateful-dead" + type);
-        else if (graphData.equals(LoadGraphWith.GraphData.MODERN))
-            return PATHS.get("tinkerpop-modern" + type);
-        else if (graphData.equals(LoadGraphWith.GraphData.CLASSIC))
-            return PATHS.get("tinkerpop-classic" + type);
-        else if (graphData.equals(LoadGraphWith.GraphData.CREW))
-            return PATHS.get("tinkerpop-crew" + type);
-        else if (graphData.equals(LoadGraphWith.GraphData.SINK))
-            return PATHS.get("tinkerpop-sink" + type);
-        else
-            throw new RuntimeException("Could not load graph with " + graphData);
+        return TestFiles.getInputLocation(graphData, graphSONInput);
     }
-
 }
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/AbstractGuiceFactory.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/AbstractGuiceFactory.java
new file mode 100644
index 0000000..13c17b9
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/AbstractGuiceFactory.java
@@ -0,0 +1,56 @@
+/*
+ * 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.features;
+
+import com.google.inject.Injector;
+import io.cucumber.core.backend.ObjectFactory;
+import io.cucumber.guice.ScenarioScope;
+
+/**
+ * Base class for implementing a custom {@code ObjectFactory} for cucumber tests and is based on the basic
+ * {@code GuiceFactory} implementation which can't be extended. That implementation works well when there is only
+ * single {@link World} implementation to test or if the requirements are such that system properties or environment
+ * variables can otherwise suffice in controlling the test environment to the provider's satisfaction. In other cases,
+ * it may simply be easier to create a custom {@code ObjectFactory} from this class, register it in
+ * {@code META-INF/services/io.cucumber.core.backend.ObjectFactory} and then reference it directly in the
+ * {@code CucumberOptions} annotation for the test class.
+ */
+public class AbstractGuiceFactory implements ObjectFactory {
+    private final Injector injector;
+
+    protected AbstractGuiceFactory(final Injector injector) {
+        this.injector = injector;
+    }
+
+    public boolean addClass(final Class<?> clazz) {
+        return true;
+    }
+
+    public void start() {
+        injector.getInstance(ScenarioScope.class).enterScope();
+    }
+
+    public void stop() {
+        injector.getInstance(ScenarioScope.class).exitScope();
+    }
+
+    public <T> T getInstance(final Class<T> clazz) {
+        return injector.getInstance(clazz);
+    }
+}
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/FeatureReader.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/FeatureReader.java
deleted file mode 100644
index 763cb0e..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/FeatureReader.java
+++ /dev/null
@@ -1,79 +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.features;
-
-import org.apache.commons.text.StringEscapeUtils;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Reads the feature files and extracts Gremlin to a {@code Map} structure of the test name as the key with a
- * {@code List} of Gremlin strings for the value.
- */
-public class FeatureReader {
-
-    public static Map<String, List<String>> parse(final String projectRoot) throws IOException {
-        final Map<String, List<String>> gremlins = new LinkedHashMap<>();
-        Files.find(Paths.get(projectRoot, "gremlin-test", "features"),
-                   Integer.MAX_VALUE,
-                (filePath, fileAttr) -> fileAttr.isRegularFile() && filePath.toString().endsWith(".feature")).
-                sorted().
-                forEach(f -> {
-                    String currentGremlin = "";
-                    boolean openTriples = false;
-                    boolean skipIgnored = false;
-                    String scenarioName = "";
-
-                    try {
-                        final List<String> lines = Files.readAllLines(f, StandardCharsets.UTF_8);
-                        for (String line : lines) {
-                            String cleanLine = line.trim();
-                            if (cleanLine.startsWith("Scenario:")) {
-                                scenarioName = cleanLine.split(":")[1].trim();
-                                skipIgnored = false;
-                            } else if (cleanLine.startsWith("Then nothing should happen because")) {
-                                skipIgnored = true;
-                            } else if (cleanLine.startsWith("And the graph should return")) {
-                                gremlins.computeIfAbsent(scenarioName, k -> new ArrayList<>()).add(StringEscapeUtils.unescapeJava(cleanLine.substring(cleanLine.indexOf("\"") + 1, cleanLine.lastIndexOf("\""))));
-                            } else if (cleanLine.startsWith("\"\"\"")) {
-                                openTriples = !openTriples;
-                                if (!skipIgnored && !openTriples) {
-                                    gremlins.computeIfAbsent(scenarioName, k -> new ArrayList<>()).add(currentGremlin);
-                                    currentGremlin = "";
-                                }
-                            } else if (openTriples && !skipIgnored) {
-                                currentGremlin += cleanLine;
-                            }
-                        }
-                    } catch (IOException ioe) {
-                        throw new RuntimeException(ioe);
-                    }
-                });
-
-        return gremlins;
-    }
-}
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java
new file mode 100644
index 0000000..410858c
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java
@@ -0,0 +1,440 @@
+/*
+ * 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.features;
+
+import com.google.inject.Inject;
+import io.cucumber.datatable.DataTable;
+import io.cucumber.guice.ScenarioScoped;
+import io.cucumber.java.After;
+import io.cucumber.java.Before;
+import io.cucumber.java.Scenario;
+import io.cucumber.java.en.Given;
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import org.antlr.v4.runtime.CharStreams;
+import org.antlr.v4.runtime.CommonTokenStream;
+import org.apache.tinkerpop.gremlin.language.grammar.GremlinAntlrToJava;
+import org.apache.tinkerpop.gremlin.language.grammar.GremlinLexer;
+import org.apache.tinkerpop.gremlin.language.grammar.GremlinParser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
+import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
+import org.javatuples.Pair;
+import org.javatuples.Triplet;
+import org.junit.AssumptionViolatedException;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIn.in;
+import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+import static org.hamcrest.core.Every.everyItem;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@ScenarioScoped
+public final class StepDefinition {
+
+    private static final ObjectMapper mapper = new ObjectMapper();
+
+    private World world;
+    private GraphTraversalSource g;
+    private final Map<String, String> stringParameters = new HashMap<>();
+    private Traversal traversal;
+    private Object result;
+    private static final Pattern edgeTripletPattern = Pattern.compile("(.+)-(.+)->(.+)");
+    private static final Pattern ioPattern = Pattern.compile("g\\.io\\(\"(.*)\"\\).*");
+    private List<Pair<Pattern, Function<String,String>>> stringMatcherConverters = new ArrayList<Pair<Pattern, Function<String,String>>>() {{
+        // expects json so that should port to the Gremlin script form - replace curly json braces with square ones
+        // for Gremlin sake.
+        add(Pair.with(Pattern.compile("m\\[(.*)\\]"), s -> s.replace('{','[').replace('}', ']')));
+
+        add(Pair.with(Pattern.compile("l\\[\\]"), s -> "[]"));
+        add(Pair.with(Pattern.compile("l\\[(.*)\\]"), s -> {
+            final String[] items = s.split(",");
+            final String listItems = Stream.of(items).map(String::trim).map(x -> convertToString(x)).collect(Collectors.joining(","));
+            return String.format("[%s]", listItems);
+        }));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.i"), s -> s));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.l"), s -> s + "l"));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.f"), s -> s + "f"));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.d"), s -> s + "d"));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.m"), s -> String.format("new BigDecimal(%s)", s)));
+
+        add(Pair.with(Pattern.compile("v\\[(.+)\\]\\.id"), s -> g.V().has("name", s).id().next().toString()));
+        add(Pair.with(Pattern.compile("v\\[(.+)\\]\\.sid"), s -> g.V().has("name", s).id().next().toString()));
+        add(Pair.with(Pattern.compile("e\\[(.+)\\]\\.id"), s -> getEdgeIdString(g, s)));
+        add(Pair.with(Pattern.compile("e\\[(.+)\\]\\.sid"), s -> getEdgeIdString(g, s)));
+
+        add(Pair.with(Pattern.compile("t\\[(.*)\\]"), s -> String.format("T.%s", s)));
+        add(Pair.with(Pattern.compile("D\\[(.*)\\]"), s -> String.format("Direction.%s", s)));
+
+        // the following force ignore conditions as they cannot be parsed by the grammar at this time. the grammar will
+        // need to be modified to handle them or perhaps these tests stay relegated to the JVM in some way for certain
+        // cases like the lambda item which likely won't make it to the grammar as it's raw groovy.
+        add(Pair.with(Pattern.compile("c\\[(.*)\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a lambda as a parameter which is not supported by gremlin-language");
+        }));
+        add(Pair.with(Pattern.compile("v\\[(.+)\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a Vertex as a parameter which is not supported by gremlin-language");
+        }));
+        add(Pair.with(Pattern.compile("e\\[(.+)\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a Edge as a parameter which is not supported by gremlin-language");
+        }));
+        add(Pair.with(Pattern.compile("p\\[(.*)\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a Path as a parameter which is not supported by gremlin-language");
+        }));
+        add(Pair.with(Pattern.compile("s\\[\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a empty Set as a parameter which is not supported by gremlin-language");
+        }));
+        add(Pair.with(Pattern.compile("s\\[(.*)\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a Set as a parameter which is not supported by gremlin-language");
+        }));
+        add(Pair.with(Pattern.compile("(null)"), s -> "null"));
+    }};
+
+    private List<Pair<Pattern, Function<String,Object>>> objectMatcherConverters = new ArrayList<Pair<Pattern, Function<String,Object>>>() {{
+        // expects json so that should port to the Gremlin script form - replace curly json braces with square ones
+        // for Gremlin sake.
+        add(Pair.with(Pattern.compile("m\\[(.*)\\]"), s -> {
+            try {
+                // read tree from JSON - can't parse right to Map as each m[] level needs to be managed individually
+                return convertToObject(mapper.readTree(s));
+            } catch (Exception ex) {
+                throw new IllegalStateException(String.format("Can't parse JSON to map for %s", s), ex);
+            }
+        }));
+
+        add(Pair.with(Pattern.compile("l\\[\\]"), s -> Collections.emptyList()));
+        add(Pair.with(Pattern.compile("l\\[(.*)\\]"), s -> {
+            final String[] items = s.split(",");
+            return Stream.of(items).map(String::trim).map(x -> convertToObject(x)).collect(Collectors.toList());
+        }));
+
+        add(Pair.with(Pattern.compile("(null)"), s -> null));
+
+        add(Pair.with(Pattern.compile("p\\[(.*)\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a Path as a parameter which is not supported by gremlin-language");
+        }));
+
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.i"), Integer::parseInt));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.l"), Long::parseLong));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.f"), Float::parseFloat));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.d"), Double::parseDouble));
+        add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.m"), BigDecimal::new));
+
+        add(Pair.with(Pattern.compile("v\\[(.+)\\]\\.id"), s -> g.V().has("name", s).id().next()));
+        add(Pair.with(Pattern.compile("v\\[(.+)\\]\\.sid"), s -> g.V().has("name", s).id().next().toString()));
+        add(Pair.with(Pattern.compile("v\\[(.+)\\]"), s -> g.V().has("name", s).next()));
+        add(Pair.with(Pattern.compile("e\\[(.+)\\]\\.id"), s -> getEdgeId(g, s)));
+        add(Pair.with(Pattern.compile("e\\[(.+)\\]\\.sid"), s -> getEdgeIdString(g, s)));
+        add(Pair.with(Pattern.compile("e\\[(.+)\\]"), s -> getEdge(g, s)));
+
+        add(Pair.with(Pattern.compile("t\\[(.*)\\]"), T::valueOf));
+        add(Pair.with(Pattern.compile("D\\[(.*)\\]"), Direction::valueOf));
+
+        add(Pair.with(Pattern.compile("c\\[(.*)\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a lambda as a parameter which is not supported by gremlin-language");
+        }));
+        add(Pair.with(Pattern.compile("s\\[\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a empty Set as a parameter which is not supported by gremlin-language");
+        }));
+        add(Pair.with(Pattern.compile("s\\[(.*)\\]"), s -> {
+            throw new AssumptionViolatedException("This test uses a Set as a parameter which is not supported by gremlin-language");
+        }));
+    }};
+
+    @Inject
+    public StepDefinition(final World world) {
+        this.world = Objects.requireNonNull(world, "world must not be null");
+    }
+
+    @Before
+    public void beforeEachScenario(final Scenario scenario) throws Exception {
+        world.beforeEachScenario(scenario);
+        stringParameters.clear();
+        if (traversal != null) {
+            traversal.close();
+            traversal = null;
+        }
+
+        if (result != null) result = null;
+    }
+
+    @After
+    public void afterEachScenario() throws Exception {
+        world.afterEachScenario();
+        if (g != null) g.close();
+    }
+
+    @Given("the {word} graph")
+    public void givenTheXGraph(final String graphName) {
+        if (graphName.equals("empty"))
+            this.g = world.getGraphTraversalSource(null);
+        else
+            this.g = world.getGraphTraversalSource(GraphData.valueOf(graphName.toUpperCase()));
+    }
+
+    @Given("the graph initializer of")
+    public void theGraphInitializerOf(final String gremlin) {
+        parseGremlin(gremlin).iterate();
+    }
+
+    @Given("using the parameter {word} defined as {string}")
+    public void usingTheParameterXDefinedAsX(final String key, final String value) {
+        stringParameters.put(key, convertToString(value));
+    }
+
+    @Given("using the parameter {word} of P.{word}\\({string})")
+    public void usingTheParameterXOfPX(final String key, final String pval, final String string) {
+        stringParameters.put(key, String.format("P.%s(%s)", pval, convertToString(string)));
+    }
+
+    @Given("the traversal of")
+    public void theTraversalOf(final String docString) {
+        final String gremlin = tryUpdateDataFilePath(docString);
+        traversal = parseGremlin(applyParameters(gremlin));
+    }
+
+    @When("iterated to list")
+    public void iteratedToList() {
+        result = traversal.toList();
+    }
+
+    @When("iterated next")
+    public void iteratedNext() {
+        result = traversal.next();
+    }
+
+    @Then("the result should be unordered")
+    public void theResultShouldBeUnordered(final DataTable dataTable) {
+        final List<Object> actual = translateResultsToActual();
+
+        // account for header in dataTable size
+        assertEquals(dataTable.height() - 1, actual.size());
+
+        // skip the header in the dataTable
+        final Object[] expected = dataTable.asList().stream().skip(1).map(this::convertToObject).toArray();
+        assertThat(actual, containsInAnyOrder(expected));
+    }
+
+    @Then("the result should be ordered")
+    public void theResultShouldBeOrdered(final DataTable dataTable) {
+        final List<Object> actual = translateResultsToActual();
+
+        // account for header in dataTable size
+        assertEquals(dataTable.height() - 1, actual.size());
+
+        // skip the header in the dataTable
+        final Object[] expected = dataTable.asList().stream().skip(1).map(this::convertToObject).toArray();
+        assertThat(actual, contains(expected));
+    }
+
+    @Then("the result should be of")
+    public void theResultShouldBeOf(final DataTable dataTable) {
+        final List<Object> actual = translateResultsToActual();
+
+        // skip the header in the dataTable
+        final Object[] expected = dataTable.asList().stream().skip(1).map(this::convertToObject).toArray();
+        assertThat(actual, everyItem(in(expected)));
+    }
+
+    @Then("the result should have a count of {int}")
+    public void theResultShouldHaveACountOf(final Integer val) {
+        if (result instanceof Iterable)
+            assertEquals(val.intValue(), IteratorUtils.count((Iterable) result));
+        else if (result instanceof Map)
+            assertEquals(val.intValue(), ((Map) result).size());
+        else
+            fail(String.format("Missing an assert for this type", result.getClass()));
+    }
+
+    @Then("the graph should return {int} for count of {string}")
+    public void theGraphShouldReturnForCountOf(final Integer count, final String gremlin) {
+        assertEquals(count.longValue(), ((GraphTraversal) parseGremlin(applyParameters(gremlin))).count().next());
+    }
+
+    @Then("the result should be empty")
+    public void theResultShouldBeEmpty() {
+        assertThat(result, instanceOf(Collection.class));
+        assertEquals(0, IteratorUtils.count((Collection) result));
+    }
+
+    //////////////////////////////////////////////
+
+    @Given("an unsupported test")
+    public void anUnsupportedTest() {
+        // placeholder text - no operation needed because it should be followed by nothingShouldHappenBecause()
+    }
+
+    @Then("nothing should happen because")
+    public void nothingShouldHappenBecause(final String message) {
+        throw new AssumptionViolatedException(String.format("This test is not supported by Gherkin because: %s", message));
+    }
+
+    //////////////////////////////////////////////
+
+    private Traversal parseGremlin(final String script) {
+        final GremlinLexer lexer = new GremlinLexer(CharStreams.fromString(script));
+        final GremlinParser parser = new GremlinParser(new CommonTokenStream(lexer));
+        final GremlinParser.QueryContext ctx = parser.query();
+        return (Traversal) new GremlinAntlrToJava(g).visitQuery(ctx);
+    }
+
+    private List<Object> translateResultsToActual() {
+        final List<Object> r = result instanceof List ? (List<Object>) result : IteratorUtils.asList(result);
+
+        // gotta convert Map.Entry to individual Map coz that how we assert those for GLVs - dah
+        final List<Object> actual = r.stream().map(o -> {
+            if (o instanceof Map.Entry) {
+                return new LinkedHashMap() {{
+                    put(((Map.Entry<?, ?>) o).getKey(), ((Map.Entry<?, ?>) o).getValue());
+                }};
+            } else {
+                return o;
+            }
+        }).collect(Collectors.toList());
+        return actual;
+    }
+
+    private String convertToString(final String pvalue) {
+        return convertToString(null, pvalue);
+    }
+
+    private String convertToString(final String pkey, final String pvalue) {
+        for (Pair<Pattern,Function<String,String>> matcherConverter : stringMatcherConverters) {
+            final Pattern pattern = matcherConverter.getValue0();
+            final Matcher matcher = pattern.matcher(pvalue);
+            if (matcher.find()) {
+                final Function<String,String> converter = matcherConverter.getValue1();
+                // when there are no groups there is a direct match
+                return converter.apply(matcher.groupCount() == 0 ? "" : matcher.group(1));
+            }
+        }
+
+        // this should be a raw string if it didn't match anything - suppose it could be a syntax error in the
+        // test too, but i guess the test would fail so perhaps ok to just assume it's raw string value that
+        // didn't need a transform by default
+        return String.format("\"%s\"", pvalue);
+    }
+
+    private Object convertToObject(final Object pvalue) {
+        final Object v;
+        // we may get some json stuff if it's a m[]
+        if (pvalue instanceof JsonNode) {
+            final JsonNode n = (JsonNode) pvalue;
+            if (n.isNull()) {
+                v = null;
+            } else if (n.isArray()) {
+                v = IteratorUtils.stream(n.elements()).map(this::convertToObject).collect(Collectors.toList());
+            } else if (n.isObject()) {
+                final Map<Object,Object> m = new HashMap<>(n.size());
+                n.fields().forEachRemaining(e -> m.put(convertToObject(e.getKey()), convertToObject(e.getValue())));
+                v = m;
+            } else if (n.isNumber()) {
+                v = n.numberValue();
+            } else if (n.isBoolean()) {
+                v = n.booleanValue();
+            } else {
+                v = n.textValue();
+            }
+        } else {
+            v = pvalue;
+        }
+
+        // if the object is already of a type then no need to push it through the matchers.
+        if (!(v instanceof String)) return v;
+
+        for (Pair<Pattern,Function<String,Object>> matcherConverter : objectMatcherConverters) {
+            final Pattern pattern = matcherConverter.getValue0();
+            final Matcher matcher = pattern.matcher((String) v);
+            if (matcher.find()) {
+                final Function<String,Object> converter = matcherConverter.getValue1();
+                return converter.apply(matcher.group(1));
+            }
+        }
+
+        // this should be a raw string if it didn't match anything - suppose it could be a syntax error in the
+        // test too, but i guess the test would fail so perhaps ok to just assume it's raw string value that
+        // didn't need a transform by default
+        return String.format("%s", v);
+    }
+
+    private static Triplet<String,String,String> getEdgeTriplet(final String e) {
+        final Matcher m = edgeTripletPattern.matcher(e);
+        if (m.matches()) {
+            return Triplet.with(m.group(1), m.group(2), m.group(3));
+        }
+
+        throw new IllegalStateException(String.format("Invalid edge identifier: %s", e));
+    }
+
+    private static Edge getEdge(final GraphTraversalSource g, final String e) {
+        final Triplet<String,String,String> t = getEdgeTriplet(e);
+
+        // make this OLAP proof since you can't leave the star graph
+        return g.V().has("name", t.getValue0()).outE(t.getValue1()).toStream().
+                   filter(edge -> g.V(edge.inVertex().id()).has("name", t.getValue2()).hasNext()).findFirst().get();
+    }
+
+    private static Object getEdgeId(final GraphTraversalSource g, final String e) {
+        return getEdge(g, e).id();
+    }
+
+    private static String getEdgeIdString(final GraphTraversalSource g, final String e) {
+        return getEdgeId(g, e).toString();
+    }
+
+    private String applyParameters(final String docString) {
+        String replaced = docString;
+        for (Map.Entry<String, String> kv : stringParameters.entrySet()) {
+            replaced = replaced.replace(kv.getKey(), kv.getValue());
+        }
+        return replaced;
+    }
+
+    private String tryUpdateDataFilePath(final String docString) {
+        final Matcher matcher = ioPattern.matcher(docString);
+        final String gremlin = matcher.matches() ?
+                docString.replace(matcher.group(1), world.changePathToDataFile(matcher.group(1))) : docString;
+        return gremlin;
+    }
+}
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/TestFiles.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/TestFiles.java
new file mode 100644
index 0000000..c923452
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/TestFiles.java
@@ -0,0 +1,99 @@
+/*
+ * 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.features;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.structure.io.Storage;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONResourceAccess;
+import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoResourceAccess;
+import org.apache.tinkerpop.gremlin.structure.io.script.ScriptResourceAccess;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+public class TestFiles {
+    protected static final Random RANDOM = TestHelper.RANDOM;
+
+    public static final Map<String, String> PATHS = new HashMap<>();
+    static {
+        try {
+            final List<String> kryoResources = Arrays.asList(
+                    "tinkerpop-modern-v3d0.kryo",
+                    "grateful-dead-v3d0.kryo",
+                    "tinkerpop-classic-v3d0.kryo",
+                    "tinkerpop-crew-v3d0.kryo",
+                    "tinkerpop-sink-v3d0.kryo");
+            for (final String fileName : kryoResources) {
+                PATHS.put(fileName,
+                        Storage.toPath(TestHelper.generateTempFileFromResource(GryoResourceAccess.class, fileName, "")));
+            }
+
+            final List<String> graphsonResources = Arrays.asList(
+                    "tinkerpop-modern-typed-v2d0.json",
+                    "tinkerpop-modern-v3d0.json",
+                    "grateful-dead-typed-v2d0.json",
+                    "grateful-dead-v3d0.json",
+                    "tinkerpop-classic-typed-v2d0.json",
+                    "tinkerpop-classic-v3d0.json",
+                    "tinkerpop-crew-typed-v2d0.json",
+                    "tinkerpop-crew-v3d0.json",
+                    "tinkerpop-sink-v3d0.json");
+            for (final String fileName : graphsonResources) {
+                PATHS.put(fileName,
+                        Storage.toPath(TestHelper.generateTempFileFromResource(GraphSONResourceAccess.class, fileName, "")));
+            }
+
+            final List<String> scriptResources = Arrays.asList(
+                    "tinkerpop-classic.txt",
+                    "script-input.groovy",
+                    "script-output.groovy",
+                    "grateful-dead.txt",
+                    "script-input-grateful-dead.groovy",
+                    "script-output-grateful-dead.groovy");
+            for (final String fileName : scriptResources) {
+                PATHS.put(fileName,
+                        Storage.toPath(TestHelper.generateTempFileFromResource(ScriptResourceAccess.class, fileName, "")));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String getInputLocation(final LoadGraphWith.GraphData graphData, final boolean useGraphSON) {
+        final String type = useGraphSON ? "-v3d0.json" : "-v3d0.kryo";
+
+        if (graphData.equals(LoadGraphWith.GraphData.GRATEFUL))
+            return PATHS.get("grateful-dead" + type);
+        else if (graphData.equals(LoadGraphWith.GraphData.MODERN))
+            return PATHS.get("tinkerpop-modern" + type);
+        else if (graphData.equals(LoadGraphWith.GraphData.CLASSIC))
+            return PATHS.get("tinkerpop-classic" + type);
+        else if (graphData.equals(LoadGraphWith.GraphData.CREW))
+            return PATHS.get("tinkerpop-crew" + type);
+        else if (graphData.equals(LoadGraphWith.GraphData.SINK))
+            return PATHS.get("tinkerpop-sink" + type);
+        else
+            throw new RuntimeException("Could not load graph with " + graphData);
+    }
+
+}
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/World.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/World.java
new file mode 100644
index 0000000..971105b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/World.java
@@ -0,0 +1,69 @@
+/*
+ * 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.features;
+
+import io.cucumber.java.Scenario;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
+
+/**
+ * This interface provides the context the test suite needs in order to execute the Gherkin tests. It is implemented
+ * by graph providers who wish to test their graph systems against the TinkerPop test suite. It is paired with a
+ * test that uses the Cucumber test runner (i.e. {@code @RunWith(Cucumber.class)}) and requires a dependency injection
+ * package (e.g. {@code guice}) to push an instance into the Cucumber execution.
+ */
+public interface World {
+
+    /**
+     * Gets a {@link GraphTraversalSource} that is backed by the specified {@link GraphData}. For {@code null}, the
+     * returned source should be an empty graph with no data in it. Tests do not mutate the standard graphs. Only tests
+     * that use an empty graph will change its state.
+     */
+    public GraphTraversalSource getGraphTraversalSource(final GraphData graphData);
+
+    /**
+     * Called before each individual test is executed which provides an opportunity to do some setup. For example,
+     * if there is a specific test that can't be supported it can be ignored by checking for the name with
+     * {@code scenario.getName()} and then throwing an {@code AssumptionViolationException}.
+     * @param scenario
+     */
+    public default void beforeEachScenario(final Scenario scenario) {
+        // do nothing
+    }
+
+    /**
+     * Called after each individual test is executed allowing for cleanup of any open resources.
+     */
+    public default void afterEachScenario() {
+        // do nothing
+    }
+
+    /**
+     * Called when {@code g.io()} is encountered in the Gherkin tests and allows the path to the data file to
+     * referenced to be changed. The default path will look something like:  {@code data/file.extension} and will
+     * match one of the standard TinkerPop data files associated with the test framework. If the files need to be
+     * located somewhere else for a particular provider, this method can alter the path as needed.
+     *
+     * @param pathToFileFromGremlin the path to a data file as taken from the Gherkin tests
+     */
+    public default String changePathToDataFile(final String pathToFileFromGremlin) {
+        return pathToFileFromGremlin;
+    }
+}
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessLimitedComputerSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessLimitedComputerSuite.java
new file mode 100644
index 0000000..bf3f357
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessLimitedComputerSuite.java
@@ -0,0 +1,177 @@
+/*
+ * 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.process;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputerTest;
+import org.apache.tinkerpop.gremlin.process.computer.clone.CloneVertexProgramTest;
+import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgramTest;
+import org.apache.tinkerpop.gremlin.process.computer.search.path.ShortestPathVertexProgramTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionComputerTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComplexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.OptionalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ConnectedComponentTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ConstantTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ElementMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LoopsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PageRankTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PeerPressureTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProgramTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ReadTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ShortestPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.WriteTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ExplainTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.TranslationStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EarlyLimitStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.StructureStandardSuite;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.RunnerBuilder;
+
+/**
+ * The {@code ProcessLimitedComputerSuite} is a set of tests that providers may implement in addition to the standard Gherkin
+ * feature tests. The {@link ProcessComputerSuite} contains all the tests in Gherkin and is therefore duplicative of
+ * that test set but also includes a number of tests that have not been (or cannot be) converted to Gherkin for various
+ * reasons.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class ProcessLimitedComputerSuite extends AbstractGremlinSuite {
+
+    /**
+     * This list of tests in the suite that will be executed as part of this suite.
+     */
+    private static final Class<?>[] allTests = new Class<?>[]{
+            GraphComputerTest.class,
+            MatchTest.CountMatchTraversals.class,
+            MatchTest.GreedyMatchTraversals.class,
+            ProfileTest.Traversals.class,
+            ProgramTest.Traversals.class,
+            WriteTest.Traversals.class,
+            ExplainTest.Traversals.class,
+            SideEffectTest.Traversals.class,
+            SubgraphTest.Traversals.class,
+            TreeTest.Traversals.class,
+
+            // compliance
+            ComplexTest.Traversals.class,
+            TraversalInterruptionComputerTest.class,
+
+            // algorithms
+            PageRankVertexProgramTest.class,
+            ShortestPathVertexProgramTest.class,
+            CloneVertexProgramTest.class,
+
+            // creations
+            TranslationStrategyProcessTest.class,
+
+            // decorations
+            ReadOnlyStrategyProcessTest.class,
+            SeedStrategyProcessTest.class,
+            SubgraphStrategyProcessTest.class,
+
+            // optimizations
+            IncidentToAdjacentStrategyProcessTest.class,
+            EarlyLimitStrategyProcessTest.class
+    };
+
+    /**
+     * A list of the minimum set of base tests that Gremlin flavors should implement to be compliant with Gremlin.
+     */
+    private static final Class<?>[] testsToEnforce = new Class<?>[]{
+            MatchTest.class,
+            ProfileTest.class,
+            ProgramTest.class,
+            SideEffectTest.class,
+            SubgraphTest.class,
+            TreeTest.class
+    };
+
+    /**
+     * This constructor is used by JUnit and will run this suite with its concrete implementations of the
+     * {@code testsToEnforce}.
+     */
+    public ProcessLimitedComputerSuite(final Class<?> klass, final RunnerBuilder builder) throws InitializationError {
+        super(klass, builder, allTests, allTests, false, TraversalEngine.Type.COMPUTER);
+    }
+
+    /**
+     * This constructor is used by Gremlin flavor implementers who supply their own implementations of the
+     * {@code testsToEnforce}.
+     */
+    public ProcessLimitedComputerSuite(final Class<?> klass, final RunnerBuilder builder, final Class<?>[] testsToExecute) throws InitializationError {
+        super(klass, builder, testsToExecute, testsToEnforce, true, TraversalEngine.Type.COMPUTER);
+    }
+}
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessLimitedStandardSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessLimitedStandardSuite.java
new file mode 100644
index 0000000..ddf3280
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessLimitedStandardSuite.java
@@ -0,0 +1,170 @@
+/*
+ * 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.process;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
+import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComplexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.OptionalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ConstantTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ElementMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.IndexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LoopsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ReadTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.WriteTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ExplainTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.TranslationStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EarlyLimitStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategyProcessTest;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.StructureStandardSuite;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.RunnerBuilder;
+
+/**
+ * The {@code ProcessLimitedComputerSuite} is a set of tests that providers may implement in addition to the standard Gherkin
+ * feature tests. The {@link ProcessStandardSuite} contains all the tests in Gherkin and is therefore duplicative of
+ * that test set but also includes a number of tests that have not been (or cannot be) converted to Gherkin for various
+ * reasons.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class ProcessLimitedStandardSuite extends AbstractGremlinSuite {
+
+    /**
+     * This list of tests in the suite that will be executed as part of this suite.
+     */
+    private static final Class<?>[] allTests = new Class<?>[]{
+
+            MatchTest.CountMatchTraversals.class,
+            MatchTest.GreedyMatchTraversals.class,
+            ProfileTest.Traversals.class,
+            WriteTest.Traversals.class,
+            ExplainTest.Traversals.class,
+            SideEffectTest.Traversals.class,
+            SubgraphTest.Traversals.class,
+            TreeTest.Traversals.class,
+
+            // compliance
+            ComplexTest.Traversals.class,
+            CoreTraversalTest.class,
+            TraversalInterruptionTest.class,
+
+            // creations
+            TranslationStrategyProcessTest.class,
+
+            // decorations
+            ElementIdStrategyProcessTest.class,
+            EventStrategyProcessTest.class,
+            ReadOnlyStrategyProcessTest.class,
+            PartitionStrategyProcessTest.class,
+            SeedStrategyProcessTest.class,
+            SubgraphStrategyProcessTest.class,
+
+            // optimizations
+            IncidentToAdjacentStrategyProcessTest.class,
+            EarlyLimitStrategyProcessTest.class
+    };
+
+    /**
+     * A list of the minimum set of base tests that Gremlin flavors should implement to be compliant with Gremlin.
+     */
+    private static final Class<?>[] testsToEnforce = new Class<?>[]{
+            ProfileTest.class,
+            SideEffectTest.class,
+            SubgraphTest.class,
+            TreeTest.class,
+    };
+
+    /**
+     * This constructor is used by JUnit and will run this suite with its concrete implementations of the
+     * {@code testsToEnforce}.
+     */
+    public ProcessLimitedStandardSuite(final Class<?> klass, final RunnerBuilder builder) throws InitializationError {
+        super(klass, builder, allTests, testsToEnforce, false, TraversalEngine.Type.STANDARD);
+    }
+
+    /**
+     * This constructor is used by Gremlin flavor implementers who supply their own implementations of the
+     * {@code testsToEnforce}.
+     */
+    public ProcessLimitedStandardSuite(final Class<?> klass, final RunnerBuilder builder, final Class<?>[] testsToExecute) throws InitializationError {
+        super(klass, builder, testsToExecute, testsToEnforce, true, TraversalEngine.Type.STANDARD);
+    }
+}
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
index 7fbc8b5..e60ec62 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
@@ -69,44 +69,6 @@
 public class CoreTraversalTest extends AbstractGremlinProcessTest {
 
     @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_NULL_PROPERTY_VALUES)
-    public void g_addVXpersonX_propertyXname_nullX() {
-        final Traversal<Vertex, Vertex> traversal = g.addV("person").property("name", null);
-        printTraversalForm(traversal);
-        final Vertex nulled = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals("person", nulled.label());
-        assertNull(nulled.value("name"));
-        assertEquals(1, IteratorUtils.count(nulled.properties()));
-        assertEquals(7, IteratorUtils.count(g.V()));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_NULL_PROPERTY_VALUES)
-    public void g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_nullX() {
-        final Traversal<Vertex, Edge> traversal = g.V(convertToVertexId("marko")).as("a").out("created").addE("createdBy").to("a").property("weight", null);
-        printTraversalForm(traversal);
-        int count = 0;
-        while (traversal.hasNext()) {
-            final Edge edge = traversal.next();
-            assertEquals("createdBy", edge.label());
-            assertNull(g.E(edge).<Double>values("weight").next());
-            assertEquals(1, g.E(edge).properties().count().next().intValue());
-            count++;
-
-
-        }
-        assertEquals(1, count);
-        assertEquals(7, IteratorUtils.count(g.E()));
-        assertEquals(6, IteratorUtils.count(g.V()));
-    }
-
-    @Test
     @LoadGraphWith
     public void shouldNeverPropagateANoBulkTraverser() {
         try {
@@ -131,51 +93,10 @@
 
     @Test
     @LoadGraphWith(MODERN)
-    public void shouldLoadVerticesViaIds() {
+    public void shouldAllowIdsOfMixedTypes() {
         final List<Vertex> vertices = g.V().toList();
-        final List<Object> ids = vertices.stream().map(Vertex::id).collect(Collectors.toList());
-        final List<Vertex> verticesReloaded = g.V(ids.toArray()).toList();
-        assertEquals(vertices.size(), verticesReloaded.size());
-        assertEquals(new HashSet<>(vertices), new HashSet<>(verticesReloaded));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void shouldLoadEdgesViaIds() {
-        final List<Edge> edges = g.E().toList();
-        final List<Object> ids = edges.stream().map(Edge::id).collect(Collectors.toList());
-        final List<Edge> edgesReloaded = g.E(ids.toArray()).toList();
-        assertEquals(edges.size(), edgesReloaded.size());
-        assertEquals(new HashSet<>(edges), new HashSet<>(edgesReloaded));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void shouldLoadVerticesViaVertices() {
-        final List<Vertex> vertices = g.V().toList();
-        final List<Vertex> verticesReloaded = g.V(vertices.toArray()).toList();
-        assertEquals(vertices.size(), verticesReloaded.size());
-        assertEquals(new HashSet<>(vertices), new HashSet<>(verticesReloaded));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void shouldLoadEdgesViaEdges() {
-        final List<Edge> edges = g.E().toList();
-        final List<Edge> edgesReloaded = g.E(edges.toArray()).toList();
-        assertEquals(edges.size(), edgesReloaded.size());
-        assertEquals(new HashSet<>(edges), new HashSet<>(edgesReloaded));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void shouldThrowExceptionWhenIdsMixed() {
-        final List<Vertex> vertices = g.V().toList();
-        try {
-            g.V(vertices.get(0), vertices.get(1).id()).toList();
-        } catch (Exception ex) {
-            validateException(Graph.Exceptions.idArgsMustBeEitherIdOrElement(), ex);
-        }
+        assertEquals(2, g.V(vertices.get(0), vertices.get(1).id()).count().next().intValue());
+        assertEquals(2, g.V(vertices.get(0).id(), vertices.get(1)).count().next().intValue());
     }
 
     @Test
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
index 95d5adc..6d2cb35 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
@@ -701,38 +701,6 @@
 
     @Test
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ANY_IDS)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_STRING_IDS)
-    public void shouldNotMixTypesForGettingSpecificVerticesWithVertexFirst() {
-        final Vertex v1 = graph.addVertex();
-        try {
-            graph.vertices(v1, graphProvider.convertId("1", Vertex.class));
-            fail("Should have thrown an exception because id arguments were mixed.");
-        } catch (Exception ex) {
-            final Exception expected = Graph.Exceptions.idArgsMustBeEitherIdOrElement();
-            assertEquals(expected.getClass(), ex.getClass());
-            assertEquals(expected.getMessage(), ex.getMessage());
-        }
-    }
-
-    @Test
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ANY_IDS)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_STRING_IDS)
-    public void shouldNotMixTypesForGettingSpecificVerticesWithStringFirst() {
-        final Vertex v1 = graph.addVertex();
-        try {
-            graph.vertices(graphProvider.convertId("1", Vertex.class), v1);
-            fail("Should have thrown an exception because id arguments were mixed.");
-        } catch (Exception ex) {
-            final Exception expected = Graph.Exceptions.idArgsMustBeEitherIdOrElement();
-            assertEquals(expected.getClass(), ex.getClass());
-            assertEquals(expected.getMessage(), ex.getMessage());
-        }
-    }
-
-    @Test
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_STRING_IDS)
     public void shouldIterateVerticesWithStringIdSupportUsingVertex() {
         // if the graph supports id assigned, it should allow it.  if the graph does not, it will generate one
@@ -1645,42 +1613,6 @@
     @Test
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
     @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ANY_IDS)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_STRING_IDS)
-    public void shouldNotMixTypesForGettingSpecificEdgesWithEdgeFirst() {
-        final Vertex v = graph.addVertex();
-        final Edge e1 = v.addEdge("self", v);
-        try {
-            graph.edges(e1, graphProvider.convertId("1", Edge.class));
-            fail("Should have thrown an exception because id arguments were mixed.");
-        } catch (Exception ex) {
-            final Exception expected = Graph.Exceptions.idArgsMustBeEitherIdOrElement();
-            assertEquals(expected.getClass(), ex.getClass());
-            assertEquals(expected.getMessage(), ex.getMessage());
-        }
-    }
-
-    @Test
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ANY_IDS)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_STRING_IDS)
-    public void shouldNotMixTypesForGettingSpecificEdgesWithStringFirst() {
-        final Vertex v = graph.addVertex();
-        final Edge e1 = v.addEdge("self", v);
-        try {
-            graph.edges(graphProvider.convertId("1", Edge.class), e1);
-            fail("Should have thrown an exception because id arguments were mixed.");
-        } catch (Exception ex) {
-            final Exception expected = Graph.Exceptions.idArgsMustBeEitherIdOrElement();
-            assertEquals(expected.getClass(), ex.getClass());
-            assertEquals(expected.getMessage(), ex.getMessage());
-        }
-    }
-
-    @Test
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
     @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_STRING_IDS)
     public void shouldIterateEdgesWithStringIdSupportUsingEdge() {
         // if the graph supports id assigned, it should allow it.  if the graph does not, it will generate one
diff --git a/gremlin-test/src/main/static/LICENSE b/gremlin-test/src/main/static/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/gremlin-test/src/main/static/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
diff --git a/gremlin-test/src/main/static/NOTICE b/gremlin-test/src/main/static/NOTICE
new file mode 100644
index 0000000..71f0464
--- /dev/null
+++ b/gremlin-test/src/main/static/NOTICE
@@ -0,0 +1,5 @@
+Apache TinkerPop
+Copyright 2015-2021 The Apache Software Foundation.
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/gremlin-test/src/test/java/org/apache/tinkerpop/gremlin/features/FeatureReaderTest.java b/gremlin-test/src/test/java/org/apache/tinkerpop/gremlin/features/FeatureReaderTest.java
deleted file mode 100644
index 8d67347..0000000
--- a/gremlin-test/src/test/java/org/apache/tinkerpop/gremlin/features/FeatureReaderTest.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.features;
-
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.number.OrderingComparison.greaterThan;
-import static org.junit.Assert.assertEquals;
-
-public class FeatureReaderTest {
-
-    @Test
-    public void shouldParseInSameOrder() throws IOException {
-        final String projectRoot = "../";
-        final Map<String,List<String>> gremlins = FeatureReader.parse(projectRoot);
-        assertThat(gremlins.size(), greaterThan(0));
-        assertEquals(gremlins,
-                     FeatureReader.parse(projectRoot));
-
-    }
-}
diff --git a/gremlin-test/src/test/resources/log4j-silent.properties b/gremlin-test/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 98d9e2a..0000000
--- a/gremlin-test/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,29 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-# need to turn this on as this test actually tests "logging" - needs INFO at minimum for tests to pass
-log4j.logger.org.apache.tinkerpop.gremlin.util.Log4jRecordingAppenderTest=INFO
-
-# need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
\ No newline at end of file
diff --git a/gremlin-test/src/test/resources/log4j-test.properties b/gremlin-test/src/test/resources/log4j-test.properties
deleted file mode 100644
index 0517b4c..0000000
--- a/gremlin-test/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,27 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-# need to turn this on as this test actually tests "logging" - needs INFO at minimum for tests to pass
-log4j.logger.org.apache.tinkerpop.gremlin.util.Log4jRecordingAppenderTest=INFO   
-
-# need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
\ No newline at end of file
diff --git a/gremlin-test/src/test/resources/logback-silent.xml b/gremlin-test/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..cb9d252
--- /dev/null
+++ b/gremlin-test/src/test/resources/logback-silent.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-test/src/test/resources/logback-test.xml b/gremlin-test/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..f1bca0d
--- /dev/null
+++ b/gremlin-test/src/test/resources/logback-test.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-benchmark/pom.xml b/gremlin-tools/gremlin-benchmark/pom.xml
index 41392ed..676571a 100644
--- a/gremlin-tools/gremlin-benchmark/pom.xml
+++ b/gremlin-tools/gremlin-benchmark/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>gremlin-tools</artifactId>
         <groupId>org.apache.tinkerpop</groupId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>gremlin-benchmark</artifactId>
@@ -76,13 +76,8 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-            <optional>true</optional>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
         </dependency>
     </dependencies>
     <build>
@@ -109,7 +104,7 @@
                     </excludes>
                     <systemPropertyVariables>
                         <benchmarkReportDir>${project.build.directory}/reports/benchmark/</benchmarkReportDir>
-                        <jvmArgs>-Dlog4j.configuration=${log4j-test.properties} -server -Xms4g -Xmx4g -Xss4m</jvmArgs>
+                        <jvmArgs>-Dlogback.configurationFile=${logback-test.properties} -server -Xms4g -Xmx4g -Xss4m</jvmArgs>
                         <warmupIterations>3</warmupIterations>
                         <measureIterations>10</measureIterations>
                         <forks>2</forks>
diff --git a/gremlin-tools/gremlin-benchmark/src/test/resources/log4j-silent.properties b/gremlin-tools/gremlin-benchmark/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 1825bb0..0000000
--- a/gremlin-tools/gremlin-benchmark/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,23 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-benchmark/src/test/resources/log4j-test.properties b/gremlin-tools/gremlin-benchmark/src/test/resources/log4j-test.properties
deleted file mode 100644
index ef436fe..0000000
--- a/gremlin-tools/gremlin-benchmark/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,21 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-benchmark/src/test/resources/logback-silent.xml b/gremlin-tools/gremlin-benchmark/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..4c5947d
--- /dev/null
+++ b/gremlin-tools/gremlin-benchmark/src/test/resources/logback-silent.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-benchmark/src/test/resources/logback-test.xml b/gremlin-tools/gremlin-benchmark/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..5d94c3b
--- /dev/null
+++ b/gremlin-tools/gremlin-benchmark/src/test/resources/logback-test.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-coverage/pom.xml b/gremlin-tools/gremlin-coverage/pom.xml
index 2e58728..20c333e 100644
--- a/gremlin-tools/gremlin-coverage/pom.xml
+++ b/gremlin-tools/gremlin-coverage/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <artifactId>gremlin-tools</artifactId>
         <groupId>org.apache.tinkerpop</groupId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-coverage</artifactId>
     <name>Apache TinkerPop :: Gremlin Coverage</name>
@@ -47,9 +47,8 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <optional>true</optional>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/gremlin-tools/gremlin-io-test/pom.xml b/gremlin-tools/gremlin-io-test/pom.xml
index 8eaeee6..999939e 100644
--- a/gremlin-tools/gremlin-io-test/pom.xml
+++ b/gremlin-tools/gremlin-io-test/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <artifactId>gremlin-tools</artifactId>
         <groupId>org.apache.tinkerpop</groupId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlin-io-test</artifactId>
     <name>Apache TinkerPop :: Gremlin IO Test</name>
@@ -45,9 +45,8 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-            <optional>true</optional>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.tinkerpop</groupId>
@@ -106,9 +105,9 @@
                                 <scope>runtime</scope>
                             </dependency>
                             <dependency>
-                                <groupId>log4j</groupId>
-                                <artifactId>log4j</artifactId>
-                                <version>1.2.17</version>
+                                <groupId>ch.qos.logback</groupId>
+                                <artifactId>logback-classic</artifactId>
+                                <version>${logback.version}</version>
                                 <scope>runtime</scope>
                             </dependency>
                         </dependencies>
diff --git a/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibility.java b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibility.java
index 15b4da2..6aaf48a 100644
--- a/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibility.java
+++ b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibility.java
@@ -58,7 +58,9 @@
 
     V1_3_5_0("3.5.0", "1.0", "v1"),
     V1_3_5_1("3.5.1", "1.0", "v1"),
-    V1_3_5_2("3.5.2", "1.0", "v1");
+    V1_3_5_2("3.5.2", "1.0", "v1"),
+
+    V1_3_6_0("3.6.0", "1.0", "v1");
 
     private static final String SEP = File.separator;
 
diff --git a/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONCompatibility.java b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONCompatibility.java
index 02270bb..c704edc 100644
--- a/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONCompatibility.java
+++ b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONCompatibility.java
@@ -168,7 +168,12 @@
     V1D0_3_5_2("3.5.2", "1.0", "v1d0"),
     V2D0_PARTIAL_3_5_2("3.5.2", "2.0", "v2d0-partial"),
     V2D0_NO_TYPE_3_5_2("3.5.2", "2.0", "v2d0-no-types"),
-    V3D0_PARTIAL_3_5_2("3.5.2", "3.0", "v3d0");
+    V3D0_PARTIAL_3_5_2("3.5.2", "3.0", "v3d0"),
+
+    V1D0_3_6_0("3.6.0", "1.0", "v1d0"),
+    V2D0_PARTIAL_3_6_0("3.6.0", "2.0", "v2d0-partial"),
+    V2D0_NO_TYPE_3_6_0("3.6.0", "2.0", "v2d0-no-types"),
+    V3D0_PARTIAL_3_6_0("3.6.0", "3.0", "v3d0");
 
     private static final String SEP = File.separator;
 
diff --git a/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoCompatibility.java b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoCompatibility.java
index 4a458f4..11d4d7b 100644
--- a/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoCompatibility.java
+++ b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoCompatibility.java
@@ -110,7 +110,10 @@
     V1D0_3_5_1("3.5.1", "1.0", "v1d0"),
     V3D0_3_5_1("3.5.1", "3.0", "v3d0"),
     V1D0_3_5_2("3.5.2", "1.0", "v1d0"),
-    V3D0_3_5_2("3.5.2", "3.0", "v3d0");
+    V3D0_3_5_2("3.5.2", "3.0", "v3d0"),
+
+    V1D0_3_6_0("3.6.0", "1.0", "v1d0"),
+    V3D0_3_6_0("3.6.0", "3.0", "v3d0");
 
     private static final String SEP = File.separator;
 
diff --git a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
index d8e2b6b..436b723 100644
--- a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
+++ b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
@@ -60,6 +60,8 @@
                 {GraphBinaryCompatibility.V1_3_5_0, readerV1, writerV1 },
                 {GraphBinaryCompatibility.V1_3_5_1, readerV1, writerV1 },
                 {GraphBinaryCompatibility.V1_3_5_2, readerV1, writerV1 },
+
+                {GraphBinaryCompatibility.V1_3_6_0, readerV1, writerV1 },
         });
     }
 
diff --git a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
index 6785bce..709f2c6 100644
--- a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
+++ b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
@@ -117,6 +117,9 @@
                 {GraphSONCompatibility.V3D0_PARTIAL_3_5_1, mapperV3 },
                 {GraphSONCompatibility.V2D0_PARTIAL_3_5_2, mapperV2 },
                 {GraphSONCompatibility.V3D0_PARTIAL_3_5_2, mapperV3 },
+
+                {GraphSONCompatibility.V2D0_PARTIAL_3_6_0, mapperV2 },
+                {GraphSONCompatibility.V3D0_PARTIAL_3_6_0, mapperV3 },
         });
     }
 
diff --git a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
index a478e39..f7de42f 100644
--- a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
+++ b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
@@ -125,6 +125,9 @@
                 {GraphSONCompatibility.V2D0_NO_TYPE_3_5_1, mapperV2 },
                 {GraphSONCompatibility.V1D0_3_5_2, mapperV1 },
                 {GraphSONCompatibility.V2D0_NO_TYPE_3_5_2, mapperV2 },
+
+                {GraphSONCompatibility.V1D0_3_6_0, mapperV1 },
+                {GraphSONCompatibility.V2D0_NO_TYPE_3_6_0, mapperV2 },
         });
     }
 
diff --git a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoCompatibilityTest.java b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoCompatibilityTest.java
index 91f6008..0981b4f 100644
--- a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoCompatibilityTest.java
+++ b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoCompatibilityTest.java
@@ -114,6 +114,9 @@
                 {GryoCompatibility.V3D0_3_5_1, mapperV3 },
                 {GryoCompatibility.V1D0_3_5_2, mapperV1 },
                 {GryoCompatibility.V3D0_3_5_2, mapperV3 },
+
+                {GryoCompatibility.V1D0_3_6_0, mapperV1 },
+                {GryoCompatibility.V3D0_3_6_0, mapperV3 },
         });
     }
 
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/log4j-silent.properties b/gremlin-tools/gremlin-io-test/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 1825bb0..0000000
--- a/gremlin-tools/gremlin-io-test/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,23 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/log4j-test.properties b/gremlin-tools/gremlin-io-test/src/test/resources/log4j-test.properties
deleted file mode 100644
index ef436fe..0000000
--- a/gremlin-tools/gremlin-io-test/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,21 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/logback-silent.xml b/gremlin-tools/gremlin-io-test/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..4c5947d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/logback-silent.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/logback-test.xml b/gremlin-tools/gremlin-io-test/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..5d94c3b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/logback-test.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/barrier-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/barrier-v1.gbin
new file mode 100644
index 0000000..f905861
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/barrier-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bigdecimal-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bigdecimal-v1.gbin
new file mode 100644
index 0000000..921d957
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bigdecimal-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/biginteger-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/biginteger-v1.gbin
new file mode 100644
index 0000000..d841fbe
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/biginteger-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/binding-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/binding-v1.gbin
new file mode 100644
index 0000000..79620eb
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/binding-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bulkset-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bulkset-v1.gbin
new file mode 100644
index 0000000..4542906
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bulkset-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/byte-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/byte-v1.gbin
new file mode 100644
index 0000000..af9544f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/byte-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bytebuffer-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bytebuffer-v1.gbin
new file mode 100644
index 0000000..39793d2
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bytebuffer-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bytecode-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bytecode-v1.gbin
new file mode 100644
index 0000000..bc76c2e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/bytecode-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/cardinality-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/cardinality-v1.gbin
new file mode 100644
index 0000000..3c875a5
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/cardinality-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/char-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/char-v1.gbin
new file mode 100644
index 0000000..b9d97e6
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/char-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/class-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/class-v1.gbin
new file mode 100644
index 0000000..6be272d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/class-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/column-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/column-v1.gbin
new file mode 100644
index 0000000..c6805c8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/column-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/date-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/date-v1.gbin
new file mode 100644
index 0000000..e68e17a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/date-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/direction-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/direction-v1.gbin
new file mode 100644
index 0000000..3caaba3
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/direction-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/double-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/double-v1.gbin
new file mode 100644
index 0000000..e538a62
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/double-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/duration-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/duration-v1.gbin
new file mode 100644
index 0000000..7ffa3ad
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/duration-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/edge-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/edge-v1.gbin
new file mode 100644
index 0000000..086e85d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/edge-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/float-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/float-v1.gbin
new file mode 100644
index 0000000..322772c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/float-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/inetaddress-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/inetaddress-v1.gbin
new file mode 100644
index 0000000..b613ddb
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/inetaddress-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/instant-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/instant-v1.gbin
new file mode 100644
index 0000000..3335532
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/instant-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/integer-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/integer-v1.gbin
new file mode 100644
index 0000000..7dc246a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/integer-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/lambda-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/lambda-v1.gbin
new file mode 100644
index 0000000..b0e98f9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/lambda-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/list-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/list-v1.gbin
new file mode 100644
index 0000000..1aa405d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/list-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localdate-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localdate-v1.gbin
new file mode 100644
index 0000000..2c9e211
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localdate-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localdatetime-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localdatetime-v1.gbin
new file mode 100644
index 0000000..2e0c83c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localdatetime-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localtime-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localtime-v1.gbin
new file mode 100644
index 0000000..05785c6
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/localtime-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/long-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/long-v1.gbin
new file mode 100644
index 0000000..cee0083
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/long-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/map-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/map-v1.gbin
new file mode 100644
index 0000000..46cd9e2
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/map-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/metrics-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/metrics-v1.gbin
new file mode 100644
index 0000000..dea77a5
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/metrics-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/monthday-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/monthday-v1.gbin
new file mode 100644
index 0000000..c128263
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/monthday-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/offsetdatetime-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/offsetdatetime-v1.gbin
new file mode 100644
index 0000000..4b2aabb
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/offsetdatetime-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/offsettime-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/offsettime-v1.gbin
new file mode 100644
index 0000000..a4c8c5b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/offsettime-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/operator-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/operator-v1.gbin
new file mode 100644
index 0000000..84717cc
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/operator-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/order-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/order-v1.gbin
new file mode 100644
index 0000000..311b6ad
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/order-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/p-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/p-v1.gbin
new file mode 100644
index 0000000..ac60799
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/p-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pand-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pand-v1.gbin
new file mode 100644
index 0000000..3237c94
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pand-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/path-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/path-v1.gbin
new file mode 100644
index 0000000..ba075ac
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/path-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/period-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/period-v1.gbin
new file mode 100644
index 0000000..f7dab35
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/period-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pick-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pick-v1.gbin
new file mode 100644
index 0000000..77aca2f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pick-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pop-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pop-v1.gbin
new file mode 100644
index 0000000..f698c94
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pop-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/por-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/por-v1.gbin
new file mode 100644
index 0000000..7c0b3ab
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/por-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/property-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/property-v1.gbin
new file mode 100644
index 0000000..ddc34e5
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/property-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pwithin-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pwithin-v1.gbin
new file mode 100644
index 0000000..5ad30a9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pwithin-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pwithout-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pwithout-v1.gbin
new file mode 100644
index 0000000..5b195db
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/pwithout-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/scope-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/scope-v1.gbin
new file mode 100644
index 0000000..534b956
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/scope-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/set-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/set-v1.gbin
new file mode 100644
index 0000000..02df059
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/set-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/short-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/short-v1.gbin
new file mode 100644
index 0000000..e1d2d7d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/short-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/t-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/t-v1.gbin
new file mode 100644
index 0000000..a6376db
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/t-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/textp-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/textp-v1.gbin
new file mode 100644
index 0000000..c796468
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/textp-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/timestamp-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/timestamp-v1.gbin
new file mode 100644
index 0000000..4fc4e5e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/timestamp-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/tinkergraph-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/tinkergraph-v1.gbin
new file mode 100644
index 0000000..a0a76d1
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/tinkergraph-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/traversalmetrics-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/traversalmetrics-v1.gbin
new file mode 100644
index 0000000..c947e62
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/traversalmetrics-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/traverser-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/traverser-v1.gbin
new file mode 100644
index 0000000..8e47cc0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/traverser-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/uuid-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/uuid-v1.gbin
new file mode 100644
index 0000000..7f1775d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/uuid-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/vertex-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/vertex-v1.gbin
new file mode 100644
index 0000000..7fb9d65
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/vertex-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/vertexproperty-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/vertexproperty-v1.gbin
new file mode 100644
index 0000000..89f0329
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/vertexproperty-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/year-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/year-v1.gbin
new file mode 100644
index 0000000..1fe0c74
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/year-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/yearmonth-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/yearmonth-v1.gbin
new file mode 100644
index 0000000..481a121
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/yearmonth-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/zoneoffset-v1.gbin b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/zoneoffset-v1.gbin
new file mode 100644
index 0000000..2867c97
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/_3_6_0/zoneoffset-v1.gbin
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v1d0.json
new file mode 100644
index 0000000..8c5b82c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v1d0.json
@@ -0,0 +1,12 @@
+{
+  "requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
+  "status" : {
+    "message" : "",
+    "code" : 407,
+    "attributes" : { }
+  },
+  "result" : {
+    "data" : null,
+    "meta" : { }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v2d0-no-types.json
new file mode 100644
index 0000000..8c5b82c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v2d0-no-types.json
@@ -0,0 +1,12 @@
+{
+  "requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
+  "status" : {
+    "message" : "",
+    "code" : 407,
+    "attributes" : { }
+  },
+  "result" : {
+    "data" : null,
+    "meta" : { }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v2d0-partial.json
new file mode 100644
index 0000000..8c5b82c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v2d0-partial.json
@@ -0,0 +1,12 @@
+{
+  "requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
+  "status" : {
+    "message" : "",
+    "code" : 407,
+    "attributes" : { }
+  },
+  "result" : {
+    "data" : null,
+    "meta" : { }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v3d0.json
new file mode 100644
index 0000000..d1734c6
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationchallenge-v3d0.json
@@ -0,0 +1,18 @@
+{
+  "requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
+  "status" : {
+    "message" : "",
+    "code" : 407,
+    "attributes" : {
+      "@type" : "g:Map",
+      "@value" : [ ]
+    }
+  },
+  "result" : {
+    "data" : null,
+    "meta" : {
+      "@type" : "g:Map",
+      "@value" : [ ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v1d0.json
new file mode 100644
index 0000000..838e1fd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v1d0.json
@@ -0,0 +1,9 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "authentication",
+  "processor" : "",
+  "args" : {
+    "saslMechanism" : "PLAIN",
+    "sasl" : "AHN0ZXBocGhlbgBwYXNzd29yZA=="
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v2d0-no-types.json
new file mode 100644
index 0000000..838e1fd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v2d0-no-types.json
@@ -0,0 +1,9 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "authentication",
+  "processor" : "",
+  "args" : {
+    "saslMechanism" : "PLAIN",
+    "sasl" : "AHN0ZXBocGhlbgBwYXNzd29yZA=="
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v2d0-partial.json
new file mode 100644
index 0000000..838e1fd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v2d0-partial.json
@@ -0,0 +1,9 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "authentication",
+  "processor" : "",
+  "args" : {
+    "saslMechanism" : "PLAIN",
+    "sasl" : "AHN0ZXBocGhlbgBwYXNzd29yZA=="
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v3d0.json
new file mode 100644
index 0000000..daceca2
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/authenticationresponse-v3d0.json
@@ -0,0 +1,9 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "authentication",
+  "processor" : "",
+  "args" : {
+    "@type" : "g:Map",
+    "@value" : [ "saslMechanism", "PLAIN", "sasl", "AHN0ZXBocGhlbgBwYXNzd29yZA==" ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/barrier-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/barrier-v2d0-partial.json
new file mode 100644
index 0000000..7ddccdd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/barrier-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Barrier",
+  "@value" : "normSack"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/barrier-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/barrier-v3d0.json
new file mode 100644
index 0000000..7ddccdd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/barrier-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Barrier",
+  "@value" : "normSack"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bigdecimal-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bigdecimal-v2d0-partial.json
new file mode 100644
index 0000000..475337c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bigdecimal-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:BigDecimal",
+  "@value" : 123456789987654321123456789987654321
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bigdecimal-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bigdecimal-v3d0.json
new file mode 100644
index 0000000..475337c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bigdecimal-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:BigDecimal",
+  "@value" : 123456789987654321123456789987654321
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/biginteger-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/biginteger-v2d0-partial.json
new file mode 100644
index 0000000..58e6114
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/biginteger-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:BigInteger",
+  "@value" : 123456789987654321123456789987654321
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/biginteger-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/biginteger-v3d0.json
new file mode 100644
index 0000000..58e6114
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/biginteger-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:BigInteger",
+  "@value" : 123456789987654321123456789987654321
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/binding-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/binding-v2d0-partial.json
new file mode 100644
index 0000000..579b8c7
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/binding-v2d0-partial.json
@@ -0,0 +1,10 @@
+{
+  "@type" : "g:Binding",
+  "@value" : {
+    "key" : "x",
+    "value" : {
+      "@type" : "g:Int32",
+      "@value" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/binding-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/binding-v3d0.json
new file mode 100644
index 0000000..579b8c7
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/binding-v3d0.json
@@ -0,0 +1,10 @@
+{
+  "@type" : "g:Binding",
+  "@value" : {
+    "key" : "x",
+    "value" : {
+      "@type" : "g:Int32",
+      "@value" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bulkset-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bulkset-v2d0-partial.json
new file mode 100644
index 0000000..c844975
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bulkset-v2d0-partial.json
@@ -0,0 +1 @@
+[ "marko", "josh", "josh" ]
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bulkset-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bulkset-v3d0.json
new file mode 100644
index 0000000..c216a36
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bulkset-v3d0.json
@@ -0,0 +1,10 @@
+{
+  "@type" : "g:BulkSet",
+  "@value" : [ "marko", {
+    "@type" : "g:Int64",
+    "@value" : 1
+  }, "josh", {
+    "@type" : "g:Int64",
+    "@value" : 2
+  } ]
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/byte-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/byte-v2d0-partial.json
new file mode 100644
index 0000000..979625b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/byte-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Byte",
+  "@value" : 1
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/byte-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/byte-v3d0.json
new file mode 100644
index 0000000..979625b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/byte-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Byte",
+  "@value" : 1
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytebuffer-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytebuffer-v2d0-partial.json
new file mode 100644
index 0000000..5724115
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytebuffer-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:ByteBuffer",
+  "@value" : "c29tZSBieXRlcyBmb3IgeW91"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytebuffer-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytebuffer-v3d0.json
new file mode 100644
index 0000000..5724115
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytebuffer-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:ByteBuffer",
+  "@value" : "c29tZSBieXRlcyBmb3IgeW91"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytecode-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytecode-v2d0-partial.json
new file mode 100644
index 0000000..269d277
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytecode-v2d0-partial.json
@@ -0,0 +1,6 @@
+{
+  "@type" : "g:Bytecode",
+  "@value" : {
+    "step" : [ [ "V" ], [ "hasLabel", "person" ], [ "out" ], [ "in" ], [ "tree" ] ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytecode-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytecode-v3d0.json
new file mode 100644
index 0000000..269d277
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/bytecode-v3d0.json
@@ -0,0 +1,6 @@
+{
+  "@type" : "g:Bytecode",
+  "@value" : {
+    "step" : [ [ "V" ], [ "hasLabel", "person" ], [ "out" ], [ "in" ], [ "tree" ] ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/cardinality-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/cardinality-v2d0-partial.json
new file mode 100644
index 0000000..834e64e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/cardinality-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Cardinality",
+  "@value" : "list"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/cardinality-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/cardinality-v3d0.json
new file mode 100644
index 0000000..834e64e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/cardinality-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Cardinality",
+  "@value" : "list"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/char-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/char-v2d0-partial.json
new file mode 100644
index 0000000..8f27e9d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/char-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Char",
+  "@value" : "x"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/char-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/char-v3d0.json
new file mode 100644
index 0000000..8f27e9d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/char-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Char",
+  "@value" : "x"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/class-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/class-v2d0-partial.json
new file mode 100644
index 0000000..80f15a2
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/class-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Class",
+  "@value" : "java.io.File"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/class-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/class-v3d0.json
new file mode 100644
index 0000000..80f15a2
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/class-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Class",
+  "@value" : "java.io.File"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/column-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/column-v2d0-partial.json
new file mode 100644
index 0000000..0b3a56e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/column-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Column",
+  "@value" : "keys"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/column-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/column-v3d0.json
new file mode 100644
index 0000000..0b3a56e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/column-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Column",
+  "@value" : "keys"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v2d0-no-types.json
new file mode 100644
index 0000000..03b71a0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v2d0-no-types.json
@@ -0,0 +1 @@
+1481750076295
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v2d0-partial.json
new file mode 100644
index 0000000..cf4007a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Date",
+  "@value" : 1481750076295
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v3d0.json
new file mode 100644
index 0000000..cf4007a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/date-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Date",
+  "@value" : 1481750076295
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/direction-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/direction-v2d0-partial.json
new file mode 100644
index 0000000..78cb7e4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/direction-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Direction",
+  "@value" : "OUT"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/direction-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/direction-v3d0.json
new file mode 100644
index 0000000..78cb7e4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/direction-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Direction",
+  "@value" : "OUT"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v2d0-no-types.json
new file mode 100644
index 0000000..e772e62
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v2d0-no-types.json
@@ -0,0 +1 @@
+100.0
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v2d0-partial.json
new file mode 100644
index 0000000..9ae4964
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Double",
+  "@value" : 100.0
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v3d0.json
new file mode 100644
index 0000000..9ae4964
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/double-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Double",
+  "@value" : 100.0
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/duration-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/duration-v2d0-partial.json
new file mode 100644
index 0000000..05c0ce9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/duration-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Duration",
+  "@value" : "PT120H"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/duration-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/duration-v3d0.json
new file mode 100644
index 0000000..05c0ce9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/duration-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Duration",
+  "@value" : "PT120H"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v1d0.json
new file mode 100644
index 0000000..0f7f168
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v1d0.json
@@ -0,0 +1,12 @@
+{
+  "id" : 13,
+  "label" : "develops",
+  "type" : "edge",
+  "inVLabel" : "software",
+  "outVLabel" : "person",
+  "inV" : 10,
+  "outV" : 1,
+  "properties" : {
+    "since" : 2009
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v2d0-no-types.json
new file mode 100644
index 0000000..a8e73db
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v2d0-no-types.json
@@ -0,0 +1,14 @@
+{
+  "id" : 13,
+  "label" : "develops",
+  "inVLabel" : "software",
+  "outVLabel" : "person",
+  "inV" : 10,
+  "outV" : 1,
+  "properties" : {
+    "since" : {
+      "key" : "since",
+      "value" : 2009
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v2d0-partial.json
new file mode 100644
index 0000000..ba1c52e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v2d0-partial.json
@@ -0,0 +1,32 @@
+{
+  "@type" : "g:Edge",
+  "@value" : {
+    "id" : {
+      "@type" : "g:Int32",
+      "@value" : 13
+    },
+    "label" : "develops",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : {
+      "@type" : "g:Int32",
+      "@value" : 10
+    },
+    "outV" : {
+      "@type" : "g:Int32",
+      "@value" : 1
+    },
+    "properties" : {
+      "since" : {
+        "@type" : "g:Property",
+        "@value" : {
+          "key" : "since",
+          "value" : {
+            "@type" : "g:Int32",
+            "@value" : 2009
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v3d0.json
new file mode 100644
index 0000000..ba1c52e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/edge-v3d0.json
@@ -0,0 +1,32 @@
+{
+  "@type" : "g:Edge",
+  "@value" : {
+    "id" : {
+      "@type" : "g:Int32",
+      "@value" : 13
+    },
+    "label" : "develops",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : {
+      "@type" : "g:Int32",
+      "@value" : 10
+    },
+    "outV" : {
+      "@type" : "g:Int32",
+      "@value" : 1
+    },
+    "properties" : {
+      "since" : {
+        "@type" : "g:Property",
+        "@value" : {
+          "key" : "since",
+          "value" : {
+            "@type" : "g:Int32",
+            "@value" : 2009
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/float-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/float-v2d0-partial.json
new file mode 100644
index 0000000..7179aaf
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/float-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Float",
+  "@value" : 100.0
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/float-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/float-v3d0.json
new file mode 100644
index 0000000..7179aaf
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/float-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Float",
+  "@value" : 100.0
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/inetaddress-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/inetaddress-v2d0-partial.json
new file mode 100644
index 0000000..fba98c0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/inetaddress-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:InetAddress",
+  "@value" : "localhost"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/inetaddress-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/inetaddress-v3d0.json
new file mode 100644
index 0000000..fba98c0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/inetaddress-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:InetAddress",
+  "@value" : "localhost"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/instant-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/instant-v2d0-partial.json
new file mode 100644
index 0000000..3749741
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/instant-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Instant",
+  "@value" : "2016-12-14T16:39:19.349Z"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/instant-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/instant-v3d0.json
new file mode 100644
index 0000000..3749741
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/instant-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Instant",
+  "@value" : "2016-12-14T16:39:19.349Z"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v2d0-no-types.json
new file mode 100644
index 0000000..105d7d9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v2d0-no-types.json
@@ -0,0 +1 @@
+100
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v2d0-partial.json
new file mode 100644
index 0000000..750ce7a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Int32",
+  "@value" : 100
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v3d0.json
new file mode 100644
index 0000000..750ce7a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/integer-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Int32",
+  "@value" : 100
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/lambda-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/lambda-v2d0-partial.json
new file mode 100644
index 0000000..5be179b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/lambda-v2d0-partial.json
@@ -0,0 +1,8 @@
+{
+  "@type" : "g:Lambda",
+  "@value" : {
+    "script" : "{ it.get() }",
+    "language" : "gremlin-groovy",
+    "arguments" : 1
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/lambda-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/lambda-v3d0.json
new file mode 100644
index 0000000..5be179b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/lambda-v3d0.json
@@ -0,0 +1,8 @@
+{
+  "@type" : "g:Lambda",
+  "@value" : {
+    "script" : "{ it.get() }",
+    "language" : "gremlin-groovy",
+    "arguments" : 1
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/list-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/list-v3d0.json
new file mode 100644
index 0000000..b714e2d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/list-v3d0.json
@@ -0,0 +1,7 @@
+{
+  "@type" : "g:List",
+  "@value" : [ {
+    "@type" : "g:Int32",
+    "@value" : 1
+  }, "person", true ]
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdate-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdate-v2d0-partial.json
new file mode 100644
index 0000000..36fb81d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdate-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:LocalDate",
+  "@value" : "2016-01-01"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdate-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdate-v3d0.json
new file mode 100644
index 0000000..36fb81d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdate-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:LocalDate",
+  "@value" : "2016-01-01"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdatetime-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdatetime-v2d0-partial.json
new file mode 100644
index 0000000..2d83668
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdatetime-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:LocalDateTime",
+  "@value" : "2016-01-01T12:30"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdatetime-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdatetime-v3d0.json
new file mode 100644
index 0000000..2d83668
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localdatetime-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:LocalDateTime",
+  "@value" : "2016-01-01T12:30"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localtime-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localtime-v2d0-partial.json
new file mode 100644
index 0000000..eff65a7
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localtime-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:LocalTime",
+  "@value" : "12:30:45"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localtime-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localtime-v3d0.json
new file mode 100644
index 0000000..eff65a7
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/localtime-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:LocalTime",
+  "@value" : "12:30:45"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/long-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/long-v2d0-partial.json
new file mode 100644
index 0000000..84b9a23
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/long-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Int64",
+  "@value" : 100
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/long-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/long-v3d0.json
new file mode 100644
index 0000000..84b9a23
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/long-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Int64",
+  "@value" : 100
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/map-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/map-v3d0.json
new file mode 100644
index 0000000..7ad59c9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/map-v3d0.json
@@ -0,0 +1,25 @@
+{
+  "@type" : "g:Map",
+  "@value" : [ {
+    "@type" : "g:Date",
+    "@value" : 1481750076295
+  }, "red", {
+    "@type" : "g:List",
+    "@value" : [ {
+      "@type" : "g:Int32",
+      "@value" : 1
+    }, {
+      "@type" : "g:Int32",
+      "@value" : 2
+    }, {
+      "@type" : "g:Int32",
+      "@value" : 3
+    } ]
+  }, {
+    "@type" : "g:Date",
+    "@value" : 1481750076295
+  }, "test", {
+    "@type" : "g:Int32",
+    "@value" : 123
+  } ]
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/metrics-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/metrics-v2d0-partial.json
new file mode 100644
index 0000000..7b1e964
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/metrics-v2d0-partial.json
@@ -0,0 +1,54 @@
+{
+  "@type" : "g:Metrics",
+  "@value" : {
+    "dur" : {
+      "@type" : "g:Double",
+      "@value" : 100.0
+    },
+    "counts" : {
+      "traverserCount" : {
+        "@type" : "g:Int64",
+        "@value" : 4
+      },
+      "elementCount" : {
+        "@type" : "g:Int64",
+        "@value" : 4
+      }
+    },
+    "name" : "TinkerGraphStep(vertex,[~label.eq(person)])",
+    "annotations" : {
+      "percentDur" : {
+        "@type" : "g:Double",
+        "@value" : 25.0
+      }
+    },
+    "id" : "7.0.0()",
+    "metrics" : [ {
+      "@type" : "g:Metrics",
+      "@value" : {
+        "dur" : {
+          "@type" : "g:Double",
+          "@value" : 100.0
+        },
+        "counts" : {
+          "traverserCount" : {
+            "@type" : "g:Int64",
+            "@value" : 7
+          },
+          "elementCount" : {
+            "@type" : "g:Int64",
+            "@value" : 7
+          }
+        },
+        "name" : "VertexStep(OUT,vertex)",
+        "annotations" : {
+          "percentDur" : {
+            "@type" : "g:Double",
+            "@value" : 25.0
+          }
+        },
+        "id" : "3.0.0()"
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/metrics-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/metrics-v3d0.json
new file mode 100644
index 0000000..f6e678b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/metrics-v3d0.json
@@ -0,0 +1,52 @@
+{
+  "@type" : "g:Metrics",
+  "@value" : {
+    "@type" : "g:Map",
+    "@value" : [ "dur", {
+      "@type" : "g:Double",
+      "@value" : 100.0
+    }, "counts", {
+      "@type" : "g:Map",
+      "@value" : [ "traverserCount", {
+        "@type" : "g:Int64",
+        "@value" : 4
+      }, "elementCount", {
+        "@type" : "g:Int64",
+        "@value" : 4
+      } ]
+    }, "name", "TinkerGraphStep(vertex,[~label.eq(person)])", "annotations", {
+      "@type" : "g:Map",
+      "@value" : [ "percentDur", {
+        "@type" : "g:Double",
+        "@value" : 25.0
+      } ]
+    }, "id", "7.0.0()", "metrics", {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Metrics",
+        "@value" : {
+          "@type" : "g:Map",
+          "@value" : [ "dur", {
+            "@type" : "g:Double",
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 7
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 7
+            } ]
+          }, "name", "VertexStep(OUT,vertex)", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "3.0.0()" ]
+        }
+      } ]
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/monthday-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/monthday-v2d0-partial.json
new file mode 100644
index 0000000..5da5914
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/monthday-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:MonthDay",
+  "@value" : "--01-01"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/monthday-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/monthday-v3d0.json
new file mode 100644
index 0000000..5da5914
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/monthday-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:MonthDay",
+  "@value" : "--01-01"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsetdatetime-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsetdatetime-v2d0-partial.json
new file mode 100644
index 0000000..03f45cd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsetdatetime-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:OffsetDateTime",
+  "@value" : "2007-12-03T10:15:30+01:00"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsetdatetime-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsetdatetime-v3d0.json
new file mode 100644
index 0000000..03f45cd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsetdatetime-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:OffsetDateTime",
+  "@value" : "2007-12-03T10:15:30+01:00"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsettime-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsettime-v2d0-partial.json
new file mode 100644
index 0000000..b124953
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsettime-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:OffsetTime",
+  "@value" : "10:15:30+01:00"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsettime-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsettime-v3d0.json
new file mode 100644
index 0000000..b124953
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/offsettime-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:OffsetTime",
+  "@value" : "10:15:30+01:00"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/operator-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/operator-v2d0-partial.json
new file mode 100644
index 0000000..14c1400
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/operator-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Operator",
+  "@value" : "sum"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/operator-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/operator-v3d0.json
new file mode 100644
index 0000000..14c1400
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/operator-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Operator",
+  "@value" : "sum"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/order-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/order-v2d0-partial.json
new file mode 100644
index 0000000..4be0432
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/order-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Order",
+  "@value" : "shuffle"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/order-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/order-v3d0.json
new file mode 100644
index 0000000..4be0432
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/order-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Order",
+  "@value" : "shuffle"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/p-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/p-v2d0-partial.json
new file mode 100644
index 0000000..5bdfb3b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/p-v2d0-partial.json
@@ -0,0 +1,10 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "gt",
+    "value" : {
+      "@type" : "g:Int32",
+      "@value" : 0
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/p-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/p-v3d0.json
new file mode 100644
index 0000000..5bdfb3b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/p-v3d0.json
@@ -0,0 +1,10 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "gt",
+    "value" : {
+      "@type" : "g:Int32",
+      "@value" : 0
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pand-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pand-v2d0-partial.json
new file mode 100644
index 0000000..c271958
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pand-v2d0-partial.json
@@ -0,0 +1,25 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "and",
+    "value" : [ {
+      "@type" : "g:P",
+      "@value" : {
+        "predicate" : "gt",
+        "value" : {
+          "@type" : "g:Int32",
+          "@value" : 0
+        }
+      }
+    }, {
+      "@type" : "g:P",
+      "@value" : {
+        "predicate" : "lt",
+        "value" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        }
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pand-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pand-v3d0.json
new file mode 100644
index 0000000..c271958
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pand-v3d0.json
@@ -0,0 +1,25 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "and",
+    "value" : [ {
+      "@type" : "g:P",
+      "@value" : {
+        "predicate" : "gt",
+        "value" : {
+          "@type" : "g:Int32",
+          "@value" : 0
+        }
+      }
+    }, {
+      "@type" : "g:P",
+      "@value" : {
+        "predicate" : "lt",
+        "value" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        }
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v1d0.json
new file mode 100644
index 0000000..2eee883
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v1d0.json
@@ -0,0 +1,62 @@
+{
+  "labels" : [ [ ], [ ], [ ] ],
+  "objects" : [ {
+    "id" : 1,
+    "label" : "person",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 0,
+        "value" : "marko"
+      } ],
+      "location" : [ {
+        "id" : 6,
+        "value" : "san diego",
+        "properties" : {
+          "startTime" : 1997,
+          "endTime" : 2001
+        }
+      }, {
+        "id" : 7,
+        "value" : "santa cruz",
+        "properties" : {
+          "startTime" : 2001,
+          "endTime" : 2004
+        }
+      }, {
+        "id" : 8,
+        "value" : "brussels",
+        "properties" : {
+          "startTime" : 2004,
+          "endTime" : 2005
+        }
+      }, {
+        "id" : 9,
+        "value" : "santa fe",
+        "properties" : {
+          "startTime" : 2005
+        }
+      } ]
+    }
+  }, {
+    "id" : 10,
+    "label" : "software",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 4,
+        "value" : "gremlin"
+      } ]
+    }
+  }, {
+    "id" : 11,
+    "label" : "software",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 5,
+        "value" : "tinkergraph"
+      } ]
+    }
+  } ]
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v2d0-no-types.json
new file mode 100644
index 0000000..a592d2f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v2d0-no-types.json
@@ -0,0 +1,13 @@
+{
+  "labels" : [ [ ], [ ], [ ] ],
+  "objects" : [ {
+    "id" : 1,
+    "label" : "person"
+  }, {
+    "id" : 10,
+    "label" : "software"
+  }, {
+    "id" : 11,
+    "label" : "software"
+  } ]
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v2d0-partial.json
new file mode 100644
index 0000000..9ccaa00
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v2d0-partial.json
@@ -0,0 +1,34 @@
+{
+  "@type" : "g:Path",
+  "@value" : {
+    "labels" : [ [ ], [ ], [ ] ],
+    "objects" : [ {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "label" : "person"
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "label" : "software"
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "label" : "software"
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v3d0.json
new file mode 100644
index 0000000..216b393
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/path-v3d0.json
@@ -0,0 +1,49 @@
+{
+  "@type" : "g:Path",
+  "@value" : {
+    "labels" : {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Set",
+        "@value" : [ ]
+      }, {
+        "@type" : "g:Set",
+        "@value" : [ ]
+      }, {
+        "@type" : "g:Set",
+        "@value" : [ ]
+      } ]
+    },
+    "objects" : {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Vertex",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int32",
+            "@value" : 1
+          },
+          "label" : "person"
+        }
+      }, {
+        "@type" : "g:Vertex",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int32",
+            "@value" : 10
+          },
+          "label" : "software"
+        }
+      }, {
+        "@type" : "g:Vertex",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int32",
+            "@value" : 11
+          },
+          "label" : "software"
+        }
+      } ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/period-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/period-v2d0-partial.json
new file mode 100644
index 0000000..20438a1
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/period-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Period",
+  "@value" : "P1Y6M15D"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/period-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/period-v3d0.json
new file mode 100644
index 0000000..20438a1
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/period-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Period",
+  "@value" : "P1Y6M15D"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pick-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pick-v2d0-partial.json
new file mode 100644
index 0000000..3ca2f2e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pick-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Pick",
+  "@value" : "any"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pick-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pick-v3d0.json
new file mode 100644
index 0000000..3ca2f2e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pick-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Pick",
+  "@value" : "any"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pop-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pop-v2d0-partial.json
new file mode 100644
index 0000000..271515f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pop-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Pop",
+  "@value" : "all"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pop-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pop-v3d0.json
new file mode 100644
index 0000000..271515f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pop-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Pop",
+  "@value" : "all"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/por-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/por-v2d0-partial.json
new file mode 100644
index 0000000..71fcb7d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/por-v2d0-partial.json
@@ -0,0 +1,31 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "or",
+    "value" : [ {
+      "@type" : "g:P",
+      "@value" : {
+        "predicate" : "gt",
+        "value" : {
+          "@type" : "g:Int32",
+          "@value" : 0
+        }
+      }
+    }, {
+      "@type" : "g:P",
+      "@value" : {
+        "predicate" : "within",
+        "value" : [ {
+          "@type" : "g:Int32",
+          "@value" : -1
+        }, {
+          "@type" : "g:Int32",
+          "@value" : -10
+        }, {
+          "@type" : "g:Int32",
+          "@value" : -100
+        } ]
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/por-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/por-v3d0.json
new file mode 100644
index 0000000..a71b1cf
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/por-v3d0.json
@@ -0,0 +1,34 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "or",
+    "value" : [ {
+      "@type" : "g:P",
+      "@value" : {
+        "predicate" : "gt",
+        "value" : {
+          "@type" : "g:Int32",
+          "@value" : 0
+        }
+      }
+    }, {
+      "@type" : "g:P",
+      "@value" : {
+        "predicate" : "within",
+        "value" : {
+          "@type" : "g:List",
+          "@value" : [ {
+            "@type" : "g:Int32",
+            "@value" : -1
+          }, {
+            "@type" : "g:Int32",
+            "@value" : -10
+          }, {
+            "@type" : "g:Int32",
+            "@value" : -100
+          } ]
+        }
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v1d0.json
new file mode 100644
index 0000000..c051c0a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v1d0.json
@@ -0,0 +1,4 @@
+{
+  "key" : "since",
+  "value" : 2009
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v2d0-no-types.json
new file mode 100644
index 0000000..c051c0a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v2d0-no-types.json
@@ -0,0 +1,4 @@
+{
+  "key" : "since",
+  "value" : 2009
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v2d0-partial.json
new file mode 100644
index 0000000..296fe32
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v2d0-partial.json
@@ -0,0 +1,10 @@
+{
+  "@type" : "g:Property",
+  "@value" : {
+    "key" : "since",
+    "value" : {
+      "@type" : "g:Int32",
+      "@value" : 2009
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v3d0.json
new file mode 100644
index 0000000..296fe32
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/property-v3d0.json
@@ -0,0 +1,10 @@
+{
+  "@type" : "g:Property",
+  "@value" : {
+    "key" : "since",
+    "value" : {
+      "@type" : "g:Int32",
+      "@value" : 2009
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithin-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithin-v2d0-partial.json
new file mode 100644
index 0000000..afa3826
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithin-v2d0-partial.json
@@ -0,0 +1,10 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "within",
+    "value" : [ {
+      "@type" : "g:Int32",
+      "@value" : 1
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithin-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithin-v3d0.json
new file mode 100644
index 0000000..83f99cc
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithin-v3d0.json
@@ -0,0 +1,13 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "within",
+    "value" : {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Int32",
+        "@value" : 1
+      } ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithout-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithout-v2d0-partial.json
new file mode 100644
index 0000000..8c2291b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithout-v2d0-partial.json
@@ -0,0 +1,13 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "without",
+    "value" : [ {
+      "@type" : "g:Int32",
+      "@value" : 1
+    }, {
+      "@type" : "g:Int32",
+      "@value" : 2
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithout-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithout-v3d0.json
new file mode 100644
index 0000000..9a16890
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/pwithout-v3d0.json
@@ -0,0 +1,16 @@
+{
+  "@type" : "g:P",
+  "@value" : {
+    "predicate" : "without",
+    "value" : {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Int32",
+        "@value" : 1
+      }, {
+        "@type" : "g:Int32",
+        "@value" : 2
+      } ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/scope-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/scope-v2d0-partial.json
new file mode 100644
index 0000000..4a74af0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/scope-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Scope",
+  "@value" : "local"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/scope-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/scope-v3d0.json
new file mode 100644
index 0000000..4a74af0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/scope-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Scope",
+  "@value" : "local"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v1d0.json
new file mode 100644
index 0000000..ac825e8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v1d0.json
@@ -0,0 +1,8 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "close",
+  "processor" : "session",
+  "args" : {
+    "session" : "unique-session-identifier"
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v2d0-no-types.json
new file mode 100644
index 0000000..ac825e8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v2d0-no-types.json
@@ -0,0 +1,8 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "close",
+  "processor" : "session",
+  "args" : {
+    "session" : "unique-session-identifier"
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v2d0-partial.json
new file mode 100644
index 0000000..ac825e8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v2d0-partial.json
@@ -0,0 +1,8 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "close",
+  "processor" : "session",
+  "args" : {
+    "session" : "unique-session-identifier"
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v3d0.json
new file mode 100644
index 0000000..4be1ccd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionclose-v3d0.json
@@ -0,0 +1,9 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "close",
+  "processor" : "session",
+  "args" : {
+    "@type" : "g:Map",
+    "@value" : [ "session", "unique-session-identifier" ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v1d0.json
new file mode 100644
index 0000000..8bce82f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v1d0.json
@@ -0,0 +1,13 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "session",
+  "args" : {
+    "gremlin" : "g.V(x)",
+    "language" : "gremlin-groovy",
+    "session" : "unique-session-identifier",
+    "bindings" : {
+      "x" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v2d0-no-types.json
new file mode 100644
index 0000000..8bce82f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v2d0-no-types.json
@@ -0,0 +1,13 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "session",
+  "args" : {
+    "gremlin" : "g.V(x)",
+    "language" : "gremlin-groovy",
+    "session" : "unique-session-identifier",
+    "bindings" : {
+      "x" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v2d0-partial.json
new file mode 100644
index 0000000..8ff8b96
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v2d0-partial.json
@@ -0,0 +1,16 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "session",
+  "args" : {
+    "gremlin" : "g.V(x)",
+    "language" : "gremlin-groovy",
+    "session" : "unique-session-identifier",
+    "bindings" : {
+      "x" : {
+        "@type" : "g:Int32",
+        "@value" : 1
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v3d0.json
new file mode 100644
index 0000000..301c393
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessioneval-v3d0.json
@@ -0,0 +1,15 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "session",
+  "args" : {
+    "@type" : "g:Map",
+    "@value" : [ "gremlin", "g.V(x)", "language", "gremlin-groovy", "session", "unique-session-identifier", "bindings", {
+      "@type" : "g:Map",
+      "@value" : [ "x", {
+        "@type" : "g:Int32",
+        "@value" : 1
+      } ]
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v1d0.json
new file mode 100644
index 0000000..5f4ef46
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v1d0.json
@@ -0,0 +1,16 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "session",
+  "args" : {
+    "gremlin" : "social.V(x)",
+    "language" : "gremlin-groovy",
+    "aliases" : {
+      "g" : "social"
+    },
+    "session" : "unique-session-identifier",
+    "bindings" : {
+      "x" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v2d0-no-types.json
new file mode 100644
index 0000000..5f4ef46
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v2d0-no-types.json
@@ -0,0 +1,16 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "session",
+  "args" : {
+    "gremlin" : "social.V(x)",
+    "language" : "gremlin-groovy",
+    "aliases" : {
+      "g" : "social"
+    },
+    "session" : "unique-session-identifier",
+    "bindings" : {
+      "x" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v2d0-partial.json
new file mode 100644
index 0000000..394e5d3
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v2d0-partial.json
@@ -0,0 +1,19 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "session",
+  "args" : {
+    "gremlin" : "social.V(x)",
+    "language" : "gremlin-groovy",
+    "aliases" : {
+      "g" : "social"
+    },
+    "session" : "unique-session-identifier",
+    "bindings" : {
+      "x" : {
+        "@type" : "g:Int32",
+        "@value" : 1
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v3d0.json
new file mode 100644
index 0000000..7448160
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionevalaliased-v3d0.json
@@ -0,0 +1,18 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "session",
+  "args" : {
+    "@type" : "g:Map",
+    "@value" : [ "gremlin", "social.V(x)", "language", "gremlin-groovy", "aliases", {
+      "@type" : "g:Map",
+      "@value" : [ "g", "social" ]
+    }, "session", "unique-session-identifier", "bindings", {
+      "@type" : "g:Map",
+      "@value" : [ "x", {
+        "@type" : "g:Int32",
+        "@value" : 1
+      } ]
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v1d0.json
new file mode 100644
index 0000000..8c9a807
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v1d0.json
@@ -0,0 +1,12 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "",
+  "args" : {
+    "gremlin" : "g.V(x)",
+    "language" : "gremlin-groovy",
+    "bindings" : {
+      "x" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v2d0-no-types.json
new file mode 100644
index 0000000..8c9a807
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v2d0-no-types.json
@@ -0,0 +1,12 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "",
+  "args" : {
+    "gremlin" : "g.V(x)",
+    "language" : "gremlin-groovy",
+    "bindings" : {
+      "x" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v2d0-partial.json
new file mode 100644
index 0000000..81e2f6c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v2d0-partial.json
@@ -0,0 +1,15 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "",
+  "args" : {
+    "gremlin" : "g.V(x)",
+    "language" : "gremlin-groovy",
+    "bindings" : {
+      "x" : {
+        "@type" : "g:Int32",
+        "@value" : 1
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v3d0.json
new file mode 100644
index 0000000..dc8c8e6
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlesseval-v3d0.json
@@ -0,0 +1,15 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "",
+  "args" : {
+    "@type" : "g:Map",
+    "@value" : [ "gremlin", "g.V(x)", "language", "gremlin-groovy", "bindings", {
+      "@type" : "g:Map",
+      "@value" : [ "x", {
+        "@type" : "g:Int32",
+        "@value" : 1
+      } ]
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v1d0.json
new file mode 100644
index 0000000..59f0c6c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v1d0.json
@@ -0,0 +1,15 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "",
+  "args" : {
+    "gremlin" : "social.V(x)",
+    "language" : "gremlin-groovy",
+    "aliases" : {
+      "g" : "social"
+    },
+    "bindings" : {
+      "x" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v2d0-no-types.json
new file mode 100644
index 0000000..59f0c6c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v2d0-no-types.json
@@ -0,0 +1,15 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "",
+  "args" : {
+    "gremlin" : "social.V(x)",
+    "language" : "gremlin-groovy",
+    "aliases" : {
+      "g" : "social"
+    },
+    "bindings" : {
+      "x" : 1
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v2d0-partial.json
new file mode 100644
index 0000000..0f6a54e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v2d0-partial.json
@@ -0,0 +1,18 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "",
+  "args" : {
+    "gremlin" : "social.V(x)",
+    "language" : "gremlin-groovy",
+    "aliases" : {
+      "g" : "social"
+    },
+    "bindings" : {
+      "x" : {
+        "@type" : "g:Int32",
+        "@value" : 1
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v3d0.json
new file mode 100644
index 0000000..fc03a37
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/sessionlessevalaliased-v3d0.json
@@ -0,0 +1,18 @@
+{
+  "requestId" : "cb682578-9d92-4499-9ebc-5c6aa73c5397",
+  "op" : "eval",
+  "processor" : "",
+  "args" : {
+    "@type" : "g:Map",
+    "@value" : [ "gremlin", "social.V(x)", "language", "gremlin-groovy", "aliases", {
+      "@type" : "g:Map",
+      "@value" : [ "g", "social" ]
+    }, "bindings", {
+      "@type" : "g:Map",
+      "@value" : [ "x", {
+        "@type" : "g:Int32",
+        "@value" : 1
+      } ]
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/set-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/set-v3d0.json
new file mode 100644
index 0000000..32deea2
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/set-v3d0.json
@@ -0,0 +1,7 @@
+{
+  "@type" : "g:Set",
+  "@value" : [ {
+    "@type" : "g:Int32",
+    "@value" : 1
+  }, "person", true ]
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/short-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/short-v2d0-partial.json
new file mode 100644
index 0000000..c68f5cd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/short-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Int16",
+  "@value" : 100
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/short-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/short-v3d0.json
new file mode 100644
index 0000000..c68f5cd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/short-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Int16",
+  "@value" : 100
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v1d0.json
new file mode 100644
index 0000000..9b93727
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v1d0.json
@@ -0,0 +1,50 @@
+{
+  "requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
+  "status" : {
+    "message" : "",
+    "code" : 200,
+    "attributes" : { }
+  },
+  "result" : {
+    "data" : [ {
+      "id" : 1,
+      "label" : "person",
+      "type" : "vertex",
+      "properties" : {
+        "name" : [ {
+          "id" : 0,
+          "value" : "marko"
+        } ],
+        "location" : [ {
+          "id" : 6,
+          "value" : "san diego",
+          "properties" : {
+            "startTime" : 1997,
+            "endTime" : 2001
+          }
+        }, {
+          "id" : 7,
+          "value" : "santa cruz",
+          "properties" : {
+            "startTime" : 2001,
+            "endTime" : 2004
+          }
+        }, {
+          "id" : 8,
+          "value" : "brussels",
+          "properties" : {
+            "startTime" : 2004,
+            "endTime" : 2005
+          }
+        }, {
+          "id" : 9,
+          "value" : "santa fe",
+          "properties" : {
+            "startTime" : 2005
+          }
+        } ]
+      }
+    } ],
+    "meta" : { }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v2d0-partial.json
new file mode 100644
index 0000000..857c6db
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v2d0-partial.json
@@ -0,0 +1,111 @@
+{
+  "requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
+  "status" : {
+    "message" : "",
+    "code" : 200,
+    "attributes" : { }
+  },
+  "result" : {
+    "data" : [ {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 0
+              },
+              "value" : "marko",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 6
+              },
+              "value" : "san diego",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1997
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 7
+              },
+              "value" : "santa cruz",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 8
+              },
+              "value" : "brussels",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 9
+              },
+              "value" : "santa fe",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          } ]
+        }
+      }
+    } ],
+    "meta" : { }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v3d0.json
new file mode 100644
index 0000000..dfca400
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/standardresult-v3d0.json
@@ -0,0 +1,120 @@
+{
+  "requestId" : "41d2e28a-20a4-4ab0-b379-d810dede3786",
+  "status" : {
+    "message" : "",
+    "code" : 200,
+    "attributes" : {
+      "@type" : "g:Map",
+      "@value" : [ ]
+    }
+  },
+  "result" : {
+    "data" : {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Vertex",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int32",
+            "@value" : 1
+          },
+          "label" : "person",
+          "properties" : {
+            "name" : [ {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 0
+                },
+                "value" : "marko",
+                "label" : "name"
+              }
+            } ],
+            "location" : [ {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 6
+                },
+                "value" : "san diego",
+                "label" : "location",
+                "properties" : {
+                  "startTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 1997
+                  },
+                  "endTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2001
+                  }
+                }
+              }
+            }, {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 7
+                },
+                "value" : "santa cruz",
+                "label" : "location",
+                "properties" : {
+                  "startTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2001
+                  },
+                  "endTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2004
+                  }
+                }
+              }
+            }, {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 8
+                },
+                "value" : "brussels",
+                "label" : "location",
+                "properties" : {
+                  "startTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2004
+                  },
+                  "endTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2005
+                  }
+                }
+              }
+            }, {
+              "@type" : "g:VertexProperty",
+              "@value" : {
+                "id" : {
+                  "@type" : "g:Int64",
+                  "@value" : 9
+                },
+                "value" : "santa fe",
+                "label" : "location",
+                "properties" : {
+                  "startTime" : {
+                    "@type" : "g:Int32",
+                    "@value" : 2005
+                  }
+                }
+              }
+            } ]
+          }
+        }
+      } ]
+    },
+    "meta" : {
+      "@type" : "g:Map",
+      "@value" : [ ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/t-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/t-v2d0-partial.json
new file mode 100644
index 0000000..9693983
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/t-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:T",
+  "@value" : "label"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/t-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/t-v3d0.json
new file mode 100644
index 0000000..9693983
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/t-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:T",
+  "@value" : "label"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/textp-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/textp-v2d0-partial.json
new file mode 100644
index 0000000..2820989
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/textp-v2d0-partial.json
@@ -0,0 +1,7 @@
+{
+  "@type" : "g:TextP",
+  "@value" : {
+    "predicate" : "containing",
+    "value" : "ark"
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/textp-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/textp-v3d0.json
new file mode 100644
index 0000000..2820989
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/textp-v3d0.json
@@ -0,0 +1,7 @@
+{
+  "@type" : "g:TextP",
+  "@value" : {
+    "predicate" : "containing",
+    "value" : "ark"
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/timestamp-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/timestamp-v2d0-partial.json
new file mode 100644
index 0000000..1ca0e17
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/timestamp-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Timestamp",
+  "@value" : 1481750076295
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/timestamp-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/timestamp-v3d0.json
new file mode 100644
index 0000000..1ca0e17
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/timestamp-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:Timestamp",
+  "@value" : 1481750076295
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v1d0.json
new file mode 100644
index 0000000..13719f6
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v1d0.json
@@ -0,0 +1,313 @@
+{
+  "vertices" : [ {
+    "id" : 1,
+    "label" : "person",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 0,
+        "value" : "marko"
+      } ],
+      "location" : [ {
+        "id" : 6,
+        "value" : "san diego",
+        "properties" : {
+          "startTime" : 1997,
+          "endTime" : 2001
+        }
+      }, {
+        "id" : 7,
+        "value" : "santa cruz",
+        "properties" : {
+          "startTime" : 2001,
+          "endTime" : 2004
+        }
+      }, {
+        "id" : 8,
+        "value" : "brussels",
+        "properties" : {
+          "startTime" : 2004,
+          "endTime" : 2005
+        }
+      }, {
+        "id" : 9,
+        "value" : "santa fe",
+        "properties" : {
+          "startTime" : 2005
+        }
+      } ]
+    }
+  }, {
+    "id" : 7,
+    "label" : "person",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 1,
+        "value" : "stephen"
+      } ],
+      "location" : [ {
+        "id" : 10,
+        "value" : "centreville",
+        "properties" : {
+          "startTime" : 1990,
+          "endTime" : 2000
+        }
+      }, {
+        "id" : 11,
+        "value" : "dulles",
+        "properties" : {
+          "startTime" : 2000,
+          "endTime" : 2006
+        }
+      }, {
+        "id" : 12,
+        "value" : "purcellville",
+        "properties" : {
+          "startTime" : 2006
+        }
+      } ]
+    }
+  }, {
+    "id" : 8,
+    "label" : "person",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 2,
+        "value" : "matthias"
+      } ],
+      "location" : [ {
+        "id" : 13,
+        "value" : "bremen",
+        "properties" : {
+          "startTime" : 2004,
+          "endTime" : 2007
+        }
+      }, {
+        "id" : 14,
+        "value" : "baltimore",
+        "properties" : {
+          "startTime" : 2007,
+          "endTime" : 2011
+        }
+      }, {
+        "id" : 15,
+        "value" : "oakland",
+        "properties" : {
+          "startTime" : 2011,
+          "endTime" : 2014
+        }
+      }, {
+        "id" : 16,
+        "value" : "seattle",
+        "properties" : {
+          "startTime" : 2014
+        }
+      } ]
+    }
+  }, {
+    "id" : 9,
+    "label" : "person",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 3,
+        "value" : "daniel"
+      } ],
+      "location" : [ {
+        "id" : 17,
+        "value" : "spremberg",
+        "properties" : {
+          "startTime" : 1982,
+          "endTime" : 2005
+        }
+      }, {
+        "id" : 18,
+        "value" : "kaiserslautern",
+        "properties" : {
+          "startTime" : 2005,
+          "endTime" : 2009
+        }
+      }, {
+        "id" : 19,
+        "value" : "aachen",
+        "properties" : {
+          "startTime" : 2009
+        }
+      } ]
+    }
+  }, {
+    "id" : 10,
+    "label" : "software",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 4,
+        "value" : "gremlin"
+      } ]
+    }
+  }, {
+    "id" : 11,
+    "label" : "software",
+    "type" : "vertex",
+    "properties" : {
+      "name" : [ {
+        "id" : 5,
+        "value" : "tinkergraph"
+      } ]
+    }
+  } ],
+  "edges" : [ {
+    "id" : 13,
+    "label" : "develops",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 1,
+    "properties" : {
+      "since" : 2009
+    }
+  }, {
+    "id" : 14,
+    "label" : "develops",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 1,
+    "properties" : {
+      "since" : 2010
+    }
+  }, {
+    "id" : 15,
+    "label" : "uses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 1,
+    "properties" : {
+      "skill" : 4
+    }
+  }, {
+    "id" : 16,
+    "label" : "uses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 1,
+    "properties" : {
+      "skill" : 5
+    }
+  }, {
+    "id" : 17,
+    "label" : "develops",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 7,
+    "properties" : {
+      "since" : 2010
+    }
+  }, {
+    "id" : 18,
+    "label" : "develops",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 7,
+    "properties" : {
+      "since" : 2011
+    }
+  }, {
+    "id" : 19,
+    "label" : "uses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 7,
+    "properties" : {
+      "skill" : 5
+    }
+  }, {
+    "id" : 20,
+    "label" : "uses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 7,
+    "properties" : {
+      "skill" : 4
+    }
+  }, {
+    "id" : 21,
+    "label" : "develops",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 8,
+    "properties" : {
+      "since" : 2012
+    }
+  }, {
+    "id" : 22,
+    "label" : "uses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 8,
+    "properties" : {
+      "skill" : 3
+    }
+  }, {
+    "id" : 23,
+    "label" : "uses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 8,
+    "properties" : {
+      "skill" : 3
+    }
+  }, {
+    "id" : 24,
+    "label" : "uses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 9,
+    "properties" : {
+      "skill" : 5
+    }
+  }, {
+    "id" : 25,
+    "label" : "uses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 9,
+    "properties" : {
+      "skill" : 3
+    }
+  }, {
+    "id" : 26,
+    "label" : "traverses",
+    "type" : "edge",
+    "inVLabel" : "software",
+    "outVLabel" : "software",
+    "inV" : 11,
+    "outV" : 10
+  } ]
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v2d0-no-types.json
new file mode 100644
index 0000000..94ad061
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v2d0-no-types.json
@@ -0,0 +1,352 @@
+{
+  "vertices" : [ {
+    "id" : 1,
+    "label" : "person",
+    "properties" : {
+      "name" : [ {
+        "id" : 0,
+        "value" : "marko",
+        "label" : "name"
+      } ],
+      "location" : [ {
+        "id" : 6,
+        "value" : "san diego",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 1997,
+          "endTime" : 2001
+        }
+      }, {
+        "id" : 7,
+        "value" : "santa cruz",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2001,
+          "endTime" : 2004
+        }
+      }, {
+        "id" : 8,
+        "value" : "brussels",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2004,
+          "endTime" : 2005
+        }
+      }, {
+        "id" : 9,
+        "value" : "santa fe",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2005
+        }
+      } ]
+    }
+  }, {
+    "id" : 7,
+    "label" : "person",
+    "properties" : {
+      "name" : [ {
+        "id" : 1,
+        "value" : "stephen",
+        "label" : "name"
+      } ],
+      "location" : [ {
+        "id" : 10,
+        "value" : "centreville",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 1990,
+          "endTime" : 2000
+        }
+      }, {
+        "id" : 11,
+        "value" : "dulles",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2000,
+          "endTime" : 2006
+        }
+      }, {
+        "id" : 12,
+        "value" : "purcellville",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2006
+        }
+      } ]
+    }
+  }, {
+    "id" : 8,
+    "label" : "person",
+    "properties" : {
+      "name" : [ {
+        "id" : 2,
+        "value" : "matthias",
+        "label" : "name"
+      } ],
+      "location" : [ {
+        "id" : 13,
+        "value" : "bremen",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2004,
+          "endTime" : 2007
+        }
+      }, {
+        "id" : 14,
+        "value" : "baltimore",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2007,
+          "endTime" : 2011
+        }
+      }, {
+        "id" : 15,
+        "value" : "oakland",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2011,
+          "endTime" : 2014
+        }
+      }, {
+        "id" : 16,
+        "value" : "seattle",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2014
+        }
+      } ]
+    }
+  }, {
+    "id" : 9,
+    "label" : "person",
+    "properties" : {
+      "name" : [ {
+        "id" : 3,
+        "value" : "daniel",
+        "label" : "name"
+      } ],
+      "location" : [ {
+        "id" : 17,
+        "value" : "spremberg",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 1982,
+          "endTime" : 2005
+        }
+      }, {
+        "id" : 18,
+        "value" : "kaiserslautern",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2005,
+          "endTime" : 2009
+        }
+      }, {
+        "id" : 19,
+        "value" : "aachen",
+        "label" : "location",
+        "properties" : {
+          "startTime" : 2009
+        }
+      } ]
+    }
+  }, {
+    "id" : 10,
+    "label" : "software",
+    "properties" : {
+      "name" : [ {
+        "id" : 4,
+        "value" : "gremlin",
+        "label" : "name"
+      } ]
+    }
+  }, {
+    "id" : 11,
+    "label" : "software",
+    "properties" : {
+      "name" : [ {
+        "id" : 5,
+        "value" : "tinkergraph",
+        "label" : "name"
+      } ]
+    }
+  } ],
+  "edges" : [ {
+    "id" : 13,
+    "label" : "develops",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 1,
+    "properties" : {
+      "since" : {
+        "key" : "since",
+        "value" : 2009
+      }
+    }
+  }, {
+    "id" : 14,
+    "label" : "develops",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 1,
+    "properties" : {
+      "since" : {
+        "key" : "since",
+        "value" : 2010
+      }
+    }
+  }, {
+    "id" : 15,
+    "label" : "uses",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 1,
+    "properties" : {
+      "skill" : {
+        "key" : "skill",
+        "value" : 4
+      }
+    }
+  }, {
+    "id" : 16,
+    "label" : "uses",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 1,
+    "properties" : {
+      "skill" : {
+        "key" : "skill",
+        "value" : 5
+      }
+    }
+  }, {
+    "id" : 17,
+    "label" : "develops",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 7,
+    "properties" : {
+      "since" : {
+        "key" : "since",
+        "value" : 2010
+      }
+    }
+  }, {
+    "id" : 18,
+    "label" : "develops",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 7,
+    "properties" : {
+      "since" : {
+        "key" : "since",
+        "value" : 2011
+      }
+    }
+  }, {
+    "id" : 19,
+    "label" : "uses",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 7,
+    "properties" : {
+      "skill" : {
+        "key" : "skill",
+        "value" : 5
+      }
+    }
+  }, {
+    "id" : 20,
+    "label" : "uses",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 7,
+    "properties" : {
+      "skill" : {
+        "key" : "skill",
+        "value" : 4
+      }
+    }
+  }, {
+    "id" : 21,
+    "label" : "develops",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 8,
+    "properties" : {
+      "since" : {
+        "key" : "since",
+        "value" : 2012
+      }
+    }
+  }, {
+    "id" : 22,
+    "label" : "uses",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 8,
+    "properties" : {
+      "skill" : {
+        "key" : "skill",
+        "value" : 3
+      }
+    }
+  }, {
+    "id" : 23,
+    "label" : "uses",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 8,
+    "properties" : {
+      "skill" : {
+        "key" : "skill",
+        "value" : 3
+      }
+    }
+  }, {
+    "id" : 24,
+    "label" : "uses",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 10,
+    "outV" : 9,
+    "properties" : {
+      "skill" : {
+        "key" : "skill",
+        "value" : 5
+      }
+    }
+  }, {
+    "id" : 25,
+    "label" : "uses",
+    "inVLabel" : "software",
+    "outVLabel" : "person",
+    "inV" : 11,
+    "outV" : 9,
+    "properties" : {
+      "skill" : {
+        "key" : "skill",
+        "value" : 3
+      }
+    }
+  }, {
+    "id" : 26,
+    "label" : "traverses",
+    "inVLabel" : "software",
+    "outVLabel" : "software",
+    "inV" : 11,
+    "outV" : 10
+  } ]
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v2d0-partial.json
new file mode 100644
index 0000000..24e95ed
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v2d0-partial.json
@@ -0,0 +1,829 @@
+{
+  "@type" : "tinker:graph",
+  "@value" : {
+    "vertices" : [ {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 0
+              },
+              "value" : "marko",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 6
+              },
+              "value" : "san diego",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1997
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 7
+              },
+              "value" : "santa cruz",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 8
+              },
+              "value" : "brussels",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 9
+              },
+              "value" : "santa fe",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 1
+              },
+              "value" : "stephen",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 10
+              },
+              "value" : "centreville",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1990
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2000
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 11
+              },
+              "value" : "dulles",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2000
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2006
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 12
+              },
+              "value" : "purcellville",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2006
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 8
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 2
+              },
+              "value" : "matthias",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 13
+              },
+              "value" : "bremen",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2007
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 14
+              },
+              "value" : "baltimore",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2007
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2011
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 15
+              },
+              "value" : "oakland",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2011
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2014
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 16
+              },
+              "value" : "seattle",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2014
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 9
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 3
+              },
+              "value" : "daniel",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 17
+              },
+              "value" : "spremberg",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1982
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 18
+              },
+              "value" : "kaiserslautern",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2009
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 19
+              },
+              "value" : "aachen",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2009
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "label" : "software",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 4
+              },
+              "value" : "gremlin",
+              "label" : "name"
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "label" : "software",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 5
+              },
+              "value" : "tinkergraph",
+              "label" : "name"
+            }
+          } ]
+        }
+      }
+    } ],
+    "edges" : [ {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 13
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2009
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 14
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2010
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 15
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 4
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 16
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 5
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 17
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2010
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 18
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2011
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 19
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 5
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 20
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 4
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 21
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 8
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2012
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 22
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 8
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 3
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 23
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 8
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 3
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 24
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 9
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 5
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 25
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 9
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 3
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 26
+        },
+        "label" : "traverses",
+        "inVLabel" : "software",
+        "outVLabel" : "software",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        }
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v3d0.json
new file mode 100644
index 0000000..24e95ed
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/tinkergraph-v3d0.json
@@ -0,0 +1,829 @@
+{
+  "@type" : "tinker:graph",
+  "@value" : {
+    "vertices" : [ {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 0
+              },
+              "value" : "marko",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 6
+              },
+              "value" : "san diego",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1997
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 7
+              },
+              "value" : "santa cruz",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 8
+              },
+              "value" : "brussels",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 9
+              },
+              "value" : "santa fe",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 1
+              },
+              "value" : "stephen",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 10
+              },
+              "value" : "centreville",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1990
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2000
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 11
+              },
+              "value" : "dulles",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2000
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2006
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 12
+              },
+              "value" : "purcellville",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2006
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 8
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 2
+              },
+              "value" : "matthias",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 13
+              },
+              "value" : "bremen",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2007
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 14
+              },
+              "value" : "baltimore",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2007
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2011
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 15
+              },
+              "value" : "oakland",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2011
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2014
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 16
+              },
+              "value" : "seattle",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2014
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 9
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 3
+              },
+              "value" : "daniel",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 17
+              },
+              "value" : "spremberg",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1982
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 18
+              },
+              "value" : "kaiserslautern",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2009
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 19
+              },
+              "value" : "aachen",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2009
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "label" : "software",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 4
+              },
+              "value" : "gremlin",
+              "label" : "name"
+            }
+          } ]
+        }
+      }
+    }, {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "label" : "software",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 5
+              },
+              "value" : "tinkergraph",
+              "label" : "name"
+            }
+          } ]
+        }
+      }
+    } ],
+    "edges" : [ {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 13
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2009
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 14
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2010
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 15
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 4
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 16
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 5
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 17
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2010
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 18
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2011
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 19
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 5
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 20
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 7
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 4
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 21
+        },
+        "label" : "develops",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 8
+        },
+        "properties" : {
+          "since" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "since",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 2012
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 22
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 8
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 3
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 23
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 8
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 3
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 24
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 9
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 5
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 25
+        },
+        "label" : "uses",
+        "inVLabel" : "software",
+        "outVLabel" : "person",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 9
+        },
+        "properties" : {
+          "skill" : {
+            "@type" : "g:Property",
+            "@value" : {
+              "key" : "skill",
+              "value" : {
+                "@type" : "g:Int32",
+                "@value" : 3
+              }
+            }
+          }
+        }
+      }
+    }, {
+      "@type" : "g:Edge",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 26
+        },
+        "label" : "traverses",
+        "inVLabel" : "software",
+        "outVLabel" : "software",
+        "inV" : {
+          "@type" : "g:Int32",
+          "@value" : 11
+        },
+        "outV" : {
+          "@type" : "g:Int32",
+          "@value" : 10
+        }
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traversalmetrics-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traversalmetrics-v2d0-partial.json
new file mode 100644
index 0000000..fdd18a4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traversalmetrics-v2d0-partial.json
@@ -0,0 +1,114 @@
+{
+  "@type" : "g:TraversalMetrics",
+  "@value" : {
+    "dur" : {
+      "@type" : "g:Double",
+      "@value" : 0.004
+    },
+    "metrics" : [ {
+      "@type" : "g:Metrics",
+      "@value" : {
+        "dur" : {
+          "@type" : "g:Double",
+          "@value" : 100.0
+        },
+        "counts" : {
+          "traverserCount" : {
+            "@type" : "g:Int64",
+            "@value" : 4
+          },
+          "elementCount" : {
+            "@type" : "g:Int64",
+            "@value" : 4
+          }
+        },
+        "name" : "TinkerGraphStep(vertex,[~label.eq(person)])",
+        "annotations" : {
+          "percentDur" : {
+            "@type" : "g:Double",
+            "@value" : 25.0
+          }
+        },
+        "id" : "7.0.0()"
+      }
+    }, {
+      "@type" : "g:Metrics",
+      "@value" : {
+        "dur" : {
+          "@type" : "g:Double",
+          "@value" : 100.0
+        },
+        "counts" : {
+          "traverserCount" : {
+            "@type" : "g:Int64",
+            "@value" : 13
+          },
+          "elementCount" : {
+            "@type" : "g:Int64",
+            "@value" : 13
+          }
+        },
+        "name" : "VertexStep(OUT,vertex)",
+        "annotations" : {
+          "percentDur" : {
+            "@type" : "g:Double",
+            "@value" : 25.0
+          }
+        },
+        "id" : "2.0.0()"
+      }
+    }, {
+      "@type" : "g:Metrics",
+      "@value" : {
+        "dur" : {
+          "@type" : "g:Double",
+          "@value" : 100.0
+        },
+        "counts" : {
+          "traverserCount" : {
+            "@type" : "g:Int64",
+            "@value" : 7
+          },
+          "elementCount" : {
+            "@type" : "g:Int64",
+            "@value" : 7
+          }
+        },
+        "name" : "VertexStep(OUT,vertex)",
+        "annotations" : {
+          "percentDur" : {
+            "@type" : "g:Double",
+            "@value" : 25.0
+          }
+        },
+        "id" : "3.0.0()"
+      }
+    }, {
+      "@type" : "g:Metrics",
+      "@value" : {
+        "dur" : {
+          "@type" : "g:Double",
+          "@value" : 100.0
+        },
+        "counts" : {
+          "traverserCount" : {
+            "@type" : "g:Int64",
+            "@value" : 1
+          },
+          "elementCount" : {
+            "@type" : "g:Int64",
+            "@value" : 1
+          }
+        },
+        "name" : "TreeStep",
+        "annotations" : {
+          "percentDur" : {
+            "@type" : "g:Double",
+            "@value" : 25.0
+          }
+        },
+        "id" : "4.0.0()"
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traversalmetrics-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traversalmetrics-v3d0.json
new file mode 100644
index 0000000..46f7636
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traversalmetrics-v3d0.json
@@ -0,0 +1,109 @@
+{
+  "@type" : "g:TraversalMetrics",
+  "@value" : {
+    "@type" : "g:Map",
+    "@value" : [ "dur", {
+      "@type" : "g:Double",
+      "@value" : 0.004
+    }, "metrics", {
+      "@type" : "g:List",
+      "@value" : [ {
+        "@type" : "g:Metrics",
+        "@value" : {
+          "@type" : "g:Map",
+          "@value" : [ "dur", {
+            "@type" : "g:Double",
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 4
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 4
+            } ]
+          }, "name", "TinkerGraphStep(vertex,[~label.eq(person)])", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "7.0.0()" ]
+        }
+      }, {
+        "@type" : "g:Metrics",
+        "@value" : {
+          "@type" : "g:Map",
+          "@value" : [ "dur", {
+            "@type" : "g:Double",
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 13
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 13
+            } ]
+          }, "name", "VertexStep(OUT,vertex)", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "2.0.0()" ]
+        }
+      }, {
+        "@type" : "g:Metrics",
+        "@value" : {
+          "@type" : "g:Map",
+          "@value" : [ "dur", {
+            "@type" : "g:Double",
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 7
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 7
+            } ]
+          }, "name", "VertexStep(OUT,vertex)", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "3.0.0()" ]
+        }
+      }, {
+        "@type" : "g:Metrics",
+        "@value" : {
+          "@type" : "g:Map",
+          "@value" : [ "dur", {
+            "@type" : "g:Double",
+            "@value" : 100.0
+          }, "counts", {
+            "@type" : "g:Map",
+            "@value" : [ "traverserCount", {
+              "@type" : "g:Int64",
+              "@value" : 1
+            }, "elementCount", {
+              "@type" : "g:Int64",
+              "@value" : 1
+            } ]
+          }, "name", "TreeStep", "annotations", {
+            "@type" : "g:Map",
+            "@value" : [ "percentDur", {
+              "@type" : "g:Double",
+              "@value" : 25.0
+            } ]
+          }, "id", "4.0.0()" ]
+        }
+      } ]
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traverser-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traverser-v2d0-partial.json
new file mode 100644
index 0000000..a59a29e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traverser-v2d0-partial.json
@@ -0,0 +1,109 @@
+{
+  "@type" : "g:Traverser",
+  "@value" : {
+    "bulk" : {
+      "@type" : "g:Int64",
+      "@value" : 1
+    },
+    "value" : {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 0
+              },
+              "value" : "marko",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 6
+              },
+              "value" : "san diego",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1997
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 7
+              },
+              "value" : "santa cruz",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 8
+              },
+              "value" : "brussels",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 9
+              },
+              "value" : "santa fe",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traverser-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traverser-v3d0.json
new file mode 100644
index 0000000..a59a29e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/traverser-v3d0.json
@@ -0,0 +1,109 @@
+{
+  "@type" : "g:Traverser",
+  "@value" : {
+    "bulk" : {
+      "@type" : "g:Int64",
+      "@value" : 1
+    },
+    "value" : {
+      "@type" : "g:Vertex",
+      "@value" : {
+        "id" : {
+          "@type" : "g:Int32",
+          "@value" : 1
+        },
+        "label" : "person",
+        "properties" : {
+          "name" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 0
+              },
+              "value" : "marko",
+              "label" : "name"
+            }
+          } ],
+          "location" : [ {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 6
+              },
+              "value" : "san diego",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 1997
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 7
+              },
+              "value" : "santa cruz",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2001
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 8
+              },
+              "value" : "brussels",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2004
+                },
+                "endTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          }, {
+            "@type" : "g:VertexProperty",
+            "@value" : {
+              "id" : {
+                "@type" : "g:Int64",
+                "@value" : 9
+              },
+              "value" : "santa fe",
+              "label" : "location",
+              "properties" : {
+                "startTime" : {
+                  "@type" : "g:Int32",
+                  "@value" : 2005
+                }
+              }
+            }
+          } ]
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v2d0-no-types.json
new file mode 100644
index 0000000..b36ff96
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v2d0-no-types.json
@@ -0,0 +1 @@
+"41d2e28a-20a4-4ab0-b379-d810dede3786"
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v2d0-partial.json
new file mode 100644
index 0000000..1cf09f0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:UUID",
+  "@value" : "41d2e28a-20a4-4ab0-b379-d810dede3786"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v3d0.json
new file mode 100644
index 0000000..1cf09f0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/uuid-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "g:UUID",
+  "@value" : "41d2e28a-20a4-4ab0-b379-d810dede3786"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v1d0.json
new file mode 100644
index 0000000..a885f58
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v1d0.json
@@ -0,0 +1,39 @@
+{
+  "id" : 1,
+  "label" : "person",
+  "type" : "vertex",
+  "properties" : {
+    "name" : [ {
+      "id" : 0,
+      "value" : "marko"
+    } ],
+    "location" : [ {
+      "id" : 6,
+      "value" : "san diego",
+      "properties" : {
+        "startTime" : 1997,
+        "endTime" : 2001
+      }
+    }, {
+      "id" : 7,
+      "value" : "santa cruz",
+      "properties" : {
+        "startTime" : 2001,
+        "endTime" : 2004
+      }
+    }, {
+      "id" : 8,
+      "value" : "brussels",
+      "properties" : {
+        "startTime" : 2004,
+        "endTime" : 2005
+      }
+    }, {
+      "id" : 9,
+      "value" : "santa fe",
+      "properties" : {
+        "startTime" : 2005
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v2d0-no-types.json
new file mode 100644
index 0000000..8e6155f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v2d0-no-types.json
@@ -0,0 +1,43 @@
+{
+  "id" : 1,
+  "label" : "person",
+  "properties" : {
+    "name" : [ {
+      "id" : 0,
+      "value" : "marko",
+      "label" : "name"
+    } ],
+    "location" : [ {
+      "id" : 6,
+      "value" : "san diego",
+      "label" : "location",
+      "properties" : {
+        "startTime" : 1997,
+        "endTime" : 2001
+      }
+    }, {
+      "id" : 7,
+      "value" : "santa cruz",
+      "label" : "location",
+      "properties" : {
+        "startTime" : 2001,
+        "endTime" : 2004
+      }
+    }, {
+      "id" : 8,
+      "value" : "brussels",
+      "label" : "location",
+      "properties" : {
+        "startTime" : 2004,
+        "endTime" : 2005
+      }
+    }, {
+      "id" : 9,
+      "value" : "santa fe",
+      "label" : "location",
+      "properties" : {
+        "startTime" : 2005
+      }
+    } ]
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v2d0-partial.json
new file mode 100644
index 0000000..f102230
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v2d0-partial.json
@@ -0,0 +1,100 @@
+{
+  "@type" : "g:Vertex",
+  "@value" : {
+    "id" : {
+      "@type" : "g:Int32",
+      "@value" : 1
+    },
+    "label" : "person",
+    "properties" : {
+      "name" : [ {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 0
+          },
+          "value" : "marko",
+          "label" : "name"
+        }
+      } ],
+      "location" : [ {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 6
+          },
+          "value" : "san diego",
+          "label" : "location",
+          "properties" : {
+            "startTime" : {
+              "@type" : "g:Int32",
+              "@value" : 1997
+            },
+            "endTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2001
+            }
+          }
+        }
+      }, {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 7
+          },
+          "value" : "santa cruz",
+          "label" : "location",
+          "properties" : {
+            "startTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2001
+            },
+            "endTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2004
+            }
+          }
+        }
+      }, {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 8
+          },
+          "value" : "brussels",
+          "label" : "location",
+          "properties" : {
+            "startTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2004
+            },
+            "endTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2005
+            }
+          }
+        }
+      }, {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 9
+          },
+          "value" : "santa fe",
+          "label" : "location",
+          "properties" : {
+            "startTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2005
+            }
+          }
+        }
+      } ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v3d0.json
new file mode 100644
index 0000000..f102230
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertex-v3d0.json
@@ -0,0 +1,100 @@
+{
+  "@type" : "g:Vertex",
+  "@value" : {
+    "id" : {
+      "@type" : "g:Int32",
+      "@value" : 1
+    },
+    "label" : "person",
+    "properties" : {
+      "name" : [ {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 0
+          },
+          "value" : "marko",
+          "label" : "name"
+        }
+      } ],
+      "location" : [ {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 6
+          },
+          "value" : "san diego",
+          "label" : "location",
+          "properties" : {
+            "startTime" : {
+              "@type" : "g:Int32",
+              "@value" : 1997
+            },
+            "endTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2001
+            }
+          }
+        }
+      }, {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 7
+          },
+          "value" : "santa cruz",
+          "label" : "location",
+          "properties" : {
+            "startTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2001
+            },
+            "endTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2004
+            }
+          }
+        }
+      }, {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 8
+          },
+          "value" : "brussels",
+          "label" : "location",
+          "properties" : {
+            "startTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2004
+            },
+            "endTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2005
+            }
+          }
+        }
+      }, {
+        "@type" : "g:VertexProperty",
+        "@value" : {
+          "id" : {
+            "@type" : "g:Int64",
+            "@value" : 9
+          },
+          "value" : "santa fe",
+          "label" : "location",
+          "properties" : {
+            "startTime" : {
+              "@type" : "g:Int32",
+              "@value" : 2005
+            }
+          }
+        }
+      } ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v1d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v1d0.json
new file mode 100644
index 0000000..74025a8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v1d0.json
@@ -0,0 +1,5 @@
+{
+  "id" : 0,
+  "value" : "marko",
+  "label" : "name"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v2d0-no-types.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v2d0-no-types.json
new file mode 100644
index 0000000..74025a8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v2d0-no-types.json
@@ -0,0 +1,5 @@
+{
+  "id" : 0,
+  "value" : "marko",
+  "label" : "name"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v2d0-partial.json
new file mode 100644
index 0000000..af184b1
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v2d0-partial.json
@@ -0,0 +1,11 @@
+{
+  "@type" : "g:VertexProperty",
+  "@value" : {
+    "id" : {
+      "@type" : "g:Int64",
+      "@value" : 0
+    },
+    "value" : "marko",
+    "label" : "name"
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v3d0.json
new file mode 100644
index 0000000..af184b1
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/vertexproperty-v3d0.json
@@ -0,0 +1,11 @@
+{
+  "@type" : "g:VertexProperty",
+  "@value" : {
+    "id" : {
+      "@type" : "g:Int64",
+      "@value" : 0
+    },
+    "value" : "marko",
+    "label" : "name"
+  }
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/year-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/year-v2d0-partial.json
new file mode 100644
index 0000000..ff420bc
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/year-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Year",
+  "@value" : "2016"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/year-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/year-v3d0.json
new file mode 100644
index 0000000..ff420bc
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/year-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:Year",
+  "@value" : "2016"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/yearmonth-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/yearmonth-v2d0-partial.json
new file mode 100644
index 0000000..98a5e27
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/yearmonth-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:YearMonth",
+  "@value" : "2016-06"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/yearmonth-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/yearmonth-v3d0.json
new file mode 100644
index 0000000..98a5e27
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/yearmonth-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:YearMonth",
+  "@value" : "2016-06"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneddatetime-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneddatetime-v2d0-partial.json
new file mode 100644
index 0000000..367fc47
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneddatetime-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:ZonedDateTime",
+  "@value" : "2016-12-23T12:12:24.000000036+02:00[GMT+02:00]"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneddatetime-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneddatetime-v3d0.json
new file mode 100644
index 0000000..367fc47
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneddatetime-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:ZonedDateTime",
+  "@value" : "2016-12-23T12:12:24.000000036+02:00[GMT+02:00]"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneoffset-v2d0-partial.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneoffset-v2d0-partial.json
new file mode 100644
index 0000000..8591794
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneoffset-v2d0-partial.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:ZoneOffset",
+  "@value" : "+03:06:09"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneoffset-v3d0.json b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneoffset-v3d0.json
new file mode 100644
index 0000000..8591794
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/_3_6_0/zoneoffset-v3d0.json
@@ -0,0 +1,4 @@
+{
+  "@type" : "gx:ZoneOffset",
+  "@value" : "+03:06:09"
+}
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/authenticationchallenge-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/authenticationchallenge-v3d0.kryo
new file mode 100644
index 0000000..baf91ac
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/authenticationchallenge-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/authenticationresponse-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/authenticationresponse-v3d0.kryo
new file mode 100644
index 0000000..1f99f2a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/authenticationresponse-v3d0.kryo
@@ -0,0 +1 @@
+Ëh%x’D™ž¼\j§<S—authenticatioîsaslMechanisíPLAIÎsasìAHN0ZXBocGhlbgBwYXNzd29yZA=½
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/barrier-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/barrier-v1d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/barrier-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/barrier-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/barrier-v3d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/barrier-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bigdecimal-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bigdecimal-v1d0.kryo
new file mode 100644
index 0000000..d4f40e0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bigdecimal-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bigdecimal-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bigdecimal-v3d0.kryo
new file mode 100644
index 0000000..d4f40e0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bigdecimal-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/biginteger-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/biginteger-v1d0.kryo
new file mode 100644
index 0000000..f424ac6
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/biginteger-v1d0.kryo
@@ -0,0 +1 @@
+ÆãÂýтZÏ}Dvú±
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/biginteger-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/biginteger-v3d0.kryo
new file mode 100644
index 0000000..f424ac6
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/biginteger-v3d0.kryo
@@ -0,0 +1 @@
+ÆãÂýтZÏ}Dvú±
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/binding-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/binding-v1d0.kryo
new file mode 100644
index 0000000..103143b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/binding-v1d0.kryo
@@ -0,0 +1 @@
+‚x
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/binding-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/binding-v3d0.kryo
new file mode 100644
index 0000000..103143b
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/binding-v3d0.kryo
@@ -0,0 +1 @@
+‚x
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bulkset-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bulkset-v1d0.kryo
new file mode 100644
index 0000000..5fda27a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bulkset-v1d0.kryo
@@ -0,0 +1 @@
+markïjosè
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bulkset-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bulkset-v3d0.kryo
new file mode 100644
index 0000000..5fda27a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bulkset-v3d0.kryo
@@ -0,0 +1 @@
+markïjosè
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/byte-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/byte-v1d0.kryo
new file mode 100644
index 0000000..6b2aaa7
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/byte-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/byte-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/byte-v3d0.kryo
new file mode 100644
index 0000000..6b2aaa7
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/byte-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytebuffer-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytebuffer-v1d0.kryo
new file mode 100644
index 0000000..ba94b5d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytebuffer-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytebuffer-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytebuffer-v3d0.kryo
new file mode 100644
index 0000000..ba94b5d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytebuffer-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytecode-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytecode-v1d0.kryo
new file mode 100644
index 0000000..edf8dd4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytecode-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytecode-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytecode-v3d0.kryo
new file mode 100644
index 0000000..edf8dd4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/bytecode-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/cardinality-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/cardinality-v1d0.kryo
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/cardinality-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/cardinality-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/cardinality-v3d0.kryo
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/cardinality-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/char-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/char-v1d0.kryo
new file mode 100644
index 0000000..718882c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/char-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/char-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/char-v3d0.kryo
new file mode 100644
index 0000000..718882c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/char-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/class-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/class-v1d0.kryo
new file mode 100644
index 0000000..e8b65af
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/class-v1d0.kryo
@@ -0,0 +1 @@
+java.io.Filå
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/class-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/class-v3d0.kryo
new file mode 100644
index 0000000..e8b65af
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/class-v3d0.kryo
@@ -0,0 +1 @@
+java.io.Filå
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/column-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/column-v1d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/column-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/column-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/column-v3d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/column-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/date-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/date-v1d0.kryo
new file mode 100644
index 0000000..a86f98f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/date-v1d0.kryo
@@ -0,0 +1 @@
+‡·¿ù+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/date-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/date-v3d0.kryo
new file mode 100644
index 0000000..a86f98f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/date-v3d0.kryo
@@ -0,0 +1 @@
+‡·¿ù+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/direction-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/direction-v1d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/direction-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/direction-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/direction-v3d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/direction-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/double-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/double-v1d0.kryo
new file mode 100644
index 0000000..36506ac
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/double-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/double-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/double-v3d0.kryo
new file mode 100644
index 0000000..36506ac
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/double-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/duration-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/duration-v1d0.kryo
new file mode 100644
index 0000000..d640ae0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/duration-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/duration-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/duration-v3d0.kryo
new file mode 100644
index 0000000..d640ae0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/duration-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/edge-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/edge-v1d0.kryo
new file mode 100644
index 0000000..d2a2492
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/edge-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/edge-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/edge-v3d0.kryo
new file mode 100644
index 0000000..6dfbefb
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/edge-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/float-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/float-v1d0.kryo
new file mode 100644
index 0000000..19a8865
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/float-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/float-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/float-v3d0.kryo
new file mode 100644
index 0000000..19a8865
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/float-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/inetaddress-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/inetaddress-v1d0.kryo
new file mode 100644
index 0000000..af797a5
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/inetaddress-v1d0.kryo
@@ -0,0 +1 @@
+localhosô
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/inetaddress-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/inetaddress-v3d0.kryo
new file mode 100644
index 0000000..af797a5
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/inetaddress-v3d0.kryo
@@ -0,0 +1 @@
+localhosô
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/instant-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/instant-v1d0.kryo
new file mode 100644
index 0000000..d9466cd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/instant-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/instant-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/instant-v3d0.kryo
new file mode 100644
index 0000000..d9466cd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/instant-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/integer-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/integer-v1d0.kryo
new file mode 100644
index 0000000..ff28336
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/integer-v1d0.kryo
@@ -0,0 +1 @@
+È
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/integer-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/integer-v3d0.kryo
new file mode 100644
index 0000000..ff28336
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/integer-v3d0.kryo
@@ -0,0 +1 @@
+È
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/lambda-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/lambda-v1d0.kryo
new file mode 100644
index 0000000..463661d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/lambda-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/lambda-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/lambda-v3d0.kryo
new file mode 100644
index 0000000..463661d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/lambda-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdate-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdate-v1d0.kryo
new file mode 100644
index 0000000..f82dd16
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdate-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdate-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdate-v3d0.kryo
new file mode 100644
index 0000000..f82dd16
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdate-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdatetime-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdatetime-v1d0.kryo
new file mode 100644
index 0000000..97eae64
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdatetime-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdatetime-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdatetime-v3d0.kryo
new file mode 100644
index 0000000..97eae64
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localdatetime-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localtime-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localtime-v1d0.kryo
new file mode 100644
index 0000000..1b5bfa4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localtime-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localtime-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localtime-v3d0.kryo
new file mode 100644
index 0000000..1b5bfa4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/localtime-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/long-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/long-v1d0.kryo
new file mode 100644
index 0000000..ff28336
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/long-v1d0.kryo
@@ -0,0 +1 @@
+È
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/long-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/long-v3d0.kryo
new file mode 100644
index 0000000..ff28336
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/long-v3d0.kryo
@@ -0,0 +1 @@
+È
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/metrics-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/metrics-v1d0.kryo
new file mode 100644
index 0000000..d94cd24
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/metrics-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/metrics-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/metrics-v3d0.kryo
new file mode 100644
index 0000000..f65dd63
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/metrics-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/monthday-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/monthday-v1d0.kryo
new file mode 100644
index 0000000..5acab8f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/monthday-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/monthday-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/monthday-v3d0.kryo
new file mode 100644
index 0000000..5acab8f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/monthday-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsetdatetime-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsetdatetime-v1d0.kryo
new file mode 100644
index 0000000..6bb92d0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsetdatetime-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsetdatetime-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsetdatetime-v3d0.kryo
new file mode 100644
index 0000000..6bb92d0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsetdatetime-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsettime-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsettime-v1d0.kryo
new file mode 100644
index 0000000..d1621aa
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsettime-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsettime-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsettime-v3d0.kryo
new file mode 100644
index 0000000..d1621aa
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/offsettime-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/operator-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/operator-v1d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/operator-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/operator-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/operator-v3d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/operator-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/order-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/order-v1d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/order-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/order-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/order-v3d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/order-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/p-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/p-v1d0.kryo
new file mode 100644
index 0000000..3c676a8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/p-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/p-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/p-v3d0.kryo
new file mode 100644
index 0000000..3c676a8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/p-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pand-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pand-v1d0.kryo
new file mode 100644
index 0000000..5477e40
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pand-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pand-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pand-v3d0.kryo
new file mode 100644
index 0000000..5477e40
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pand-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/path-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/path-v1d0.kryo
new file mode 100644
index 0000000..bac203d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/path-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/path-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/path-v3d0.kryo
new file mode 100644
index 0000000..bac203d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/path-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/period-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/period-v1d0.kryo
new file mode 100644
index 0000000..f04e9c8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/period-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/period-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/period-v3d0.kryo
new file mode 100644
index 0000000..f04e9c8
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/period-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pick-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pick-v1d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pick-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pick-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pick-v3d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pick-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pop-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pop-v1d0.kryo
new file mode 100644
index 0000000..c8c7811
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pop-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pop-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pop-v3d0.kryo
new file mode 100644
index 0000000..c8c7811
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pop-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/por-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/por-v1d0.kryo
new file mode 100644
index 0000000..8b8ebb4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/por-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/por-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/por-v3d0.kryo
new file mode 100644
index 0000000..8b8ebb4
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/por-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/property-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/property-v1d0.kryo
new file mode 100644
index 0000000..133ac6f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/property-v1d0.kryo
@@ -0,0 +1 @@
+sincå²
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/property-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/property-v3d0.kryo
new file mode 100644
index 0000000..a7d9c27
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/property-v3d0.kryo
@@ -0,0 +1 @@
+sincå²developó
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithin-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithin-v1d0.kryo
new file mode 100644
index 0000000..35dfe21
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithin-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithin-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithin-v3d0.kryo
new file mode 100644
index 0000000..35dfe21
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithin-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithout-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithout-v1d0.kryo
new file mode 100644
index 0000000..50f14cf
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithout-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithout-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithout-v3d0.kryo
new file mode 100644
index 0000000..50f14cf
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/pwithout-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/scope-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/scope-v1d0.kryo
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/scope-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/scope-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/scope-v3d0.kryo
new file mode 100644
index 0000000..71bd63e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/scope-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionclose-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionclose-v3d0.kryo
new file mode 100644
index 0000000..1bad6a1
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionclose-v3d0.kryo
@@ -0,0 +1 @@
+Ëh%x’D™ž¼\j§<S—sessioîclosåsessioîunique-session-identifieò
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessioneval-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessioneval-v3d0.kryo
new file mode 100644
index 0000000..f551b96
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessioneval-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionevalaliased-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionevalaliased-v3d0.kryo
new file mode 100644
index 0000000..8bb5889
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionevalaliased-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionlesseval-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionlesseval-v3d0.kryo
new file mode 100644
index 0000000..fd84e20
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionlesseval-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionlessevalaliased-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionlessevalaliased-v3d0.kryo
new file mode 100644
index 0000000..d3745be
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/sessionlessevalaliased-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/short-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/short-v1d0.kryo
new file mode 100644
index 0000000..6060b89
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/short-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/short-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/short-v3d0.kryo
new file mode 100644
index 0000000..6060b89
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/short-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/standardresult-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/standardresult-v3d0.kryo
new file mode 100644
index 0000000..06c5d8a
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/standardresult-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/stargraph-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/stargraph-v1d0.kryo
new file mode 100644
index 0000000..9947842
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/stargraph-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/stargraph-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/stargraph-v3d0.kryo
new file mode 100644
index 0000000..9947842
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/stargraph-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/t-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/t-v1d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/t-v1d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/t-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/t-v3d0.kryo
new file mode 100644
index 0000000..40fdece
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/t-v3d0.kryo
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/textp-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/textp-v1d0.kryo
new file mode 100644
index 0000000..d71eb0f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/textp-v1d0.kryo
@@ -0,0 +1 @@
+containinçarë
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/textp-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/textp-v3d0.kryo
new file mode 100644
index 0000000..d71eb0f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/textp-v3d0.kryo
@@ -0,0 +1 @@
+containinçarë
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/timestamp-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/timestamp-v1d0.kryo
new file mode 100644
index 0000000..a86f98f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/timestamp-v1d0.kryo
@@ -0,0 +1 @@
+‡·¿ù+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/timestamp-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/timestamp-v3d0.kryo
new file mode 100644
index 0000000..a86f98f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/timestamp-v3d0.kryo
@@ -0,0 +1 @@
+‡·¿ù+
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tinkergraph-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tinkergraph-v1d0.kryo
new file mode 100644
index 0000000..5789986
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tinkergraph-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tinkergraph-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tinkergraph-v3d0.kryo
new file mode 100644
index 0000000..5789986
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tinkergraph-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traversalmetrics-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traversalmetrics-v1d0.kryo
new file mode 100644
index 0000000..eef8b5f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traversalmetrics-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traversalmetrics-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traversalmetrics-v3d0.kryo
new file mode 100644
index 0000000..5ec44fd
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traversalmetrics-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traverser-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traverser-v1d0.kryo
new file mode 100644
index 0000000..cc019f0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traverser-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traverser-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traverser-v3d0.kryo
new file mode 100644
index 0000000..7c1fb0d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/traverser-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tree-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tree-v1d0.kryo
new file mode 100644
index 0000000..682529f
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tree-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tree-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tree-v3d0.kryo
new file mode 100644
index 0000000..d5a9dd9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/tree-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/uuid-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/uuid-v1d0.kryo
new file mode 100644
index 0000000..34fc35d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/uuid-v1d0.kryo
@@ -0,0 +1 @@
+AÒ⊠¤J°³yØÞÞ7†
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/uuid-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/uuid-v3d0.kryo
new file mode 100644
index 0000000..34fc35d
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/uuid-v3d0.kryo
@@ -0,0 +1 @@
+AÒ⊠¤J°³yØÞÞ7†
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertex-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertex-v1d0.kryo
new file mode 100644
index 0000000..c58ac46
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertex-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertex-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertex-v3d0.kryo
new file mode 100644
index 0000000..4464039
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertex-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertexproperty-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertexproperty-v1d0.kryo
new file mode 100644
index 0000000..3b74daa
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertexproperty-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertexproperty-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertexproperty-v3d0.kryo
new file mode 100644
index 0000000..95f8be0
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/vertexproperty-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/year-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/year-v1d0.kryo
new file mode 100644
index 0000000..2ec2ef9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/year-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/year-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/year-v3d0.kryo
new file mode 100644
index 0000000..2ec2ef9
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/year-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/yearmonth-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/yearmonth-v1d0.kryo
new file mode 100644
index 0000000..47e3a3e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/yearmonth-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/yearmonth-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/yearmonth-v3d0.kryo
new file mode 100644
index 0000000..47e3a3e
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/yearmonth-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneddatetime-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneddatetime-v1d0.kryo
new file mode 100644
index 0000000..3ebbce5
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneddatetime-v1d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneddatetime-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneddatetime-v3d0.kryo
new file mode 100644
index 0000000..3ebbce5
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneddatetime-v3d0.kryo
Binary files differ
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneoffset-v1d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneoffset-v1d0.kryo
new file mode 100644
index 0000000..4d34f9c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneoffset-v1d0.kryo
@@ -0,0 +1 @@
++03:06:0¹
\ No newline at end of file
diff --git a/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneoffset-v3d0.kryo b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneoffset-v3d0.kryo
new file mode 100644
index 0000000..4d34f9c
--- /dev/null
+++ b/gremlin-tools/gremlin-io-test/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/gryo/_3_6_0/zoneoffset-v3d0.kryo
@@ -0,0 +1 @@
++03:06:0¹
\ No newline at end of file
diff --git a/gremlin-tools/pom.xml b/gremlin-tools/pom.xml
index 06c85d1..8817046 100644
--- a/gremlin-tools/pom.xml
+++ b/gremlin-tools/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <artifactId>tinkerpop</artifactId>
         <groupId>org.apache.tinkerpop</groupId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>gremlin-tools</artifactId>
diff --git a/gremlint/package-lock.json b/gremlint/package-lock.json
index 933461f..808d9e3 100644
--- a/gremlint/package-lock.json
+++ b/gremlint/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "gremlint",
-  "version": "3.5.2-alpha1",
+  "version": "3.6.0-alpha1",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
diff --git a/gremlint/package.json b/gremlint/package.json
index 2a94497..0ed3af7 100644
--- a/gremlint/package.json
+++ b/gremlint/package.json
@@ -1,6 +1,6 @@
 {
   "name": "gremlint",
-  "version": "3.5.2-alpha1",
+  "version": "3.6.0-alpha1",
   "description": "Linter/code formatter for Gremlin",
   "main": "lib/index.js",
   "types": "lib/index.d.ts",
diff --git a/gremlint/pom.xml b/gremlint/pom.xml
index 231eea2..ee5c5d8 100644
--- a/gremlint/pom.xml
+++ b/gremlint/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>gremlint</artifactId>
     <name>Apache TinkerPop :: Gremlint</name>
diff --git a/hadoop-gremlin/pom.xml b/hadoop-gremlin/pom.xml
index 6f49dcc..64bb79e 100644
--- a/hadoop-gremlin/pom.xml
+++ b/hadoop-gremlin/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>hadoop-gremlin</artifactId>
     <name>Apache TinkerPop :: Hadoop Gremlin</name>
@@ -52,26 +52,6 @@
             <version>${hadoop.version}</version>
             <exclusions>
                 <exclusion>
-                    <groupId>log4j</groupId>
-                    <artifactId>log4j</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-log4j12</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>commons-codec</groupId>
-                    <artifactId>commons-codec</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.commons</groupId>
-                    <artifactId>commons-compress</artifactId>
-                </exclusion>
-                <exclusion>
                     <groupId>com.google.guava</groupId>
                     <artifactId>guava</artifactId>
                 </exclusion>
@@ -80,97 +60,79 @@
                     <artifactId>commons-logging</artifactId>
                 </exclusion>
                 <exclusion>
-                    <groupId>commons-io</groupId>
-                    <artifactId>commons-io</artifactId>
+                    <groupId>com.nimbusds</groupId>
+                    <artifactId>nimbus-jose-jwt</artifactId>
                 </exclusion>
                 <exclusion>
-                    <groupId>org.codehaus.jackson</groupId>
-                    <artifactId>jackson-mapper-asl</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.codehaus.jackson</groupId>
-                    <artifactId>jackson-core-asl</artifactId>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-databind</artifactId>
                 </exclusion>
                 <exclusion>
                     <groupId>org.xerial.snappy</groupId>
                     <artifactId>snappy-java</artifactId>
                 </exclusion>
                 <exclusion>
-                    <groupId>javax.servlet</groupId>
-                    <artifactId>servlet-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>commons-lang</groupId>
-                    <artifactId>commons-lang</artifactId>
-                </exclusion>
-                <exclusion>
                     <groupId>org.apache.commons</groupId>
                     <artifactId>commons-compress</artifactId>
                 </exclusion>
-                <!--
-                spark 3.0/scala 2.12 uses paranamer 2.8 and hadoop is stuck with an older version. without 2.8 you get
-                SPARK-14220
-                -->
+                <exclusion>
+                    <groupId>org.codehaus.woodstox</groupId>
+                    <artifactId>stax2-api</artifactId>
+                </exclusion>
+                <!-- align paranamer with expected spark-gremlin version - using 2.3 from hadoop via avro breaks spark
+                     execution given incompatibilities with java 8 -->
                 <exclusion>
                     <groupId>com.thoughtworks.paranamer</groupId>
                     <artifactId>paranamer</artifactId>
                 </exclusion>
             </exclusions>
-            <!--<scope>provided</scope>-->
         </dependency>
-        <!-- consistent dependencies -->
+        <!-- hadoop-client conflict resolution -->
         <dependency>
             <groupId>com.thoughtworks.paranamer</groupId>
             <artifactId>paranamer</artifactId>
             <version>2.8</version>
         </dependency>
         <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
+            <groupId>org.codehaus.woodstox</groupId>
+            <artifactId>stax2-api</artifactId>
+            <version>4.2.1</version>
         </dependency>
         <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.6</version>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.19</version>
         </dependency>
         <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
+            <groupId>org.xerial.snappy</groupId>
+            <artifactId>snappy-java</artifactId>
+            <version>1.1.8.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.10.5.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.nimbusds</groupId>
+            <artifactId>nimbus-jose-jwt</artifactId>
+            <version>9.8.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>27.0-jre</version>
         </dependency>
         <dependency>
             <groupId>commons-logging</groupId>
             <artifactId>commons-logging</artifactId>
             <version>1.2</version>
         </dependency>
+        <!-- log4j is required by hadoop -->
         <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>16.0.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-mapper-asl</artifactId>
-            <version>1.9.13</version>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-core-asl</artifactId>
-            <version>1.9.13</version>
-        </dependency>
-        <dependency>
-            <groupId>org.xerial.snappy</groupId>
-            <artifactId>snappy-java</artifactId>
-            <version>1.1.1.7</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>3.1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-compress</artifactId>
-            <version>1.19</version>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
         </dependency>
         <!-- TEST -->
         <dependency>
@@ -186,8 +148,20 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+            <version>4.2.3</version>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
index f4722ea..5cfacf7 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
@@ -35,14 +35,20 @@
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.AbortiveMultiIterator;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Optional;
+import java.util.Spliterator;
+import java.util.Spliterators;
 import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -50,6 +56,8 @@
 @Graph.OptIn(Graph.OptIn.SUITE_STRUCTURE_STANDARD)
 @Graph.OptIn(Graph.OptIn.SUITE_PROCESS_STANDARD)
 @Graph.OptIn(Graph.OptIn.SUITE_PROCESS_COMPUTER)
+@Graph.OptIn(Graph.OptIn.SUITE_PROCESS_LIMITED_STANDARD)
+@Graph.OptIn(Graph.OptIn.SUITE_PROCESS_LIMITED_COMPUTER)
 @Graph.OptOut(
         test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$Traversals",
         method = "g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX",
@@ -138,11 +146,6 @@
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.",
         computers = {"ALL"})
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$GreedyMatchTraversals",
-        method = "g_V_matchXa_followedBy_count_isXgtX10XX_b__a_0followedBy_count_isXgtX10XX_bX_count",
-        reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.",
-        computers = {"ALL"})
-@Graph.OptOut(
         test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ReadTest$Traversals",
         method = "g_io_readXxmlX",
         reason = "Hadoop-Gremlin does not support reads/writes with GraphML.")
@@ -257,22 +260,18 @@
             if (0 == vertexIds.length) {
                 return new HadoopVertexIterator(this);
             } else {
-                // base the conversion function on the first item in the id list as the expectation is that these
-                // id values will be a uniform list
-                if (vertexIds[0] instanceof Vertex) {
-                    // based on the first item assume all vertices in the argument list
-                    if (!Stream.of(vertexIds).allMatch(id -> id instanceof Vertex))
-                        throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();
+                final Stream<Vertex> idsThatWereVertices = Stream.of(vertexIds).
+                        filter(id -> id instanceof Vertex).map(id -> (Vertex) id);
+                final Stream<Vertex> verticesFromHadoopGraph = StreamSupport.stream(Spliterators.spliteratorUnknownSize(
+                        IteratorUtils.filter(new HadoopVertexIterator(this),
+                                vertex -> ElementHelper.idExists(vertex.id(), vertexIds)), Spliterator.ORDERED), false);
 
-                    // no need to get the vertices again, so just flip it back - some implementation may want to treat this
-                    // as a refresh operation. that's not necessary for hadoopgraph.
-                    return Stream.of(vertexIds).map(id -> (Vertex) id).iterator();
-                } else {
-                    final Class<?> firstClass = vertexIds[0].getClass();
-                    if (!Stream.of(vertexIds).map(Object::getClass).allMatch(firstClass::equals))
-                        throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();     // todo: change exception to be ids of the same type
-                    return IteratorUtils.filter(new HadoopVertexIterator(this), vertex -> ElementHelper.idExists(vertex.id(), vertexIds));
-                }
+                // if the vertexIds are all Vertex objects then abort the iteration of the full HadoopGraph as there
+                // is no need to refresh the data in this use case as other graphs might
+                final AbortiveMultiIterator<Vertex> iterator = new AbortiveMultiIterator<>();
+                iterator.addIterator(idsThatWereVertices.iterator());
+                iterator.addIterator(verticesFromHadoopGraph.iterator(), c -> c != vertexIds.length);
+                return iterator;
             }
         } catch (final IOException e) {
             throw new IllegalStateException(e.getMessage(), e);
@@ -285,22 +284,18 @@
             if (0 == edgeIds.length) {
                 return new HadoopEdgeIterator(this);
             } else {
-                // base the conversion function on the first item in the id list as the expectation is that these
-                // id values will be a uniform list
-                if (edgeIds[0] instanceof Edge) {
-                    // based on the first item assume all Edges in the argument list
-                    if (!Stream.of(edgeIds).allMatch(id -> id instanceof Edge))
-                        throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();
+                final Stream<Edge> idsThatWereEdges = Stream.of(edgeIds).
+                        filter(id -> id instanceof Edge).map(id -> (Edge) id);
+                final Stream<Edge> edgesFromHadoopGraph = StreamSupport.stream(Spliterators.spliteratorUnknownSize(
+                        IteratorUtils.filter(new HadoopEdgeIterator(this),
+                                edge -> ElementHelper.idExists(edge.id(), edgeIds)), Spliterator.ORDERED), false);
 
-                    // no need to get the vertices again, so just flip it back - some implementation may want to treat this
-                    // as a refresh operation. that's not necessary for hadoopgraph.
-                    return Stream.of(edgeIds).map(id -> (Edge) id).iterator();
-                } else {
-                    final Class<?> firstClass = edgeIds[0].getClass();
-                    if (!Stream.of(edgeIds).map(Object::getClass).allMatch(firstClass::equals))
-                        throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();     // todo: change exception to be ids of the same type
-                    return IteratorUtils.filter(new HadoopEdgeIterator(this), vertex -> ElementHelper.idExists(vertex.id(), edgeIds));
-                }
+                // if the edgeIds are all Edge objects then abort the iteration of the full HadoopGraph as there
+                // is no need to refresh the data in this use case as other graphs might
+                final AbortiveMultiIterator<Edge> iterator = new AbortiveMultiIterator<>();
+                iterator.addIterator(idsThatWereEdges.iterator());
+                iterator.addIterator(edgesFromHadoopGraph.iterator(), c -> c != edgeIds.length);
+                return iterator;
             }
         } catch (final IOException e) {
             throw new IllegalStateException(e.getMessage(), e);
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/HadoopGraphFeatureIntegrateTest.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/HadoopGraphFeatureIntegrateTest.java
new file mode 100644
index 0000000..a6f5450
--- /dev/null
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/HadoopGraphFeatureIntegrateTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.hadoop;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Stage;
+import io.cucumber.guice.CucumberModules;
+import io.cucumber.guice.GuiceFactory;
+import io.cucumber.guice.InjectorSource;
+import io.cucumber.java.Scenario;
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.apache.commons.configuration2.MapConfiguration;
+import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
+import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat;
+import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.javatuples.Pair;
+import org.junit.AssumptionViolatedException;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(
+        tags = "not @RemoteOnly and not @GraphComputerOnly",
+        glue = { "org.apache.tinkerpop.gremlin.features" },
+        objectFactory = GuiceFactory.class,
+        features = { "../gremlin-test/features" },
+        plugin = {"pretty", "junit:target/cucumber.xml"})
+public class HadoopGraphFeatureIntegrateTest {
+    private static final String skipReasonLength = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.";
+
+    private static final List<Pair<String, String>> skip = new ArrayList<Pair<String,String>>() {{
+       add(Pair.with("g_V_both_both_count", skipReasonLength));
+        add(Pair.with("g_V_repeatXoutX_timesX3X_count", skipReasonLength));
+        add(Pair.with("g_V_repeatXoutX_timesX8X_count", skipReasonLength));
+        add(Pair.with("g_V_repeatXoutX_timesX5X_asXaX_outXwrittenByX_asXbX_selectXa_bX_count", skipReasonLength));
+        add(Pair.with("g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX", skipReasonLength));
+        add(Pair.with("g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX", skipReasonLength));
+        add(Pair.with("g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX", skipReasonLength));
+        add(Pair.with("g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX", skipReasonLength));
+        add(Pair.with("g_V_hasLabelXsongX_groupXaX_byXnameX_byXproperties_groupCount_byXlabelXX_out_capXaX", skipReasonLength));
+        add(Pair.with("g_V_outXfollowedByX_group_byXsongTypeX_byXbothE_group_byXlabelX_byXweight_sumXX", skipReasonLength));
+        add(Pair.with("g_V_repeatXbothXfollowedByXX_timesX2X_group_byXsongTypeX_byXcountX", skipReasonLength));
+        add(Pair.with("g_V_repeatXbothXfollowedByXX_timesX2X_groupXaX_byXsongTypeX_byXcountX_capXaX", skipReasonLength));
+        add(Pair.with("g_V_matchXa_followedBy_count_isXgtX10XX_b__a_0followedBy_count_isXgtX10XX_bX_count", skipReasonLength));
+    }};
+
+    public static final class ServiceModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            bind(World.class).to(HadoopGraphWorld.class);
+        }
+    }
+
+    public static class HadoopGraphWorld implements World {
+
+        private static final HadoopGraph modern = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.MODERN)));
+        private static final HadoopGraph classic = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.CLASSIC)));
+        private static final HadoopGraph crew = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.CREW)));
+        private static final HadoopGraph sink = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.SINK)));
+        private static final HadoopGraph grateful = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.GRATEFUL)));
+
+        static {
+            readIntoGraph(modern, GraphData.MODERN);
+            readIntoGraph(classic, GraphData.CLASSIC);
+            readIntoGraph(crew, GraphData.CREW);
+            readIntoGraph(sink, GraphData.SINK);
+            readIntoGraph(grateful, GraphData.GRATEFUL);
+        }
+
+        @Override
+        public GraphTraversalSource getGraphTraversalSource(final GraphData graphData) {
+            if (null == graphData)
+                throw new AssumptionViolatedException("HadoopGraph does not support graph mutations");
+            else if (graphData == GraphData.CLASSIC)
+                return classic.traversal();
+            else if (graphData == GraphData.CREW)
+                return crew.traversal();
+            else if (graphData == GraphData.MODERN)
+                return modern.traversal();
+            else if (graphData == GraphData.SINK)
+                return sink.traversal();
+            else if (graphData == GraphData.GRATEFUL)
+                return grateful.traversal();
+            else
+                throw new UnsupportedOperationException("GraphData not supported: " + graphData.name());
+        }
+
+        @Override
+        public void beforeEachScenario(final Scenario scenario) {
+            final Optional<Pair<String,String>> skipped = skip.stream().
+                    filter(s -> s.getValue0().equals(scenario.getName())).findFirst();
+            if (skipped.isPresent())
+                throw new AssumptionViolatedException(skipped.get().getValue1());
+        }
+
+        private static void readIntoGraph(final Graph graph, final GraphData graphData) {
+            ((HadoopGraph) graph).configuration().setInputLocation(TestFiles.getInputLocation(graphData, false));
+        }
+
+        private static String getWorkingDirectory() {
+            return TestHelper.makeTestDataDirectory(HadoopGraphFeatureIntegrateTest.class, "graph-provider-data");
+        }
+
+        private static Map<String, Object> getBaseConfiguration(final GraphData graphData) {
+            return new HashMap<String, Object>() {{
+                put(Graph.GRAPH, HadoopGraph.class.getName());
+                put(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
+                put(Constants.GREMLIN_HADOOP_GRAPH_WRITER, GryoOutputFormat.class.getCanonicalName());
+                put(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, getWorkingDirectory());
+                put(Constants.GREMLIN_HADOOP_JARS_IN_DISTRIBUTED_CACHE, false);
+            }};
+        }
+    }
+
+    public static final class WorldInjectorSource implements InjectorSource {
+        @Override
+        public Injector getInjector() {
+            return Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule());
+        }
+    }
+
+}
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/HadoopGraphProcessStandardIntegrateTest.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/HadoopGraphProcessStandardIntegrateTest.java
index 4b8375d..f73cb74 100644
--- a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/HadoopGraphProcessStandardIntegrateTest.java
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/HadoopGraphProcessStandardIntegrateTest.java
@@ -21,13 +21,13 @@
 import org.apache.tinkerpop.gremlin.GraphProviderClass;
 import org.apache.tinkerpop.gremlin.hadoop.HadoopGraphProvider;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
-import org.apache.tinkerpop.gremlin.process.ProcessStandardSuite;
+import org.apache.tinkerpop.gremlin.process.ProcessLimitedStandardSuite;
 import org.junit.runner.RunWith;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-@RunWith(ProcessStandardSuite.class)
+@RunWith(ProcessLimitedStandardSuite.class)
 @GraphProviderClass(provider = HadoopGraphProvider.class, graph = HadoopGraph.class)
 public class HadoopGraphProcessStandardIntegrateTest {
 
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/RecordReaderWriterTest.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/RecordReaderWriterTest.java
index ae93e37..48a6755 100644
--- a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/RecordReaderWriterTest.java
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/RecordReaderWriterTest.java
@@ -33,6 +33,7 @@
 import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl;
 import org.apache.hadoop.util.ReflectionUtils;
 import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.hadoop.HadoopGraphProvider;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -70,7 +71,7 @@
     @Test
     public void shouldSplitFileAndWriteProperSplits() throws Exception {
         for (int numberOfSplits = 1; numberOfSplits < 10; numberOfSplits++) {
-            final File testFile = new File(HadoopGraphProvider.PATHS.get(getInputFilename()));
+            final File testFile = new File(TestFiles.PATHS.get(getInputFilename()));
             logger.info("Testing: {}", testFile + " (splits {}", numberOfSplits + ")");
             final List<FileSplit> splits = generateFileSplits(testFile, numberOfSplits);
             final Class<? extends InputFormat<NullWritable, VertexWritable>> inputFormatClass = getInputFormat();
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReaderWriterTest.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReaderWriterTest.java
index bb0d783..554b20e 100644
--- a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReaderWriterTest.java
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReaderWriterTest.java
@@ -22,6 +22,7 @@
 import org.apache.hadoop.io.NullWritable;
 import org.apache.hadoop.mapreduce.InputFormat;
 import org.apache.hadoop.mapreduce.OutputFormat;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.hadoop.HadoopGraphProvider;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.RecordReaderWriterTest;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable;
@@ -36,8 +37,8 @@
     @Override
     protected Configuration configure(final File outputDirectory) {
         final Configuration configuration = super.configure(outputDirectory);
-        configuration.set(ScriptRecordReader.SCRIPT_FILE, HadoopGraphProvider.PATHS.get("script-input-grateful-dead.groovy"));
-        configuration.set(ScriptRecordWriter.SCRIPT_FILE, HadoopGraphProvider.PATHS.get("script-output-grateful-dead.groovy"));
+        configuration.set(ScriptRecordReader.SCRIPT_FILE, TestFiles.PATHS.get("script-input-grateful-dead.groovy"));
+        configuration.set(ScriptRecordWriter.SCRIPT_FILE, TestFiles.PATHS.get("script-output-grateful-dead.groovy"));
         return configuration;
     }
 
diff --git a/hadoop-gremlin/src/test/resources/cucumber.properties b/hadoop-gremlin/src/test/resources/cucumber.properties
new file mode 100644
index 0000000..b30d19d
--- /dev/null
+++ b/hadoop-gremlin/src/test/resources/cucumber.properties
@@ -0,0 +1 @@
+guice.injector-source=org.apache.tinkerpop.gremlin.hadoop.HadoopGraphFeatureIntegrateTest$WorldInjectorSource
\ No newline at end of file
diff --git a/hadoop-gremlin/src/test/resources/log4j-silent.properties b/hadoop-gremlin/src/test/resources/log4j-silent.properties
index 4e9f465..0414068 100644
--- a/hadoop-gremlin/src/test/resources/log4j-silent.properties
+++ b/hadoop-gremlin/src/test/resources/log4j-silent.properties
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
+# TinkerPop doesn't use log4j but hadoop does directly. Need this config to control output.
+
 # this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
 # required or else some logs throw error and use other log4j.properties files on the path.
 log4j.rootLogger=OFF, stdout
diff --git a/hadoop-gremlin/src/test/resources/log4j-test.properties b/hadoop-gremlin/src/test/resources/log4j-test.properties
index 7f7a284..ac485d1 100644
--- a/hadoop-gremlin/src/test/resources/log4j-test.properties
+++ b/hadoop-gremlin/src/test/resources/log4j-test.properties
@@ -15,10 +15,12 @@
 # specific language governing permissions and limitations
 # under the License.
 
+# TinkerPop doesn't use log4j but hadoop does directly. Need this config to control output.
+
 log4j.rootLogger=WARN, stdout
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n   
 
 # need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
+log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
\ No newline at end of file
diff --git a/hadoop-gremlin/src/test/resources/logback-silent.xml b/hadoop-gremlin/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..cb9d252
--- /dev/null
+++ b/hadoop-gremlin/src/test/resources/logback-silent.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/hadoop-gremlin/src/test/resources/logback-test.xml b/hadoop-gremlin/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..f1bca0d
--- /dev/null
+++ b/hadoop-gremlin/src/test/resources/logback-test.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/neo4j-gremlin/pom.xml b/neo4j-gremlin/pom.xml
index 7524adf..d97e20a 100644
--- a/neo4j-gremlin/pom.xml
+++ b/neo4j-gremlin/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>neo4j-gremlin</artifactId>
     <name>Apache TinkerPop :: Neo4j Gremlin</name>
@@ -51,8 +51,14 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+            <version>4.2.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
index 55be5f6..df63c97 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
@@ -56,6 +56,7 @@
 @Graph.OptIn(Graph.OptIn.SUITE_STRUCTURE_STANDARD)
 @Graph.OptIn(Graph.OptIn.SUITE_STRUCTURE_INTEGRATE)
 @Graph.OptIn(Graph.OptIn.SUITE_PROCESS_STANDARD)
+@Graph.OptIn(Graph.OptIn.SUITE_PROCESS_LIMITED_STANDARD)
 @Graph.OptIn("org.apache.tinkerpop.gremlin.neo4j.NativeNeo4jSuite")
 public final class Neo4jGraph implements Graph, WrappedGraph<Neo4jGraphAPI> {
 
@@ -143,7 +144,6 @@
             return IteratorUtils.stream(this.getBaseGraph().allNodes())
                     .map(node -> (Vertex) new Neo4jVertex(node, this)).iterator();
         } else {
-            ElementHelper.validateMixedElementIds(Vertex.class, vertexIds);
             return Stream.of(vertexIds)
                     .map(id -> {
                         if (id instanceof Number)
@@ -174,7 +174,6 @@
             return IteratorUtils.stream(this.getBaseGraph().allRelationships())
                     .map(relationship -> (Edge) new Neo4jEdge(relationship, this)).iterator();
         } else {
-            ElementHelper.validateMixedElementIds(Edge.class, edgeIds);
             return Stream.of(edgeIds)
                     .map(id -> {
                         if (id instanceof Number)
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/Neo4jGraphFeatureTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/Neo4jGraphFeatureTest.java
new file mode 100644
index 0000000..e66ab9f
--- /dev/null
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/Neo4jGraphFeatureTest.java
@@ -0,0 +1,196 @@
+/*
+ * 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.neo4j;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Stage;
+import io.cucumber.guice.CucumberModules;
+import io.cucumber.guice.GuiceFactory;
+import io.cucumber.guice.InjectorSource;
+import io.cucumber.java.Scenario;
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.apache.commons.configuration2.MapConfiguration;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoResourceAccess;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(
+        tags = "not @RemoteOnly and not @MultiMetaProperties and not @GraphComputerOnly and not @AllowNullPropertyValues",
+        glue = { "org.apache.tinkerpop.gremlin.features" },
+        objectFactory = GuiceFactory.class,
+        features = { "../gremlin-test/features" },
+        plugin = {"pretty", "junit:target/cucumber.xml"})
+public class Neo4jGraphFeatureTest {
+    private static final Logger logger = LoggerFactory.getLogger(Neo4jGraphFeatureTest.class);
+
+    public static final class ServiceModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            bind(World.class).to(Neo4jGraphWorld.class);
+        }
+    }
+
+    public static class Neo4jGraphWorld implements World {
+
+        private static final Neo4jGraph modern = Neo4jGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.MODERN)));
+        private static final Neo4jGraph classic = Neo4jGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.CLASSIC)));
+        private static final Neo4jGraph sink = Neo4jGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.SINK)));
+        private static final Neo4jGraph grateful = Neo4jGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.GRATEFUL)));
+        private static final Neo4jGraph empty = Neo4jGraph.open(new MapConfiguration(getBaseConfiguration(null)));
+
+        static {
+            createIndices();
+            readIntoGraph(modern, GraphData.MODERN);
+            readIntoGraph(classic, GraphData.CLASSIC);
+            readIntoGraph(sink, GraphData.SINK);
+            readIntoGraph(grateful, GraphData.GRATEFUL);
+        }
+
+        @Override
+        public GraphTraversalSource getGraphTraversalSource(final GraphData graphData) {
+            if (null == graphData)
+                return empty.traversal();
+            else if (graphData == GraphData.CLASSIC)
+                return classic.traversal();
+            else if (graphData == GraphData.CREW)
+                throw new UnsupportedOperationException("The Crew dataset is not supported by Neo4j because it doesn't support mult/meta-properties");
+            else if (graphData == GraphData.MODERN)
+                return modern.traversal();
+            else if (graphData == GraphData.SINK)
+                return sink.traversal();
+            else if (graphData == GraphData.GRATEFUL)
+                return grateful.traversal();
+            else
+                throw new UnsupportedOperationException("GraphData not supported: " + graphData.name());
+        }
+
+        @Override
+        public void beforeEachScenario(final Scenario scenario) {
+            cleanEmpty();
+        }
+
+        @Override
+        public String changePathToDataFile(final String pathToFileFromGremlin) {
+            return ".." + File.separator + pathToFileFromGremlin;
+        }
+
+        private static void createIndices() {
+            grateful.tx().readWrite();
+            grateful.cypher("CREATE INDEX ON :artist(name)").iterate();
+            grateful.cypher("CREATE INDEX ON :song(name)").iterate();
+            grateful.cypher("CREATE INDEX ON :song(songType)").iterate();
+            grateful.cypher("CREATE INDEX ON :song(performances)").iterate();
+            grateful.tx().commit();
+
+            modern.tx().readWrite();
+            modern.cypher("CREATE INDEX ON :person(name)").iterate();
+            modern.cypher("CREATE INDEX ON :person(age)").iterate();
+            modern.cypher("CREATE INDEX ON :software(name)").iterate();
+            modern.cypher("CREATE INDEX ON :software(lang)").iterate();
+            modern.tx().commit();
+
+            classic.tx().readWrite();
+            classic.cypher("CREATE INDEX ON :vertex(name)").iterate();
+            classic.cypher("CREATE INDEX ON :vertex(age)").iterate();
+            classic.cypher("CREATE INDEX ON :vertex(lang)").iterate();
+            classic.tx().commit();
+        }
+
+        private void cleanEmpty() {
+            final GraphTraversalSource g = empty.traversal();
+            g.V().drop().iterate();
+        }
+
+        private static void readIntoGraph(final Graph graph, final GraphData graphData) {
+            try {
+                final String dataFile = TestHelper.generateTempFileFromResource(graph.getClass(),
+                        GryoResourceAccess.class, graphData.location().substring(graphData.location().lastIndexOf(File.separator) + 1), "", false).getAbsolutePath();
+                graph.traversal().io(dataFile).read().iterate();
+            } catch (IOException ioe) {
+                throw new IllegalStateException(ioe);
+            }
+        }
+
+        private static String getWorkingDirectory() {
+            return TestHelper.makeTestDataDirectory(Neo4jGraphFeatureTest.class, "graph-provider-data");
+        }
+
+        private static String makeTestDirectory(final String graphName) {
+            return getWorkingDirectory() + File.separator
+                    + RandomStringUtils.randomAlphabetic(10) + File.separator
+                    + TestHelper.cleanPathSegment(graphName);
+        }
+
+        private static Map<String, Object> getBaseConfiguration(final LoadGraphWith.GraphData graphData) {
+            final String directory = makeTestDirectory(graphData == null ? "default" : graphData.name().toLowerCase());
+
+            final File f = new File(directory);
+            if (f.exists()) deleteDirectory(f);
+            f.mkdirs();
+
+            return new HashMap<String, Object>() {{
+                put(Graph.GRAPH, Neo4jGraph.class.getName());
+                put(Neo4jGraph.CONFIG_DIRECTORY, directory);
+                put(Neo4jGraph.CONFIG_CONF + ".dbms.memory.pagecache.size", "1m");
+            }};
+        }
+
+        static void deleteDirectory(final File directory) {
+            if (directory.exists()) {
+                for (File file : directory.listFiles()) {
+                    if (file.isDirectory()) {
+                        deleteDirectory(file);
+                    } else {
+                        file.delete();
+                    }
+                }
+                directory.delete();
+            }
+
+            if (directory.exists()) logger.error("unable to delete directory " + directory.getAbsolutePath());
+        }
+    }
+
+    public static final class WorldInjectorSource implements InjectorSource {
+        @Override
+        public Injector getInjector() {
+            return Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule());
+        }
+    }
+
+}
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jGraphProcessStandardTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jGraphProcessStandardTest.java
index 3f2e819..f39561c 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jGraphProcessStandardTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jGraphProcessStandardTest.java
@@ -21,13 +21,13 @@
 import org.apache.tinkerpop.gremlin.GraphProviderClass;
 import org.apache.tinkerpop.gremlin.neo4j.Neo4jGraphProvider;
 import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
-import org.apache.tinkerpop.gremlin.process.ProcessStandardSuite;
+import org.apache.tinkerpop.gremlin.process.ProcessLimitedStandardSuite;
 import org.junit.runner.RunWith;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-@RunWith(ProcessStandardSuite.class)
+@RunWith(ProcessLimitedStandardSuite.class)
 @GraphProviderClass(provider = Neo4jGraphProvider.class, graph = Neo4jGraph.class)
 public class Neo4jGraphProcessStandardTest {
 }
diff --git a/neo4j-gremlin/src/test/resources/cucumber.properties b/neo4j-gremlin/src/test/resources/cucumber.properties
new file mode 100644
index 0000000..bbb9128
--- /dev/null
+++ b/neo4j-gremlin/src/test/resources/cucumber.properties
@@ -0,0 +1 @@
+guice.injector-source=org.apache.tinkerpop.gremlin.neo4j.Neo4jGraphFeatureTest$WorldInjectorSource
\ No newline at end of file
diff --git a/neo4j-gremlin/src/test/resources/log4j-silent.properties b/neo4j-gremlin/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 7c312f7..0000000
--- a/neo4j-gremlin/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,26 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-# need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
\ No newline at end of file
diff --git a/neo4j-gremlin/src/test/resources/log4j-test.properties b/neo4j-gremlin/src/test/resources/log4j-test.properties
deleted file mode 100644
index 067fa7b..0000000
--- a/neo4j-gremlin/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,24 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-# need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
\ No newline at end of file
diff --git a/neo4j-gremlin/src/test/resources/logback-silent.xml b/neo4j-gremlin/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..cb9d252
--- /dev/null
+++ b/neo4j-gremlin/src/test/resources/logback-silent.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/neo4j-gremlin/src/test/resources/logback-test.xml b/neo4j-gremlin/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..f1bca0d
--- /dev/null
+++ b/neo4j-gremlin/src/test/resources/logback-test.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 6e3187b..8460bf9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
     </parent>
     <groupId>org.apache.tinkerpop</groupId>
     <artifactId>tinkerpop</artifactId>
-    <version>3.5.2-SNAPSHOT</version>
+    <version>3.6.0-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>Apache TinkerPop</name>
     <description>A Graph Computing Framework</description>
@@ -125,6 +125,7 @@
         <module>gremlin-language</module>
         <module>gremlin-shaded</module>
         <module>gremlin-core</module>
+        <module>gremlin-annotations</module>
         <module>gremlin-test</module>
         <module>gremlin-groovy</module>
         <module>tinkergraph-gremlin</module>
@@ -154,16 +155,16 @@
         <commons.lang3.version>3.11</commons.lang3.version>
         <commons.text.version>1.9</commons.text.version>
         <groovy.version>2.5.14</groovy.version>
-        <hadoop.version>2.7.7</hadoop.version>
+        <hadoop.version>3.3.1</hadoop.version>
         <java.tuples.version>1.2</java.tuples.version>
         <javadoc-plugin.version>3.1.0</javadoc-plugin.version>
         <jcabi.version>1.1</jcabi.version>
-        <log4j.version>1.2.17</log4j.version>
+        <logback.version>1.2.3</logback.version>
         <metrics.version>3.0.2</metrics.version>
         <netty.version>4.1.61.Final</netty.version>
         <slf4j.version>1.7.25</slf4j.version>
         <snakeyaml.version>1.27</snakeyaml.version>
-        <spark.version>3.0.0</spark.version>
+        <spark.version>3.1.2</spark.version>
         <powermock.version>2.0.9</powermock.version>
 
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -172,10 +173,14 @@
         <suresafeArgs> </suresafeArgs>
 
         <!--
-        This file will come from the root of each modules test/resources/ directories. log4j-silent.properties will
-        turn off all logging possible while still allowing tests to pass. log4j-test.properties will be more verbose
+        This file will come from the root of each modules test/resources/ directories. logback-silent.xml will
+        turn off all logging possible while still allowing tests to pass. logback-test.xml will be more verbose
         in its output.
         -->
+        <logback-test.properties>file:target/test-classes/logback-test.xml</logback-test.properties>
+        <logback-silent.properties>file:target/test-classes/logback-silent.xml</logback-silent.properties>
+
+        <!-- only needed for hadoop/spark which still are stuck in log4j 1.x - do not depend on these otherwise -->
         <log4j-test.properties>file:target/test-classes/log4j-test.properties</log4j-test.properties>
         <log4j-silent.properties>file:target/test-classes/log4j-silent.properties</log4j-silent.properties>
 
@@ -400,6 +405,7 @@
                         <exclude>**/goal.txt</exclude>
                         <exclude>**/src/main/resources/META-INF/services/**</exclude>
                         <exclude>**/src/test/resources/META-INF/services/**</exclude>
+                        <exclude>**/src/test/resources/cucumber.properties</exclude>
                         <exclude>**/src/test/resources/incorrect-traversals.txt</exclude>
                         <exclude>**/src/test/resources/org/apache/tinkerpop/gremlin/console/groovy/plugin/script-customizer-*.groovy</exclude>
                         <exclude>**/src/test/resources/org/apache/tinkerpop/gremlin/jsr223/script-customizer-*.groovy</exclude>
@@ -461,7 +467,7 @@
         </plugins>
         <pluginManagement>
             <plugins>
-                <!-- there is a jdk11 profile that will be enabled if built with that version - these settings will be overriden -->
+                <!-- there is a jdk11 profile that will be enabled if built with that version - these settings will be overridden -->
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-compiler-plugin</artifactId>
@@ -482,14 +488,28 @@
                 <!-- reverted surefire to 2.21.0 for performance reasons. 2.22.2 required forkCount=1 and
                      reuseForks=true which seemed to more the double the build time. there are only milestone
                      releases after 2.22.2 so rather than rely on those at this time, i guess we just stick with
-                     2.21.0 -->
+                     2.21.0
+
+                     the above note was from 3.5.0. for 3.6.0 tried this change as part of bumping to newer
+                     versions of hadoop/spark and didn't see a slow down in execution time. going to newer
+                     versions of surefire/failsafe, the aforementioned milestone releases, however seemed to cause
+                     test failures for spark integration tests. it was not clear why.
+
+                     note that while we got rid of log4j 1.x and have converted to logback, hadoop seems bound
+                     tightly to the former. included the log4j configuration file here so that we didn't have to
+                     copy/paste this entire config into both hadoop-gremlin and spark-gremlin. it is of no cost to
+                     maintain these settings here globally even if they aren't used as such.
+                -->
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-surefire-plugin</artifactId>
-                    <version>2.21.0</version>
+                    <version>2.22.2</version>
                     <configuration>
                         <argLine>
-                            -Dlog4j.configuration=${log4j-test.properties} -Dbuild.dir=${project.build.directory} -Dis.testing=true -Djava.net.preferIPv4Stack=true ${suresafeArgs}
+                            -Dlogback.configuration=${logback-test.properties}
+                            -Dlog4j.configuration=${log4j-test.properties}
+                            -Dbuild.dir=${project.build.directory}
+                            -Dis.testing=true -Djava.net.preferIPv4Stack=true ${suresafeArgs}
                         </argLine>
                         <trimStackTrace>false</trimStackTrace>
                         <excludes>
@@ -513,7 +533,11 @@
                                 </includes>
                                 <skipTests>${skipIntegrationTests}</skipTests>
                                 <argLine>
-                                    -Dlog4j.configuration=${log4j-test.properties} -Dhost=localhost -Dport=8182 -Dbuild.dir=${project.build.directory} -Dis.testing=true -Djava.net.preferIPv4Stack=true ${suresafeArgs}
+                                    -Dlogback.configuration=${logback-test.properties}
+                                    -Dlog4j.configuration=${log4j-test.properties}
+                                    -Dhost=localhost -Dport=8182
+                                    -Dbuild.dir=${project.build.directory} -Dis.testing=true
+                                    -Djava.net.preferIPv4Stack=true ${suresafeArgs}
                                 </argLine>
                                 <forkCount>1</forkCount>
                                 <reuseForks>false</reuseForks>
@@ -641,32 +665,6 @@
                 <version>${commons.lang3.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.apache.hadoop</groupId>
-                <artifactId>hadoop-core</artifactId>
-                <version>1.2.1</version>
-                <exclusions>
-                    <!-- self-conflicts -->
-                    <exclusion>
-                        <groupId>commons-codec</groupId>
-                        <artifactId>commons-codec</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>commons-httpclient</groupId>
-                        <artifactId>commons-httpclient</artifactId>
-                    </exclusion>
-                    <!-- conflict with commons-configuration -->
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                    <!-- conflict with TinkerPop tests -->
-                    <exclusion>
-                        <groupId>junit</groupId>
-                        <artifactId>junit</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
                 <groupId>com.codahale.metrics</groupId>
                 <artifactId>metrics-core</artifactId>
                 <version>${metrics.version}</version>
@@ -734,11 +732,6 @@
                 </exclusions>
             </dependency>
             <dependency>
-                <groupId>log4j</groupId>
-                <artifactId>log4j</artifactId>
-                <version>${log4j.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
                 <version>4.13.1</version>
@@ -805,9 +798,14 @@
                 <version>2.2</version>
             </dependency>
             <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-log4j12</artifactId>
-                <version>${slf4j.version}</version>
+                <groupId>io.github.hakky54</groupId>
+                <artifactId>logcaptor</artifactId>
+                <version>2.6.1</version>
+            </dependency>
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-classic</artifactId>
+                <version>${logback.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.slf4j</groupId>
@@ -822,7 +820,7 @@
             <dependency>
                 <groupId>org.jacoco</groupId>
                 <artifactId>jacoco-maven-plugin</artifactId>
-                <version>0.8.4</version>
+                <version>0.8.5</version>
             </dependency>
             <dependency>
                 <groupId>commons-io</groupId>
@@ -1537,7 +1535,11 @@
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
                         <configuration>
-                            <argLine>-Dlog4j.configuration=${log4j-silent.properties} -Dbuild.dir=${project.build.directory} -Dis.testing=true -Djava.net.preferIPv4Stack=true ${suresafeArgs}
+                            <argLine>
+                                -Dlogback.configuration=${logback-silent.properties}
+                                -Dlog4j.configuration=${log4j-silent.properties}
+                                -Dbuild.dir=${project.build.directory} -Dis.testing=true
+                                -Djava.net.preferIPv4Stack=true ${suresafeArgs}
                             </argLine>
                             <excludes>
                                 <exclude>**/*IntegrateTest.java</exclude>
@@ -1634,7 +1636,10 @@
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-surefire-plugin</artifactId>
                         <configuration>
-                            <argLine>-Dlog4j.configuration=${log4j-test.properties} -Dbuild.dir=${project.build.directory} -Dis.testing=true ${suresafeArgs} -Djava.net.preferIPv4Stack=true
+                            <argLine>-Dlogback.configuration=${logback-test.properties}
+                                -Dlog4j.configuration=${log4j-test.properties}
+                                -Dbuild.dir=${project.build.directory} -Dis.testing=true ${suresafeArgs}
+                                -Djava.net.preferIPv4Stack=true
                             </argLine>
                         </configuration>
                     </plugin>
@@ -1642,7 +1647,10 @@
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-failsafe-plugin</artifactId>
                         <configuration>
-                            <argLine>-Dlog4j.configuration=${log4j-test.properties} -Dhost=localhost -Dport=8182 -Dbuild.dir=${project.build.directory} -Dis.testing=true ${suresafeArgs} -Djava.net.preferIPv4Stack=true
+                            <argLine>-Dlogback.configuration=${logback-test.properties}
+                                -Dlog4j.configuration=${log4j-test.properties} -Dhost=localhost -Dport=8182
+                                -Dbuild.dir=${project.build.directory} -Dis.testing=true ${suresafeArgs}
+                                -Djava.net.preferIPv4Stack=true
                             </argLine>
                         </configuration>
                     </plugin>
diff --git a/spark-gremlin/pom.xml b/spark-gremlin/pom.xml
index 76388ff..089e99a 100644
--- a/spark-gremlin/pom.xml
+++ b/spark-gremlin/pom.xml
@@ -1,22 +1,19 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~ http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
@@ -24,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>spark-gremlin</artifactId>
     <name>Apache TinkerPop :: Spark Gremlin</name>
@@ -32,7 +29,13 @@
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
-            <version>16.0.1</version>
+            <version>27.0-jre</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.code.findbugs</groupId>
+                    <artifactId>jsr305</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.tinkerpop</groupId>
@@ -44,40 +47,38 @@
             <artifactId>hadoop-gremlin</artifactId>
             <version>${project.version}</version>
             <exclusions>
-                <!-- use our snappy as there is conflict within spark-->
+                <!-- prefer gremlin-test/spark kerby -->
                 <exclusion>
-                    <groupId>org.xerial.snappy</groupId>
-                    <artifactId>snappy-java</artifactId>
+                    <groupId>org.apache.kerby</groupId>
+                    <artifactId>kerb-simplekdc</artifactId>
                 </exclusion>
-                <!-- use spark's avro -->
                 <exclusion>
-                    <groupId>org.apache.avro</groupId>
-                    <artifactId>avro</artifactId>
+                    <groupId>org.apache.kerby</groupId>
+                    <artifactId>kerb-core</artifactId>
                 </exclusion>
-                <!-- use spark's math -->
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-annotations</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-core</artifactId>
+                </exclusion>
                 <exclusion>
                     <groupId>org.apache.commons</groupId>
                     <artifactId>commons-math3</artifactId>
                 </exclusion>
-                <!-- use spark's netty 4-->
                 <exclusion>
-                    <groupId>io.netty</groupId>
-                    <artifactId>netty-all</artifactId>
+                    <groupId>org.apache.avro</groupId>
+                    <artifactId>avro</artifactId>
                 </exclusion>
-                <!-- use spark's activation -->
                 <exclusion>
-                    <groupId>javax.activation</groupId>
-                    <artifactId>activation</artifactId>
+                    <groupId>com.google.code.findbugs</groupId>
+                    <artifactId>jsr305</artifactId>
                 </exclusion>
-                <!-- use zookeeper's netty 3 -->
                 <exclusion>
-                    <groupId>io.netty</groupId>
-                    <artifactId>netty</artifactId>
-                </exclusion>
-                <!-- use sparks commons-compress -->
-                <exclusion>
-                    <groupId>org.apache.commons</groupId>
-                    <artifactId>commons-compress</artifactId>
+                    <groupId>log4j</groupId>
+                    <artifactId>log4j</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
@@ -91,86 +92,105 @@
                     <groupId>org.apache.hadoop</groupId>
                     <artifactId>hadoop-client</artifactId>
                 </exclusion>
+                <!-- prefer hadoop-gremlins jackson databind -->
                 <exclusion>
                     <groupId>com.fasterxml.jackson.core</groupId>
                     <artifactId>jackson-databind</artifactId>
                 </exclusion>
+                <!-- prefer hadoop-gremlin guava -->
                 <exclusion>
-                    <groupId>org.apache.zookeeper</groupId>
-                    <artifactId>zookeeper</artifactId>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
                 </exclusion>
                 <exclusion>
-                    <groupId>org.xerial.snappy</groupId>
-                    <artifactId>snappy</artifactId>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-annotations</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.fasterxml.jackson.core</groupId>
+                    <artifactId>jackson-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
                 </exclusion>
                 <exclusion>
                     <groupId>org.scala-lang</groupId>
                     <artifactId>scala-library</artifactId>
                 </exclusion>
                 <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-math3</artifactId>
+                </exclusion>
+                <!-- prefer hadoop-gremlin commons-net -->
+                <exclusion>
+                    <groupId>commons-net</groupId>
+                    <artifactId>commons-net</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.avro</groupId>
+                    <artifactId>avro</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.curator</groupId>
+                    <artifactId>curator-recipes</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- resolve spark-gremlin conflicts -->
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <version>4.2.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.zookeeper</groupId>
+                    <artifactId>zookeeper</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.avro</groupId>
+            <artifactId>avro</artifactId>
+            <version>1.8.2</version>
+            <exclusions>
+                <exclusion>
                     <groupId>org.xerial.snappy</groupId>
                     <artifactId>snappy-java</artifactId>
                 </exclusion>
                 <exclusion>
-                    <groupId>jakarta.annotation</groupId>
-                    <artifactId>jakarta.annotation-api</artifactId>
-                </exclusion>
-                <exclusion>
                     <groupId>org.apache.commons</groupId>
-                    <artifactId>commons-text</artifactId>
+                    <artifactId>commons-compress</artifactId>
                 </exclusion>
-                <!--
-                spark 3.0/scala 2.12 uses paranamer 2.8 and hadoop is stuck with an older version. without 2.8 you get
-                SPARK-14220
-                -->
                 <exclusion>
                     <groupId>com.thoughtworks.paranamer</groupId>
                     <artifactId>paranamer</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
-        <!-- spark self-conflict and hadoop conflict -->
         <dependency>
-            <groupId>org.xerial.snappy</groupId>
-            <artifactId>snappy-java</artifactId>
-            <version>1.1.7.3</version>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math3</artifactId>
+            <version>3.4.1</version>
         </dependency>
-        <!-- spark self-conflict and hadoop conflict -->
-        <dependency>
-            <groupId>com.thoughtworks.paranamer</groupId>
-            <artifactId>paranamer</artifactId>
-            <version>2.8</version>
-        </dependency>
-        <!-- spark self-conflict -->
-        <dependency>
-            <groupId>jakarta.annotation</groupId>
-            <artifactId>jakarta.annotation-api</artifactId>
-            <version>1.3.5</version>
-        </dependency>
-        <!-- spark self-conflict -->
         <dependency>
             <groupId>org.scala-lang</groupId>
             <artifactId>scala-library</artifactId>
             <version>2.12.10</version>
         </dependency>
-        <!-- spark self-confict -->
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-            <version>2.10.0</version>
+            <artifactId>jackson-annotations</artifactId>
+            <version>2.10.5</version>
         </dependency>
-        <!-- spark self-confict -->
         <dependency>
-            <groupId>org.apache.zookeeper</groupId>
-            <artifactId>zookeeper</artifactId>
-            <version>3.4.6</version>
-            <exclusions>
-                <!-- use gremlin-groovy's jline -->
-                <exclusion>
-                    <groupId>jline</groupId>
-                    <artifactId>jline</artifactId>
-                </exclusion>
-            </exclusions>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.10.5</version>
         </dependency>
         <!-- TEST -->
         <dependency>
@@ -178,6 +198,24 @@
             <artifactId>gremlin-test</artifactId>
             <version>${project.version}</version>
             <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.nimbusds</groupId>
+                    <artifactId>nimbus-jose-jwt</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+            <version>4.2.3</version>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.tinkerpop</groupId>
@@ -186,8 +224,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
@@ -261,9 +299,6 @@
                             <Gremlin-Plugin-Dependencies>
                                 org.apache.hadoop:hadoop-client:${hadoop.version};org.apache.hadoop:hadoop-yarn-server-web-proxy:${hadoop.version};org.apache.spark:spark-yarn_2.12:${spark.version}
                             </Gremlin-Plugin-Dependencies>
-                            <!-- deletes the servlet-api jar from the path after install - causes conflicts -->
-                            <Gremlin-Plugin-Paths>servlet-api-2.5.jar=</Gremlin-Plugin-Paths>
-                            <Gremlin-Lib-Paths>servlet-api-2.5.jar=</Gremlin-Lib-Paths>
                         </manifestEntries>
                     </archive>
                 </configuration>
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java
new file mode 100644
index 0000000..3b15904
--- /dev/null
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java
@@ -0,0 +1,200 @@
+/*
+ * 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.spark;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Stage;
+import io.cucumber.guice.CucumberModules;
+import io.cucumber.guice.GuiceFactory;
+import io.cucumber.guice.InjectorSource;
+import io.cucumber.java.Scenario;
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.apache.commons.configuration2.MapConfiguration;
+import org.apache.spark.launcher.SparkLauncher;
+import org.apache.spark.serializer.KryoSerializer;
+import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.apache.tinkerpop.gremlin.hadoop.Constants;
+import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
+import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat;
+import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat;
+import org.apache.tinkerpop.gremlin.process.computer.Computer;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.spark.process.computer.SparkGraphComputer;
+import org.apache.tinkerpop.gremlin.spark.structure.io.gryo.GryoRegistrator;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.javatuples.Pair;
+import org.junit.AssumptionViolatedException;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(
+        tags = "not @RemoteOnly",
+        glue = { "org.apache.tinkerpop.gremlin.features" },
+        objectFactory = GuiceFactory.class,
+        features = { "../gremlin-test/features" },
+        plugin = {"pretty", "junit:target/cucumber.xml"})
+public class SparkGraphFeatureIntegrateTest {
+    private static final int AVAILABLE_PROCESSORS = Runtime.getRuntime().availableProcessors();
+
+    private static final String skipReasonLength = "Spark-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.";
+
+    /**
+     * May need to improve the definition of result equality with map&lt;list&gt; - TINKERPOP-2622
+     */
+    private static final String skipReasonOrdering = "There are some internal ordering issues with result where equality is not required but is being enforced";
+
+    private static final List<Pair<String, String>> skip = new ArrayList<Pair<String,String>>() {{
+        add(Pair.with("g_V_both_both_count", skipReasonLength));
+        add(Pair.with("g_V_repeatXoutX_timesX3X_count", skipReasonLength));
+        add(Pair.with("g_V_repeatXoutX_timesX8X_count", skipReasonLength));
+        add(Pair.with("g_V_repeatXoutX_timesX5X_asXaX_outXwrittenByX_asXbX_selectXa_bX_count", skipReasonLength));
+        add(Pair.with("g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX", skipReasonLength));
+        add(Pair.with("g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX", skipReasonLength));
+        add(Pair.with("g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX", skipReasonLength));
+        add(Pair.with("g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX", skipReasonLength));
+        add(Pair.with("g_V_hasLabelXsongX_groupXaX_byXnameX_byXproperties_groupCount_byXlabelXX_out_capXaX", skipReasonLength));
+        add(Pair.with("g_V_outXfollowedByX_group_byXsongTypeX_byXbothE_group_byXlabelX_byXweight_sumXX", skipReasonLength));
+        add(Pair.with("g_V_repeatXbothXfollowedByXX_timesX2X_group_byXsongTypeX_byXcountX", skipReasonLength));
+        add(Pair.with("g_V_repeatXbothXfollowedByXX_timesX2X_groupXaX_byXsongTypeX_byXcountX_capXaX", skipReasonLength));
+        add(Pair.with("g_V_matchXa_followedBy_count_isXgtX10XX_b__a_0followedBy_count_isXgtX10XX_bX_count", skipReasonLength));
+        add(Pair.with("g_V_order_byXname_descX_barrier_dedup_age_name", skipReasonOrdering));
+        add(Pair.with("g_V_group_byXoutE_countX_byXnameX", skipReasonOrdering));
+        add(Pair.with("g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_descX", skipReasonOrdering));
+        add(Pair.with("g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX", skipReasonOrdering));
+        add(Pair.with("g_V_group_byXageX", skipReasonOrdering));
+        add(Pair.with("g_V_order_byXoutE_count_descX", skipReasonOrdering));
+        add(Pair.with("g_V_both_both_dedup_byXoutE_countX_name", skipReasonOrdering));
+        add(Pair.with("g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX", skipReasonOrdering));
+        add(Pair.with("g_V_hasLabelXsoftwareX_order_byXnameX_index_withXmapX", skipReasonOrdering));
+    }};
+
+    private static final List<String> TAGS_TO_IGNORE = Arrays.asList(
+            "@StepDrop",
+            "@StepV",
+            "@StepIndex", // doesn't look like this works with Spark atm - doesn't serialize (IndexTest not in the ProcessComputerSuite)
+            "@GraphComputerVerificationOneBulk",
+            "@GraphComputerVerificationStrategyNotSupported",
+            "@GraphComputerVerificationMidVNotSupported",
+            "@GraphComputerVerificationInjectionNotSupported",
+            "@GraphComputerVerificationStarGraphExceeded",
+            "@GraphComputerVerificationReferenceOnly");
+
+    public static final class ServiceModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            bind(World.class).to(SparkGraphWorld.class);
+        }
+    }
+
+    public static class SparkGraphWorld implements World {
+
+        private static final HadoopGraph modern = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.MODERN)));
+        private static final HadoopGraph classic = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.CLASSIC)));
+        private static final HadoopGraph crew = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.CREW)));
+        private static final HadoopGraph sink = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.SINK)));
+        private static final HadoopGraph grateful = HadoopGraph.open(new MapConfiguration(getBaseConfiguration(GraphData.GRATEFUL)));
+
+        static {
+            readIntoGraph(modern, GraphData.MODERN);
+            readIntoGraph(classic, GraphData.CLASSIC);
+            readIntoGraph(crew, GraphData.CREW);
+            readIntoGraph(sink, GraphData.SINK);
+            readIntoGraph(grateful, GraphData.GRATEFUL);
+        }
+
+        @Override
+        public GraphTraversalSource getGraphTraversalSource(final GraphData graphData) {
+            if (null == graphData)
+                throw new AssumptionViolatedException("HadoopGraph does not support graph mutations");
+            else if (graphData == GraphData.CLASSIC)
+                return classic.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
+            else if (graphData == GraphData.CREW)
+                return crew.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
+            else if (graphData == GraphData.MODERN)
+                return modern.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
+            else if (graphData == GraphData.SINK)
+                return sink.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
+            else if (graphData == GraphData.GRATEFUL)
+                return grateful.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
+            else
+                throw new UnsupportedOperationException("GraphData not supported: " + graphData.name());
+        }
+
+        @Override
+        public void beforeEachScenario(final Scenario scenario) {
+            final Optional<Pair<String,String>> skipped = skip.stream().
+                    filter(s -> s.getValue0().equals(scenario.getName())).findFirst();
+            if (skipped.isPresent())
+                throw new AssumptionViolatedException(skipped.get().getValue1());
+
+            final List<String> ignores = TAGS_TO_IGNORE.stream().filter(t -> scenario.getSourceTagNames().contains(t)).collect(Collectors.toList());
+            if (!ignores.isEmpty())
+                throw new AssumptionViolatedException(String.format("This scenario is not supported with GraphComputer: %s", ignores));
+        }
+
+        private static void readIntoGraph(final Graph graph, final GraphData graphData) {
+            ((HadoopGraph) graph).configuration().setInputLocation(TestFiles.getInputLocation(graphData, false));
+        }
+
+        private static String getWorkingDirectory() {
+            return TestHelper.makeTestDataDirectory(SparkGraphFeatureIntegrateTest.class, "graph-provider-data");
+        }
+
+        private static Map<String, Object> getBaseConfiguration(final GraphData graphData) {
+            return new HashMap<String, Object>() {{
+                put(Graph.GRAPH, HadoopGraph.class.getName());
+                put(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
+                put(Constants.GREMLIN_HADOOP_GRAPH_WRITER, GryoOutputFormat.class.getCanonicalName());
+                put(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, getWorkingDirectory());
+                put(Constants.GREMLIN_HADOOP_JARS_IN_DISTRIBUTED_CACHE, false);
+
+                put(Constants.GREMLIN_SPARK_PERSIST_CONTEXT, true);  // this makes the test suite go really fast
+
+                put(Constants.GREMLIN_HADOOP_DEFAULT_GRAPH_COMPUTER, SparkGraphComputer.class.getCanonicalName());
+                put(SparkLauncher.SPARK_MASTER, "local[" + AVAILABLE_PROCESSORS + "]");
+                put(Constants.SPARK_SERIALIZER, KryoSerializer.class.getCanonicalName());
+                put(Constants.SPARK_KRYO_REGISTRATOR, GryoRegistrator.class.getCanonicalName());
+                put(Constants.SPARK_KRYO_REGISTRATION_REQUIRED, true);
+            }};
+        }
+    }
+
+    public static final class WorldInjectorSource implements InjectorSource {
+        @Override
+        public Injector getInjector() {
+            return Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule());
+        }
+    }
+
+}
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/LocalPropertyTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/LocalPropertyTest.java
index 829c405..f26d6b0 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/LocalPropertyTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/LocalPropertyTest.java
@@ -26,6 +26,7 @@
 import org.apache.spark.api.java.JavaSparkContext;
 import org.apache.spark.api.java.JavaSparkStatusTracker;
 import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.hadoop.Constants;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat;
@@ -56,7 +57,7 @@
         configuration.setProperty("spark.master", "local[4]");
         configuration.setProperty("spark.serializer", GryoSerializer.class.getCanonicalName());
         configuration.setProperty(Graph.GRAPH, HadoopGraph.class.getName());
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, rddName);
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/SparkGraphComputerProcessIntegrateTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/SparkGraphComputerProcessIntegrateTest.java
index f38dcf5..7091ff3 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/SparkGraphComputerProcessIntegrateTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/SparkGraphComputerProcessIntegrateTest.java
@@ -21,12 +21,14 @@
 import org.apache.tinkerpop.gremlin.GraphProviderClass;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
 import org.apache.tinkerpop.gremlin.process.ProcessComputerSuite;
+import org.apache.tinkerpop.gremlin.process.ProcessLimitedComputerSuite;
+import org.apache.tinkerpop.gremlin.process.ProcessLimitedStandardSuite;
 import org.junit.runner.RunWith;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-@RunWith(ProcessComputerSuite.class)
+@RunWith(ProcessLimitedComputerSuite.class)
 @GraphProviderClass(provider = SparkHadoopGraphProvider.class, graph = HadoopGraph.class)
 public class SparkGraphComputerProcessIntegrateTest {
 }
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/SparkInterceptorStrategyTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/SparkInterceptorStrategyTest.java
index b1d58a6..869963c 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/SparkInterceptorStrategyTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/SparkInterceptorStrategyTest.java
@@ -21,6 +21,7 @@
 
 import org.apache.commons.configuration2.Configuration;
 import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.hadoop.Constants;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
@@ -60,7 +61,7 @@
     @Test
     public void shouldHandleSideEffectsCorrectly() throws Exception {
         final Configuration configuration = getBaseConfiguration();
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, TestHelper.makeTestDataDirectory(SparkSingleIterationStrategyTest.class, UUID.randomUUID().toString()));
@@ -88,7 +89,7 @@
     @Test
     public void shouldSuccessfullyEvaluateInterceptedTraversals() throws Exception {
         final Configuration configuration = getBaseConfiguration();
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, TestHelper.makeTestDataDirectory(SparkSingleIterationStrategyTest.class, UUID.randomUUID().toString()));
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/SparkSingleIterationStrategyTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/SparkSingleIterationStrategyTest.java
index 6202f33..cbd8cd4 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/SparkSingleIterationStrategyTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/SparkSingleIterationStrategyTest.java
@@ -21,6 +21,7 @@
 
 import org.apache.commons.configuration2.Configuration;
 import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.hadoop.Constants;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
@@ -76,7 +77,7 @@
     public void shouldSuccessfullyEvaluateSingleIterationTraversals() throws Exception {
         final String outputLocation = TestHelper.makeTestDataDirectory(SparkSingleIterationStrategyTest.class, UUID.randomUUID().toString());
         Configuration configuration = getBaseConfiguration();
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, outputLocation);
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/SparkTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/SparkTest.java
index 5aa78a4..17ef288 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/SparkTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/SparkTest.java
@@ -23,6 +23,7 @@
 import org.apache.commons.configuration2.Configuration;
 import org.apache.spark.rdd.RDD;
 import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.hadoop.Constants;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat;
@@ -59,7 +60,7 @@
 
         configuration.setProperty("spark.serializer", GryoSerializer.class.getCanonicalName());
         configuration.setProperty(Graph.GRAPH, HadoopGraph.class.getName());
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_JARS_IN_DISTRIBUTED_CACHE, false);
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/OutputRDDTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/OutputRDDTest.java
index 7042a6c..b675615 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/OutputRDDTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/OutputRDDTest.java
@@ -21,6 +21,7 @@
 import org.apache.commons.configuration2.BaseConfiguration;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.hadoop.Constants;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat;
@@ -46,7 +47,7 @@
         configuration.setProperty("spark.master", "local[4]");
         configuration.setProperty("spark.serializer", GryoSerializer.class.getCanonicalName());
         configuration.setProperty(Graph.GRAPH, HadoopGraph.class.getName());
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, ExampleOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, TestHelper.makeTestDataDirectory(this.getClass(), "shouldWriteToArbitraryRDD"));
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/PersistedInputOutputRDDIntegrateTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/PersistedInputOutputRDDIntegrateTest.java
index f26efbc..ded8698 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/PersistedInputOutputRDDIntegrateTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/PersistedInputOutputRDDIntegrateTest.java
@@ -22,6 +22,7 @@
 import org.apache.commons.configuration2.Configuration;
 import org.apache.spark.storage.StorageLevel;
 import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.hadoop.Constants;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat;
@@ -56,7 +57,7 @@
         Spark.create("local[4]");
         final String rddName = TestHelper.makeTestDataDirectory(PersistedInputOutputRDDIntegrateTest.class, UUID.randomUUID().toString());
         final Configuration configuration = super.getBaseConfiguration();
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, GryoOutputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, rddName);
@@ -84,7 +85,7 @@
             counter++;
             final String rddName = TestHelper.makeTestDataDirectory(PersistedInputOutputRDDIntegrateTest.class, UUID.randomUUID().toString());
             final Configuration configuration = super.getBaseConfiguration();
-            configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+            configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
             configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
             configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
             configuration.setProperty(Constants.GREMLIN_SPARK_PERSIST_STORAGE_LEVEL, storageLevel);
@@ -112,7 +113,7 @@
         Spark.create("local[4]");
         final String rddName = TestHelper.makeTestDataDirectory(PersistedInputOutputRDDIntegrateTest.class, UUID.randomUUID().toString());
         final Configuration configuration = super.getBaseConfiguration();
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, rddName);
@@ -138,7 +139,7 @@
         final String rddName = TestHelper.makeTestDataDirectory(PersistedInputOutputRDDIntegrateTest.class, UUID.randomUUID().toString());
         final String rddName2 = TestHelper.makeTestDataDirectory(PersistedInputOutputRDDIntegrateTest.class, UUID.randomUUID().toString());
         final Configuration configuration = super.getBaseConfiguration();
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, rddName);
@@ -211,7 +212,7 @@
         final String rddName2 = TestHelper.makeTestDataDirectory(PersistedInputOutputRDDIntegrateTest.class, "testComplexChain", "graphRDD2");
         final Configuration configuration = super.getBaseConfiguration();
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_READER, GryoInputFormat.class.getCanonicalName());
-        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, SparkHadoopGraphProvider.PATHS.get("tinkerpop-modern-v3d0.kryo"));
+        configuration.setProperty(Constants.GREMLIN_HADOOP_INPUT_LOCATION, TestFiles.PATHS.get("tinkerpop-modern-v3d0.kryo"));
         configuration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_WRITER, PersistedOutputRDD.class.getCanonicalName());
         configuration.setProperty(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION, rddName);
         configuration.setProperty(Constants.GREMLIN_SPARK_PERSIST_CONTEXT, true);
diff --git a/spark-gremlin/src/test/resources/cucumber.properties b/spark-gremlin/src/test/resources/cucumber.properties
new file mode 100644
index 0000000..21cdec8
--- /dev/null
+++ b/spark-gremlin/src/test/resources/cucumber.properties
@@ -0,0 +1 @@
+guice.injector-source=org.apache.tinkerpop.gremlin.spark.SparkGraphFeatureIntegrateTest$WorldInjectorSource
\ No newline at end of file
diff --git a/spark-gremlin/src/test/resources/log4j-silent.properties b/spark-gremlin/src/test/resources/log4j-silent.properties
index 7c312f7..1818830 100644
--- a/spark-gremlin/src/test/resources/log4j-silent.properties
+++ b/spark-gremlin/src/test/resources/log4j-silent.properties
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
+# TinkerPop doesn't use log4j but hadoop does directly. Need this config to control output.
+
 # this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
 # required or else some logs throw error and use other log4j.properties files on the path.
 log4j.rootLogger=OFF, stdout
diff --git a/spark-gremlin/src/test/resources/log4j-test.properties b/spark-gremlin/src/test/resources/log4j-test.properties
index 1a84d2c..b91f809 100644
--- a/spark-gremlin/src/test/resources/log4j-test.properties
+++ b/spark-gremlin/src/test/resources/log4j-test.properties
@@ -15,6 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
+# TinkerPop doesn't use log4j but hadoop does directly. Need this config to control output.
+
 log4j.rootLogger=WARN, stdout
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
diff --git a/spark-gremlin/src/test/resources/logback-silent.xml b/spark-gremlin/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..cb9d252
--- /dev/null
+++ b/spark-gremlin/src/test/resources/logback-silent.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/spark-gremlin/src/test/resources/logback-test.xml b/spark-gremlin/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..257d1f1
--- /dev/null
+++ b/spark-gremlin/src/test/resources/logback-test.xml
@@ -0,0 +1,30 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.apache.spark" level="ERROR"/>
+    <logger name="org.apache.hadoop" level="ERROR"/>
+    <logger name="org.spark-project" level="ERROR"/>
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/sparql-gremlin/pom.xml b/sparql-gremlin/pom.xml
index 8239879..466867c 100644
--- a/sparql-gremlin/pom.xml
+++ b/sparql-gremlin/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <artifactId>tinkerpop</artifactId>
         <groupId>org.apache.tinkerpop</groupId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>sparql-gremlin</artifactId>
     <name>Apache TinkerPop :: SPARQL Gremlin</name>
@@ -24,8 +24,8 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/sparql-gremlin/src/test/resources/log4j-silent.properties b/sparql-gremlin/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 1825bb0..0000000
--- a/sparql-gremlin/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,23 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/sparql-gremlin/src/test/resources/log4j-test.properties b/sparql-gremlin/src/test/resources/log4j-test.properties
deleted file mode 100644
index 79038b1..0000000
--- a/sparql-gremlin/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,23 +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.
-#
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
\ No newline at end of file
diff --git a/sparql-gremlin/src/test/resources/logback-silent.xml b/sparql-gremlin/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..4c5947d
--- /dev/null
+++ b/sparql-gremlin/src/test/resources/logback-silent.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/sparql-gremlin/src/test/resources/logback-test.xml b/sparql-gremlin/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..5d94c3b
--- /dev/null
+++ b/sparql-gremlin/src/test/resources/logback-test.xml
@@ -0,0 +1,26 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/tinkergraph-gremlin/pom.xml b/tinkergraph-gremlin/pom.xml
index 953030a..ea943b3 100644
--- a/tinkergraph-gremlin/pom.xml
+++ b/tinkergraph-gremlin/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>tinkerpop</artifactId>
-        <version>3.5.2-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
     </parent>
     <artifactId>tinkergraph-gremlin</artifactId>
     <name>Apache TinkerPop :: TinkerGraph Gremlin</name>
@@ -36,8 +36,14 @@
             <artifactId>commons-lang3</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+            <version>4.2.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
index 6f4f821..0343302 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
@@ -65,6 +65,8 @@
 @Graph.OptIn(Graph.OptIn.SUITE_STRUCTURE_INTEGRATE)
 @Graph.OptIn(Graph.OptIn.SUITE_PROCESS_STANDARD)
 @Graph.OptIn(Graph.OptIn.SUITE_PROCESS_COMPUTER)
+@Graph.OptIn(Graph.OptIn.SUITE_PROCESS_LIMITED_STANDARD)
+@Graph.OptIn(Graph.OptIn.SUITE_PROCESS_LIMITED_COMPUTER)
 public final class TinkerGraph implements Graph {
 
     static {
@@ -305,18 +307,18 @@
                                                                   final Object... ids) {
         final Iterator<T> iterator;
         if (0 == ids.length) {
-            iterator = new TinkerGraphIterator<T>(elements.values().iterator());
+            iterator = new TinkerGraphIterator<>(elements.values().iterator());
         } else {
             final List<Object> idList = Arrays.asList(ids);
-            validateHomogenousIds(idList);
 
-            // if the type is of Element - have to look each up because it might be an Attachable instance or
-            // other implementation. the assumption is that id conversion is not required for detached
-            // stuff - doesn't seem likely someone would detach a Titan vertex then try to expect that
-            // vertex to be findable in OrientDB
-            return clazz.isAssignableFrom(ids[0].getClass()) ?
-                    new TinkerGraphIterator<T>(IteratorUtils.filter(IteratorUtils.map(idList, id -> elements.get(clazz.cast(id).id())).iterator(), Objects::nonNull))
-                    : new TinkerGraphIterator<T>(IteratorUtils.filter(IteratorUtils.map(idList, id -> elements.get(idManager.convert(id))).iterator(), Objects::nonNull));
+            // TinkerGraph can take a Vertex/Edge or any object as an "id". If it is an Element then we just cast
+            // to that type and pop off the identifier. there is no need to pass that through the IdManager since
+            // the assumption is that if it's already an Element, its identifier must be valid to the Graph and to
+            // its associated IdManager. All other objects are passed to the IdManager for conversion.
+            return new TinkerGraphIterator<>(IteratorUtils.filter(IteratorUtils.map(idList, id -> {
+                final Object iid = clazz.isAssignableFrom(id.getClass()) ? clazz.cast(id).id() : idManager.convert(id);
+                return elements.get(idManager.convert(iid));
+            }).iterator(), Objects::nonNull));
         }
         return TinkerHelper.inComputerMode(this) ?
                 (Iterator<T>) (clazz.equals(Vertex.class) ?
@@ -336,19 +338,6 @@
         return features;
     }
 
-    private void validateHomogenousIds(final List<Object> ids) {
-        final Iterator<Object> iterator = ids.iterator();
-        Object id = iterator.next();
-        if (id == null)
-            throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();
-        final Class firstClass = id.getClass();
-        while (iterator.hasNext()) {
-            id = iterator.next();
-            if (id == null || !id.getClass().equals(firstClass))
-                throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();
-        }
-    }
-
     public class TinkerGraphFeatures implements Features {
 
         private final TinkerGraphGraphFeatures graphFeatures = new TinkerGraphGraphFeatures();
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphAllowNullFeatureTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphAllowNullFeatureTest.java
new file mode 100644
index 0000000..4c226aa
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphAllowNullFeatureTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.tinkergraph;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Stage;
+import io.cucumber.guice.CucumberModules;
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.apache.tinkerpop.gremlin.features.AbstractGuiceFactory;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(
+        tags = "@AllowNullPropertyValues",
+        glue = { "org.apache.tinkerpop.gremlin.features" },
+        objectFactory = TinkerGraphAllowNullFeatureTest.TinkerGraphGuiceFactory.class,
+        features = { "../gremlin-test/features" },
+        plugin = {"pretty", "junit:target/cucumber.xml"})
+public class TinkerGraphAllowNullFeatureTest {
+
+    public static class TinkerGraphGuiceFactory extends AbstractGuiceFactory {
+        public TinkerGraphGuiceFactory() {
+            super(Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule()));
+        }
+    }
+
+    public static final class ServiceModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            bind(World.class).to(TinkerGraphWorld.NullWorld.class);
+        }
+    }
+}
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphComputerFeatureTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphComputerFeatureTest.java
new file mode 100644
index 0000000..e996a23
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphComputerFeatureTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.tinkergraph;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Stage;
+import io.cucumber.guice.CucumberModules;
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.apache.tinkerpop.gremlin.features.AbstractGuiceFactory;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(
+        tags = "not @RemoteOnly",
+        glue = { "org.apache.tinkerpop.gremlin.features" },
+        objectFactory = TinkerGraphComputerFeatureTest.TinkerGraphGuiceFactory.class,
+        features = { "../gremlin-test/features" },
+        plugin = {"pretty", "junit:target/cucumber.xml"})
+public class TinkerGraphComputerFeatureTest {
+
+    public static class TinkerGraphGuiceFactory extends AbstractGuiceFactory {
+        public TinkerGraphGuiceFactory() {
+            super(Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule()));
+        }
+    }
+
+    public static final class ServiceModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            bind(World.class).to(TinkerGraphWorld.ComputerWorld.class);
+        }
+    }
+}
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphFeatureTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphFeatureTest.java
new file mode 100644
index 0000000..5ace402
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphFeatureTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.tinkergraph;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Stage;
+import io.cucumber.guice.CucumberModules;
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.apache.tinkerpop.gremlin.features.AbstractGuiceFactory;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(
+        tags = "not @RemoteOnly and not @GraphComputerOnly and not @AllowNullPropertyValues",
+        glue = { "org.apache.tinkerpop.gremlin.features" },
+        objectFactory = TinkerGraphFeatureTest.TinkerGraphGuiceFactory.class,
+        features = { "../gremlin-test/features" },
+        plugin = {"pretty", "junit:target/cucumber.xml"})
+public class TinkerGraphFeatureTest {
+
+    public static class TinkerGraphGuiceFactory extends AbstractGuiceFactory {
+        public TinkerGraphGuiceFactory() {
+            super(Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule()));
+        }
+    }
+
+    public static final class ServiceModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            bind(World.class).to(TinkerGraphWorld.class);
+        }
+    }
+}
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java
new file mode 100644
index 0000000..cda080f
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java
@@ -0,0 +1,154 @@
+/*
+ * 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.tinkergraph;
+
+import io.cucumber.java.Scenario;
+import org.apache.commons.configuration2.BaseConfiguration;
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.MapConfiguration;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
+import org.junit.AssumptionViolatedException;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+/**
+ * The {@link World} implementation for TinkerGraph that provides the {@link GraphTraversalSource} instances required
+ * by the Gherkin test suite.
+ */
+public class TinkerGraphWorld implements World {
+    private static final TinkerGraph modern = TinkerFactory.createModern();
+    private static final TinkerGraph classic = TinkerFactory.createClassic();
+    private static final TinkerGraph crew = TinkerFactory.createTheCrew();
+    private static final TinkerGraph sink = TinkerFactory.createKitchenSink();
+    private static final TinkerGraph grateful = TinkerFactory.createGratefulDead();
+
+    @Override
+    public GraphTraversalSource getGraphTraversalSource(final LoadGraphWith.GraphData graphData) {
+        if (null == graphData)
+            return TinkerGraph.open(getNumberIdManagerConfiguration()).traversal();
+        else if (graphData == LoadGraphWith.GraphData.CLASSIC)
+            return classic.traversal();
+        else if (graphData == LoadGraphWith.GraphData.CREW)
+            return crew.traversal();
+        else if (graphData == LoadGraphWith.GraphData.MODERN)
+            return modern.traversal();
+        else if (graphData == LoadGraphWith.GraphData.SINK)
+            return sink.traversal();
+        else if (graphData == LoadGraphWith.GraphData.GRATEFUL)
+            return grateful.traversal();
+        else
+            throw new UnsupportedOperationException("GraphData not supported: " + graphData.name());
+    }
+
+    @Override
+    public String changePathToDataFile(final String pathToFileFromGremlin) {
+        return ".." + File.separator + pathToFileFromGremlin;
+    }
+
+    private static Configuration getNumberIdManagerConfiguration() {
+        final Configuration conf = new BaseConfiguration();
+        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
+        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
+        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, TinkerGraph.DefaultIdManager.LONG.name());
+        return conf;
+    }
+
+    /**
+     * Enables the storing of {@code null} property values when testing.
+     */
+    public static class NullWorld extends TinkerGraphWorld {
+
+        @Override
+        public GraphTraversalSource getGraphTraversalSource(final LoadGraphWith.GraphData graphData) {
+            if (graphData != null)
+                throw new UnsupportedOperationException("GraphData not supported: " + graphData.name());
+
+            final Configuration conf = TinkerGraphWorld.getNumberIdManagerConfiguration();
+            conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_ALLOW_NULL_PROPERTY_VALUES, true);
+            return TinkerGraph.open(conf).traversal();
+        }
+    }
+
+    /**
+     * Turns on {@link GraphComputer} when testing.
+     */
+    public static class ComputerWorld extends TinkerGraphWorld {
+        private static final Random RANDOM = TestHelper.RANDOM;
+
+        private static final List<String> TAGS_TO_IGNORE = Arrays.asList(
+                "@StepDrop",
+                "@StepV",
+                "@GraphComputerVerificationOneBulk",
+                "@GraphComputerVerificationStrategyNotSupported",
+                "@GraphComputerVerificationMidVNotSupported",
+                "@GraphComputerVerificationInjectionNotSupported",
+                "@GraphComputerVerificationStarGraphExceeded",
+                "@GraphComputerVerificationReferenceOnly");
+
+        private static final List<String> SCENARIOS_TO_IGNORE = Arrays.asList(
+                "g_V_group_byXoutE_countX_byXnameX",
+                "g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_descX",
+                "g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX",
+                "g_V_group_byXageX",
+                "g_V_order_byXoutE_count_descX",
+                "g_V_both_both_dedup_byXoutE_countX_name",
+                "g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX",
+                "g_V_hasLabelXsoftwareX_order_byXnameX_index_withXmapX",
+                "g_V_order_byXname_descX_barrier_dedup_age_name");
+
+        @Override
+        public void beforeEachScenario(final Scenario scenario) {
+            final List<String> ignores = TAGS_TO_IGNORE.stream().filter(t -> scenario.getSourceTagNames().contains(t)).collect(Collectors.toList());
+            if (!ignores.isEmpty())
+                throw new AssumptionViolatedException(String.format("This scenario is not supported with GraphComputer: %s", ignores));
+
+            // the following needs some further investigation.........may need to improve the definition of result
+            // equality with map<list>
+            final String scenarioName = scenario.getName();
+            if (SCENARIOS_TO_IGNORE.contains(scenarioName))
+                throw new AssumptionViolatedException("There are some internal ordering issues with result where equality is not required but is being enforced");
+        }
+
+        @Override
+        public GraphTraversalSource getGraphTraversalSource(final LoadGraphWith.GraphData graphData) {
+            if (null == graphData)
+                throw new AssumptionViolatedException("GraphComputer does not support mutation");
+
+            return super.getGraphTraversalSource(graphData).withStrategies(VertexProgramStrategy.create(new MapConfiguration(new HashMap<String, Object>() {{
+                put(VertexProgramStrategy.WORKERS, Runtime.getRuntime().availableProcessors());
+                put(VertexProgramStrategy.GRAPH_COMPUTER, RANDOM.nextBoolean() ?
+                        GraphComputer.class.getCanonicalName() :
+                        TinkerGraphComputer.class.getCanonicalName());
+            }})));
+        }
+    }
+}
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphProcessStandardTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphProcessStandardTest.java
index abff119..54ab306 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphProcessStandardTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphProcessStandardTest.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.tinkergraph.process;
 
 import org.apache.tinkerpop.gremlin.GraphProviderClass;
-import org.apache.tinkerpop.gremlin.process.ProcessStandardSuite;
+import org.apache.tinkerpop.gremlin.process.ProcessLimitedStandardSuite;
 import org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphProvider;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.junit.runner.RunWith;
@@ -29,7 +29,7 @@
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-@RunWith(ProcessStandardSuite.class)
+@RunWith(ProcessLimitedStandardSuite.class)
 @GraphProviderClass(provider = TinkerGraphProvider.class, graph = TinkerGraph.class)
 public class TinkerGraphProcessStandardTest {
 }
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphIdManagerTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphIdManagerTest.java
index e589c5c..8dd2e12 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphIdManagerTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphIdManagerTest.java
@@ -54,7 +54,8 @@
                     {"coerceInt", 100, 200, 300},
                     {"coerceDouble", 100d, 200d, 300d},
                     {"coerceFloat", 100f, 200f, 300f},
-                    {"coerceString", "100", "200", "300"}});
+                    {"coerceString", "100", "200", "300"},
+                    {"coerceMixed", 100d, 200f, "300"}});
         }
 
         @Parameterized.Parameter(value = 0)
@@ -120,7 +121,8 @@
         public static Iterable<Object[]> data() {
             return Arrays.asList(new Object[][]{
                     {"coerceUuid", vertexId, edgeId, vertexPropertyId},
-                    {"coerceString", vertexId.toString(), edgeId.toString(), vertexPropertyId.toString()}});
+                    {"coerceString", vertexId.toString(), edgeId.toString(), vertexPropertyId.toString()},
+                    {"coerceMixed", vertexId, edgeId, vertexPropertyId.toString()}});
         }
 
         @Parameterized.Parameter(value = 0)
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index a6611bd..1bca9dc 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -76,6 +76,7 @@
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
@@ -879,6 +880,24 @@
         assertEquals(3, traversal().withEmbedded(graph).V().hasLabel("person").count().next().intValue());
     }
 
+    @Test
+    public void shouldAllowHeterogeneousIdsWithAnyManager() {
+        final Configuration anyManagerConfig = new BaseConfiguration();
+        anyManagerConfig.addProperty(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, TinkerGraph.DefaultIdManager.ANY.name());
+        anyManagerConfig.addProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, TinkerGraph.DefaultIdManager.ANY.name());
+        anyManagerConfig.addProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, TinkerGraph.DefaultIdManager.ANY.name());
+        final Graph graph = TinkerGraph.open(anyManagerConfig);
+        final GraphTraversalSource g = traversal().withEmbedded(graph);
+
+        final UUID uuid = UUID.fromString("0E939658-ADD2-4598-A722-2FC178E9B741");
+        g.addV("person").property(T.id, 100).
+                addV("person").property(T.id, "1000").
+                addV("person").property(T.id, "1001").
+                addV("person").property(T.id, uuid).iterate();
+
+        assertEquals(3, g.V(100, "1000", uuid).count().next().intValue());
+    }
+
     /**
      * Coerces a {@code Color} to a {@link TinkerGraph} during serialization.  Demonstrates how custom serializers
      * can be developed that can coerce one value to another during serialization.
diff --git a/tinkergraph-gremlin/src/test/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory b/tinkergraph-gremlin/src/test/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory
new file mode 100644
index 0000000..54484d4
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory
@@ -0,0 +1,3 @@
+org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphFeatureTest$TinkerGraphGuiceFactory
+org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphComputerFeatureTest$TinkerGraphGuiceFactory
+org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphAllowNullFeatureTest$TinkerGraphGuiceFactory
\ No newline at end of file
diff --git a/tinkergraph-gremlin/src/test/resources/log4j-silent.properties b/tinkergraph-gremlin/src/test/resources/log4j-silent.properties
deleted file mode 100644
index 7c312f7..0000000
--- a/tinkergraph-gremlin/src/test/resources/log4j-silent.properties
+++ /dev/null
@@ -1,26 +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.
-
-# this file should always have logging set to OFF.  it seems, however, that an appender of some sort is
-# required or else some logs throw error and use other log4j.properties files on the path.
-log4j.rootLogger=OFF, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-# need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
\ No newline at end of file
diff --git a/tinkergraph-gremlin/src/test/resources/log4j-test.properties b/tinkergraph-gremlin/src/test/resources/log4j-test.properties
deleted file mode 100644
index 067fa7b..0000000
--- a/tinkergraph-gremlin/src/test/resources/log4j-test.properties
+++ /dev/null
@@ -1,24 +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.
-
-log4j.rootLogger=WARN, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=[%p] %C - %m%n
-
-# need to turn this on so that we know the test seed
-log4j.logger.org.apache.tinkerpop.gremlin.TestHelper=INFO
\ No newline at end of file
diff --git a/tinkergraph-gremlin/src/test/resources/logback-silent.xml b/tinkergraph-gremlin/src/test/resources/logback-silent.xml
new file mode 100644
index 0000000..cb9d252
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/resources/logback-silent.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="OFF">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/tinkergraph-gremlin/src/test/resources/logback-test.xml b/tinkergraph-gremlin/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..f1bca0d
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/resources/logback-test.xml
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+<configuration>
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>[%p] %C - %m%n</pattern>
+        </encoder>
+    </appender>
+    <!-- need to turn this on so that we know the test seed -->
+    <logger name="org.apache.tinkerpop.gremlin.TestHelper" level="INFO"/>
+    <root level="WARN">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
\ No newline at end of file