You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/02/13 22:26:12 UTC

[3/3] incubator-tinkerpop git commit: OMG -- no more submit(g.compute()). TraversalEngine is now an interface with Graph.engine() being the user specified traversal engine for all traversals emanating from that graph. Insanity........ this was a crazy cr

OMG -- no more submit(g.compute()). TraversalEngine is now an interface with Graph.engine() being the user specified traversal engine for all traversals emanating from that graph. Insanity........ this was a crazy crazy crazy amount of work... there will be cleaning for days to come. Fixed #565


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/d70378f4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/d70378f4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/d70378f4

Branch: refs/heads/master
Commit: d70378f48ffce15b10b61141547b6e10db514397
Parents: 84c1632
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Feb 13 14:25:52 2015 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Feb 13 14:26:01 2015 -0700

----------------------------------------------------------------------
 .../tinkerpop/gremlin/process/Traversal.java    | 54 +++++---------
 .../gremlin/process/TraversalEngine.java        | 22 +++++-
 .../traversal/TraversalVertexProgram.java       | 14 ++--
 .../traversal/step/map/ComputerResultStep.java  | 70 +++++++++++-------
 .../computer/util/DefaultComputerResult.java    |  2 +
 .../graph/traversal/DefaultGraphTraversal.java  |  4 +-
 .../process/graph/traversal/EdgeTraversal.java  |  2 +-
 .../graph/traversal/ElementTraversal.java       |  6 --
 .../process/graph/traversal/GraphTraversal.java | 19 +----
 .../traversal/VertexPropertyTraversal.java      |  2 +-
 .../graph/traversal/VertexTraversal.java        |  2 +-
 .../gremlin/process/graph/traversal/__.java     |  8 +--
 .../graph/traversal/step/map/BackStep.java      |  2 +-
 .../graph/traversal/step/map/SelectOneStep.java |  2 +-
 .../graph/traversal/step/map/SelectStep.java    |  2 +-
 .../traversal/step/sideEffect/GraphStep.java    |  2 +-
 .../traversal/step/sideEffect/GroupStep.java    |  2 +-
 .../traversal/step/sideEffect/ProfileStep.java  |  6 +-
 .../sideEffect/mapreduce/GroupMapReduce.java    |  7 +-
 .../traversal/step/util/ComputerAwareStep.java  |  4 +-
 .../ComparatorHolderRemovalStrategy.java        |  2 +-
 .../traversal/strategy/ReducingStrategy.java    |  2 +-
 .../strategy/TraversalVerificationStrategy.java |  7 +-
 .../traversal/util/EmptyGraphTraversal.java     |  5 --
 .../process/traversal/DefaultTraversal.java     | 76 ++++++++++++++------
 .../engine/ComputerTraversalEngine.java         | 57 +++++++++++++++
 .../engine/StandardTraversalEngine.java         | 54 ++++++++++++++
 .../lambda/AbstractLambdaTraversal.java         | 23 ++++--
 .../traversal/lambda/HasNextTraversal.java      | 16 ++++-
 .../process/traversal/util/EmptyTraversal.java  | 18 +++--
 .../tinkerpop/gremlin/structure/Graph.java      | 14 ++--
 .../structure/strategy/PartitionStrategy.java   |  9 +--
 .../structure/strategy/StrategyGraph.java       | 11 +++
 .../structure/util/batch/BatchGraph.java        | 12 ++++
 .../structure/util/empty/EmptyGraph.java        | 12 ++++
 .../step/branch/GroovyUnionTest.groovy          |  2 +
 .../step/filter/GroovySampleTest.groovy         |  3 +
 .../step/filter/GroovyWhereTest.groovy          |  3 +
 .../traversal/step/map/GroovyCountTest.groovy   |  2 +
 .../traversal/step/map/GroovyFoldTest.groovy    |  2 +
 .../traversal/step/map/GroovyMapTest.groovy     |  3 +
 .../traversal/step/map/GroovyOrderTest.groovy   |  8 ++-
 .../traversal/step/map/GroovySelectTest.groovy  |  7 ++
 .../process/GroovyProcessComputerSuite.java     |  2 +-
 .../AbstractImportCustomizerProvider.java       |  8 ++-
 .../groovy/engine/GroovyTraversalScript.java    | 17 ++---
 .../tinkerpop/gremlin/AbstractGremlinTest.java  |  5 +-
 .../apache/tinkerpop/gremlin/GraphProvider.java |  7 +-
 .../gremlin/process/ProcessComputerSuite.java   |  1 +
 .../ranking/PageRankVertexProgramTest.java      |  2 +
 .../graph/traversal/step/branch/BranchTest.java |  4 +-
 .../graph/traversal/step/branch/ChooseTest.java |  2 +-
 .../graph/traversal/step/branch/LocalTest.java  | 18 ++---
 .../graph/traversal/step/branch/RepeatTest.java | 18 ++---
 .../graph/traversal/step/branch/UnionTest.java  | 12 ++--
 .../graph/traversal/step/filter/AndTest.java    |  4 +-
 .../graph/traversal/step/filter/CoinTest.java   |  4 +-
 .../traversal/step/filter/CyclicPathTest.java   |  4 +-
 .../graph/traversal/step/filter/ExceptTest.java | 19 +++--
 .../graph/traversal/step/filter/FilterTest.java | 25 ++++---
 .../graph/traversal/step/filter/HasNotTest.java |  4 +-
 .../graph/traversal/step/filter/HasTest.java    | 28 ++++----
 .../graph/traversal/step/filter/IsTest.java     | 10 +--
 .../graph/traversal/step/filter/OrTest.java     |  4 +-
 .../graph/traversal/step/filter/RetainTest.java |  8 ++-
 .../graph/traversal/step/filter/SampleTest.java |  9 ++-
 .../traversal/step/filter/SimplePathTest.java   |  4 +-
 .../graph/traversal/step/filter/WhereTest.java  |  8 ++-
 .../graph/traversal/step/map/BackTest.java      | 18 ++---
 .../graph/traversal/step/map/CoalesceTest.java  | 10 +--
 .../graph/traversal/step/map/CountTest.java     | 16 +++--
 .../graph/traversal/step/map/FoldTest.java      |  6 +-
 .../graph/traversal/step/map/MapTest.java       | 13 +++-
 .../graph/traversal/step/map/MaxTest.java       |  4 +-
 .../graph/traversal/step/map/MeanTest.java      |  2 +-
 .../graph/traversal/step/map/MinTest.java       |  4 +-
 .../graph/traversal/step/map/OrderTest.java     | 20 ++++--
 .../graph/traversal/step/map/PathTest.java      |  4 +-
 .../traversal/step/map/PropertiesTest.java      |  4 +-
 .../graph/traversal/step/map/SelectTest.java    | 20 ++++--
 .../graph/traversal/step/map/UnfoldTest.java    |  6 +-
 .../graph/traversal/step/map/ValueMapTest.java  |  9 ++-
 .../graph/traversal/step/map/VertexTest.java    | 50 ++++++-------
 .../step/sideEffect/AggregateTest.java          |  6 +-
 .../step/sideEffect/GroupCountTest.java         | 12 ++--
 .../traversal/step/sideEffect/GroupTest.java    | 10 +--
 .../traversal/step/sideEffect/InjectTest.java   |  4 +-
 .../traversal/step/sideEffect/ProfileTest.java  |  4 +-
 .../traversal/step/sideEffect/SackTest.java     |  8 ++-
 .../step/sideEffect/SideEffectCapTest.java      |  4 +-
 .../traversal/step/sideEffect/StoreTest.java    |  8 +--
 .../traversal/step/sideEffect/TreeTest.java     |  6 +-
 .../strategy/RangeByIsCountStrategyTest.java    |  4 +-
 .../TraversalVerificationStrategyTest.java      | 21 +++---
 .../process/traversal/DefaultTraversalTest.java |  4 +-
 .../structure/GraphConstructionTest.java        |  1 +
 .../process/util/TraversalHelperTest.java       |  9 +--
 .../groovy/plugin/HadoopRemoteAcceptor.java     |  4 +-
 .../strategy/HadoopElementStepStrategy.java     |  2 +-
 .../gremlin/hadoop/structure/HadoopGraph.java   | 21 ++++--
 .../gremlin/neo4j/structure/Neo4jGraph.java     | 19 ++++-
 .../strategy/TinkerElementStepStrategy.java     |  2 +-
 .../strategy/TinkerGraphStepStrategy.java       |  2 +-
 .../tinkergraph/structure/TinkerFactory.java    |  2 +-
 .../tinkergraph/structure/TinkerGraph.java      | 21 +++++-
 .../tinkergraph/TinkerGraphGraphProvider.java   |  3 +-
 .../tinkergraph/structure/TinkerGraphTest.java  | 10 ++-
 107 files changed, 762 insertions(+), 418 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
index d50efe0..94139ea 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
@@ -18,12 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.process;
 
-import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Reversible;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
@@ -50,7 +48,7 @@ import java.util.stream.Collectors;
  * This is the base interface for all traversal's, where each extending interface is seen as a domain specific language.
  * For example, {@link GraphTraversal} is a domain specific language for traversing a graph using "graph concepts" (e.g. vertices, edges).
  * Another example may represent the graph using "social concepts" (e.g. people, cities, artifacts).
- * A {@link Traversal} is evaluated in one of two ways: {@link TraversalEngine#STANDARD} (OLTP) and {@link TraversalEngine#COMPUTER} (OLAP).
+ * A {@link Traversal} is evaluated in one of two ways: {@link StandardTraversalEngine} (OLTP) and {@link ComputerTraversalEngine} (OLAP).
  * OLTP traversals leverage an iterator and are executed within a single JVM (with data access allowed to be remote).
  * OLAP traversals leverage {@link GraphComputer} and are executed between multiple JVMs (and/or cores).
  *
@@ -73,25 +71,6 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
     }
 
     /**
-     * Submit the traversal to a {@link GraphComputer} for OLAP execution.
-     * This method should execute the traversal via {@link TraversalVertexProgram}.
-     * It should then wrap the {@link org.apache.tinkerpop.gremlin.process.computer.util.DefaultComputerResult} in a new {@link Traversal} containing a {@link ComputerResultStep}.
-     *
-     * @param computer the GraphComputer to execute the traversal on
-     * @return a new traversal with the starts being the results of the TraversalVertexProgram
-     */
-    public default Traversal<S, E> submit(final GraphComputer computer) {
-        try {
-            final TraversalVertexProgram vertexProgram = TraversalVertexProgram.build().traversal(this.asAdmin()).create();
-            final ComputerResult result = computer.program(vertexProgram).submit().get();
-            final Traversal.Admin<S, S> traversal = new DefaultTraversal<>(result.graph().getClass());
-            return traversal.asAdmin().addStep(new ComputerResultStep<>(traversal, result, vertexProgram, true));
-        } catch (final Exception e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    /**
      * Return an {@link Optional} of the next E object in the traversal.
      * If the traversal is empty, then an {@link Optional#empty()} is returned.
      *
@@ -154,8 +133,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
      */
     public default <C extends Collection<E>> C fill(final C collection) {
         try {
-            if (!this.asAdmin().getEngine().isPresent())
-                this.asAdmin().applyStrategies(TraversalEngine.STANDARD);
+            if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
             // use the end step so the results are bulked
             final Step<?, E> endStep = this.asAdmin().getEndStep();
             while (true) {
@@ -177,8 +155,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
      */
     public default <A, B> Traversal<A, B> iterate() {
         try {
-            if (!this.asAdmin().getEngine().isPresent())
-                this.asAdmin().applyStrategies(TraversalEngine.STANDARD);
+            if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
             // use the end step so the results are bulked
             final Step<?, E> endStep = this.asAdmin().getEndStep();
             while (true) {
@@ -244,7 +221,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
          * @param starts an iterators of traversers
          */
         public default void addStarts(final Iterator<Traverser<S>> starts) {
-            if(!this.getEngine().isPresent()) this.applyStrategies(TraversalEngine.STANDARD);
+            if (!this.isLocked()) this.applyStrategies();
             this.getStartStep().addStarts(starts);
         }
 
@@ -255,7 +232,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
          * @param start a traverser to add to the traversal
          */
         public default void addStart(final Traverser<S> start) {
-            if(!this.getEngine().isPresent()) this.applyStrategies(TraversalEngine.STANDARD);
+            if (!this.isLocked()) this.applyStrategies();
             this.getStartStep().addStart(start);
         }
 
@@ -340,18 +317,17 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
          * Once the strategies are applied, the traversal is "locked" and can no longer have steps added to it.
          * The order of operations for strategy applications should be: globally id steps, apply strategies to root traversal, then to nested traversals.
          *
-         * @param engine the engine that will ultimately execute the traversal.
          * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
          */
-        public void applyStrategies(final TraversalEngine engine) throws IllegalStateException;
+        public void applyStrategies() throws IllegalStateException;
 
         /**
-         * When the {@link TraversalStrategies} have been applied, the destined {@link TraversalEngine} has been declared.
-         * Once a traversal engine has been declared, the traversal can no longer be extended, only executed.
-         *
-         * @return whether the traversal engine has been defined or not.
+         * @return whether the traversal engine associated with this traversal.
          */
-        public Optional<TraversalEngine> getEngine();
+        public TraversalEngine getEngine();
+
+        public void setEngine(final TraversalEngine engine);
+
 
         /**
          * Get the {@link TraverserGenerator} associated with this traversal.
@@ -376,7 +352,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
                 requirements.add(TraverserRequirement.SIDE_EFFECTS);
             if (this.getSideEffects().getSackInitialValue().isPresent())
                 requirements.add(TraverserRequirement.SACK);
-            if (this.getEngine().isPresent() && this.getEngine().get().equals(TraversalEngine.COMPUTER))
+            if (this.getEngine().isComputer())
                 requirements.add(TraverserRequirement.BULK);
             return requirements;
         }
@@ -450,6 +426,8 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
          */
         public Traversal.Admin<S, E> clone() throws CloneNotSupportedException;
 
+        public boolean isLocked();
+
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
index 276d483..c7b84b0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
@@ -18,10 +18,28 @@
  */
 package org.apache.tinkerpop.gremlin.process;
 
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.io.Serializable;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public enum TraversalEngine {
+public interface TraversalEngine extends Serializable {
+
+    public enum Type {STANDARD, COMPUTER}
+
+    public void processTraversal(final Traversal.Admin<?, ?> traversal);
+
+    public Type getType();
+
+    public void setGraph(final Graph graph);
+
+    public default boolean isStandard() {
+        return this.getType().equals(Type.STANDARD);
+    }
 
-    STANDARD, COMPUTER
+    public default boolean isComputer() {
+        return this.getType().equals(Type.COMPUTER);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index dc68f9e..be22349 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer.traversal;
 
+import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.gremlin.process.computer.MessageCombiner;
 import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
 import org.apache.tinkerpop.gremlin.process.computer.Messenger;
 import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
 import org.apache.tinkerpop.gremlin.process.computer.util.LambdaHolder;
@@ -44,7 +45,6 @@ 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.IteratorUtils;
-import org.apache.commons.configuration.Configuration;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -108,14 +108,16 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
             throw new IllegalArgumentException("The configuration does not have a traversal supplier");
         }
         this.traversal = this.traversalSupplier.get().get();
-        if (!this.traversal.getEngine().isPresent())
-            this.traversal.applyStrategies(TraversalEngine.COMPUTER);
+        if (!this.traversal.isLocked())
+            this.traversal.applyStrategies();
+
+        ((ComputerResultStep) this.traversal.getEndStep()).asIdentity = true;
         this.traversalMatrix = new TraversalMatrix<>(this.traversal);
         for (final MapReducer<?, ?, ?, ?, ?> mapReducer : TraversalHelper.getStepsOfAssignableClassRecurssively(MapReducer.class, this.traversal)) {
             this.mapReducers.add(mapReducer.getMapReduce());
         }
-        if (!(this.traversal.getEndStep() instanceof SideEffectCapStep))
-            this.mapReducers.add(new TraverserMapReduce(this.traversal.getEndStep()));
+        if (!(this.traversal.getEndStep().getPreviousStep() instanceof SideEffectCapStep))
+            this.mapReducers.add(new TraverserMapReduce(this.traversal.getEndStep().getPreviousStep()));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
index 80ee03c..744805b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.process.Step;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
-import org.apache.tinkerpop.gremlin.process.computer.Memory;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
@@ -33,6 +33,7 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.detached.Attachable;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -44,56 +45,73 @@ import java.util.Set;
  */
 public final class ComputerResultStep<S> extends AbstractStep<S, S> {
 
-    private final Iterator<Traverser.Admin<S>> traversers;
-    private final Graph graph;
-    private final Memory memory;
-    private final Traversal.Admin<?, ?> computerTraversal;
+    private final transient GraphComputer graphComputer;
+
+    private Iterator<Traverser.Admin<S>> traversers;
+    private Graph graph;
     private final boolean attachElements; // should be part of graph computer with "propagate properties"
+    public boolean first = true;
+    public boolean asIdentity = false;
 
-    public ComputerResultStep(final Traversal.Admin traversal, final ComputerResult result, final TraversalVertexProgram traversalVertexProgram, final boolean attachElements) {
+    public ComputerResultStep(final Traversal.Admin traversal, final GraphComputer graphComputer, final boolean attachElements) {
         super(traversal);
-        this.graph = result.graph();
-        this.memory = result.memory();
         this.attachElements = attachElements;
-        this.memory.keys().forEach(key -> traversal.getSideEffects().set(key, this.memory.get(key)));
-        this.computerTraversal = traversalVertexProgram.getTraversal();
+        this.graphComputer = graphComputer;
+    }
+
+    @Override
+    public Traverser<S> processNextStart() {
+        if (this.asIdentity) {
+            return this.starts.next();
+        }
+        if (this.first) {
+            try {
+                final TraversalVertexProgram vertexProgram = TraversalVertexProgram.build().traversal(this.getTraversal()).create();
+                populateTraversers(this.graphComputer.program(vertexProgram).submit().get());
+            } catch (Exception e) {
+                throw new IllegalStateException(e.getMessage(), e);
+            }
+            this.first = false;
+        }
+
+        final Traverser.Admin<S> traverser = this.traversers.next();
+        if (this.attachElements && (traverser.get() instanceof Attachable))
+            traverser.set((S) ((Attachable) traverser.get()).attach(this.graph));
+        return traverser;
+    }
 
-        final Step endStep = this.computerTraversal.getEndStep();
+    public void populateTraversers(final ComputerResult result) {
+        this.graph = result.graph();
+        result.memory().keys().forEach(key -> this.getTraversal().getSideEffects().set(key, result.memory().get(key)));
+        final Step endStep = this.getPreviousStep();
         if (endStep instanceof SideEffectCapStep) {
             final List<String> sideEffectKeys = ((SideEffectCapStep<?, ?>) endStep).getSideEffectKeys();
             if (sideEffectKeys.size() == 1)
-                this.traversers = IteratorUtils.of(this.computerTraversal.getTraverserGenerator().generate(this.memory.get(sideEffectKeys.get(0)), this, 1l));
+                this.traversers = IteratorUtils.of(this.getTraversal().getTraverserGenerator().generate(result.memory().get(sideEffectKeys.get(0)), this, 1l));
             else {
                 final Map<String, Object> sideEffects = new HashMap<>();
                 for (final String sideEffectKey : sideEffectKeys) {
-                    sideEffects.put(sideEffectKey, this.memory.get(sideEffectKey));
+                    sideEffects.put(sideEffectKey, result.memory().get(sideEffectKey));
                 }
-                this.traversers = IteratorUtils.of(this.computerTraversal.getTraverserGenerator().generate((S) sideEffects, this, 1l));
+                this.traversers = IteratorUtils.of(this.getTraversal().getTraverserGenerator().generate((S) sideEffects, this, 1l));
             }
         } else {
-            this.traversers = this.memory.get(TraverserMapReduce.TRAVERSERS);
+            this.traversers = result.memory().get(TraverserMapReduce.TRAVERSERS);
         }
-    }
-
-    @Override
-    public Traverser<S> processNextStart() {
-        final Traverser.Admin<S> traverser = this.traversers.next();
-        if (this.attachElements && (traverser.get() instanceof Attachable))
-            traverser.set((S) ((Attachable) traverser.get()).attach(this.graph));
-        return traverser;
+        this.first = false;
     }
 
     @Override
     public String toString() {
-        return TraversalHelper.makeStepString(this, this.computerTraversal);
+        return TraversalHelper.makeStepString(this);
     }
 
     @Override
     public Set<TraverserRequirement> getRequirements() {
-        return this.computerTraversal.getTraverserRequirements();
+        return EnumSet.of(TraverserRequirement.OBJECT);
     }
 
     public Traversal.Admin<?, ?> getComputerTraversal() {
-        return this.computerTraversal;
+        return this.getTraversal();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java
index da1ebfc..86dd200 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.computer.util;
 
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
@@ -36,6 +37,7 @@ public class DefaultComputerResult implements ComputerResult {
 
     public DefaultComputerResult(final Graph graph, final Memory memory) {
         this.graph = graph;
+        this.graph.engine(StandardTraversalEngine.instance());
         this.memory = memory;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
index 44bc92a..3279c9f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
@@ -25,8 +25,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
  */
 public class DefaultGraphTraversal<S, E> extends DefaultTraversal<S, E> implements GraphTraversal.Admin<S, E> {
 
-    public DefaultGraphTraversal(final Class emanatingClass) {
-        super(emanatingClass);
+    public DefaultGraphTraversal(final Object emanatingObject) {
+        super(emanatingObject);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/EdgeTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/EdgeTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/EdgeTraversal.java
index 39f7f26..e6d5a9a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/EdgeTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/EdgeTraversal.java
@@ -31,7 +31,7 @@ public interface EdgeTraversal extends ElementTraversal<Edge> {
 
     @Override
     default GraphTraversal<Edge, Edge> start() {
-        final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this.getClass());
+        final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this);
         return traversal.addStep(new StartStep<>(traversal, this));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
index 516acff..344227f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
@@ -54,12 +54,6 @@ public abstract interface ElementTraversal<A extends Element> {
         throw new UnsupportedOperationException("This method must be implemented by the element");
     }
 
-    //////////////////////////////////////////////////////////////////////
-
-    public default GraphTraversal<A, A> submit(final GraphComputer graphComputer) {
-        return this.start().submit(graphComputer);
-    }
-
     ///////////////////// MAP STEPS /////////////////////
 
     public default <E2> GraphTraversal<A, E2> map(final Function<Traverser<A>, E2> function) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
index 83e4175..15680c1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
@@ -23,12 +23,7 @@ import org.apache.tinkerpop.gremlin.process.Scope;
 import org.apache.tinkerpop.gremlin.process.Step;
 import org.apache.tinkerpop.gremlin.process.T;
 import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.lambda.LoopTraversal;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
@@ -165,18 +160,6 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     @Override
-    public default GraphTraversal<S, E> submit(final GraphComputer computer) {
-        try {
-            final TraversalVertexProgram vertexProgram = TraversalVertexProgram.build().traversal(this.asAdmin()).create();
-            final ComputerResult result = computer.program(vertexProgram).submit().get();
-            final GraphTraversal.Admin<S, S> traversal = new DefaultGraphTraversal<>(result.graph().getClass());
-            return traversal.addStep(new ComputerResultStep<>(traversal, result, vertexProgram, true));
-        } catch (final Exception e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
     public default GraphTraversal.Admin<S, E> asAdmin() {
         return (GraphTraversal.Admin<S, E>) this;
     }
@@ -789,7 +772,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     @Override
     public default void remove() {
         try {
-            this.asAdmin().applyStrategies(TraversalEngine.STANDARD);
+            this.asAdmin().applyStrategies();
             final Step<?, E> endStep = this.asAdmin().getEndStep();
             while (true) {
                 final Object object = endStep.next().get();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexPropertyTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexPropertyTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexPropertyTraversal.java
index 9c8cf2d..3abaf33 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexPropertyTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexPropertyTraversal.java
@@ -31,7 +31,7 @@ public interface VertexPropertyTraversal extends ElementTraversal<VertexProperty
 
     @Override
     default GraphTraversal<VertexProperty, VertexProperty> start() {
-        final GraphTraversal.Admin<VertexProperty, VertexProperty> traversal = new DefaultGraphTraversal<>(this.getClass());
+        final GraphTraversal.Admin<VertexProperty, VertexProperty> traversal = new DefaultGraphTraversal<>(this);
         return traversal.addStep(new StartStep<>(traversal, this));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexTraversal.java
index 55ec6c4..e24933a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/VertexTraversal.java
@@ -32,7 +32,7 @@ public interface VertexTraversal extends ElementTraversal<Vertex> {
 
     @Override
     default GraphTraversal<Vertex, Vertex> start() {
-        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.getClass());
+        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this);
         return traversal.addStep(new StartStep<>(traversal, this));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
index 56f1ff7..b303267 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
@@ -53,13 +53,7 @@ public class __ {
     //////////////////////////////////////////////////////////////////////
 
     public static <A> GraphTraversal<A, A> start() {
-        return new DefaultGraphTraversal<>(__.class);
-    }
-
-    //////////////////////////////////////////////////////////////////////
-
-    public static <A> GraphTraversal<A, A> submit(final GraphComputer graphComputer) {
-        return __.<A>start().submit(graphComputer);
+        return new DefaultGraphTraversal<>(new __());
     }
 
     ///////////////////// MAP STEPS /////////////////////

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
index f0f93ef..6a4c4c1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
@@ -48,7 +48,7 @@ public final class BackStep<S, E> extends MapStep<S, E> implements EngineDepende
 
     @Override
     public void onEngine(final TraversalEngine traversalEngine) {
-        this.requiresPaths = traversalEngine.equals(TraversalEngine.COMPUTER);
+        this.requiresPaths = traversalEngine.isComputer();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
index 88ae977..b1aaa1d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
@@ -59,7 +59,7 @@ public final class SelectOneStep<S, E> extends MapStep<S, E> implements Traversa
 
     @Override
     public void onEngine(final TraversalEngine traversalEngine) {
-        this.requiresPaths = traversalEngine.equals(TraversalEngine.COMPUTER) ?
+        this.requiresPaths = traversalEngine.isComputer() ?
                 TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent() :
                 TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
                         .filter(step -> step instanceof CollectingBarrierStep)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
index e0ccc0d..ee1d840 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
@@ -87,7 +87,7 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement
 
     @Override
     public void onEngine(final TraversalEngine traversalEngine) {
-        this.requiresPaths = traversalEngine.equals(TraversalEngine.COMPUTER) ?
+        this.requiresPaths = traversalEngine.isComputer() ?
                 TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent() :
                 TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
                         .filter(step -> step instanceof CollectingBarrierStep)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
index f50e542..5f4ba94 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
@@ -84,7 +84,7 @@ public class GraphStep<S extends Element> extends StartStep<S> implements Engine
 
     @Override
     public void onEngine(final TraversalEngine traversalEngine) {
-        if (traversalEngine.equals(TraversalEngine.COMPUTER)) {
+        if (traversalEngine.isComputer()) {
             this.iteratorSupplier = Collections::emptyIterator;
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
index f8ce5cd..81745b8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
@@ -101,7 +101,7 @@ public final class GroupStep<S, K, V, R> extends SideEffectStep<S> implements Si
 
     @Override
     public void onEngine(final TraversalEngine traversalEngine) {
-        this.onGraphComputer = traversalEngine.equals(TraversalEngine.COMPUTER);
+        this.onGraphComputer = traversalEngine.isComputer();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
index 98876a2..bf930af 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
@@ -88,9 +88,9 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements Reversib
     }
 
     private StandardTraversalMetrics getTraversalMetricsUtil() {
-        StandardTraversalMetrics traversalMetrics = this.getTraversal().asAdmin().getSideEffects().getOrCreate(TraversalMetrics.METRICS_KEY, StandardTraversalMetrics::new);
-        final boolean isComputer = this.traversal.asAdmin().getEngine().get().equals(TraversalEngine.COMPUTER);
-        traversalMetrics.initializeIfNecessary(this.getId(), this.traversal.asAdmin().getSteps().indexOf(this), name, isComputer);
+        StandardTraversalMetrics traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(TraversalMetrics.METRICS_KEY, StandardTraversalMetrics::new);
+        final boolean isComputer = this.getTraversal().getEngine().isComputer();
+        traversalMetrics.initializeIfNecessary(this.getId(), this.getTraversal().getSteps().indexOf(this), name, isComputer);
         return traversalMetrics;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
index d5ff879..433330f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapreduce;
 
+import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
 import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
@@ -29,7 +29,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import org.apache.tinkerpop.gremlin.process.util.BulkSet;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.commons.configuration.Configuration;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -75,8 +74,8 @@ public final class GroupMapReduce implements MapReduce<Object, Collection, Objec
         this.sideEffectKey = configuration.getString(GROUP_BY_STEP_SIDE_EFFECT_KEY);
         this.groupStepId = configuration.getString(GROUP_BY_STEP_STEP_ID);
         final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
-        if (!traversal.getEngine().isPresent())
-            traversal.applyStrategies(TraversalEngine.COMPUTER); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
+        if (!traversal.isLocked())
+            traversal.applyStrategies(); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
         final GroupStep groupStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
         this.reduceFunction = groupStep.getReduceTraversal();
         this.mapSupplier = traversal.getSideEffects().<Map>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
index 39fac47..32914ae 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
@@ -52,7 +52,7 @@ public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> impleme
 
     @Override
     public void onEngine(final TraversalEngine engine) {
-        this.traverserStepIdSetByChild = engine.equals(TraversalEngine.COMPUTER);
+        this.traverserStepIdSetByChild = engine.isComputer();
     }
 
     @Override
@@ -88,7 +88,7 @@ public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> impleme
 
         @Override
         public void onEngine(final TraversalEngine engine) {
-            this.traverserStepIdSetByChild = engine.equals(TraversalEngine.COMPUTER);
+            this.traverserStepIdSetByChild = engine.isComputer();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
index 71e894a..8cf6cec 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
@@ -36,7 +36,7 @@ public final class ComparatorHolderRemovalStrategy extends AbstractTraversalStra
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal, final TraversalEngine engine) {
-        if (engine.equals(TraversalEngine.STANDARD))
+        if (engine.isStandard())
             return;
 
         if (TraversalHelper.hasStepOfAssignableClass(ComparatorHolder.class, traversal)) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ReducingStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ReducingStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ReducingStrategy.java
index b56ec45..e858912 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ReducingStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ReducingStrategy.java
@@ -38,7 +38,7 @@ public final class ReducingStrategy extends AbstractTraversalStrategy {
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal, final TraversalEngine engine) {
-        if (engine.equals(TraversalEngine.STANDARD))
+        if (engine.isStandard())
             return;
 
         final Step endStep = traversal.getEndStep();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
index 4c7fbd3..f070380 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.strategy;
 import org.apache.tinkerpop.gremlin.process.Step;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ComputerAwareStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
@@ -42,12 +43,14 @@ public final class TraversalVerificationStrategy extends AbstractTraversalStrate
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal, final TraversalEngine engine) {
-        if (engine.equals(TraversalEngine.STANDARD))
+        if (engine.isStandard())
             return;
 
-        final Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
+        Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
                 ((ComputerAwareStep.EndStep) traversal.getEndStep()).getPreviousStep() :
                 traversal.getEndStep();
+        if(endStep instanceof ComputerResultStep)
+            endStep = endStep.getPreviousStep();
 
         for (final Step<?, ?> step : traversal.getSteps()) {
             if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep))) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
index f0f1476..3a88dc2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
@@ -54,11 +54,6 @@ public final class EmptyGraphTraversal<S, E> extends EmptyTraversal<S, E> implem
     }
 
     @Override
-    public GraphTraversal<S, E> submit(final GraphComputer computer) {
-        return instance();
-    }
-
-    @Override
     public GraphTraversal<S, E> iterate() {
         return this;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
index 71bc6c9..ea03c89 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
@@ -18,12 +18,23 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal;
 
-import org.apache.tinkerpop.gremlin.process.*;
+import org.apache.tinkerpop.gremlin.process.Step;
+import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -36,14 +47,22 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     private final StepPosition stepPosition = new StepPosition();
 
     protected List<Step> steps = new ArrayList<>();
-    protected TraversalStrategies strategies;
     protected TraversalSideEffects sideEffects = new DefaultTraversalSideEffects();
-    protected TraversalEngine traversalEngine = null;
+    protected TraversalStrategies strategies;
+    protected TraversalEngine traversalEngine;
+
+    protected boolean locked = false;
 
     protected TraversalParent traversalParent = (TraversalParent) EmptyStep.instance();
 
-    public DefaultTraversal(final Class emanatingClass) {
-        this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(emanatingClass));
+    public DefaultTraversal(final Object emanatingObject) {
+        this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(emanatingObject.getClass()));
+        if (emanatingObject instanceof Graph)
+            this.traversalEngine = ((Graph) emanatingObject).engine();
+        else if (emanatingObject instanceof Element)
+            this.traversalEngine = ((Element) emanatingObject).graph().engine();
+        else
+            this.traversalEngine = StandardTraversalEngine.instance();
     }
 
     @Override
@@ -52,29 +71,37 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     }
 
     @Override
-    public void applyStrategies(final TraversalEngine engine) throws IllegalStateException {
-        if (null != this.traversalEngine) throw Traversal.Exceptions.traversalIsLocked();
-
+    public void applyStrategies() throws IllegalStateException {
+        if (this.locked) throw Traversal.Exceptions.traversalIsLocked();
         TraversalHelper.reIdSteps(this.stepPosition, this);
-        this.strategies.applyStrategies(this, engine);
+        this.strategies.applyStrategies(this, this.traversalEngine);
         for (final Step<?, ?> step : this.getSteps()) {
             if (step instanceof TraversalParent) {
-                ((TraversalParent) step).setChildStrategies(this.strategies); // TODO: should we clone?
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
-                    globalChild.applyStrategies(engine);
+                    globalChild.setStrategies(this.strategies);
+                    globalChild.setEngine(this.traversalEngine);
+                    globalChild.applyStrategies();
                 }
                 for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
-                    localChild.applyStrategies(TraversalEngine.STANDARD);
+                    localChild.setStrategies(this.strategies);
+                    localChild.setEngine(StandardTraversalEngine.instance());
+                    localChild.applyStrategies();
                 }
             }
         }
-        this.traversalEngine = engine;
+        this.traversalEngine.processTraversal(this);
         this.finalEndStep = this.getEndStep();
+        this.locked = true;
+    }
+
+    @Override
+    public TraversalEngine getEngine() {
+        return this.traversalEngine;
     }
 
     @Override
-    public Optional<TraversalEngine> getEngine() {
-        return Optional.ofNullable(this.traversalEngine);
+    public void setEngine(final TraversalEngine engine) {
+        this.traversalEngine = engine;
     }
 
     @Override
@@ -84,13 +111,13 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
 
     @Override
     public boolean hasNext() {
-        if (null == this.traversalEngine) this.applyStrategies(TraversalEngine.STANDARD);
+        if (!this.locked) this.applyStrategies();
         return this.lastEndCount > 0l || this.finalEndStep.hasNext();
     }
 
     @Override
     public E next() {
-        if (null == this.traversalEngine) this.applyStrategies(TraversalEngine.STANDARD);
+        if (!this.locked) this.applyStrategies();
         if (this.lastEndCount > 0l) {
             this.lastEndCount--;
             return this.lastEnd;
@@ -115,13 +142,13 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
 
     @Override
     public void addStart(final Traverser<S> start) {
-        if (null == this.traversalEngine) this.applyStrategies(TraversalEngine.STANDARD);
+        if (!this.locked) this.applyStrategies();
         if (!this.steps.isEmpty()) this.steps.get(0).addStart(start);
     }
 
     @Override
     public void addStarts(final Iterator<Traverser<S>> starts) {
-        if (null == this.traversalEngine) this.applyStrategies(TraversalEngine.STANDARD);
+        if (!this.locked) this.applyStrategies();
         if (!this.steps.isEmpty()) this.steps.get(0).addStarts(starts);
     }
 
@@ -161,6 +188,11 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     }
 
     @Override
+    public boolean isLocked() {
+        return this.locked;
+    }
+
+    @Override
     public void setSideEffects(final TraversalSideEffects sideEffects) {
         this.sideEffects = sideEffects;
     }
@@ -186,7 +218,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
 
     @Override
     public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException {
-        if (null != this.traversalEngine) throw Exceptions.traversalIsLocked();
+        if (this.locked) throw Exceptions.traversalIsLocked();
         step.setId(this.stepPosition.nextXId());
         this.steps.add(index, step);
         final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
@@ -200,7 +232,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
 
     @Override
     public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException {
-        if (null != this.traversalEngine) throw Exceptions.traversalIsLocked();
+        if (this.locked) throw Exceptions.traversalIsLocked();
         final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
         final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
         this.steps.remove(index);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
new file mode 100644
index 0000000..e3974b5
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
@@ -0,0 +1,57 @@
+/*
+ * 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.engine;
+
+import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ComputerTraversalEngine implements TraversalEngine {
+
+    private transient Graph graph;
+
+    private ComputerTraversalEngine() {
+
+    }
+
+    @Override
+    public void processTraversal(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getParent() instanceof EmptyStep)
+            traversal.addStep(new ComputerResultStep<>(traversal, this.graph.compute(), true));
+    }
+
+    @Override
+    public void setGraph(final Graph graph) {
+        this.graph = graph;
+    }
+
+    @Override
+    public Type getType() {
+        return Type.COMPUTER;
+    }
+
+    public static ComputerTraversalEngine instance() {
+        return new ComputerTraversalEngine();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java
new file mode 100644
index 0000000..4594ded
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java
@@ -0,0 +1,54 @@
+/*
+ * 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.engine;
+
+import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class StandardTraversalEngine implements TraversalEngine {
+
+    private static StandardTraversalEngine INSTANCE = new StandardTraversalEngine();
+
+    private StandardTraversalEngine() {
+
+    }
+
+    @Override
+    public void processTraversal(final Traversal.Admin<?, ?> traversal) {
+
+    }
+
+    @Override
+    public Type getType() {
+        return Type.STANDARD;
+    }
+
+    @Override
+    public void setGraph(final Graph graph) {
+
+    }
+
+    public static StandardTraversalEngine instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
index 9985178..186a19b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
@@ -25,15 +25,15 @@ import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traverser.O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traverser.O_TraverserGenerator;
 
 import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -61,13 +61,13 @@ public abstract class AbstractLambdaTraversal<S, E> implements Traversal.Admin<S
     }
 
     @Override
-    public void applyStrategies(final TraversalEngine engine) throws IllegalStateException {
+    public void applyStrategies() throws IllegalStateException {
 
     }
 
     @Override
-    public Optional<TraversalEngine> getEngine() {
-        return Optional.of(TraversalEngine.STANDARD);
+    public TraversalEngine getEngine() {
+        return StandardTraversalEngine.instance();
     }
 
     @Override
@@ -120,7 +120,18 @@ public abstract class AbstractLambdaTraversal<S, E> implements Traversal.Admin<S
         return true;
     }
 
+    @Override
     public void addStart(final Traverser<S> start) {
     }
 
+    @Override
+    public boolean isLocked() {
+        return true;
+    }
+
+    @Override
+    public void setEngine(final TraversalEngine engine) {
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
index a1d6ff6..3e7a15f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
@@ -120,16 +120,26 @@ public final class HasNextTraversal<S> implements Traversal.Admin<S, Boolean> {
     }
 
     @Override
-    public void applyStrategies(final TraversalEngine engine) throws IllegalStateException {
-        this.hasNextTraversal.applyStrategies(engine);
+    public boolean isLocked() {
+        return true;
+    }
+
+    @Override
+    public void applyStrategies() throws IllegalStateException {
+        this.hasNextTraversal.applyStrategies();
     }
 
     @Override
-    public Optional<TraversalEngine> getEngine() {
+    public TraversalEngine getEngine() {
         return this.hasNextTraversal.getEngine();
     }
 
     @Override
+    public void setEngine(final TraversalEngine engine) {
+
+    }
+
+    @Override
     public void reset() {
         this.hasNextTraversal.reset();
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
index e368918..f78a8b6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
@@ -26,6 +26,7 @@ import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
@@ -75,13 +76,18 @@ public class EmptyTraversal<S, E> implements Traversal.Admin<S, E> {
     }
 
     @Override
-    public void applyStrategies(final TraversalEngine engine) {
+    public void applyStrategies() {
 
     }
 
     @Override
-    public Optional<TraversalEngine> getEngine() {
-        return Optional.empty();
+    public TraversalEngine getEngine() {
+        return StandardTraversalEngine.instance();
+    }
+
+    @Override
+    public void setEngine(final TraversalEngine engine) {
+
     }
 
     @Override
@@ -105,13 +111,13 @@ public class EmptyTraversal<S, E> implements Traversal.Admin<S, E> {
     }
 
     @Override
-    public Traversal<S, E> submit(final GraphComputer computer) {
+    public EmptyTraversal<S, E> clone() throws CloneNotSupportedException {
         return instance();
     }
 
     @Override
-    public EmptyTraversal<S, E> clone() throws CloneNotSupportedException {
-        return instance();
+    public boolean isLocked() {
+        return true;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
----------------------------------------------------------------------
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 61735d8..d03b666 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
@@ -18,12 +18,14 @@
  */
 package org.apache.tinkerpop.gremlin.structure;
 
+import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.process.T;
 import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.io.DefaultIo;
 import org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLReader;
 import org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLWriter;
@@ -37,7 +39,6 @@ import org.apache.tinkerpop.gremlin.structure.strategy.GraphStrategy;
 import org.apache.tinkerpop.gremlin.structure.strategy.SequenceStrategy;
 import org.apache.tinkerpop.gremlin.structure.strategy.StrategyGraph;
 import org.apache.tinkerpop.gremlin.structure.util.FeatureDescriptor;
-import org.apache.commons.configuration.Configuration;
 import org.javatuples.Pair;
 
 import java.io.IOException;
@@ -139,7 +140,7 @@ public interface Graph extends AutoCloseable {
      * @return a graph traversal over the vertices of the graph
      */
     public default GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
-        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.getClass());
+        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this);
         return traversal.addStep(new GraphStep<>(traversal, this, Vertex.class, vertexIds));
     }
 
@@ -151,7 +152,7 @@ public interface Graph extends AutoCloseable {
      * @return a graph traversal over the edges of the graph
      */
     public default GraphTraversal<Edge, Edge> E(final Object... edgeIds) {
-        final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this.getClass());
+        final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this);
         return traversal.addStep(new GraphStep<>(traversal, this, Edge.class, edgeIds));
     }
 
@@ -178,6 +179,11 @@ public interface Graph extends AutoCloseable {
      */
     public GraphComputer compute(final Class... graphComputerClass);
 
+    public TraversalEngine engine();
+
+    public void engine(final TraversalEngine engine);
+
+
     /**
      * Configure and control the transactions for those graphs that support this feature.
      */

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
index 5886d3c..c05aa74 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
 import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traverser.util.DefaultTraverserGeneratorFactory;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Contains;
@@ -124,7 +125,7 @@ public final class PartitionStrategy implements GraphStrategy {
     @Override
     public UnaryOperator<Function<Object[], GraphTraversal<Vertex, Vertex>>> getGraphVStrategy(final StrategyContext<StrategyGraph> ctx, final GraphStrategy composingStrategy) {
         return (f) -> ids -> {
-            final GraphTraversal<Vertex, Vertex> traversal = this.generateTraversal(ctx.getStrategyGraph().getBaseGraph().getClass());
+            final GraphTraversal<Vertex, Vertex> traversal = this.generateTraversal(ctx.getStrategyGraph().getBaseGraph());
             traversal.asAdmin().getStrategies().setTraverserGeneratorFactory(DefaultTraverserGeneratorFactory.instance());
             TraversalHelper.insertTraversal(0, f.apply(ids).has(this.partitionKey, Contains.within, getReadPartitions()).asAdmin(), traversal.asAdmin());
             return traversal.filter(vertex -> testVertex(vertex.get()));
@@ -134,7 +135,7 @@ public final class PartitionStrategy implements GraphStrategy {
     @Override
     public UnaryOperator<Function<Object[], GraphTraversal<Edge, Edge>>> getGraphEStrategy(final StrategyContext<StrategyGraph> ctx, final GraphStrategy composingStrategy) {
         return (f) -> ids -> {
-            final GraphTraversal<Edge, Edge> traversal = this.generateTraversal(ctx.getStrategyGraph().getBaseGraph().getClass());
+            final GraphTraversal<Edge, Edge> traversal = this.generateTraversal(ctx.getStrategyGraph().getBaseGraph());
             traversal.asAdmin().getStrategies().setTraverserGeneratorFactory(DefaultTraverserGeneratorFactory.instance());
             TraversalHelper.insertTraversal(0, f.apply(ids).has(this.partitionKey, Contains.within, getReadPartitions()).asAdmin(), traversal.asAdmin());
             return traversal.filter(edge -> testEdge(edge.get()));
@@ -172,8 +173,8 @@ public final class PartitionStrategy implements GraphStrategy {
         }
     }
 
-    private final <S, E> GraphTraversal<S, E> generateTraversal(final Class emanatingClass) {
-        return new DefaultGraphTraversal<S, E>(emanatingClass) {
+    private final <S, E> GraphTraversal<S, E> generateTraversal(final Object emanatingObject) {
+        return new DefaultGraphTraversal<S, E>(emanatingObject) {
             @Override
             public GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) {
                 return direction.equals(Direction.BOTH) ?

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
index 6e7a8dd..4f0ebd0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.structure.strategy;
 
 import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Edge;
@@ -128,6 +129,16 @@ public class StrategyGraph implements Graph, Graph.Iterators, StrategyWrapped, W
     }
 
     @Override
+    public TraversalEngine engine() {
+        return this.baseGraph.engine();
+    }
+
+    @Override
+    public void engine(final TraversalEngine engine) {
+        this.baseGraph.engine(engine);
+    }
+
+    @Override
     public Transaction tx() {
         return this.baseGraph.tx();
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
index 7278db5..f4387a9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
@@ -20,9 +20,11 @@ package org.apache.tinkerpop.gremlin.structure.util.batch;
 
 import org.apache.tinkerpop.gremlin.process.T;
 import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.VertexTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
@@ -254,6 +256,16 @@ public class BatchGraph<G extends Graph> implements Graph, Graph.Iterators {
     }
 
     @Override
+    public TraversalEngine engine() {
+        return StandardTraversalEngine.instance();
+    }
+
+    @Override
+    public void engine(final TraversalEngine engine) {
+
+    }
+
+    @Override
     public Transaction tx() {
         return this.batchTransaction;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d70378f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
index 37070b5..1e543a0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
@@ -19,9 +19,11 @@
 package org.apache.tinkerpop.gremlin.structure.util.empty;
 
 import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.util.EmptyGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -74,6 +76,16 @@ public final class EmptyGraph implements Graph, Graph.Iterators {
     }
 
     @Override
+    public TraversalEngine engine() {
+       return StandardTraversalEngine.instance();
+    }
+
+    @Override
+    public void engine(final TraversalEngine engine) {
+
+    }
+
+    @Override
     public Transaction tx() {
         throw new IllegalStateException(MESSAGE);
     }