diff --git a/geronimo-jsonb_1.0_spec/pom.xml b/geronimo-jsonb_1.0_spec/pom.xml
index 69745af..c77d779 100644
--- a/geronimo-jsonb_1.0_spec/pom.xml
+++ b/geronimo-jsonb_1.0_spec/pom.xml
@@ -73,9 +73,16 @@
         <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-json_1.1_spec</artifactId>
-            <version>1.2-SNAPSHOT</version>
+            <version>1.2</version>
             <scope>provided</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>5.5.1</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -133,6 +140,11 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>3.0.0-M3</version>
+            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/geronimo-jsonb_1.0_spec/src/main/java/javax/json/bind/JsonbConfig.java b/geronimo-jsonb_1.0_spec/src/main/java/javax/json/bind/JsonbConfig.java
index 2545961..90bc630 100644
--- a/geronimo-jsonb_1.0_spec/src/main/java/javax/json/bind/JsonbConfig.java
+++ b/geronimo-jsonb_1.0_spec/src/main/java/javax/json/bind/JsonbConfig.java
@@ -126,7 +126,7 @@
             final T[] existing = (T[]) opt.get();
             final T[] aggregated = (T[]) Array.newInstance(componentType, existing.length + values.length);
             System.arraycopy(existing, 0, aggregated, 0, existing.length);
-            System.arraycopy(values, 0, aggregated, existing.length + 1, values.length);
+            System.arraycopy(values, 0, aggregated, existing.length, values.length);
             return setProperty(key, aggregated);
         }
         return setProperty(key, values);
diff --git a/geronimo-jsonb_1.0_spec/src/test/java/org/apache/geronimo/specs/jsonb/JsonbConfigTest.java b/geronimo-jsonb_1.0_spec/src/test/java/org/apache/geronimo/specs/jsonb/JsonbConfigTest.java
new file mode 100644
index 0000000..8cb24a3
--- /dev/null
+++ b/geronimo-jsonb_1.0_spec/src/test/java/org/apache/geronimo/specs/jsonb/JsonbConfigTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.geronimo.specs.jsonb;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.adapter.JsonbAdapter;
+
+import org.junit.jupiter.api.Test;
+
+class JsonbConfigTest {
+    @Test
+    void accumulate() {
+        final JsonbConfig jsonbConfig = new JsonbConfig()
+                .withAdapters(new PassthroughIntegerAdapter())
+                .withAdapters(new PassthroughStringAdapter());
+
+        final Object adapters = jsonbConfig.getProperty(JsonbConfig.ADAPTERS).orElseThrow(AssertionError::new);
+        assertTrue(JsonbAdapter[].class.isAssignableFrom(adapters.getClass()));
+        assertEquals(2, JsonbAdapter[].class.cast(adapters).length);
+    }
+
+    public static class PassthroughStringAdapter implements JsonbAdapter<String, String> {
+        @Override
+        public String adaptToJson(final String obj) {
+            return obj;
+        }
+
+        @Override
+        public String adaptFromJson(final String obj) {
+            return obj;
+        }
+    }
+
+    public static class PassthroughIntegerAdapter implements JsonbAdapter<Integer, Integer> {
+        @Override
+        public Integer adaptToJson(final Integer obj) {
+            return obj;
+        }
+
+        @Override
+        public Integer adaptFromJson(final Integer obj) {
+            return obj;
+        }
+    }
+}
