Merge branch '3.4-dev'
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index eea8b2e..82bfc85 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -131,6 +131,8 @@
 * Fixed bug with Bytecode serialization when `Bytecode.toString()` is used in Javascript.
 * Fixed "toString" for P and TextP to produce valid script representation from bytecode glv steps containing a string predicate in Javascript.
 * Fixed a bug which could cause Java driver to hang when using `ResultSet.statusAttributes()`
+* Fixed bug with `ReservedVerificationStrategy.getConfiguration()` which was omitting the reserved `keys` value.
+* Changed all configuration keys on `AbstractWarningVerificationStrategy` implementations to `public`.
 * Deprecated `BytecodeUtil` and merged its functionality to the existing `BytecodeHelper`.
 
 [[release-3-4-8]]
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Memory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Memory.java
index 93931c3..1b74508 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Memory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Memory.java
@@ -65,8 +65,10 @@
     public void set(final String key, final Object value) throws IllegalArgumentException, IllegalStateException;
 
     /**
-     * Set the value of the provided key. This is typically called in setup() and/or terminate() of the {@link VertexProgram}.
-     * If this is called during execute(), there is no guarantee as to the ultimately stored value as call order is indeterminate.
+     * Set the value of the provided key. This is typically called in setup() and/or terminate() of the
+     * {@link VertexProgram}. If this is called during execute(), there is no guarantee as to the ultimately stored
+     * value as call order is indeterminate. It is up to the implementation to determine the states in which this
+     * method can be called.
      *
      * @param key   they key to set a value for
      * @param value the value to set for the key
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/AbstractWarningVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/AbstractWarningVerificationStrategy.java
index 9a9391b..8bdf0ee 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/AbstractWarningVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/AbstractWarningVerificationStrategy.java
@@ -40,8 +40,8 @@
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AbstractWarningVerificationStrategy.class);
 
-    protected static final String THROW_EXCEPTION = "throwException";
-    protected static final String LOG_WARNING = "logWarning";
+    public static final String THROW_EXCEPTION = "throwException";
+    public static final String LOG_WARNING = "logWarning";
 
     protected final boolean throwException;
     protected final boolean logWarning;
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategy.java
index d764693..28c59ca 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategy.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
 import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration.MapConfiguration;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing;
@@ -31,7 +32,9 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -47,7 +50,7 @@
  */
 public class ReservedKeysVerificationStrategy extends AbstractWarningVerificationStrategy {
 
-    private static final String KEYS = "keys";
+    public static final String KEYS = "keys";
     private static final Set<String> DEFAULT_RESERVED_KEYS = new HashSet<>(Arrays.asList("id", "label"));
     private final Set<String> reservedKeys;
 
@@ -84,6 +87,13 @@
                 .logWarning(configuration.getBoolean(LOG_WARNING, false)).create();
     }
 
+    @Override
+    public Configuration getConfiguration() {
+        final Configuration c = super.getConfiguration();
+        c.setProperty(KEYS, this.reservedKeys);
+        return c;
+    }
+
     public static ReservedKeysVerificationStrategy.Builder build() {
         return new ReservedKeysVerificationStrategy.Builder();
     }
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategyTest.java
index f25f66d..22dcd11 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategyTest.java
@@ -34,6 +34,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
@@ -81,6 +82,7 @@
                 {"__.addE('knows').property('label','xyz')", __.addE("knows").property("id", "xyz"), false},
                 {"__.addV().property('x','xyz', 'label', 'xxx')", __.addV().property("x", "xyz", "label", "xxx"), false},
                 {"__.addV().property('x','xyz', 'not-Label', 'xxx')", __.addV().property("x", "xyz", "not-label", "xxx"), true},
+                {"__.addV().property('x','xyz', 'not-allowed', 'xxx')", __.addV().property("x", "xyz", "not-allowed", "xxx"), false},
         });
     }
 
@@ -106,7 +108,10 @@
     @Test
     public void shouldOnlyThrow() {
         final TraversalStrategies strategies = new DefaultTraversalStrategies();
-        strategies.addStrategies(ReservedKeysVerificationStrategy.build().throwException().create());
+        final ReservedKeysVerificationStrategy.Builder builder = ReservedKeysVerificationStrategy.build().throwException();
+        if (name.equals("__.addV().property('x','xyz', 'not-allowed', 'xxx')"))
+            builder.reservedKeys(new HashSet<>(Arrays.asList("id", "label", "not-allowed")));
+        strategies.addStrategies(builder.create());
         final Traversal traversal = this.traversal.asAdmin().clone();
         traversal.asAdmin().setStrategies(strategies);
         if (allow) {
@@ -125,7 +130,10 @@
     @Test
     public void shouldOnlyLog() {
         final TraversalStrategies strategies = new DefaultTraversalStrategies();
-        strategies.addStrategies(ReservedKeysVerificationStrategy.build().logWarning().create());
+        final ReservedKeysVerificationStrategy.Builder builder = ReservedKeysVerificationStrategy.build().logWarning();
+        if (name.equals("__.addV().property('x','xyz', 'not-allowed', 'xxx')"))
+            builder.reservedKeys(new HashSet<>(Arrays.asList("id", "label", "not-allowed")));
+        strategies.addStrategies(builder.create());
         final Traversal traversal = this.traversal.asAdmin().clone();
         traversal.asAdmin().setStrategies(strategies);
         traversal.asAdmin().applyStrategies();
@@ -138,7 +146,11 @@
     @Test
     public void shouldThrowAndLog() {
         final TraversalStrategies strategies = new DefaultTraversalStrategies();
-        strategies.addStrategies(ReservedKeysVerificationStrategy.build().throwException().logWarning().create());
+        final ReservedKeysVerificationStrategy.Builder builder = ReservedKeysVerificationStrategy.build().
+                throwException().logWarning();
+        if (name.equals("__.addV().property('x','xyz', 'not-allowed', 'xxx')"))
+            builder.reservedKeys(new HashSet<>(Arrays.asList("id", "label", "not-allowed")));
+        strategies.addStrategies(builder.create());
         final Traversal traversal = this.traversal.asAdmin().clone();
         traversal.asAdmin().setStrategies(strategies);
         if (allow) {