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

colegreer pushed a commit to branch 3.8-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/3.8-dev by this push:
     new 54d3218f98 [TINKERPOP-3193] Decouple non with()-related configs from 
Configuring/Parameterizing interfaces (#3215)
54d3218f98 is described below

commit 54d3218f987ac49165ed5c753e14171effb69d13
Author: Cole Greer <[email protected]>
AuthorDate: Mon Sep 29 15:58:53 2025 -0700

    [TINKERPOP-3193] Decouple non with()-related configs from 
Configuring/Parameterizing interfaces (#3215)
    
    Isolate internal state management from Configuring/Parameterizing
    
    Updates AddVertexStep, AddVertexStartStep, AddEdgeStep, AddEdgeStartStep, 
and AddPropertyStep
    to isolate internal state management (used for id, label, properties, 
from/to...) from the
    Paramenters object used by Configuring and Parameters interfaces. These 
interfaces are now
    exclusively used for the purposes of with() modulation. All other existing 
usages of Parameters
    in Configuring steps is exclusively related to with() modulation.
---
 CHANGELOG.asciidoc                                 |  3 +-
 docs/src/upgrade/release-3.8.x.asciidoc            | 39 +++++++++++++
 .../process/traversal/step/Configuring.java        |  3 +-
 .../map/AbstractAddElementStepPlaceholder.java     | 18 ++++++
 .../traversal/step/map/AddEdgeStartStep.java       | 67 +++++++++++----------
 .../process/traversal/step/map/AddEdgeStep.java    | 67 +++++++++++----------
 .../traversal/step/map/AddElementStepContract.java |  3 +-
 .../traversal/step/map/AddVertexStartStep.java     | 68 ++++++++++++----------
 .../process/traversal/step/map/AddVertexStep.java  | 66 +++++++++++----------
 .../traversal/step/sideEffect/AddPropertyStep.java | 45 +++++++-------
 .../step/sideEffect/AddPropertyStepContract.java   |  4 +-
 .../sideEffect/AddPropertyStepPlaceholder.java     | 22 ++++++-
 .../process/traversal/step/util/Parameters.java    |  4 ++
 .../traversal/step/map/AddEdgeStartStepTest.java   | 10 ++++
 .../traversal/step/map/AddEdgeStepTest.java        | 10 ++++
 .../traversal/step/map/AddVertexStartStepTest.java | 10 ++++
 .../traversal/step/map/AddVertexStepTest.java      | 18 ++++--
 .../step/sideEffect/AddPropertyStepTest.java       | 13 +++++
 .../traversal/step/util/ParametersTest.java        | 10 ----
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs |  3 +
 gremlin-go/driver/cucumber/gremlin.go              |  3 +
 .../gremlin-javascript/test/cucumber/gremlin.js    |  3 +
 gremlin-python/src/main/python/radish/gremlin.py   |  3 +
 .../gremlin/test/features/map/AddEdge.feature      | 19 +++++-
 .../gremlin/test/features/map/AddVertex.feature    | 25 +++++++-
 25 files changed, 368 insertions(+), 168 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index b7e9040d93..b959cab335 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -103,7 +103,8 @@ This release also includes changes from <<release-3-7-XXX, 
3.7.XXX>>.
 * Updated which steps are able to accept arguments in grammar
 * Introduced `GValue` to represent parameterized values in a `GraphTraversal`
 * Added optional traversal cache to `GremlinLangScriptEngine`
-* Introduced step interfaces for all parameterizable steps
+* Introduced `StepContract` interfaces for all parameterizable steps
+* Decoupled management of id, label, and properties from `Configuring` 
interface in `addV()`, `addE()` and `property()`
 * Switched `gremlin-net` byte serializers to signed bytes (`sbyte`) to be 
consistent with IO doc
 * Removed auto-unfold of singleton collections from `range()`, `limit()`, and 
`tail()` local scope steps to improve consistency of output.
 * Updated `asString()` step to throw `IllegalArgumentException` with `null` 
inputs for casting step consistency
diff --git a/docs/src/upgrade/release-3.8.x.asciidoc 
b/docs/src/upgrade/release-3.8.x.asciidoc
index f55b5cac5e..9e51e4ac16 100644
--- a/docs/src/upgrade/release-3.8.x.asciidoc
+++ b/docs/src/upgrade/release-3.8.x.asciidoc
@@ -997,6 +997,45 @@ pinned variable is one which must remain bound to the 
current value. By paramete
 variable, as it can be substituted in the optimized traversal without any loss 
of meaning, however the variable "count"
 will be pinned as the optimized traversal is not valid for other values of 
"count".
 
+===== Decouple internal step state from `Configuring`/`Parameterizing` 
interfaces
+
+Previously `AddVertexStep`, `AddVertexStartStep`, `AddEdgeStep`, 
`AddEdgeStartStep`, and `AddPropertyStep` stored their
+internal state (id, label, properties, from/to vertices...) in a `Parameters` 
object which was exposed via the
+`Configuring` and `Parameterizing` interfaces. These interfaces are primarily 
intended to support with()-modulation, and
+thus these steps had weird unintended behaviors when combined with 
with()-modulation. The following example shows how in
+3.7.4 TinkerGraph, with()-modulation can be used to append properties to an 
`addV()` step, which has never been an
+intended or documented behavior.
+
+[source,text]
+----
+gremlin> g.addV().with("name", "cole").valueMap()
+==>[name:[cole]]
+----
+
+This internal step state has now been decoupled from the `Configuring` and 
`Parameterizing` interfaces, which are now
+exclusively used for the purposes of with()-modulation. This change affects 
`AddVertexStep`, `AddVertexStartStep`,
+`AddEdgeStep`, `AddEdgeStartStep`, and `AddPropertyStep`. For all of these 
steps, `configure()` and `getParameters()`
+are now exclusively used for with()-modulation and cannot be used to read and 
write ids, labels, or properties. All
+accesses of these steps' internal data must now go through methods defined in 
the new `StepContract` interfaces:
+`AddVertexStepContract`, `AddEdgeStepContract`, and `AddPropertyStepContract`.
+
+[source,text]
+----
+// Read label
+Object label = addVertexStep.getParameters().getRaw().get(T.label).get(0) // 
3.7.4
+Object label = addVertexStep.getLabel() // 3.8.0
+
+// Set property
+addVertexStep.configure("name", "cole") // 3.7.4
+addVertexStep.addProperty("name", "cole") // 3.8.0
+
+// Get properties
+Map<Object, List<Object>> properties = addVertexStep.getParameters.getRaw() // 
3.7.4
+Map<Object, List<Object>> properties = addVertexStep.getProperties() // 3.8.0
+----
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-3193[TINKERPOP-3193]
+
 ==== Graph Driver Providers
 
 ===== Prefer OffsetDateTime
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Configuring.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Configuring.java
index 4ac62802d7..11cf1613d4 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Configuring.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Configuring.java
@@ -24,7 +24,8 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 
 /**
  * Identifies a {@link Step} as one that can accept configurations via the 
{@link GraphTraversal#with(String, Object)}
- * step modulator. The nature of the configuration allowed is specific to the 
implementation.
+ * step modulator. The nature of the configuration allowed is specific to the 
implementation. This interface should not
+ * be used to store step data which is unrelated to the {@link 
GraphTraversal#with(String, Object)} step modulator.
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
index 4083168269..fbf4eb083f 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
@@ -27,6 +27,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.GValueHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
@@ -53,6 +54,7 @@ public abstract class AbstractAddElementStepPlaceholder<S, E 
extends Element, X
     protected Map<Object, List<Object>> properties = new HashMap<>();
     protected Traversal.Admin<S, Object> elementId;
     protected Set<String> scopeKeys = new HashSet<>();
+    protected Parameters withConfiguration = new Parameters();
 
     public AbstractAddElementStepPlaceholder(final Traversal.Admin traversal, 
final String label) {
         this(traversal, label == null ? null : new ConstantTraversal<>(label));
@@ -134,6 +136,7 @@ public abstract class AbstractAddElementStepPlaceholder<S, 
E extends Element, X
                 hash ^= Objects.hashCode(entry.getValue());
             };
         }
+        hash ^= withConfiguration.hashCode();
         return hash;
     }
 
@@ -150,6 +153,11 @@ public abstract class AbstractAddElementStepPlaceholder<S, 
E extends Element, X
                 step.setElementId(this.elementId);
             }
         }
+        for (Map.Entry<Object, List<Object>> entry : 
withConfiguration.getRaw().entrySet()) {
+            for (Object value : entry.getValue()) {
+                step.configure(entry.getKey(), value);
+            }
+        }
         TraversalHelper.copyLabels(this, step, false);
     }
 
@@ -364,7 +372,17 @@ public abstract class AbstractAddElementStepPlaceholder<S, 
E extends Element, X
         }
 
         clone.scopeKeys = new HashSet<>(this.scopeKeys);
+        clone.withConfiguration = this.withConfiguration.clone();
         return clone;
     }
 
+    @Override
+    public Parameters getParameters() {
+        return this.withConfiguration;
+    }
+
+    @Override
+    public void configure(final Object... keyValues) {
+        this.withConfiguration.set(this, keyValues);
+    }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
index 2fe2827659..54ac1feb15 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java
@@ -28,7 +28,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
@@ -48,65 +47,69 @@ import 
org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class AddEdgeStartStep extends AbstractStep<Edge, Edge>
-        implements AddEdgeStepContract<Edge>, Configuring {
+public class AddEdgeStartStep extends AbstractStep<Edge, Edge> implements 
AddEdgeStepContract<Edge> {
 
     private static final String FROM = Graph.Hidden.hide("from");
     private static final String TO = Graph.Hidden.hide("to");
 
     private boolean first = true;
-    private Parameters parameters = new Parameters();
+    private Parameters internalParameters = new Parameters();
+    private Parameters withConfiguration = new Parameters();
     private CallbackRegistry<Event.EdgeAddedEvent> callbackRegistry;
 
     public AddEdgeStartStep(final Traversal.Admin traversal, final String 
edgeLabel) {
         super(traversal);
-        this.parameters.set(this, T.label, edgeLabel);
+        this.internalParameters.set(this, T.label, edgeLabel);
     }
 
     public AddEdgeStartStep(final Traversal.Admin traversal, final 
Traversal<?, String> edgeLabelTraversal) {
         super(traversal);
-        this.parameters.set(this, T.label, edgeLabelTraversal);
+        this.internalParameters.set(this, T.label, edgeLabelTraversal);
     }
 
     @Override
     public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() {
-        return this.parameters.getTraversals();
+        return this.internalParameters.getTraversals();
     }
 
     @Override
     public Parameters getParameters() {
-        return this.parameters;
+        return this.withConfiguration;
     }
 
     @Override
     public Set<String> getScopeKeys() {
-        return this.parameters.getReferencedLabels();
+        return this.internalParameters.getReferencedLabels();
     }
 
     @Override
     public void configure(final Object... keyValues) {
-        this.parameters.set(this, keyValues);
+        this.withConfiguration.set(this, keyValues);
+    }
+
+    private void configureInternalParams(final Object... keyValues) {
+        this.internalParameters.set(this, keyValues);
     }
 
     @Override
     public void addTo(final Traversal.Admin<?, ?> toObject) {
-        this.parameters.set(this, TO, toObject);
+        this.internalParameters.set(this, TO, toObject);
     }
 
     @Override
     public void addFrom(final Traversal.Admin<?, ?> fromObject) {
-        this.parameters.set(this, FROM, fromObject);
+        this.internalParameters.set(this, FROM, fromObject);
     }
 
     @Override
     public Object getElementId() {
-        List<Object> ids = this.parameters.get(T.id, null);
+        List<Object> ids = this.internalParameters.get(T.id, null);
         return ids.isEmpty() ? null : ids.get(0);
     }
 
     @Override
     public void setElementId(Object elementId) {
-        configure(T.id, elementId);
+        configureInternalParams(T.id, elementId);
     }
 
     @Override
@@ -118,10 +121,10 @@ public class AddEdgeStartStep extends AbstractStep<Edge, 
Edge>
             // a dead traverser to trigger the traversal
             final Traverser.Admin traverser = generator.generate(1, (Step) 
this, 1);
 
-            final String edgeLabel = (String) this.parameters.get(traverser, 
T.label, () -> Edge.DEFAULT_LABEL).get(0);
+            final String edgeLabel = (String) 
this.internalParameters.get(traverser, T.label, () -> 
Edge.DEFAULT_LABEL).get(0);
 
             // FROM/TO must be set and must be vertices
-            Object theTo = this.parameters.get(traverser, TO, () -> 
null).get(0);
+            Object theTo = this.internalParameters.get(traverser, TO, () -> 
null).get(0);
             if (theTo != null && !(theTo instanceof Vertex)) {
                 theTo = new ReferenceVertex(theTo);
             }
@@ -130,7 +133,7 @@ public class AddEdgeStartStep extends AbstractStep<Edge, 
Edge>
                 throw new IllegalStateException(String.format(
                         "The value given to addE(%s).to() must resolve to a 
Vertex or the ID of a Vertex present in the graph, but null was specified 
instead", edgeLabel));
 
-            Object theFrom = this.parameters.get(traverser, FROM, () -> 
null).get(0);
+            Object theFrom = this.internalParameters.get(traverser, FROM, () 
-> null).get(0);
             if (theFrom != null && !(theFrom instanceof Vertex)) {
                 theFrom = new ReferenceVertex(theFrom);
             }
@@ -161,7 +164,7 @@ public class AddEdgeStartStep extends AbstractStep<Edge, 
Edge>
                         "The value given to addE(%s).from() must resolve to a 
Vertex or the ID of a Vertex present in the graph. The provided value does not 
match any vertices in the graph", edgeLabel));
             }
 
-            final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, 
this.parameters.getKeyValues(traverser, TO, FROM, T.label));
+            final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, 
this.internalParameters.getKeyValues(traverser, TO, FROM, T.label));
             EventUtil.registerEdgeCreation(callbackRegistry, getTraversal(), 
edge);
             return generator.generate(edge, this, 1L);
         } else
@@ -178,30 +181,32 @@ public class AddEdgeStartStep extends AbstractStep<Edge, 
Edge>
 
     @Override
     public int hashCode() {
-        return super.hashCode() ^ this.parameters.hashCode();
+        return super.hashCode() ^ this.internalParameters.hashCode() ^ 
this.withConfiguration.hashCode();
     }
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.parameters.toString());
+        return StringFactory.stepString(this, 
this.internalParameters.toString());
     }
 
     @Override
     public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) {
         super.setTraversal(parentTraversal);
-        this.parameters.getTraversals().forEach(this::integrateChild);
+        this.internalParameters.getTraversals().forEach(this::integrateChild);
+        this.withConfiguration.getTraversals().forEach(this::integrateChild);
     }
 
     @Override
     public AddEdgeStartStep clone() {
         final AddEdgeStartStep clone = (AddEdgeStartStep) super.clone();
-        clone.parameters = this.parameters.clone();
+        clone.internalParameters = this.internalParameters.clone();
+        clone.withConfiguration = this.withConfiguration.clone();
         return clone;
     }
 
     @Override
     public Object getLabel() {
-        Object label = parameters.get(T.label, () -> 
Edge.DEFAULT_LABEL).get(0);
+        Object label = internalParameters.get(T.label, () -> 
Edge.DEFAULT_LABEL).get(0);
         if (label instanceof ConstantTraversal) {
             return ((ConstantTraversal<?, ?>) label).next();
         }
@@ -210,23 +215,23 @@ public class AddEdgeStartStep extends AbstractStep<Edge, 
Edge>
 
     @Override
     public Object getFrom() {
-        return getAdjacentVertex(this.parameters, FROM);
+        return getAdjacentVertex(this.internalParameters, FROM);
     }
 
     @Override
     public Object getTo() {
-        return getAdjacentVertex(this.parameters, TO);
+        return getAdjacentVertex(this.internalParameters, TO);
     }
     
     @Override
     public Map<Object, List<Object>> getProperties() {
-        return Collections.unmodifiableMap(parameters.getRaw());
+        return Collections.unmodifiableMap(internalParameters.getRaw(T.id, 
T.label, TO, FROM));
     }
 
     @Override
     public boolean removeProperty(Object k) {
-        if (parameters.contains(k)) {
-            parameters.remove(k);
+        if (internalParameters.contains(k)) {
+            internalParameters.remove(k);
             return true;
         }
         return false;
@@ -234,8 +239,8 @@ public class AddEdgeStartStep extends AbstractStep<Edge, 
Edge>
 
     @Override
     public boolean removeElementId() {
-        if (this.parameters.contains(T.id)) {
-            this.parameters.remove(T.id);
+        if (this.internalParameters.contains(T.id)) {
+            this.internalParameters.remove(T.id);
             return true;
         }
         return false;
@@ -243,6 +248,6 @@ public class AddEdgeStartStep extends AbstractStep<Edge, 
Edge>
 
     @Override
     public void addProperty(final Object key, final Object value) {
-        configure(key, value);
+        configureInternalParams(key, value);
     }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
index 77d6dfcffa..19ef65921d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
@@ -25,7 +25,6 @@ import java.util.Set;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
@@ -44,72 +43,76 @@ import 
org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class AddEdgeStep<S> extends ScalarMapStep<S, Edge>
-        implements AddEdgeStepContract<S>, Configuring {
+public class AddEdgeStep<S> extends ScalarMapStep<S, Edge> implements 
AddEdgeStepContract<S> {
 
     private static final String FROM = Graph.Hidden.hide("from");
     private static final String TO = Graph.Hidden.hide("to");
 
-    private Parameters parameters = new Parameters();
+    private Parameters internalParameters = new Parameters();
+    private Parameters withConfiguration = new Parameters();
     private CallbackRegistry<Event.EdgeAddedEvent> callbackRegistry;
 
     public AddEdgeStep(final Traversal.Admin traversal, final String 
edgeLabel) {
         super(traversal);
-        this.parameters.set(this, T.label, edgeLabel);
+        this.internalParameters.set(this, T.label, edgeLabel);
     }
 
     public AddEdgeStep(final Traversal.Admin traversal, final 
Traversal.Admin<S,String> edgeLabelTraversal) {
         super(traversal);
-        this.parameters.set(this, T.label, edgeLabelTraversal);
+        this.internalParameters.set(this, T.label, edgeLabelTraversal);
     }
 
     @Override
     public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() {
-        return this.parameters.getTraversals();
+        return this.internalParameters.getTraversals();
     }
 
     @Override
     public Parameters getParameters() {
-        return this.parameters;
+        return this.withConfiguration;
     }
 
     @Override
     public Set<String> getScopeKeys() {
-        return this.parameters.getReferencedLabels();
+        return this.internalParameters.getReferencedLabels();
     }
 
     @Override
     public void configure(final Object... keyValues) {
-        this.parameters.set(this, keyValues);
+        this.withConfiguration.set(this, keyValues);
+    }
+
+    private void configureInternalParams(final Object... keyValues) {
+        this.internalParameters.set(this, keyValues);
     }
 
     @Override
     public void addTo(final Traversal.Admin<?, ?> toObject) {
-        this.parameters.set(this, TO, toObject);
+        this.internalParameters.set(this, TO, toObject);
     }
 
     @Override
     public void addFrom(final Traversal.Admin<?, ?> fromObject) {
-        this.parameters.set(this, FROM, fromObject);
+        this.internalParameters.set(this, FROM, fromObject);
     }
 
     @Override
     public Object getElementId() {
-        List<Object> ids = this.parameters.get(T.id, null);
+        List<Object> ids = this.internalParameters.get(T.id, null);
         return ids.isEmpty() ? null : ids.get(0);
     }
 
     @Override
     public void setElementId(Object elementId) {
-        configure(T.id, elementId);
+        configureInternalParams(T.id, elementId);
     }
 
     @Override
     protected Edge map(final Traverser.Admin<S> traverser) {
-        final String edgeLabel = this.parameters.get(traverser, T.label, () -> 
Edge.DEFAULT_LABEL).get(0);
+        final String edgeLabel = this.internalParameters.get(traverser, 
T.label, () -> Edge.DEFAULT_LABEL).get(0);
 
-        Vertex toVertex = getAdjacentVertex(this.parameters, TO, traverser, 
edgeLabel);
-        Vertex fromVertex = getAdjacentVertex(this.parameters, FROM, 
traverser, edgeLabel);
+        Vertex toVertex = getAdjacentVertex(this.internalParameters, TO, 
traverser, edgeLabel);
+        Vertex fromVertex = getAdjacentVertex(this.internalParameters, FROM, 
traverser, edgeLabel);
 
         try {
             if (toVertex instanceof Attachable)
@@ -131,8 +134,7 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge>
                     "The value given to addE(%s).from() must resolve to a 
Vertex or the ID of a Vertex present in the graph. The provided value does not 
match any vertices in the graph", edgeLabel));
         }
 
-
-        final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, 
this.parameters.getKeyValues(traverser, TO, FROM, T.label));
+        final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, 
this.internalParameters.getKeyValues(traverser, TO, FROM, T.label));
         EventUtil.registerEdgeCreation(callbackRegistry, getTraversal(), edge);
         return edge;
     }
@@ -150,30 +152,31 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge>
 
     @Override
     public int hashCode() {
-        return super.hashCode() ^ this.parameters.hashCode();
+        return super.hashCode() ^ this.internalParameters.hashCode() ^ 
this.withConfiguration.hashCode();
     }
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.parameters.toString());
+        return StringFactory.stepString(this, 
this.internalParameters.toString());
     }
 
     @Override
     public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) {
         super.setTraversal(parentTraversal);
-        this.parameters.getTraversals().forEach(this::integrateChild);
+        this.internalParameters.getTraversals().forEach(this::integrateChild);
     }
 
     @Override
     public AddEdgeStep<S> clone() {
         final AddEdgeStep<S> clone = (AddEdgeStep<S>) super.clone();
-        clone.parameters = this.parameters.clone();
+        clone.internalParameters = this.internalParameters.clone();
+        clone.withConfiguration = this.withConfiguration.clone();
         return clone;
     }
 
     @Override
     public Object getLabel() {
-        Object label = parameters.get(T.label, () -> 
Edge.DEFAULT_LABEL).get(0);
+        Object label = internalParameters.get(T.label, () -> 
Edge.DEFAULT_LABEL).get(0);
         if (label instanceof ConstantTraversal) {
             return ((ConstantTraversal<?, ?>) label).next();
         }
@@ -182,18 +185,18 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge>
 
     @Override
     public void addProperty(Object key, Object value) {
-        configure(key, value);
+        configureInternalParams(key, value);
     }
 
     @Override
     public Map<Object, List<Object>> getProperties() {
-        return Collections.unmodifiableMap(parameters.getRaw(T.label, TO, 
FROM));
+        return Collections.unmodifiableMap(internalParameters.getRaw(T.id, 
T.label, TO, FROM));
     }
 
     @Override
     public boolean removeProperty(Object k) {
-        if (parameters.contains(k)) {
-            parameters.remove(k);
+        if (internalParameters.contains(k)) {
+            internalParameters.remove(k);
             return true;
         }
         return false;
@@ -201,8 +204,8 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge>
 
     @Override
     public boolean removeElementId() {
-        if (this.parameters.contains(T.id)) {
-            this.parameters.remove(T.id);
+        if (this.internalParameters.contains(T.id)) {
+            this.internalParameters.remove(T.id);
             return true;
         }
         return false;
@@ -210,11 +213,11 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge>
 
     @Override
     public Object getFrom() {
-        return getAdjacentVertex(this.parameters, FROM);
+        return getAdjacentVertex(this.internalParameters, FROM);
     }
 
     @Override
     public Object getTo() {
-        return getAdjacentVertex(this.parameters, TO);
+        return getAdjacentVertex(this.internalParameters, TO);
     }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
index 2ed91d5626..753102a79f 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
@@ -26,7 +27,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 
 import java.util.HashSet;
 
-public interface AddElementStepContract<S, E> extends Step<S, E>, 
PropertiesHolder, TraversalParent, Scoping {
+public interface AddElementStepContract<S, E> extends Step<S, E>, 
PropertiesHolder, TraversalParent, Scoping, Configuring {
     Object getLabel();
 
     default Object getLabelWithGValue() {
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
index 053b9ff911..eb9e362721 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
@@ -27,9 +27,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
@@ -46,22 +43,23 @@ import 
org.apache.tinkerpop.gremlin.structure.util.StringFactory;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> 
implements AddVertexStepContract<Vertex>, Configuring {
+public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> 
implements AddVertexStepContract<Vertex> {
 
-    private Parameters parameters = new Parameters();
+    private Parameters internalParameters = new Parameters();
+    private Parameters withConfiguration = new Parameters();
     private boolean first = true;
     private CallbackRegistry<Event.VertexAddedEvent> callbackRegistry;
     private boolean userProvidedLabel;
 
     public AddVertexStartStep(final Traversal.Admin traversal, final String 
label) {
         super(traversal);
-        this.parameters.set(this, T.label, null == label ? 
Vertex.DEFAULT_LABEL : label);
+        this.internalParameters.set(this, T.label, null == label ? 
Vertex.DEFAULT_LABEL : label);
         userProvidedLabel = label != null;
     }
 
     public AddVertexStartStep(final Traversal.Admin traversal, final 
Traversal<?, String> vertexLabelTraversal) {
         super(traversal);
-        this.parameters.set(this, T.label, null == vertexLabelTraversal ? 
Vertex.DEFAULT_LABEL : vertexLabelTraversal);
+        this.internalParameters.set(this, T.label, null == 
vertexLabelTraversal ? Vertex.DEFAULT_LABEL : vertexLabelTraversal);
         userProvidedLabel = vertexLabelTraversal != null;
     }
 
@@ -72,45 +70,49 @@ public class AddVertexStartStep extends 
AbstractStep<Vertex, Vertex> implements
 
     @Override
     public Object getElementId() {
-        List<Object> ids = this.parameters.get(T.id, null);
+        List<Object> ids = this.internalParameters.get(T.id, null);
         return ids.isEmpty() ? null : ids.get(0);
     }
 
     @Override
     public void setElementId(Object elementId) {
-        configure(T.id, elementId);
+        configureInternalParams(T.id, elementId);
     }
 
     @Override
     public Parameters getParameters() {
-        return this.parameters;
+        return this.withConfiguration;
     }
 
     @Override
     public Set<String> getScopeKeys() {
-        return this.parameters.getReferencedLabels();
+        return this.internalParameters.getReferencedLabels();
     }
 
     @Override
     public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() {
-        return this.parameters.getTraversals();
+        return this.internalParameters.getTraversals();
     }
 
     @Override
     public void configure(final Object... keyValues) {
-        if (keyValues[0] == T.label && this.parameters.contains(T.label)) {
-            if (this.parameters.contains(T.label, Vertex.DEFAULT_LABEL)) {
-                this.parameters.remove(T.label);
-                this.parameters.set(this, keyValues);
+        this.withConfiguration.set(this, keyValues);
+    }
+
+    private void configureInternalParams(final Object... keyValues) {
+        if (keyValues[0] == T.label && 
this.internalParameters.contains(T.label)) {
+            if (this.internalParameters.contains(T.label, 
Vertex.DEFAULT_LABEL)) {
+                this.internalParameters.remove(T.label);
+                this.internalParameters.set(this, keyValues);
             } else {
                 throw new IllegalArgumentException(String.format("Vertex 
T.label has already been set to [%s] and cannot be overridden with [%s]",
-                        this.parameters.getRaw().get(T.label).get(0), 
keyValues[1]));
+                        this.internalParameters.getRaw().get(T.label).get(0), 
keyValues[1]));
             }
-        } else if (keyValues[0] == T.id && this.parameters.contains(T.id)) {
+        } else if (keyValues[0] == T.id && 
this.internalParameters.contains(T.id)) {
             throw new IllegalArgumentException(String.format("Vertex T.id has 
already been set to [%s] and cannot be overridden with [%s]",
-                    this.parameters.getRaw().get(T.id).get(0), keyValues[1]));
+                    this.internalParameters.getRaw().get(T.id).get(0), 
keyValues[1]));
         } else {
-            this.parameters.set(this, keyValues);
+            this.internalParameters.set(this, keyValues);
         }
     }
 
@@ -119,7 +121,7 @@ public class AddVertexStartStep extends 
AbstractStep<Vertex, Vertex> implements
         if (this.first) {
             this.first = false;
             final TraverserGenerator generator = 
this.getTraversal().getTraverserGenerator();
-            final Vertex vertex = 
this.getTraversal().getGraph().get().addVertex(this.parameters.getKeyValues(generator.generate(false,
 (Step) this, 1L)));
+            final Vertex vertex = 
this.getTraversal().getGraph().get().addVertex(this.internalParameters.getKeyValues(generator.generate(false,
 (Step) this, 1L)));
             EventUtil.registerVertexCreation(callbackRegistry, getTraversal(), 
vertex);
             return generator.generate(vertex, this, 1L);
         } else
@@ -139,7 +141,7 @@ public class AddVertexStartStep extends 
AbstractStep<Vertex, Vertex> implements
 
     @Override
     public int hashCode() {
-        return super.hashCode() ^ this.parameters.hashCode();
+        return super.hashCode() ^ this.internalParameters.hashCode() ^ 
this.withConfiguration.hashCode();
     }
 
     @Override
@@ -149,26 +151,28 @@ public class AddVertexStartStep extends 
AbstractStep<Vertex, Vertex> implements
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.parameters);
+        return StringFactory.stepString(this, this.internalParameters);
     }
 
     @Override
     public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) {
         super.setTraversal(parentTraversal);
-        this.parameters.getTraversals().forEach(this::integrateChild);
+        this.internalParameters.getTraversals().forEach(this::integrateChild);
+        this.withConfiguration.getTraversals().forEach(this::integrateChild);
     }
 
     @Override
     public AddVertexStartStep clone() {
         final AddVertexStartStep clone = (AddVertexStartStep) super.clone();
-        clone.parameters = this.parameters.clone();
+        clone.internalParameters = this.internalParameters.clone();
+        clone.withConfiguration = this.withConfiguration.clone();
         clone.userProvidedLabel = this.userProvidedLabel;
         return clone;
     }
 
     @Override
     public Object getLabel() {
-        Object label = parameters.get(T.label, () -> 
Vertex.DEFAULT_LABEL).get(0);
+        Object label = internalParameters.get(T.label, () -> 
Vertex.DEFAULT_LABEL).get(0);
         if (label instanceof ConstantTraversal) {
             return ((ConstantTraversal<?, ?>) label).next();
         }
@@ -177,13 +181,13 @@ public class AddVertexStartStep extends 
AbstractStep<Vertex, Vertex> implements
 
     @Override
     public Map<Object, List<Object>> getProperties() {
-        return Collections.unmodifiableMap(parameters.getRaw());
+        return Collections.unmodifiableMap(internalParameters.getRaw(T.id, 
T.label));
     }
 
     @Override
     public boolean removeProperty(Object k) {
-        if (parameters.contains(k)) {
-            parameters.remove(k);
+        if (internalParameters.contains(k)) {
+            internalParameters.remove(k);
             return true;
         }
         return false;
@@ -191,8 +195,8 @@ public class AddVertexStartStep extends 
AbstractStep<Vertex, Vertex> implements
 
     @Override
     public boolean removeElementId() {
-        if (this.parameters.contains(T.id)) {
-            this.parameters.remove(T.id);
+        if (this.internalParameters.contains(T.id)) {
+            this.internalParameters.remove(T.id);
             return true;
         }
         return false;
@@ -200,6 +204,6 @@ public class AddVertexStartStep extends 
AbstractStep<Vertex, Vertex> implements
 
     @Override
     public void addProperty(final Object key, final Object value) {
-        configure(key, value);
+        configureInternalParams(key, value);
     }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
index baead68ac1..8e40283dd3 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
@@ -21,7 +21,6 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
@@ -41,21 +40,22 @@ import java.util.Set;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> implements 
AddVertexStepContract<S>, Configuring {
+public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> implements 
AddVertexStepContract<S> {
 
-    private Parameters parameters = new Parameters();
+    private Parameters internalParameters = new Parameters();
+    private Parameters withConfiguration = new Parameters();
     private CallbackRegistry<Event.VertexAddedEvent> callbackRegistry;
     private boolean userProvidedLabel;
 
     public AddVertexStep(final Traversal.Admin traversal, final String label) {
         super(traversal);
-        this.parameters.set(this, T.label, null == label ? 
Vertex.DEFAULT_LABEL : label);
+        this.internalParameters.set(this, T.label, null == label ? 
Vertex.DEFAULT_LABEL : label);
         userProvidedLabel = label != null;
     }
 
     public AddVertexStep(final Traversal.Admin traversal, final 
Traversal.Admin<S,String> vertexLabelTraversal) {
         super(traversal);
-        this.parameters.set(this, T.label, null == vertexLabelTraversal ? 
Vertex.DEFAULT_LABEL : vertexLabelTraversal);
+        this.internalParameters.set(this, T.label, null == 
vertexLabelTraversal ? Vertex.DEFAULT_LABEL : vertexLabelTraversal);
         userProvidedLabel = vertexLabelTraversal != null;
     }
 
@@ -66,53 +66,57 @@ public class AddVertexStep<S> extends ScalarMapStep<S, 
Vertex> implements AddVer
 
     @Override
     public Object getElementId() {
-        List<Object> ids = this.parameters.get(T.id, null);
+        List<Object> ids = this.internalParameters.get(T.id, null);
         return ids.isEmpty() ? null : ids.get(0);
     }
 
     @Override
     public void setElementId(Object elementId) {
-        configure(T.id, elementId);
+        configureInternalParams(T.id, elementId);
     }
 
     @Override
     public Parameters getParameters() {
-        return this.parameters;
+        return this.withConfiguration;
     }
 
     @Override
     public Set<String> getScopeKeys() {
-        return this.parameters.getReferencedLabels();
+        return this.internalParameters.getReferencedLabels();
     }
 
     @Override
     public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() {
-        return this.parameters.getTraversals();
+        return this.internalParameters.getTraversals();
     }
 
     @Override
     public void configure(final Object... keyValues) {
+        this.withConfiguration.set(this, keyValues);
+    }
+
+    private void configureInternalParams(final Object... keyValues) {
         if (keyValues[0] == T.label) userProvidedLabel = true;
 
-        if (keyValues[0] == T.label && this.parameters.contains(T.label)) {
-            if (this.parameters.contains(T.label, Vertex.DEFAULT_LABEL)) {
-                this.parameters.remove(T.label);
-                this.parameters.set(this, keyValues);
+        if (keyValues[0] == T.label && 
this.internalParameters.contains(T.label)) {
+            if (this.internalParameters.contains(T.label, 
Vertex.DEFAULT_LABEL)) {
+                this.internalParameters.remove(T.label);
+                this.internalParameters.set(this, keyValues);
             } else {
                 throw new IllegalArgumentException(String.format("Vertex 
T.label has already been set to [%s] and cannot be overridden with [%s]",
-                        this.parameters.getRaw().get(T.label).get(0), 
keyValues[1]));
+                        this.internalParameters.getRaw().get(T.label).get(0), 
keyValues[1]));
             }
-        } else if (keyValues[0] == T.id && this.parameters.contains(T.id)) {
+        } else if (keyValues[0] == T.id && 
this.internalParameters.contains(T.id)) {
             throw new IllegalArgumentException(String.format("Vertex T.id has 
already been set to [%s] and cannot be overridden with [%s]",
-                    this.parameters.getRaw().get(T.id).get(0), keyValues[1]));
+                    this.internalParameters.getRaw().get(T.id).get(0), 
keyValues[1]));
         } else {
-            this.parameters.set(this, keyValues);
+            this.internalParameters.set(this, keyValues);
         }
     }
 
     @Override
     protected Vertex map(final Traverser.Admin<S> traverser) {
-        final Vertex vertex = 
this.getTraversal().getGraph().get().addVertex(this.parameters.getKeyValues(traverser));
+        final Vertex vertex = 
this.getTraversal().getGraph().get().addVertex(this.internalParameters.getKeyValues(traverser));
         EventUtil.registerVertexCreation(callbackRegistry, getTraversal(), 
vertex);
         return vertex;
     }
@@ -125,7 +129,7 @@ public class AddVertexStep<S> extends ScalarMapStep<S, 
Vertex> implements AddVer
 
     @Override
     public int hashCode() {
-        return super.hashCode() ^ this.parameters.hashCode();
+        return super.hashCode() ^ this.internalParameters.hashCode() ^ 
this.withConfiguration.hashCode();
     }
 
     @Override
@@ -135,26 +139,28 @@ public class AddVertexStep<S> extends ScalarMapStep<S, 
Vertex> implements AddVer
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.parameters);
+        return StringFactory.stepString(this, this.internalParameters);
     }
 
     @Override
     public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) {
         super.setTraversal(parentTraversal);
-        this.parameters.getTraversals().forEach(this::integrateChild);
+        this.internalParameters.getTraversals().forEach(this::integrateChild);
+        this.withConfiguration.getTraversals().forEach(this::integrateChild);
     }
 
     @Override
     public AddVertexStep<S> clone() {
         final AddVertexStep<S> clone = (AddVertexStep<S>) super.clone();
-        clone.parameters = this.parameters.clone();
+        clone.internalParameters = this.internalParameters.clone();
+        clone.withConfiguration = this.withConfiguration.clone();
         clone.userProvidedLabel = this.userProvidedLabel;
         return clone;
     }
 
     @Override
     public Object getLabel() {
-        Object label = parameters.get(T.label, () -> 
Vertex.DEFAULT_LABEL).get(0);
+        Object label = internalParameters.get(T.label, () -> 
Vertex.DEFAULT_LABEL).get(0);
         if (label instanceof ConstantTraversal) {
             return ((ConstantTraversal<?, ?>) label).next();
         }
@@ -163,13 +169,13 @@ public class AddVertexStep<S> extends ScalarMapStep<S, 
Vertex> implements AddVer
 
     @Override
     public Map<Object, List<Object>> getProperties() {
-        return Collections.unmodifiableMap(parameters.getRaw());
+        return Collections.unmodifiableMap(internalParameters.getRaw(T.id, 
T.label));
     }
 
     @Override
     public boolean removeProperty(Object k) {
-        if (parameters.contains(k)) {
-            parameters.remove(k);
+        if (internalParameters.contains(k)) {
+            internalParameters.remove(k);
             return true;
         }
         return false;
@@ -177,8 +183,8 @@ public class AddVertexStep<S> extends ScalarMapStep<S, 
Vertex> implements AddVer
 
     @Override
     public boolean removeElementId() {
-        if (this.parameters.contains(T.id)) {
-            this.parameters.remove(T.id);
+        if (this.internalParameters.contains(T.id)) {
+            this.internalParameters.remove(T.id);
             return true;
         }
         return false;
@@ -186,6 +192,6 @@ public class AddVertexStep<S> extends ScalarMapStep<S, 
Vertex> implements AddVer
 
     @Override
     public void addProperty(final Object key, final Object value) {
-        configure(key, value);
+        configureInternalParams(key, value);
     }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
index d7022622b7..035e657b5d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
@@ -21,7 +21,6 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.*;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
@@ -46,42 +45,42 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class AddPropertyStep<S extends Element> extends SideEffectStep<S>
-        implements AddPropertyStepContract<S>, Configuring {
+public class AddPropertyStep<S extends Element> extends SideEffectStep<S> 
implements AddPropertyStepContract<S> {
 
-    private Parameters parameters = new Parameters();
+    private Parameters internalParameters = new Parameters();
+    private Parameters withConfiguration = new Parameters();
     private final VertexProperty.Cardinality cardinality;
     private CallbackRegistry<Event.ElementPropertyChangedEvent> 
callbackRegistry;
 
     public AddPropertyStep(final Traversal.Admin traversal, final 
VertexProperty.Cardinality cardinality, final Object keyObject, final Object 
valueObject) {
         super(traversal);
-        this.parameters.set(this, T.key, keyObject, T.value, valueObject);
+        this.internalParameters.set(this, T.key, keyObject, T.value, 
valueObject);
         this.cardinality = cardinality;
     }
 
     @Override
     public Parameters getParameters() {
-        return this.parameters;
+        return this.withConfiguration;
     }
 
     @Override
     public Set<String> getScopeKeys() {
-        return this.parameters.getReferencedLabels();
+        return this.internalParameters.getReferencedLabels();
     }
 
     @Override
     public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() {
-        return this.parameters.getTraversals();
+        return this.internalParameters.getTraversals();
     }
 
     @Override
     public void configure(final Object... keyValues) {
-        this.parameters.set(this, keyValues);
+        this.withConfiguration.set(this, keyValues);
     }
 
     @Override
     protected void sideEffect(final Traverser.Admin<S> traverser) {
-        final Object k = this.parameters.get(traverser, T.key, () -> {
+        final Object k = this.internalParameters.get(traverser, T.key, () -> {
             throw new IllegalStateException("The AddPropertyStep does not have 
a provided key: " + this);
         }).get(0);
 
@@ -90,10 +89,10 @@ public class AddPropertyStep<S extends Element> extends 
SideEffectStep<S>
             throw new IllegalStateException(String.format("T.%s is immutable 
on existing elements", ((T) k).name()));
 
         final String key = (String) k;
-        final Object value = this.parameters.get(traverser, T.value, () -> {
+        final Object value = this.internalParameters.get(traverser, T.value, 
() -> {
             throw new IllegalStateException("The AddPropertyStep does not have 
a provided value: " + this);
         }).get(0);
-        final Object[] vertexPropertyKeyValues = 
this.parameters.getKeyValues(traverser, T.key, T.value);
+        final Object[] vertexPropertyKeyValues = 
this.internalParameters.getKeyValues(traverser, T.key, T.value);
 
         final Element element = traverser.get();
 
@@ -184,14 +183,15 @@ public class AddPropertyStep<S extends Element> extends 
SideEffectStep<S>
 
     @Override
     public int hashCode() {
-        final int hash = super.hashCode() ^ this.parameters.hashCode();
+        final int hash = super.hashCode() ^ this.internalParameters.hashCode() 
^ this.withConfiguration.hashCode();
         return (null != this.cardinality) ? (hash ^ cardinality.hashCode()) : 
hash;
     }
 
     @Override
     public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) {
         super.setTraversal(parentTraversal);
-        this.parameters.getTraversals().forEach(this::integrateChild);
+        this.internalParameters.getTraversals().forEach(this::integrateChild);
+        this.withConfiguration.getTraversals().forEach(this::integrateChild);
     }
 
     @Override
@@ -201,13 +201,13 @@ public class AddPropertyStep<S extends Element> extends 
SideEffectStep<S>
 
     @Override
     public Object getKey() {
-        List<Object> keyParams = parameters.get(T.key, null);
+        List<Object> keyParams = internalParameters.get(T.key, null);
         return keyParams.isEmpty() ? null : keyParams.get(0);
     }
 
     @Override
     public Object getValue() {
-        List<Object> values = parameters.get(T.value, null);
+        List<Object> values = internalParameters.get(T.value, null);
         if (values.isEmpty()) {
             return null;
         }
@@ -216,30 +216,31 @@ public class AddPropertyStep<S extends Element> extends 
SideEffectStep<S>
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.parameters);
+        return StringFactory.stepString(this, this.internalParameters);
     }
 
     @Override
     public AddPropertyStep<S> clone() {
         final AddPropertyStep<S> clone = (AddPropertyStep<S>) super.clone();
-        clone.parameters = this.parameters.clone();
+        clone.internalParameters = this.internalParameters.clone();
+        clone.withConfiguration = this.withConfiguration.clone();
         return clone;
     }
 
     @Override
     public void addProperty(Object key, Object value) {
-        configure(key, value);
+        internalParameters.set(this, key, value);
     }
 
     @Override
     public Map<Object, List<Object>> getProperties() {
-        return parameters.getRaw(T.key, T.value);
+        return internalParameters.getRaw(T.key, T.value);
     }
 
     @Override
     public boolean removeProperty(Object k) {
-        if (parameters.contains(k)) {
-            parameters.remove(k);
+        if (internalParameters.contains(k)) {
+            internalParameters.remove(k);
             return true;
         }
         return false;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
index af4587eef4..5d31a180e8 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
@@ -20,6 +20,7 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Deleting;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
@@ -31,7 +32,8 @@ import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 
 import java.util.HashSet;
 
-public interface AddPropertyStepContract<S> extends Step<S, S>, 
TraversalParent, Scoping, PropertiesHolder, 
Writing<Event.ElementPropertyChangedEvent>, 
Deleting<Event.ElementPropertyChangedEvent> {
+public interface AddPropertyStepContract<S> extends Step<S, S>, 
TraversalParent, Scoping, PropertiesHolder,
+        Writing<Event.ElementPropertyChangedEvent>, 
Deleting<Event.ElementPropertyChangedEvent>, Configuring {
     VertexProperty.Cardinality getCardinality();
 
     @Override
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
index c1835b0b9d..02e8a4dfd4 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
@@ -26,6 +26,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.GValueHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
@@ -63,6 +64,8 @@ public class AddPropertyStepPlaceholder<S extends Element> 
extends SideEffectSte
      */
     private Map<Object, List<Object>> properties = new HashMap<>();
 
+    private Parameters withConfiguration = new Parameters();
+
     public AddPropertyStepPlaceholder(final Traversal.Admin traversal, final 
VertexProperty.Cardinality cardinality, final Object keyObject, final Object 
valueObject) {
         super(traversal);
         if (keyObject instanceof GValue) {
@@ -124,7 +127,8 @@ public class AddPropertyStepPlaceholder<S extends Element> 
extends SideEffectSte
 
     @Override
     public int hashCode() {
-        return super.hashCode() ^ Objects.hashCode(key) ^ 
Objects.hashCode(value) ^ Objects.hashCode(cardinality);
+        return super.hashCode() ^ Objects.hashCode(key) ^ 
Objects.hashCode(value) ^ Objects.hashCode(cardinality) ^
+                Objects.hashCode(properties) ^ 
Objects.hashCode(withConfiguration);
     }
 
     @Override
@@ -214,6 +218,12 @@ public class AddPropertyStepPlaceholder<S extends Element> 
extends SideEffectSte
             }
         }
 
+        for (Map.Entry<Object, List<Object>> entry : 
withConfiguration.getRaw().entrySet()) {
+            for (Object value : entry.getValue()) {
+                step.configure(entry.getKey(), value);
+            }
+        }
+
         TraversalHelper.copyLabels(this, step, false);
         return step;
     }
@@ -298,4 +308,14 @@ public class AddPropertyStepPlaceholder<S extends Element> 
extends SideEffectSte
     public CallbackRegistry<Event.ElementPropertyChangedEvent> 
getMutatingCallbackRegistry() {
         throw new IllegalStateException("Cannot get mutating CallbackRegistry 
on GValue placeholder step");
     }
+
+    @Override
+    public void configure(final Object... keyValues) {
+        this.withConfiguration.set(this, keyValues);
+    }
+
+    @Override
+    public Parameters getParameters() {
+        return withConfiguration;
+    }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
index d1654a344e..aa839351f2 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
@@ -22,6 +22,7 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.util;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
@@ -208,6 +209,9 @@ public class Parameters implements Cloneable, Serializable {
         for (int ix = 0; ix < keyValues.length; ix = ix + 2) {
             if (!(keyValues[ix] instanceof String) && !(keyValues[ix] 
instanceof T) && !(keyValues[ix] instanceof Traversal))
                 throw new IllegalArgumentException("The provided key/value 
array must have a String, T, or Traversal on even array indices");
+            if (keyValues[ix+1] instanceof GValue) {
+                throw new IllegalArgumentException("The provided key/value 
array must not contain GValues");
+            }
 
             // check both key and value for traversal instances. track the 
list of traversals that are present so
             // that elsewhere in Parameters there is no need to iterate all 
values to not find any. also grab
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
index 97bbdcf760..4fe528b85d 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
@@ -21,6 +21,7 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
@@ -220,6 +221,15 @@ public class AddEdgeStartStepTest extends GValueStepTest {
         assertTrue(((AddEdgeStartStepPlaceholder) 
traversal.getSteps().get(0)).getGValues().isEmpty());
     }
 
+    @Test
+    public void configuringShouldNotSetProperties() {
+        AddEdgeStartStep step = new AddEdgeStartStep(new 
DefaultGraphTraversal(), "Edge");
+        step.configure("key", "option");
+        step.addProperty("prop", "value");
+        assertEquals(Map.of("prop", List.of("value")), step.getProperties());
+        assertEquals(List.of("option"), step.getParameters().get("key", () -> 
null));
+    }
+
     private GraphTraversal.Admin<Edge, Edge> getAddEdgeGValueTraversal() {
         return g.addE(GValue.of("label", "likes"))
                 .from(GValue.of("from", 1))
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
index e38e82521e..0abec8d7fd 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
@@ -22,6 +22,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
@@ -313,6 +314,15 @@ public class AddEdgeStepTest extends GValueStepTest {
         assertTrue(((AddEdgeStepPlaceholder<?>) 
traversal.getSteps().get(0)).getGValues().isEmpty());
     }
 
+    @Test
+    public void configuringShouldNotSetProperties() {
+        AddEdgeStep<?> step = new AddEdgeStep<>(new DefaultGraphTraversal(), 
"Edge");
+        step.configure("key", "option");
+        step.addProperty("prop", "value");
+        assertEquals(Map.of("prop", List.of("value")), step.getProperties());
+        assertEquals(List.of("option"), step.getParameters().get("key", () -> 
null));
+    }
+
     private GraphTraversal.Admin<Object, Edge> getAddEdgeGValueTraversal() {
         return __.addE(GValue.of("label", "likes"))
                 .from(GValue.of("from", 1))
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepTest.java
index 5a858fb29d..2956961364 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepTest.java
@@ -21,6 +21,7 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
@@ -171,6 +172,15 @@ public class AddVertexStartStepTest extends GValueStepTest 
{
         assertTrue(((AddVertexStartStepPlaceholder) 
traversal.getSteps().get(0)).getGValues().isEmpty());
     }
 
+    @Test
+    public void configuringShouldNotSetProperties() {
+        AddVertexStartStep step = new AddVertexStartStep(new 
DefaultGraphTraversal(), "Vertex");
+        step.configure("key", "option");
+        step.addProperty("prop", "value");
+        assertEquals(Map.of("prop", List.of("value")), step.getProperties());
+        assertEquals(List.of("option"), step.getParameters().get("key", () -> 
null));
+    }
+
     private GraphTraversal.Admin<Vertex, Vertex> getAddPersonGValueTraversal() 
{
         return g.addV(GValue.of("label", "person"))
                 .property(T.id, GValue.of("id", "1234"))
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java
index c8161629b5..aa887d62f1 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java
@@ -22,6 +22,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import java.util.stream.Collectors;
@@ -235,9 +236,9 @@ public class AddVertexStepTest extends GValueStepTest {
         final Traversal.Admin t = mock(Traversal.Admin.class);
         
when(t.getTraverserSetSupplier()).thenReturn(TraverserSetSupplier.instance());
         final AddVertexStartStep starStep = new AddVertexStartStep(t, (String) 
null);
-        assertEquals(Vertex.DEFAULT_LABEL, 
starStep.getParameters().getRaw().get(T.label).get(0));
+        assertEquals(Vertex.DEFAULT_LABEL, starStep.getLabel());
         final AddVertexStep step = new AddVertexStep(t, (String) null);
-        assertEquals(Vertex.DEFAULT_LABEL, 
starStep.getParameters().getRaw().get(T.label).get(0));
+        assertEquals(Vertex.DEFAULT_LABEL, starStep.getLabel());
     }
 
     @Test
@@ -245,9 +246,9 @@ public class AddVertexStepTest extends GValueStepTest {
         final Traversal.Admin t = mock(Traversal.Admin.class);
         
when(t.getTraverserSetSupplier()).thenReturn(TraverserSetSupplier.instance());
         final AddVertexStartStep starStep = new AddVertexStartStep(t, 
(Traversal<?, String>) null);
-        assertEquals(Vertex.DEFAULT_LABEL, 
starStep.getParameters().getRaw().get(T.label).get(0));
+        assertEquals(Vertex.DEFAULT_LABEL, starStep.getLabel());
         final AddVertexStep step = new AddVertexStep(t, (String) null);
-        assertEquals(Vertex.DEFAULT_LABEL, 
starStep.getParameters().getRaw().get(T.label).get(0));
+        assertEquals(Vertex.DEFAULT_LABEL, starStep.getLabel());
     }
 
     @Test
@@ -351,6 +352,15 @@ public class AddVertexStepTest extends GValueStepTest {
         assertTrue(((AddVertexStepPlaceholder) 
traversal.getSteps().get(0)).getGValues().isEmpty());
     }
 
+    @Test
+    public void configuringShouldNotSetProperties() {
+        AddVertexStep<?> step = new AddVertexStep<>(new 
DefaultGraphTraversal(), "Vertex");
+        step.configure("key", "option");
+        step.addProperty("prop", "value");
+        assertEquals(Map.of("prop", List.of("value")), step.getProperties());
+        assertEquals(List.of("option"), step.getParameters().get("key", () -> 
null));
+    }
+
     private GraphTraversal.Admin<Object, Vertex> getAddPersonGValueTraversal() 
{
         return __.addV(GValue.of("label", "person"))
                 .property(T.id, GValue.of("id", "1234"))
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepTest.java
index 9860e99bf7..7047abee07 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepTest.java
@@ -21,14 +21,18 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueStepTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -138,4 +142,13 @@ public class AddPropertyStepTest extends GValueStepTest {
         final GraphTraversal.Admin<Object, Object> traversal = 
__.property(PNAME, PVALUE, META_NAME, META_VALUE).asAdmin();
         assertTrue(((AddPropertyStepPlaceholder) 
traversal.getSteps().get(0)).getGValues().isEmpty());
     }
+
+    @Test
+    public void configuringShouldNotSetProperties() {
+        AddPropertyStep<?> step = new AddPropertyStep<>(new 
DefaultGraphTraversal(), VertexProperty.Cardinality.single, "prop", "value");
+        step.configure("key", "option");
+        step.addProperty("meta", "meta-value");
+        assertEquals(Map.of("meta", List.of("meta-value")), 
step.getProperties());
+        assertEquals(List.of("option"), step.getParameters().get("key", () -> 
null));
+    }
 }
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
index 6b21f4c928..59545a5410 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ParametersTest.java
@@ -357,14 +357,4 @@ public class ParametersTest {
 
         verify(mock).integrateChild(__.outE("knows").asAdmin());
     }
-
-    @Test
-    public void shouldGetKeyValuesWithUnresolvedGValues() {
-        final Parameters parameters = new Parameters();
-        parameters.set(null, "a", "axe", "b", GValue.of("B", "bat"), "c", 
GValue.of("C", "cat"));
-
-        final Object[] params = 
parameters.getKeyValues(mock(Traverser.Admin.class));
-        assertEquals(6, params.length);
-        assertThat(Arrays.equals(new Object[] {"a", "axe", "b", GValue.of("B", 
"bat"), "c", GValue.of("C", "cat")}, params), is(true));
-    }
 }
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
index 032054180f..9ab8812476 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
@@ -686,6 +686,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                
{"g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).AddV("person").Property("name", "vadas").Property("age", 27), (g,p) 
=>g.AddE("knows").Property("weight", null).From(__.V().Has("name", 
"marko")).To(__.V().Has("name", "vadas")), (g,p) =>g.E().Has("knows", "weight", 
(object) null)}}, 
                
{"g_addEXknowsvarXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).AddV("person").Property("name", "vadas").Property("age", 27), (g,p) 
=>g.AddE((string) p["xx1"]).Property("weight", null).From(__.V().Has("name", 
"marko")).To(__.V().Has("name", "vadas")), (g,p) =>g.E().Has("knows", "weight", 
(object) null)}}, 
                
{"g_unionXaddEXknowsvarXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXXX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).AddV("person").Property("name", "vadas").Property("age", 27), (g,p) 
=>g.Union<object>(__.AddE((string) p["xx1"]).Property("weight", 
1).From(__.V().Has("name", "marko")).To(__.V().Has("name", "vadas"))), (g,p) 
=>g.E().Has("knows", "we [...]
+               
{"g_addEXedgeX_fromXV_hasXname_markoXX_toXV_hasXname_vadasXX_propertyXweight_0_5X_withXkey_valueX_valuesXweight_keyX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).AddV("person").Property("name", "vadas").Property("age", 27), (g,p) 
=>g.AddE("edge").From(__.V().Has("name", "marko")).To(__.V().Has("name", 
"vadas")).Property("weight", 0.5).With("key", "value").Values<objec [...]
                
{"g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).As("marko").AddV("person").Property("name", "vadas").Property("age", 
27).As("vadas").AddV("software").Property("name", "lop").Property("lang", 
"java").As("lop").AddV("person").Property("name", "josh").Property("age", 
32).As("josh").AddV("software").P [...]
                {"g_V_addVXanimalX_propertyXage_0X", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).As("marko").AddV("person").Property("name", "vadas").Property("age", 
27).As("vadas").AddV("software").Property("name", "lop").Property("lang", 
"java").As("lop").AddV("person").Property("name", "josh").Property("age", 
32).As("josh").AddV("software").Property("name", "ripple").Property("lang [...]
                {"g_V_addVXanimalvarX_propertyXage_0varX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).As("marko").AddV("person").Property("name", "vadas").Property("age", 
27).As("vadas").AddV("software").Property("name", "lop").Property("lang", 
"java").As("lop").AddV("person").Property("name", "josh").Property("age", 
32).As("josh").AddV("software").Property("name", "ripple").Property [...]
@@ -719,6 +720,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                
{"g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("friendWeight", 
null, "acl", null), (g,p) =>g.V().Has("person", "name", 
"marko").Has("friendWeight", (object) null), (g,p) =>g.V().Has("person", 
"name", "marko").Properties<object>("friendWeight").Has("acl", (object) null), 
(g,p) =>g.V().Has("person", "name", " [...]
                
{"g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", 
"alice").Property(Cardinality.Single, "age", 50), (g,p) =>g.V().Has("person", 
"name", "alice").Property("age", __.Union<object>(__.Values<object>("age"), 
__.Constant<object>(1)).Sum<object>()), (g,p) =>g.V().Has("person", "age", 50), 
(g,p) =>g.V().Has("person", "age", 51)}}, 
                
{"g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("person").Property("name", "marko").Property("age", 
29).As("marko").AddV("person").Property("name", "vadas").Property("age", 
27).As("vadas").AddV("software").Property("name", "lop").Property("lang", 
"java").As("lop").AddV("person").Property("name", "josh").Proper [...]
+               
{"g_addV_propertyXname_markoX_withXkey_valueX_valuesXname_keyX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV().Property("name", "marko").With("key", 
"value").Values<object>("name", "key")}}, 
+               
{"g_addV_propertyXname_marko_since_2010X_withXkey_valueX_propertiesXnameX_valuesXsince_keyX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV().Property("name", "marko", "since", 2010).With("key", 
"value").Properties<object>("name").Values<object>("since", "key")}}, 
                {"g_injectX1X_asBool", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.Inject<object>(1).AsBool()}}, 
                {"g_injectX3_14X_asBool", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.Inject<object>(3.14).AsBool()}}, 
                {"g_injectXneg_1X_asBool", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.Inject<object>(-1).AsBool()}}, 
diff --git a/gremlin-go/driver/cucumber/gremlin.go 
b/gremlin-go/driver/cucumber/gremlin.go
index 4dd6c5663f..3c3d92fc6b 100644
--- a/gremlin-go/driver/cucumber/gremlin.go
+++ b/gremlin-go/driver/cucumber/gremlin.go
@@ -656,6 +656,7 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     
"g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).AddV("person").Property("name", 
"vadas").Property("age", 27)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.AddE("knows").Property("weight", nil).From(gremlingo.T__.V().Has("name", "ma 
[...]
     
"g_addEXknowsvarXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).AddV("person").Property("name", 
"vadas").Property("age", 27)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.AddE(p["xx1"]).Property("weight", nil).From(gremlingo.T__.V().Has("name", 
[...]
     
"g_unionXaddEXknowsvarXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXXX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).AddV("person").Property("name", 
"vadas").Property("age", 27)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Union(gremlingo.T__.AddE(p["xx1"]).Property("weight", 1).From(grem [...]
+    
"g_addEXedgeX_fromXV_hasXname_markoXX_toXV_hasXname_vadasXX_propertyXweight_0_5X_withXkey_valueX_valuesXweight_keyX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).AddV("person").Property("name", 
"vadas").Property("age", 27)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.AddE("edge").From(gremlingo.T__.V().Has(" [...]
     
"g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property("name", 
"lop").Property("lang", "java").As("lop").AddV("person").Property("name", 
"josh").Property("age", 32).As("josh").AddV("software") [...]
     "g_V_addVXanimalX_propertyXage_0X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property("name", 
"lop").Property("lang", "java").As("lop").AddV("person").Property("name", 
"josh").Property("age", 32).As("josh").AddV("software").Property("name", 
"ripple").Property("la [...]
     "g_V_addVXanimalvarX_propertyXage_0varX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property("name", 
"lop").Property("lang", "java").As("lop").AddV("person").Property("name", 
"josh").Property("age", 32).As("josh").AddV("software").Property("name", 
"ripple").Proper [...]
@@ -689,6 +690,8 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     
"g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("friendWeight", nil, "acl", nil)}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Has("friendWeight", nil)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interfa [...]
     
"g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"alice").Property(gremlingo.Cardinality.Single, "age", 50)}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"alice").Property("age", gremlingo.T__.Union(gremlingo.T__.Values("age"), 
gremlingo.T_ [...]
     
"g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property("name", 
"lop").Property("lang", "java").As("lop").AddV("person").Property("name", 
"josh").Prop [...]
+    "g_addV_propertyXname_markoX_withXkey_valueX_valuesXname_keyX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV().Property("name", 
"marko").With("key", "value").Values("name", "key")}}, 
+    
"g_addV_propertyXname_marko_since_2010X_withXkey_valueX_propertiesXnameX_valuesXsince_keyX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV().Property("name", "marko", "since", 
2010).With("key", "value").Properties("name").Values("since", "key")}}, 
     "g_injectX1X_asBool": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject(1).AsBool()}}, 
     "g_injectX3_14X_asBool": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject(3.14).AsBool()}}, 
     "g_injectXneg_1X_asBool": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject(-1).AsBool()}}, 
diff --git 
a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
 
b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
index 3dfb44225b..e01d05fbc1 100644
--- 
a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
+++ 
b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
@@ -687,6 +687,7 @@ const gremlins = {
     
g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29).addV("person").property("name", 
"vadas").property("age", 27) }, function({g}) { return 
g.addE("knows").property("weight", null).from_(__.V().has("name", 
"marko")).to(__.V().has("name", "vadas")) }, function({g}) { return 
g.E().has("knows", "weight", null) }], 
     
g_addEXknowsvarXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX:
 [function({g, xx1}) { return g.addV("person").property("name", 
"marko").property("age", 29).addV("person").property("name", 
"vadas").property("age", 27) }, function({g, xx1}) { return 
g.addE(xx1).property("weight", null).from_(__.V().has("name", 
"marko")).to(__.V().has("name", "vadas")) }, function({g, xx1}) { return 
g.E().has("knows", "weight", null) }], 
     
g_unionXaddEXknowsvarXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXXX:
 [function({g, xx1}) { return g.addV("person").property("name", 
"marko").property("age", 29).addV("person").property("name", 
"vadas").property("age", 27) }, function({g, xx1}) { return 
g.union(__.addE(xx1).property("weight", 1).from_(__.V().has("name", 
"marko")).to(__.V().has("name", "vadas"))) }, function({g, xx1}) { return 
g.E().has("knows", "weight", 1) }], 
+    
g_addEXedgeX_fromXV_hasXname_markoXX_toXV_hasXname_vadasXX_propertyXweight_0_5X_withXkey_valueX_valuesXweight_keyX:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29).addV("person").property("name", 
"vadas").property("age", 27) }, function({g}) { return 
g.addE("edge").from_(__.V().has("name", "marko")).to(__.V().has("name", 
"vadas")).property("weight", 0.5).with_("key", "value").values("weight", "key") 
}], 
     g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX: 
[function({g, vid1}) { return g.addV("person").property("name", 
"marko").property("age", 29).as("marko").addV("person").property("name", 
"vadas").property("age", 27).as("vadas").addV("software").property("name", 
"lop").property("lang", "java").as("lop").addV("person").property("name", 
"josh").property("age", 32).as("josh").addV("software").property("name", 
"ripple").property("lang", "java").as("ripple").addV("p [...]
     g_V_addVXanimalX_propertyXage_0X: [function({g}) { return 
g.addV("person").property("name", "marko").property("age", 
29).as("marko").addV("person").property("name", "vadas").property("age", 
27).as("vadas").addV("software").property("name", "lop").property("lang", 
"java").as("lop").addV("person").property("name", "josh").property("age", 
32).as("josh").addV("software").property("name", "ripple").property("lang", 
"java").as("ripple").addV("person").property("name", "peter").property("ag [...]
     g_V_addVXanimalvarX_propertyXage_0varX: [function({g, xx1, xx2}) { return 
g.addV("person").property("name", "marko").property("age", 
29).as("marko").addV("person").property("name", "vadas").property("age", 
27).as("vadas").addV("software").property("name", "lop").property("lang", 
"java").as("lop").addV("person").property("name", "josh").property("age", 
32).as("josh").addV("software").property("name", "ripple").property("lang", 
"java").as("ripple").addV("person").property("name", "pete [...]
@@ -720,6 +721,8 @@ const gremlins = {
     g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX: 
[function({g}) { return g.addV("person").property("name", 
"marko").property("friendWeight", null, "acl", null) }, function({g}) { return 
g.V().has("person", "name", "marko").has("friendWeight", null) }, function({g}) 
{ return g.V().has("person", "name", 
"marko").properties("friendWeight").has("acl", null) }, function({g}) { return 
g.V().has("person", "name", "marko").properties("friendWeight").count() }], 
     
g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX: 
[function({g}) { return g.addV("person").property("name", 
"alice").property(Cardinality.single, "age", 50) }, function({g}) { return 
g.V().has("person", "name", "alice").property("age", __.union(__.values("age"), 
__.constant(1)).sum()) }, function({g}) { return g.V().has("person", "age", 50) 
}, function({g}) { return g.V().has("person", "age", 51) }], 
     
g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX:
 [function({g}) { return g.addV("person").property("name", 
"marko").property("age", 29).as("marko").addV("person").property("name", 
"vadas").property("age", 27).as("vadas").addV("software").property("name", 
"lop").property("lang", "java").as("lop").addV("person").property("name", 
"josh").property("age", 32).as("josh").addV("software").property("name", 
"ripple").property [...]
+    g_addV_propertyXname_markoX_withXkey_valueX_valuesXname_keyX: 
[function({g}) { return g.addV().property("name", "marko").with_("key", 
"value").values("name", "key") }], 
+    
g_addV_propertyXname_marko_since_2010X_withXkey_valueX_propertiesXnameX_valuesXsince_keyX:
 [function({g}) { return g.addV().property("name", "marko", "since", 
2010).with_("key", "value").properties("name").values("since", "key") }], 
     g_injectX1X_asBool: [function({g}) { return g.inject(1).asBool() }], 
     g_injectX3_14X_asBool: [function({g}) { return g.inject(3.14).asBool() }], 
     g_injectXneg_1X_asBool: [function({g}) { return g.inject(-1).asBool() }], 
diff --git a/gremlin-python/src/main/python/radish/gremlin.py 
b/gremlin-python/src/main/python/radish/gremlin.py
index f20bf16759..3fd2da2666 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -659,6 +659,7 @@ world.gremlins = {
     
'g_addEXknowsXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 
29).add_v('person').property('name', 'vadas').property('age', 27)), (lambda 
g:g.add_e('knows').property('weight', None).from_(__.V().has('name', 
'marko')).to(__.V().has('name', 'vadas'))), (lambda g:g.E().has('knows', 
'weight', None))], 
     
'g_addEXknowsvarXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXX':
 [(lambda g, xx1=None:g.add_v('person').property('name', 
'marko').property('age', 29).add_v('person').property('name', 
'vadas').property('age', 27)), (lambda g, 
xx1=None:g.add_e(xx1).property('weight', None).from_(__.V().has('name', 
'marko')).to(__.V().has('name', 'vadas'))), (lambda g, 
xx1=None:g.E().has('knows', 'weight', None))], 
     
'g_unionXaddEXknowsvarXpropertyXweight_nullXfromXV_hasXname_markoXX_toXV_hasXname_vadasXXX':
 [(lambda g, xx1=None:g.add_v('person').property('name', 
'marko').property('age', 29).add_v('person').property('name', 
'vadas').property('age', 27)), (lambda g, 
xx1=None:g.union(__.add_e(xx1).property('weight', 1).from_(__.V().has('name', 
'marko')).to(__.V().has('name', 'vadas')))), (lambda g, 
xx1=None:g.E().has('knows', 'weight', 1))], 
+    
'g_addEXedgeX_fromXV_hasXname_markoXX_toXV_hasXname_vadasXX_propertyXweight_0_5X_withXkey_valueX_valuesXweight_keyX':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 
29).add_v('person').property('name', 'vadas').property('age', 27)), (lambda 
g:g.add_e('edge').from_(__.V().has('name', 'marko')).to(__.V().has('name', 
'vadas')).property('weight', 0.5).with_('key', 'value').values('weight', 
'key'))], 
     
'g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX': 
[(lambda g, vid1=None:g.add_v('person').property('name', 
'marko').property('age', 29).as_('marko').add_v('person').property('name', 
'vadas').property('age', 27).as_('vadas').add_v('software').property('name', 
'lop').property('lang', 'java').as_('lop').add_v('person').property('name', 
'josh').property('age', 32).as_('josh').add_v('software').property('name', 
'ripple').property('lang', 'java').as_('ripple').add [...]
     'g_V_addVXanimalX_propertyXage_0X': [(lambda 
g:g.add_v('person').property('name', 'marko').property('age', 
29).as_('marko').add_v('person').property('name', 'vadas').property('age', 
27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 
'java').as_('lop').add_v('person').property('name', 'josh').property('age', 
32).as_('josh').add_v('software').property('name', 'ripple').property('lang', 
'java').as_('ripple').add_v('person').property('name', 'peter').property('ag 
[...]
     'g_V_addVXanimalvarX_propertyXage_0varX': [(lambda g, 
xx1=None,xx2=None:g.add_v('person').property('name', 'marko').property('age', 
29).as_('marko').add_v('person').property('name', 'vadas').property('age', 
27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 
'java').as_('lop').add_v('person').property('name', 'josh').property('age', 
32).as_('josh').add_v('software').property('name', 'ripple').property('lang', 
'java').as_('ripple').add_v('person').property('nam [...]
@@ -692,6 +693,8 @@ world.gremlins = {
     
'g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX': 
[(lambda g:g.add_v('person').property('name', 'marko').property('friendWeight', 
None, 'acl', None)), (lambda g:g.V().has('person', 'name', 
'marko').has('friendWeight', None)), (lambda g:g.V().has('person', 'name', 
'marko').properties('friendWeight').has('acl', None)), (lambda 
g:g.V().has('person', 'name', 'marko').properties('friendWeight').count())], 
     
'g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX': 
[(lambda g:g.add_v('person').property('name', 
'alice').property(Cardinality.single, 'age', 50)), (lambda 
g:g.V().has('person', 'name', 'alice').property('age', 
__.union(__.values('age'), __.constant(1)).sum_())), (lambda 
g:g.V().has('person', 'age', 50)), (lambda g:g.V().has('person', 'age', 51))], 
     
'g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX':
 [(lambda g:g.add_v('person').property('name', 'marko').property('age', 
29).as_('marko').add_v('person').property('name', 'vadas').property('age', 
27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 
'java').as_('lop').add_v('person').property('name', 'josh').property('age', 
32).as_('josh').add_v('software').property('name', 'ripple').property(' [...]
+    'g_addV_propertyXname_markoX_withXkey_valueX_valuesXname_keyX': [(lambda 
g:g.add_v().property('name', 'marko').with_('key', 'value').values('name', 
'key'))], 
+    
'g_addV_propertyXname_marko_since_2010X_withXkey_valueX_propertiesXnameX_valuesXsince_keyX':
 [(lambda g:g.add_v().property('name', 'marko', 'since', 2010).with_('key', 
'value').properties('name').values('since', 'key'))], 
     'g_injectX1X_asBool': [(lambda g:g.inject(1).as_bool())], 
     'g_injectX3_14X_asBool': [(lambda g:g.inject(3.14).as_bool())], 
     'g_injectXneg_1X_asBool': [(lambda g:g.inject(-1).as_bool())], 
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddEdge.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddEdge.feature
index 535eb62e9c..aa04e6a6b8 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddEdge.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddEdge.feature
@@ -497,4 +497,21 @@ Feature: Step - addE()
       """
     When iterated to list
     Then the result should have a count of 1
-    And the graph should return 1 for count of 
"g.E().has(\"knows\",\"weight\", 1)"
\ No newline at end of file
+    And the graph should return 1 for count of 
"g.E().has(\"knows\",\"weight\", 1)"
+
+
+  Scenario: 
g_addEXedgeX_fromXV_hasXname_markoXX_toXV_hasXname_vadasXX_propertyXweight_0_5X_withXkey_valueX_valuesXweight_keyX
+    Given the empty graph
+    And the graph initializer of
+      """
+      g.addV("person").property("name", "marko").property("age", 29).
+        addV("person").property("name", "vadas").property("age", 27)
+      """
+    And the traversal of
+      """
+      
g.addE("edge").from(V().has("name","marko")).to(V().has("name","vadas")).property("weight",
 0.5).with("key", "value").values("weight", "key")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | d[0.5].d |
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddVertex.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddVertex.feature
index 50be911973..c0883b2c1b 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddVertex.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddVertex.feature
@@ -680,4 +680,27 @@ Feature: Step - addV()
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"a1": ["software", "software", "software"], "a2": ["software", 
"software", "software"]}] |
\ No newline at end of file
+      | m[{"a1": ["software", "software", "software"], "a2": ["software", 
"software", "software"]}] |
+
+  Scenario: g_addV_propertyXname_markoX_withXkey_valueX_valuesXname_keyX
+    Given the empty graph
+    And the traversal of
+      """
+      g.addV().property("name", "marko").with("key", "value").values("name", 
"key")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | marko |
+
+  @MetaProperties
+  Scenario: 
g_addV_propertyXname_marko_since_2010X_withXkey_valueX_propertiesXnameX_valuesXsince_keyX
+    Given the empty graph
+    And the traversal of
+      """
+      g.addV().property("name", "marko", "since", 2010).with("key", 
"value").properties("name").values("since", "key")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | d[2010].i |
\ No newline at end of file

Reply via email to