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/12 00:13:19 UTC

[3/3] incubator-tinkerpop git commit: INSANE COMMIT HERE --- Traversals are now fully serializable as all lambda references have been gutted -- back to Java7 :). What this means is that you can now .submit(g.compute()) Gremlin-Java traversals across the

INSANE COMMIT HERE --- Traversals are now fully serializable as all lambda references have been gutted -- back to Java7 :). What this means is that you can now .submit(g.compute()) Gremlin-Java traversals across the wire -- e.g. Hadoop, GremlinServer, etc. No more relegating over the wire traversals to ScriptEngine-based languages. Boooooooo yea.


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

Branch: refs/heads/master
Commit: af7eb28335bde563b8b1a87d4c1a153dc15f4197
Parents: 41999a8
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Feb 11 16:13:02 2015 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Feb 11 16:13:14 2015 -0700

----------------------------------------------------------------------
 .../com/tinkerpop/gremlin/process/Step.java     |   3 +-
 .../tinkerpop/gremlin/process/Traversal.java    |   5 +-
 .../gremlin/process/TraversalSideEffects.java   |   3 +-
 .../gremlin/process/TraversalStrategies.java    |   3 +-
 .../gremlin/process/TraversalStrategy.java      |   3 +-
 .../computer/traversal/TraversalSupplier.java   |  41 +++++++
 .../traversal/TraversalVertexProgram.java       |  18 ++--
 .../process/computer/util/LambdaHolder.java     |  27 ++---
 .../computer/util/VertexProgramHelper.java      |  24 +++--
 .../graph/traversal/ElementTraversal.java       |   8 ++
 .../process/graph/traversal/GraphTraversal.java |  23 +++-
 .../gremlin/process/graph/traversal/__.java     |   8 ++
 .../graph/traversal/step/branch/UnionStep.java  |   4 +-
 .../traversal/step/filter/LambdaFilterStep.java |   2 +-
 .../graph/traversal/step/filter/SampleStep.java |  93 ++++++++--------
 .../graph/traversal/step/map/CoalesceStep.java  |   3 +-
 .../graph/traversal/step/map/CountStep.java     |  27 ++++-
 .../graph/traversal/step/map/FlatMapStep.java   |   5 +-
 .../graph/traversal/step/map/FoldStep.java      |  30 +++++-
 .../graph/traversal/step/map/MaxStep.java       |  29 ++++-
 .../graph/traversal/step/map/MeanStep.java      |  30 +++++-
 .../graph/traversal/step/map/MinStep.java       |  29 ++++-
 .../traversal/step/map/OrderGlobalStep.java     |  37 +++++--
 .../graph/traversal/step/map/SumStep.java       |  27 ++++-
 .../step/sideEffect/AggregateStep.java          |  35 +++---
 .../traversal/step/sideEffect/GraphStep.java    |   8 +-
 .../step/sideEffect/GroupCountStep.java         |   4 +-
 .../traversal/step/sideEffect/GroupStep.java    |   9 +-
 .../traversal/step/sideEffect/InjectStep.java   |  20 ++--
 .../step/sideEffect/SideEffectCapStep.java      |  17 +--
 .../traversal/step/sideEffect/StoreStep.java    |   4 +-
 .../sideEffect/mapreduce/GroupMapReduce.java    |   7 +-
 .../step/util/CollectingBarrierStep.java        |  12 +--
 .../traversal/step/util/ComputerAwareStep.java  |   3 +-
 .../step/util/ReducingBarrierStep.java          |  17 ++-
 .../step/util/SupplyingBarrierStep.java         |  11 +-
 .../process/graph/util/HasContainer.java        |   3 +-
 .../process/traversal/DefaultTraversal.java     |   2 -
 .../gremlin/process/traversal/StepPosition.java |   4 +-
 .../traversal/lambda/ConstantTraversal.java     |  42 ++++++++
 .../process/traversal/lambda/OneTraversal.java  |  49 ---------
 .../step/ElementFunctionComparator.java         |   3 +-
 .../traversal/step/ExpandableStepIterator.java  |   3 +-
 .../process/traversal/util/TraversalRing.java   |   3 +-
 .../traverser/TraverserGeneratorFactory.java    |   4 +-
 .../util/function/ArrayListSupplier.java        |  42 ++++++++
 .../gremlin/util/function/BulkSetSupplier.java  |  43 ++++++++
 .../util/function/CloningUnaryOperator.java     |  49 +++++++++
 .../gremlin/util/function/ConstantSupplier.java |  38 +++++++
 .../gremlin/util/function/HashMapSupplier.java  |  44 ++++++++
 .../gremlin/util/function/HashSetSupplier.java  |  42 ++++++++
 .../util/function/MeanNumberSupplier.java       |  47 ++++++++
 .../gremlin/util/iterator/ArrayIterator.java    |   3 +-
 .../gremlin/util/iterator/DoubleIterator.java   |   3 +-
 .../gremlin/util/iterator/EmptyIterator.java    |  49 +++++++++
 .../gremlin/util/iterator/MultiIterator.java    |   3 +-
 .../gremlin/util/iterator/SingleIterator.java   |   3 +-
 .../step/branch/GroovyBranchTest.groovy         |  13 ++-
 .../step/branch/GroovyChooseTest.groovy         |  40 +------
 .../step/branch/GroovyRepeatTest.groovy         |  60 -----------
 .../step/branch/GroovyUnionTest.groovy          |  16 +--
 .../traversal/step/filter/GroovyHasTest.groovy  |  10 --
 .../step/filter/GroovyWhereTest.groovy          |   8 +-
 .../traversal/step/map/GroovyCountTest.groovy   |   8 +-
 .../traversal/step/map/GroovyOrderTest.groovy   |  10 --
 .../traversal/step/map/GroovyUnfoldTest.groovy  |  12 +--
 .../step/sideEffect/GroovyGroupCountTest.groovy |   8 +-
 .../step/sideEffect/GroovyGroupTest.groovy      |  21 ++--
 .../step/sideEffect/GroovySackTest.groovy       |  13 ++-
 .../gremlin/groovy/loaders/StepLoader.groovy    |  10 ++
 .../gremlin/groovy/function/GComparator.java    |   2 +-
 .../gremlin/groovy/function/GFunction.java      |   2 +-
 .../gremlin/groovy/function/GSupplier.java      |  53 +++++++++
 .../gremlin/groovy/function/GUnaryOperator.java |  53 +++++++++
 .../gremlin/process/ProcessComputerSuite.java   |   2 +-
 .../graph/traversal/step/branch/BranchTest.java |  19 ++--
 .../graph/traversal/step/branch/ChooseTest.java | 107 -------------------
 .../graph/traversal/step/branch/LocalTest.java  |   2 +-
 .../graph/traversal/step/branch/RepeatTest.java |  93 ----------------
 .../graph/traversal/step/branch/UnionTest.java  |  24 ++---
 .../graph/traversal/step/filter/ExceptTest.java |   6 +-
 .../graph/traversal/step/filter/FilterTest.java |  16 +--
 .../graph/traversal/step/filter/HasTest.java    |  21 ----
 .../graph/traversal/step/filter/RetainTest.java |   2 +-
 .../graph/traversal/step/filter/WhereTest.java  |  12 +--
 .../graph/traversal/step/map/CountTest.java     |  12 +--
 .../graph/traversal/step/map/FoldTest.java      |   7 +-
 .../graph/traversal/step/map/MapTest.java       |   6 +-
 .../graph/traversal/step/map/OrderTest.java     |  41 ++-----
 .../graph/traversal/step/map/UnfoldTest.java    |  17 +--
 .../step/sideEffect/GroupCountTest.java         |  12 +--
 .../traversal/step/sideEffect/GroupTest.java    |  39 ++++---
 .../traversal/step/sideEffect/SackTest.java     |  11 +-
 .../traversal/step/sideEffect/StoreTest.java    |   9 +-
 ...HadoopGraphProcessComputerIntegrateTest.java |  32 ++++++
 95 files changed, 1149 insertions(+), 788 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java
index 6eb4f44..b197790 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java
@@ -20,6 +20,7 @@ package com.tinkerpop.gremlin.process;
 
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Optional;
@@ -36,7 +37,7 @@ import java.util.Set;
  * @param <S> The incoming object type of the step
  * @param <E> The outgoing object type of the step
  */
-public interface Step<S, E> extends Iterator<Traverser<E>>, Cloneable {
+public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Cloneable {
 
     /**
      * Add a iterator of {@link Traverser} objects of type S to the step.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java
index cb42693..870c155 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java
@@ -32,6 +32,7 @@ import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import com.tinkerpop.gremlin.process.util.BulkSet;
 import com.tinkerpop.gremlin.structure.Graph;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -54,7 +55,7 @@ import java.util.stream.Collectors;
  *
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface Traversal<S, E> extends Iterator<E>, Cloneable {
+public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
 
     /**
      * Used for reflection based access to the static "of" method of a Traversal.
@@ -80,7 +81,7 @@ public interface Traversal<S, E> extends Iterator<E>, Cloneable {
      */
     public default Traversal<S, E> submit(final GraphComputer computer) {
         try {
-            final TraversalVertexProgram vertexProgram = TraversalVertexProgram.build().traversal(this::asAdmin).create();
+            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));

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java
index 9653017..f44e287 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java
@@ -20,6 +20,7 @@ package com.tinkerpop.gremlin.process;
 
 import com.tinkerpop.gremlin.structure.Vertex;
 
+import java.io.Serializable;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.BiConsumer;
@@ -30,7 +31,7 @@ import java.util.function.UnaryOperator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public interface TraversalSideEffects extends Cloneable {
+public interface TraversalSideEffects extends Cloneable, Serializable {
 
     public static final String SIDE_EFFECTS = "gremlin.traversal.sideEffects";
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
index a9c7381..c5cf221 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
@@ -28,6 +28,7 @@ import com.tinkerpop.gremlin.structure.Vertex;
 import com.tinkerpop.gremlin.structure.VertexProperty;
 import com.tinkerpop.gremlin.util.tools.MultiMap;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -41,7 +42,7 @@ import java.util.Set;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Matthias Broecheler (me@matthiasb.com)
  */
-public interface TraversalStrategies extends Cloneable {
+public interface TraversalStrategies extends Serializable, Cloneable {
 
     /**
      * Return all the {@link TraversalStrategy} singleton instances associated with this {@link TraversalStrategies}.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java
index 40b90d6..1ed0245 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java
@@ -18,6 +18,7 @@
  */
 package com.tinkerpop.gremlin.process;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.Set;
 
@@ -31,7 +32,7 @@ import java.util.Set;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Matthias Broecheler (me@matthiasb.com)
  */
-public interface TraversalStrategy {
+public interface TraversalStrategy extends Serializable{
 
     // A TraversalStrategy should not have a public constructor
     // Make use of a singleton instance() object to reduce object creation on the JVM

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
new file mode 100644
index 0000000..2e6f7ac
--- /dev/null
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
@@ -0,0 +1,41 @@
+/*
+ * 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 com.tinkerpop.gremlin.process.computer.traversal;
+
+import com.tinkerpop.gremlin.process.Traversal;
+
+import java.io.Serializable;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalSupplier<S, E> implements Supplier<Traversal.Admin<S, E>>, Serializable {
+
+    private final Traversal.Admin<S, E> traversal;
+
+    public TraversalSupplier(final Traversal.Admin<S, E> traversal) {
+        this.traversal = traversal;
+    }
+
+    @Override
+    public Traversal.Admin<S, E> get() {
+        return this.traversal;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index 0020c17..fd72c84 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -32,11 +32,11 @@ import com.tinkerpop.gremlin.process.computer.VertexProgram;
 import com.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
 import com.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
 import com.tinkerpop.gremlin.process.computer.util.LambdaHolder;
-import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
 import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
-import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.process.traversal.TraversalMatrix;
+import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.process.util.TraverserSet;
 import com.tinkerpop.gremlin.structure.Direction;
 import com.tinkerpop.gremlin.structure.Element;
@@ -46,7 +46,12 @@ import com.tinkerpop.gremlin.structure.util.StringFactory;
 import com.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.apache.commons.configuration.Configuration;
 
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Optional;
+import java.util.Set;
 import java.util.function.Supplier;
 
 
@@ -103,7 +108,8 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
             throw new IllegalArgumentException("The configuration does not have a traversal supplier");
         }
         this.traversal = this.traversalSupplier.get().get();
-        this.traversal.applyStrategies(TraversalEngine.COMPUTER);
+        if (!this.traversal.getEngine().isPresent())
+            this.traversal.applyStrategies(TraversalEngine.COMPUTER);
         this.traversalMatrix = new TraversalMatrix<>(this.traversal);
         for (final MapReducer<?, ?, ?, ?, ?> mapReducer : TraversalHelper.getStepsOfAssignableClassRecurssively(MapReducer.class, this.traversal)) {
             this.mapReducers.add(mapReducer.getMapReduce());
@@ -244,8 +250,8 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
             return traversal(GREMLIN_GROOVY, traversalScript);
         }
 
-        public Builder traversal(final Supplier<Traversal.Admin> traversal) {
-            LambdaHolder.storeState(this.configuration, LambdaHolder.Type.OBJECT, TRAVERSAL_SUPPLIER, traversal);
+        public Builder traversal(final Traversal.Admin traversal) {
+            LambdaHolder.storeState(this.configuration, LambdaHolder.Type.OBJECT, TRAVERSAL_SUPPLIER, new TraversalSupplier(traversal));
             return this;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java
index 8a629d4..21eb6ce 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java
@@ -73,7 +73,7 @@ public class LambdaHolder<S> {
         lambdaHolder.configKeyPrefix = configKeyPrefix;
         lambdaHolder.type = Type.valueOf(configuration.getString(lambdaHolder.configKeyPrefix.concat(DOT_TYPE)));
         if (lambdaHolder.type.equals(Type.OBJECT)) {
-            lambdaHolder.configObject = configuration.getProperty(lambdaHolder.configKeyPrefix.concat(DOT_OBJECT));
+            lambdaHolder.configObject = VertexProgramHelper.deserialize(configuration, lambdaHolder.configKeyPrefix.concat(DOT_OBJECT));
             lambdaHolder.realObject = lambdaHolder.configObject;
         } else if (lambdaHolder.type.equals(Type.CLASS)) {
             try {
@@ -84,13 +84,9 @@ public class LambdaHolder<S> {
                 throw new IllegalStateException(e.getMessage(), e);
             }
         } else { // SCRIPT
-            try {
-                final String[] script = VertexProgramHelper.deserialize(configuration, lambdaHolder.configKeyPrefix.concat(DOT_OBJECT));
-                lambdaHolder.configObject = script;
-                lambdaHolder.realObject = new ScriptEngineLambda(script[0], script[1]);
-            } catch (Exception e) {
-                throw new IllegalArgumentException(e.getMessage(), e);
-            }
+            final String[] script = VertexProgramHelper.deserialize(configuration, lambdaHolder.configKeyPrefix.concat(DOT_OBJECT));
+            lambdaHolder.configObject = script;
+            lambdaHolder.realObject = new ScriptEngineLambda(script[0], script[1]);
         }
         return lambdaHolder;
     }
@@ -98,17 +94,12 @@ public class LambdaHolder<S> {
 
     public void storeState(final Configuration configuration) {
         configuration.setProperty(this.configKeyPrefix.concat(DOT_TYPE), this.type.name());
-        if (this.type.equals(Type.OBJECT)) {
-            configuration.setProperty(this.configKeyPrefix.concat(DOT_OBJECT), this.configObject);
-        } else if (this.type.equals(Type.CLASS)) {
+        if (this.type.equals(Type.OBJECT))
+            VertexProgramHelper.serialize(this.configObject, configuration, this.configKeyPrefix.concat(DOT_OBJECT));
+        else if (this.type.equals(Type.CLASS))
             configuration.setProperty(this.configKeyPrefix.concat(DOT_OBJECT), ((Class) this.configObject).getCanonicalName());
-        } else { // SCRIPT
-            try {
-                VertexProgramHelper.serialize(this.configObject, configuration, this.configKeyPrefix.concat(DOT_OBJECT));
-            } catch (Exception e) {
-                throw new IllegalArgumentException(e.getMessage(), e);
-            }
-        }
+        else
+            VertexProgramHelper.serialize(this.configObject, configuration, this.configKeyPrefix.concat(DOT_OBJECT));
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
index 9d3120b..048e533 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
@@ -34,17 +34,25 @@ public final class VertexProgramHelper {
     private VertexProgramHelper() {
     }
 
-    public static void serialize(final Object object, final Configuration configuration, final String key) throws IOException {
-        configuration.setProperty(key, Serializer.serializeObject(object));
+    public static void serialize(final Object object, final Configuration configuration, final String key) {
+        try {
+            configuration.setProperty(key, Serializer.serializeObject(object));
+        } catch (final IOException e) {
+            throw new IllegalArgumentException(e.getMessage(), e);
+        }
     }
 
-    public static <T> T deserialize(final Configuration configuration, final String key) throws IOException, ClassNotFoundException {
-        final List byteList = configuration.getList(key);
-        byte[] bytes = new byte[byteList.size()];
-        for (int i = 0; i < byteList.size(); i++) {
-            bytes[i] = Byte.valueOf(byteList.get(i).toString().replace("[", "").replace("]", ""));
+    public static <T> T deserialize(final Configuration configuration, final String key) {
+        try {
+            final List byteList = configuration.getList(key);
+            byte[] bytes = new byte[byteList.size()];
+            for (int i = 0; i < byteList.size(); i++) {
+                bytes[i] = Byte.valueOf(byteList.get(i).toString().replace("[", "").replace("]", ""));
+            }
+            return (T) Serializer.deserializeObject(bytes);
+        } catch (final IOException | ClassNotFoundException e) {
+            throw new IllegalArgumentException(e.getMessage(), e);
         }
-        return (T) Serializer.deserializeObject(bytes);
     }
 
     public static void verifyReversibility(final Traversal.Admin<?, ?> traversal) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
index 0b9c17a..0484021 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
@@ -514,6 +514,14 @@ public abstract interface ElementTraversal<A extends Element> {
         return this.start().withSack(initialValue);
     }
 
+    public default <B> GraphTraversal<A, A> withSack(final B initialValue, final UnaryOperator<B> splitOperator) {
+        return this.start().withSack(initialValue, splitOperator);
+    }
+
+    public default <B> GraphTraversal<A, A> withSack(B initialValue) {
+        return this.start().withSack(initialValue);
+    }
+
     public default GraphTraversal<A, A> withPath() {
         return this.start().withPath();
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
index bdd4942..c93d4cd 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
@@ -108,6 +108,7 @@ import com.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
 import com.tinkerpop.gremlin.process.traversal.step.ElementFunctionComparator;
 import com.tinkerpop.gremlin.process.traversal.step.ElementValueComparator;
 import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import com.tinkerpop.gremlin.process.util.TraverserSet;
 import com.tinkerpop.gremlin.structure.Compare;
 import com.tinkerpop.gremlin.structure.Contains;
 import com.tinkerpop.gremlin.structure.Direction;
@@ -117,6 +118,7 @@ import com.tinkerpop.gremlin.structure.Order;
 import com.tinkerpop.gremlin.structure.Property;
 import com.tinkerpop.gremlin.structure.PropertyType;
 import com.tinkerpop.gremlin.structure.Vertex;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -159,7 +161,7 @@ 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 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));
@@ -316,7 +318,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     public default <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) {
-        return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), () -> seed, foldFunction)); // TODO: User should provide supplier?
+        return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), new ConstantSupplier<>(seed), foldFunction)); // TODO: User should provide supplier?
     }
 
     public default GraphTraversal<S, Long> count() {
@@ -660,6 +662,16 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this;
     }
 
+    public default <A> GraphTraversal<S, E> withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
+        this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.of(splitOperator));
+        return this;
+    }
+
+    public default <A> GraphTraversal<S, E> withSack(A initialValue) {
+        this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.empty());
+        return this;
+    }
+
     public default GraphTraversal<S, E> withPath() {
         return this.asAdmin().addStep(new PathIdentityStep<>(this.asAdmin()));
     }
@@ -671,7 +683,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     public default GraphTraversal<S, E> barrier() {
-        return this.asAdmin().addStep(new CollectingBarrierStep<>(this.asAdmin()));
+        return this.asAdmin().addStep(new CollectingBarrierStep(asAdmin()) {
+            @Override
+            public void barrierConsumer(TraverserSet traverserSet) {
+
+            }
+        });
     }
 
     ////

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java
index 813e937..3fc0491 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java
@@ -544,6 +544,14 @@ public class __ {
         return __.<A>start().withSack(initialValue);
     }
 
+    public static <A, B> GraphTraversal<A, A> withSack(final B initialValue, final UnaryOperator<B> splitOperator) {
+        return __.<A>start().withSack(initialValue, splitOperator);
+    }
+
+    public static <A, B> GraphTraversal<A, A> withSack(B initialValue) {
+        return __.<A>start().withSack(initialValue);
+    }
+
     public static <A> GraphTraversal<A, A> withPath() {
         return __.<A>start().withPath();
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
index 29acc09..91f75b0 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
@@ -20,7 +20,7 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.branch;
 
 import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
-import com.tinkerpop.gremlin.process.traversal.lambda.MapTraversal;
+import com.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
 import java.util.Collections;
@@ -32,7 +32,7 @@ public final class UnionStep<S, E> extends BranchStep<S, E, TraversalOptionParen
 
     public UnionStep(final Traversal.Admin traversal, final Traversal.Admin<?, E>... unionTraversals) {
         super(traversal);
-        this.setBranchTraversal(new MapTraversal<>(s -> Pick.any));
+        this.setBranchTraversal(new ConstantTraversal<>(Pick.any));
         for (final Traversal.Admin<?, E> union : unionTraversals) {
             this.addGlobalChildOption(Pick.any, (Traversal.Admin) union);
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
index 74d20f4..a355afb 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
@@ -29,7 +29,7 @@ import java.util.function.Predicate;
  */
 public final class LambdaFilterStep<S> extends FilterStep<S> {
 
-    private Predicate<Traverser<S>> predicate = null;
+    private final Predicate<Traverser<S>> predicate;
 
     public LambdaFilterStep(final Traversal.Admin traversal, final Predicate<Traverser<S>> predicate) {
         super(traversal);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java
index f0af2d6..f3da7eb 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java
@@ -20,10 +20,10 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.filter;
 
 import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.Traverser;
+import com.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
+import com.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
 import com.tinkerpop.gremlin.process.traversal.step.Reversible;
 import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import com.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import com.tinkerpop.gremlin.process.traversal.lambda.OneTraversal;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
@@ -39,14 +39,13 @@ import java.util.Set;
  */
 public final class SampleStep<S> extends CollectingBarrierStep<S> implements Reversible, TraversalParent {
 
-    private Traversal.Admin<S, Number> probabilityTraversal = OneTraversal.instance();
+    private Traversal.Admin<S, Number> probabilityTraversal = new ConstantTraversal<>(1.0d);
     private final int amountToSample;
     private static final Random RANDOM = new Random();
 
     public SampleStep(final Traversal.Admin traversal, final int amountToSample) {
         super(traversal);
         this.amountToSample = amountToSample;
-        SampleStep.generatePredicate(this);
     }
 
     @Override
@@ -65,6 +64,47 @@ public final class SampleStep<S> extends CollectingBarrierStep<S> implements Rev
     }
 
     @Override
+    public void barrierConsumer(final TraverserSet<S> traverserSet) {
+        // return the entire traverser set if the set is smaller than the amount to sample
+        if (traverserSet.bulkSize() <= this.amountToSample)
+            return;
+        //////////////// else sample the set
+        double totalWeight = 0.0d;
+        for (final Traverser<S> s : traverserSet) {
+            totalWeight = totalWeight + TraversalUtil.apply(s.asAdmin(), this.probabilityTraversal).doubleValue() * s.bulk();
+        }
+        ///////
+        final TraverserSet<S> sampledSet = new TraverserSet<>();
+        int runningAmountToSample = 0;
+        while (runningAmountToSample < this.amountToSample) {
+            boolean reSample = false;
+            double runningWeight = 0.0d;
+            for (final Traverser.Admin<S> s : traverserSet) {
+                long sampleBulk = sampledSet.contains(s) ? sampledSet.get(s).bulk() : 0;
+                if (sampleBulk < s.bulk()) {
+                    final double currentWeight = TraversalUtil.apply(s, this.probabilityTraversal).doubleValue();
+                    for (int i = 0; i < (s.bulk() - sampleBulk); i++) {
+                        runningWeight = runningWeight + currentWeight;
+                        if (RANDOM.nextDouble() <= (runningWeight / totalWeight)) {
+                            final Traverser.Admin<S> split = s.asAdmin().split();
+                            split.asAdmin().setBulk(1l);
+                            sampledSet.add(split);
+                            runningAmountToSample++;
+                            totalWeight = totalWeight - currentWeight;
+                            reSample = true;
+                            break;
+                        }
+                    }
+                    if (reSample || (runningAmountToSample >= this.amountToSample))
+                        break;
+                }
+            }
+        }
+        traverserSet.clear();
+        traverserSet.addAll(sampledSet);
+    }
+
+    @Override
     public Set<TraverserRequirement> getRequirements() {
         return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
     }
@@ -73,51 +113,6 @@ public final class SampleStep<S> extends CollectingBarrierStep<S> implements Rev
     public SampleStep<S> clone() throws CloneNotSupportedException {
         final SampleStep<S> clone = (SampleStep<S>) super.clone();
         clone.probabilityTraversal = clone.integrateChild(this.probabilityTraversal.clone(), TYPICAL_LOCAL_OPERATIONS);
-        SampleStep.generatePredicate(clone);
         return clone;
     }
-
-    /////////////////////////
-
-    private static final <S> void generatePredicate(final SampleStep<S> sampleStep) {
-        sampleStep.setConsumer(traverserSet -> {
-            // return the entire traverser set if the set is smaller than the amount to sample
-            if (traverserSet.bulkSize() <= sampleStep.amountToSample)
-                return;
-            //////////////// else sample the set
-            double totalWeight = 0.0d;
-            for (final Traverser<S> s : traverserSet) {
-                totalWeight = totalWeight + TraversalUtil.apply(s.asAdmin(), sampleStep.probabilityTraversal).doubleValue() * s.bulk();
-            }
-            ///////
-            final TraverserSet<S> sampledSet = new TraverserSet<>();
-            int runningAmountToSample = 0;
-            while (runningAmountToSample < sampleStep.amountToSample) {
-                boolean reSample = false;
-                double runningWeight = 0.0d;
-                for (final Traverser.Admin<S> s : traverserSet) {
-                    long sampleBulk = sampledSet.contains(s) ? sampledSet.get(s).bulk() : 0;
-                    if (sampleBulk < s.bulk()) {
-                        final double currentWeight = TraversalUtil.apply(s, sampleStep.probabilityTraversal).doubleValue();
-                        for (int i = 0; i < (s.bulk() - sampleBulk); i++) {
-                            runningWeight = runningWeight + currentWeight;
-                            if (RANDOM.nextDouble() <= (runningWeight / totalWeight)) {
-                                final Traverser.Admin<S> split = s.asAdmin().split();
-                                split.asAdmin().setBulk(1l);
-                                sampledSet.add(split);
-                                runningAmountToSample++;
-                                totalWeight = totalWeight - currentWeight;
-                                reSample = true;
-                                break;
-                            }
-                        }
-                        if (reSample || (runningAmountToSample >= sampleStep.amountToSample))
-                            break;
-                    }
-                }
-            }
-            traverserSet.clear();
-            traverserSet.addAll(sampledSet);
-        });
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
index 21b1d95..90113d3 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
@@ -23,6 +23,7 @@ import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.iterator.EmptyIterator;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -55,7 +56,7 @@ public final class CoalesceStep<S, E> extends FlatMapStep<S, E> implements Trave
             if (coalesceTraversal.hasNext())
                 return coalesceTraversal;
         }
-        return Collections.emptyIterator();
+        return EmptyIterator.instance();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java
index 6d6c2db..ea94492 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java
@@ -23,9 +23,12 @@ import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
 import com.tinkerpop.gremlin.process.traversal.step.Reducing;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
 
+import java.io.Serializable;
 import java.util.EnumSet;
 import java.util.Set;
+import java.util.function.BiFunction;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -36,8 +39,8 @@ public final class CountStep<S> extends ReducingBarrierStep<S, Long> implements
 
     public CountStep(final Traversal.Admin traversal) {
         super(traversal);
-        this.setSeedSupplier(() -> 0l);
-        this.setBiFunction((seed, start) -> seed + start.bulk());
+        this.setSeedSupplier(new ConstantSupplier<>(0L));
+        this.setBiFunction(CountBiFunction.<S>instance());
     }
 
 
@@ -50,4 +53,24 @@ public final class CountStep<S> extends ReducingBarrierStep<S, Long> implements
     public Reducer<Long, Traverser<S>> getReducer() {
         return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
     }
+
+    /////
+
+    private static class CountBiFunction<S> implements BiFunction<Long, Traverser<S>, Long>, Serializable {
+
+        private static final CountBiFunction INSTANCE = new CountBiFunction();
+
+        private CountBiFunction() {
+
+        }
+
+        @Override
+        public Long apply(final Long mutatingSeed, final Traverser<S> traverser) {
+            return mutatingSeed + traverser.bulk();
+        }
+
+        public final static <S> CountBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
index f38abb6..521a235 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
@@ -21,6 +21,7 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.map;
 import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.traversal.step.AbstractStep;
+import com.tinkerpop.gremlin.util.iterator.EmptyIterator;
 
 import java.util.Collections;
 import java.util.Iterator;
@@ -31,7 +32,7 @@ import java.util.Iterator;
 public abstract class FlatMapStep<S, E> extends AbstractStep<S, E> {
 
     private Traverser.Admin<S> head = null;
-    private Iterator<E> iterator = Collections.emptyIterator();
+    private Iterator<E> iterator = EmptyIterator.instance();
 
     public FlatMapStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -54,6 +55,6 @@ public abstract class FlatMapStep<S, E> extends AbstractStep<S, E> {
     @Override
     public void reset() {
         super.reset();
-        this.iterator = Collections.emptyIterator();
+        this.iterator = EmptyIterator.instance();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
index 4fccce2..fea68e2 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
@@ -19,13 +19,15 @@
 package com.tinkerpop.gremlin.process.graph.traversal.step.map;
 
 import com.tinkerpop.gremlin.process.Traversal;
+import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
 import com.tinkerpop.gremlin.process.traversal.step.Reducing;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ArrayListSupplier;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.EnumSet;
-import java.util.List;
 import java.util.Set;
 import java.util.function.BiFunction;
 import java.util.function.Supplier;
@@ -38,10 +40,7 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements R
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
 
     public FoldStep(final Traversal.Admin traversal) {
-        this(traversal, () -> (E) new ArrayList<S>(), (seed, start) -> {
-            ((List) seed).add(start);
-            return seed;
-        });
+        this(traversal, (Supplier) ArrayListSupplier.instance(), (BiFunction) ArrayListBiFunction.instance());
     }
 
     public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
@@ -59,4 +58,25 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements R
     public Set<TraverserRequirement> getRequirements() {
         return REQUIREMENTS;
     }
+
+    /////////
+
+    private static class ArrayListBiFunction<S> implements BiFunction<ArrayList<S>, S, ArrayList<S>>, Serializable {
+
+        private static final ArrayListBiFunction INSTANCE = new ArrayListBiFunction();
+
+        private ArrayListBiFunction() {
+
+        }
+
+        @Override
+        public ArrayList<S> apply(final ArrayList<S> mutatingSeed, final S traverser) {
+            mutatingSeed.add(traverser);
+            return mutatingSeed;
+        }
+
+        public final static <S> ArrayListBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java
index a60e2a3..11cc77f 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java
@@ -20,12 +20,15 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.map;
 
 import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.Traverser;
-import com.tinkerpop.gremlin.process.traversal.step.Reducing;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
+import com.tinkerpop.gremlin.process.traversal.step.Reducing;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.Set;
+import java.util.function.BiFunction;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -34,8 +37,8 @@ public final class MaxStep<S extends Number> extends ReducingBarrierStep<S, S> i
 
     public MaxStep(final Traversal.Admin traversal) {
         super(traversal);
-        this.setSeedSupplier(() -> (S) Double.valueOf(Double.MIN_VALUE));
-        this.setBiFunction((seed, start) -> seed.doubleValue() > start.get().doubleValue() ? seed : start.get());
+        this.setSeedSupplier(new ConstantSupplier<>((S) Double.valueOf(Double.MIN_VALUE)));
+        this.setBiFunction(MaxBiFunction.<S>instance());
     }
 
     @Override
@@ -47,4 +50,24 @@ public final class MaxStep<S extends Number> extends ReducingBarrierStep<S, S> i
     public Reducer<S, Traverser<S>> getReducer() {
         return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
     }
+
+    /////
+
+    private static class MaxBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+        private static final MaxBiFunction INSTANCE = new MaxBiFunction();
+
+        private MaxBiFunction() {
+
+        }
+
+        @Override
+        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+            return mutatingSeed.doubleValue() > traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+        }
+
+        public final static <S extends Number> MaxBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java
index 500c58d..bd9fc35 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java
@@ -23,9 +23,13 @@ import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
 import com.tinkerpop.gremlin.process.traversal.step.Reducing;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.MeanNumberSupplier;
 
+import java.io.Serializable;
 import java.util.EnumSet;
 import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -36,8 +40,8 @@ public final class MeanStep<S extends Number, E extends Number> extends Reducing
 
     public MeanStep(final Traversal.Admin traversal) {
         super(traversal);
-        this.setSeedSupplier(() -> (E) new MeanNumber());
-        this.setBiFunction((seed, start) -> (E) ((MeanNumber) seed).add(start.get(), start.bulk()));
+        this.setSeedSupplier((Supplier) MeanNumberSupplier.instance());
+        this.setBiFunction((BiFunction) MeanBiFunction.instance());
     }
 
     @Override
@@ -50,9 +54,29 @@ public final class MeanStep<S extends Number, E extends Number> extends Reducing
         return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
     }
 
+    /////
+
+    private static class MeanBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+        private static final MeanBiFunction INSTANCE = new MeanBiFunction();
+
+        private MeanBiFunction() {
+
+        }
+
+        @Override
+        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+            return (S) ((MeanNumber) mutatingSeed).add(traverser.get(), traverser.bulk());
+        }
+
+        public final static <S extends Number> MeanBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
+
     ///
 
-    public final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
+    public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
 
         private long count = 0l;
         private double sum = 0.0d;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java
index 783f252..742296a 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java
@@ -20,12 +20,15 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.map;
 
 import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.Traverser;
-import com.tinkerpop.gremlin.process.traversal.step.Reducing;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
+import com.tinkerpop.gremlin.process.traversal.step.Reducing;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.Set;
+import java.util.function.BiFunction;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -34,8 +37,8 @@ public final class MinStep<S extends Number> extends ReducingBarrierStep<S, S> i
 
     public MinStep(final Traversal.Admin traversal) {
         super(traversal);
-        this.setSeedSupplier(() -> (S) Double.valueOf(Double.MAX_VALUE));
-        this.setBiFunction((seed, start) -> seed.doubleValue() < start.get().doubleValue() ? seed : start.get());
+        this.setSeedSupplier(new ConstantSupplier<>((S) Double.valueOf(Double.MAX_VALUE)));
+        this.setBiFunction(MinBiFunction.instance());
     }
 
     @Override
@@ -47,4 +50,24 @@ public final class MinStep<S extends Number> extends ReducingBarrierStep<S, S> i
     public Reducer<S, Traverser<S>> getReducer() {
         return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
     }
+
+    /////
+
+    private static class MinBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+        private static final MinBiFunction INSTANCE = new MinBiFunction();
+
+        private MinBiFunction() {
+
+        }
+
+        @Override
+        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+            return mutatingSeed.doubleValue() < traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+        }
+
+        public final static <S extends Number> MinBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
index 17f34c6..40c0e2e 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
@@ -21,12 +21,14 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.map;
 import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import com.tinkerpop.gremlin.process.traversal.step.Reversible;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.process.traversal.step.Reversible;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.process.util.TraverserSet;
 import com.tinkerpop.gremlin.structure.Order;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -39,22 +41,21 @@ import java.util.Set;
 public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements Reversible, ComparatorHolder<S> {
 
     private final List<Comparator<S>> comparators = new ArrayList<>();
+    private Comparator<Traverser<S>> chainedComparator = (Comparator) Order.incr;
 
     public OrderGlobalStep(final Traversal.Admin traversal) {
         super(traversal);
-        this.setConsumer(traversers -> traversers.sort((Comparator) Order.incr));
+    }
+
+    @Override
+    public void barrierConsumer(final TraverserSet<S> traverserSet) {
+        traverserSet.sort(this.chainedComparator);
     }
 
     @Override
     public void addComparator(final Comparator<S> comparator) {
         this.comparators.add(comparator);
-        final Comparator<Traverser<S>> chainedComparator = this.comparators.stream().map(c -> (Comparator<Traverser<S>>) new Comparator<Traverser<S>>() {
-            @Override
-            public int compare(final Traverser<S> traverserA, final Traverser<S> traverserB) {
-                return c.compare(traverserA.get(), traverserB.get());
-            }
-        }).reduce((a, b) -> a.thenComparing(b)).get();
-        this.setConsumer(traversers -> traversers.sort(chainedComparator));
+        this.chainedComparator = this.comparators.stream().map(c -> (Comparator<Traverser<S>>) new ComparatorTraverser<S>(c)).reduce((a, b) -> a.thenComparing(b)).get();
     }
 
     @Override
@@ -71,4 +72,20 @@ public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implement
     public Set<TraverserRequirement> getRequirements() {
         return Collections.singleton(TraverserRequirement.OBJECT);
     }
+
+    /////
+
+    private static class ComparatorTraverser<S> implements Comparator<Traverser<S>>, Serializable {
+
+        private final Comparator<S> comparator;
+
+        public ComparatorTraverser(final Comparator<S> comparator) {
+            this.comparator = comparator;
+        }
+
+        @Override
+        public int compare(final Traverser<S> traverserA, final Traverser<S> traverserB) {
+            return this.comparator.compare(traverserA.get(), traverserB.get());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java
index 8f2d745..0278b15 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java
@@ -23,9 +23,12 @@ import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
 import com.tinkerpop.gremlin.process.traversal.step.Reducing;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
 
+import java.io.Serializable;
 import java.util.EnumSet;
 import java.util.Set;
+import java.util.function.BiFunction;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -39,8 +42,8 @@ public final class SumStep extends ReducingBarrierStep<Number, Double> implement
 
     public SumStep(final Traversal.Admin traversal) {
         super(traversal);
-        this.setSeedSupplier(() -> 0.0d);
-        this.setBiFunction((seed, start) -> seed + (start.get().doubleValue() * start.bulk()));
+        this.setSeedSupplier(new ConstantSupplier<>(0.0d));
+        this.setBiFunction(SumBiFunction.instance());
     }
 
 
@@ -53,4 +56,24 @@ public final class SumStep extends ReducingBarrierStep<Number, Double> implement
     public Reducer<Double, Traverser<Number>> getReducer() {
         return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
     }
+
+    /////
+
+    private static class SumBiFunction<S extends Number> implements BiFunction<Double, Traverser<S>, Double>, Serializable {
+
+        private static final SumBiFunction INSTANCE = new SumBiFunction();
+
+        private SumBiFunction() {
+
+        }
+
+        @Override
+        public Double apply(final Double mutatingSeed, final Traverser<S> traverser) {
+            return mutatingSeed + (traverser.get().doubleValue() * traverser.bulk());
+        }
+
+        public final static <S extends Number> SumBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
index edcdefc..7b289f9 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
@@ -20,18 +20,19 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect;
 
 import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.computer.MapReduce;
-import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import com.tinkerpop.gremlin.process.traversal.step.Reversible;
 import com.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import com.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
-import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapreduce.AggregateMapReduce;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
 import com.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import com.tinkerpop.gremlin.process.traversal.step.Reversible;
+import com.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
+import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import com.tinkerpop.gremlin.process.util.BulkSet;
+import com.tinkerpop.gremlin.process.util.TraverserSet;
+import com.tinkerpop.gremlin.util.function.BulkSetSupplier;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -49,13 +50,12 @@ public final class AggregateStep<S> extends CollectingBarrierStep<S> implements
     public AggregateStep(final Traversal.Admin traversal, final String sideEffectKey) {
         super(traversal);
         this.sideEffectKey = sideEffectKey;
-        AggregateStep.generateConsumer(this);
     }
 
     @Override
     public void registerSideEffects() {
         if (null == this.sideEffectKey) this.sideEffectKey = this.getId();
-        this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSet::new);
+        this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
     }
 
     @Override
@@ -84,6 +84,15 @@ public final class AggregateStep<S> extends CollectingBarrierStep<S> implements
     }
 
     @Override
+    public void barrierConsumer(final TraverserSet<S> traverserSet) {
+        traverserSet.forEach(traverser ->
+                TraversalHelper.addToCollection(
+                        traverser.getSideEffects().get(this.sideEffectKey),
+                        TraversalUtil.apply(traverser, this.aggregateTraversal),
+                        traverser.bulk()));
+    }
+
+    @Override
     public Set<TraverserRequirement> getRequirements() {
         return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
     }
@@ -92,18 +101,6 @@ public final class AggregateStep<S> extends CollectingBarrierStep<S> implements
     public AggregateStep<S> clone() throws CloneNotSupportedException {
         final AggregateStep<S> clone = (AggregateStep<S>) super.clone();
         clone.aggregateTraversal = this.integrateChild(this.aggregateTraversal.clone(), TYPICAL_LOCAL_OPERATIONS);
-        AggregateStep.generateConsumer(clone);
         return clone;
     }
-
-    /////////////////////////
-
-    private static final <S> void generateConsumer(final AggregateStep<S> aggregateStep) {
-        aggregateStep.setConsumer(traverserSet ->
-                traverserSet.forEach(traverser ->
-                        TraversalHelper.addToCollection(
-                                traverser.getSideEffects().get(aggregateStep.sideEffectKey),
-                                TraversalUtil.apply(traverser, aggregateStep.aggregateTraversal),
-                                traverser.bulk())));
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
index bc280f2..f698f3e 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
@@ -27,6 +27,7 @@ import com.tinkerpop.gremlin.structure.Edge;
 import com.tinkerpop.gremlin.structure.Element;
 import com.tinkerpop.gremlin.structure.Graph;
 import com.tinkerpop.gremlin.structure.Vertex;
+import com.tinkerpop.gremlin.util.iterator.EmptyIterator;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -40,8 +41,8 @@ public class GraphStep<S extends Element> extends StartStep<S> implements Engine
 
     protected final Class<S> returnClass;
     protected final Object[] ids;
-    protected final Graph graph;
-    protected Supplier<Iterator<S>> iteratorSupplier;
+    protected transient Graph graph;
+    protected transient Supplier<Iterator<S>> iteratorSupplier;
 
     public GraphStep(final Traversal.Admin traversal, final Graph graph, final Class<S> returnClass, final Object... ids) {
         super(traversal);
@@ -90,7 +91,8 @@ public class GraphStep<S extends Element> extends StartStep<S> implements Engine
 
     @Override
     protected Traverser<S> processNextStart() {
-        if (this.first) this.start = this.iteratorSupplier.get();
+        if (this.first)
+            this.start = null == this.iteratorSupplier ? EmptyIterator.instance() : this.iteratorSupplier.get();
         return super.processNextStart();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java
index 4dd86bd..288f7c8 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java
@@ -32,9 +32,9 @@ import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import com.tinkerpop.gremlin.process.util.MapHelper;
+import com.tinkerpop.gremlin.util.function.HashMapSupplier;
 
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -62,7 +62,7 @@ public final class GroupCountStep<S> extends SideEffectStep<S> implements SideEf
     @Override
     public void registerSideEffects() {
         if (this.sideEffectKey == null) this.sideEffectKey = this.getId();
-        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMap<Object, Long>::new);
+        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
index 2fcac21..dfc7071 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
@@ -22,18 +22,19 @@ import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.TraversalEngine;
 import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.computer.MapReduce;
+import com.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
+import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapreduce.GroupMapReduce;
+import com.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
 import com.tinkerpop.gremlin.process.traversal.step.EngineDependent;
 import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import com.tinkerpop.gremlin.process.traversal.step.Reversible;
-import com.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
 import com.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
 import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapreduce.GroupMapReduce;
-import com.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import com.tinkerpop.gremlin.process.util.BulkSet;
+import com.tinkerpop.gremlin.util.function.HashMapSupplier;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -80,7 +81,7 @@ public final class GroupStep<S, K, V, R> extends SideEffectStep<S> implements Si
     @Override
     public void registerSideEffects() {
         if (this.sideEffectKey == null) this.sideEffectKey = this.getId();
-        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMap<K, Collection<V>>::new);
+        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
     }
 
     private static <S, K, V> void doGroup(final Traverser.Admin<S> traverser, final Map<K, Collection<V>> groupMap, final Traversal.Admin<S, K> keyTraversal, final Traversal.Admin<S, V> valueTraversal) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
index 753c12d..4a03159 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
@@ -19,28 +19,32 @@
 package com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect;
 
 import com.tinkerpop.gremlin.process.Traversal;
-
-import java.util.Arrays;
-import java.util.List;
+import com.tinkerpop.gremlin.util.iterator.ArrayIterator;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public final class InjectStep<S> extends StartStep<S> {
 
-    private final List<S> injections;
+    private final S[] injections;
 
     @SafeVarargs
     public InjectStep(final Traversal.Admin traversal, final S... injections) {
         super(traversal);
-        this.injections = Arrays.asList(injections);
-        this.start = this.injections.iterator();
+        this.injections = injections;
+        this.start = new ArrayIterator<>(this.injections);
     }
 
     @Override
     public InjectStep<S> clone() throws CloneNotSupportedException {
-        final InjectStep<S> clone = (InjectStep<S>)super.clone();
-        clone.start = this.injections.iterator();
+        final InjectStep<S> clone = (InjectStep<S>) super.clone();
+        clone.start = new ArrayIterator<>(clone.injections);
         return clone;
     }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.start = new ArrayIterator<>(this.injections);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
index 4d93b35..de42a67 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
@@ -47,7 +47,6 @@ public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> im
     public void registerSideEffects() {
         if (this.sideEffectKeys.isEmpty())
             this.sideEffectKeys = Collections.singletonList(((SideEffectCapable) this.getPreviousStep()).getSideEffectKey());
-        SideEffectCapStep.generateSupplier(this);
     }
 
     @Override
@@ -65,10 +64,10 @@ public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> im
     }
 
     @Override
-    public SideEffectCapStep<S, E> clone() throws CloneNotSupportedException {
-        final SideEffectCapStep<S, E> clone = (SideEffectCapStep<S, E>) super.clone();
-        SideEffectCapStep.generateSupplier(clone);
-        return clone;
+    public E supply() {
+        return this.sideEffectKeys.size() == 1 ?
+                this.getTraversal().asAdmin().getSideEffects().get(this.sideEffectKeys.get(0)) :
+                (E) this.getMapOfSideEffects();
     }
 
     public Map<String, Object> getMapOfSideEffects() {
@@ -78,12 +77,4 @@ public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> im
         }
         return sideEffects;
     }
-
-    /////////////////////////
-
-    private static final <S, E> void generateSupplier(final SideEffectCapStep<S, E> sideEffectCapStep) {
-        sideEffectCapStep.setSupplier(() -> sideEffectCapStep.sideEffectKeys.size() == 1 ?
-                sideEffectCapStep.getTraversal().asAdmin().getSideEffects().get(sideEffectCapStep.sideEffectKeys.get(0)) :
-                (E) sideEffectCapStep.getMapOfSideEffects());
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
index efe5e60..e10be8a 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
@@ -31,7 +31,7 @@ import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import com.tinkerpop.gremlin.process.util.BulkSet;
+import com.tinkerpop.gremlin.util.function.BulkSetSupplier;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -62,7 +62,7 @@ public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectC
     @Override
     public void registerSideEffects() {
         if (null == this.sideEffectKey) this.sideEffectKey = this.getId();
-        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSet::new);
+        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
index 04d9c7f..4be5457 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
@@ -25,9 +25,9 @@ import com.tinkerpop.gremlin.process.computer.MapReduce;
 import com.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import com.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
 import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupStep;
-import com.tinkerpop.gremlin.process.util.BulkSet;
 import com.tinkerpop.gremlin.process.traversal.TraversalMatrix;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import com.tinkerpop.gremlin.process.util.BulkSet;
 import com.tinkerpop.gremlin.structure.Vertex;
 import org.apache.commons.configuration.Configuration;
 
@@ -65,7 +65,7 @@ public final class GroupMapReduce implements MapReduce<Object, Collection, Objec
 
     @Override
     public void storeState(final Configuration configuration) {
-        this.storeState(configuration);
+        MapReduce.super.storeState(configuration);
         configuration.setProperty(GROUP_BY_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
         configuration.setProperty(GROUP_BY_STEP_STEP_ID, this.groupStepId);
     }
@@ -75,7 +75,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();
-        traversal.applyStrategies(TraversalEngine.COMPUTER); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
+        if (!traversal.getEngine().isPresent())
+            traversal.applyStrategies(TraversalEngine.COMPUTER); // 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/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
index e850158..40bd37f 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
@@ -20,28 +20,24 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.util;
 
 import com.tinkerpop.gremlin.process.Traversal;
 import com.tinkerpop.gremlin.process.Traverser;
-import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import com.tinkerpop.gremlin.process.traversal.step.AbstractStep;
+import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import com.tinkerpop.gremlin.process.util.TraverserSet;
 
 import java.util.Collections;
 import java.util.Set;
-import java.util.function.Consumer;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class CollectingBarrierStep<S> extends AbstractStep<S, S> {
+public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> {
     private TraverserSet<S> traverserSet = new TraverserSet<>();
-    private Consumer<TraverserSet<S>> barrierConsumer;
 
     public CollectingBarrierStep(final Traversal.Admin traversal) {
         super(traversal);
     }
 
-    public void setConsumer(final Consumer<TraverserSet<S>> barrierConsumer) {
-        this.barrierConsumer = barrierConsumer;
-    }
+    public abstract void barrierConsumer(final TraverserSet<S> traverserSet);
 
     @Override
     public Set<TraverserRequirement> getRequirements() {
@@ -52,7 +48,7 @@ public class CollectingBarrierStep<S> extends AbstractStep<S, S> {
     public Traverser<S> processNextStart() {
         if (this.starts.hasNext()) {
             this.starts.forEachRemaining(this.traverserSet::add);
-            if (null != this.barrierConsumer) this.barrierConsumer.accept(this.traverserSet);
+            this.barrierConsumer(this.traverserSet);
         }
         return this.traverserSet.remove();
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
index eb2afe9..ec66645 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
@@ -24,6 +24,7 @@ import com.tinkerpop.gremlin.process.Traverser;
 import com.tinkerpop.gremlin.process.traversal.step.EngineDependent;
 import com.tinkerpop.gremlin.process.traversal.step.AbstractStep;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import com.tinkerpop.gremlin.util.iterator.EmptyIterator;
 
 import java.util.Collections;
 import java.util.Iterator;
@@ -34,7 +35,7 @@ import java.util.NoSuchElementException;
  */
 public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> implements EngineDependent {
 
-    private Iterator<Traverser<E>> previousIterator = Collections.emptyIterator();
+    private Iterator<Traverser<E>> previousIterator = EmptyIterator.instance();
 
     public ComputerAwareStep(final Traversal.Admin traversal) {
         super(traversal);