diff --git a/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveBuilder.java b/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveBuilder.java
index 2339926..c091d98 100644
--- a/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveBuilder.java
@@ -15,168 +15,18 @@
  */
 package org.onosproject.store.primitives;
 
-import org.onosproject.core.ApplicationId;
 import org.onosproject.store.service.DistributedPrimitive;
-import org.onosproject.store.service.Serializer;
 
 /**
  * Abstract builder for distributed primitives.
  *
  * @param <T> distributed primitive type
  */
-public abstract class DistributedPrimitiveBuilder<B extends DistributedPrimitiveBuilder<B, T>,
-                                                  T extends DistributedPrimitive> {
-
-    private final DistributedPrimitive.Type type;
-    private String name;
-    private ApplicationId applicationId;
-    private Serializer serializer;
-    private boolean partitionsDisabled = false;
-    private boolean meteringDisabled = false;
-    private boolean readOnly = false;
-    private boolean relaxedReadConsistency = false;
-
-    public DistributedPrimitiveBuilder(DistributedPrimitive.Type type) {
-        this.type = type;
-    }
-
-    /**
-     * Sets the primitive name.
-     *
-     * @param name primitive name
-     * @return this builder
-     */
-    public B withName(String name) {
-        this.name = name;
-        return (B) this;
-    }
-
-    /**
-     * Sets the serializer to use for transcoding info held in the primitive.
-     *
-     * @param serializer serializer
-     * @return this builder
-     */
-    public B withSerializer(Serializer serializer) {
-        this.serializer = serializer;
-        return (B) this;
-    }
-
-    /**
-     * Sets the application id that owns this primitive.
-     *
-     * @param applicationId application identifier
-     * @return this builder
-     */
-    public B withApplicationId(ApplicationId applicationId) {
-        this.applicationId = applicationId;
-        return (B) this;
-    }
-
-    /**
-     * Disables recording usage stats for this primitive.
-     * @deprecated usage of this method is discouraged for most common scenarios.
-     * @return this builder
-     */
-    @Deprecated
-    public B withMeteringDisabled() {
-        this.meteringDisabled = true;
-        return (B) this;
-    }
-
-    /**
-     * Disables state changing operations on the returned distributed primitive.
-     * @return this builder
-     */
-    public B withUpdatesDisabled() {
-        this.readOnly = true;
-        return (B) this;
-    }
-
-    /**
-     * Turns on relaxed consistency for read operations.
-     * @return this builder
-     */
-    public B withRelaxedReadConsistency() {
-        this.relaxedReadConsistency = true;
-        return (B) this;
-    }
-
-    /**
-     * Returns if metering is enabled.
-     *
-     * @return {@code true} if yes; {@code false} otherwise
-     */
-    public final boolean meteringEnabled() {
-        return !meteringDisabled;
-    }
-
-    /**
-     * Returns if partitions are disabled.
-     *
-     * @return {@code true} if yes; {@code false} otherwise
-     */
-    public final boolean partitionsDisabled() {
-        return partitionsDisabled;
-    }
-
-    /**
-     * Returns if updates are disabled.
-     *
-     * @return {@code true} if yes; {@code false} otherwise
-     */
-    public final boolean readOnly() {
-        return readOnly;
-    }
-
-    /**
-     * Returns if consistency is relaxed for read operations.
-     *
-     * @return {@code true} if yes; {@code false} otherwise
-     */
-    public final boolean relaxedReadConsistency() {
-        return relaxedReadConsistency;
-    }
-
-    /**
-     * Returns the serializer.
-     *
-     * @return serializer
-     */
-    public final Serializer serializer() {
-        return serializer;
-    }
-
-    /**
-     * Returns the application identifier.
-     *
-     * @return application id
-     */
-    public final ApplicationId applicationId() {
-        return applicationId;
-    }
-
-    /**
-     * Returns the name of the primitive.
-     *
-     * @return primitive name
-     */
-    public final String name() {
-        return name;
-    }
-
-    /**
-     * Returns the primitive type.
-     *
-     * @return primitive type
-     */
-    public final DistributedPrimitive.Type type() {
-        return type;
-    }
+public interface DistributedPrimitiveBuilder<T extends DistributedPrimitive> {
 
     /**
      * Constructs an instance of the distributed primitive.
      * @return distributed primitive
      */
-    public abstract T build();
+    T build();
 }
diff --git a/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveCreator.java b/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveCreator.java
index 1e68bdb..5fa88a7 100644
--- a/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveCreator.java
+++ b/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveCreator.java
@@ -29,9 +29,21 @@
 import org.onosproject.store.service.AsyncDistributedSet;
 import org.onosproject.store.service.AsyncDocumentTree;
 import org.onosproject.store.service.AsyncLeaderElector;
+import org.onosproject.store.service.AtomicCounterMapOptions;
+import org.onosproject.store.service.AtomicCounterOptions;
+import org.onosproject.store.service.AtomicIdGeneratorOptions;
+import org.onosproject.store.service.AtomicValueOptions;
+import org.onosproject.store.service.ConsistentMapOptions;
+import org.onosproject.store.service.ConsistentMultimapOptions;
+import org.onosproject.store.service.ConsistentTreeMapOptions;
+import org.onosproject.store.service.DistributedLockOptions;
+import org.onosproject.store.service.DistributedSetOptions;
+import org.onosproject.store.service.DocumentTreeOptions;
+import org.onosproject.store.service.LeaderElectorOptions;
 import org.onosproject.store.service.Ordering;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.WorkQueue;
+import org.onosproject.store.service.WorkQueueOptions;
 
 import static org.onosproject.store.service.DistributedPrimitive.DEFAULT_OPERATION_TIMEOUT_MILLIS;
 
@@ -48,8 +60,23 @@
      * @param <K> key type
      * @param <V> value type
      * @return map
+     * @deprecated in Nightingale Release (1.13)
      */
-    <K, V> AsyncConsistentMap<K, V> newAsyncConsistentMap(String name, Serializer serializer);
+    @Deprecated
+    default <K, V> AsyncConsistentMap<K, V> newAsyncConsistentMap(String name, Serializer serializer) {
+        return newAsyncConsistentMap((ConsistentMapOptions) new ConsistentMapOptions() {
+        }.withName(name).withSerializer(serializer));
+    }
+
+    /**
+     * Creates a new {@code AsyncConsistentMap}.
+     *
+     * @param options map options
+     * @param <K> key type
+     * @param <V> value type
+     * @return map
+     */
+    <K, V> AsyncConsistentMap<K, V> newAsyncConsistentMap(ConsistentMapOptions options);
 
     /**
      * Creates a new {@code AsyncConsistentTreeMap}.
@@ -58,8 +85,22 @@
      * @param serializer serializer to use for serializing/deserializing map entries
      * @param <V> value type
      * @return distributedTreeMap
+     * @deprecated in Nightingale Release (1.13)
      */
-    <V> AsyncConsistentTreeMap<V> newAsyncConsistentTreeMap(String name, Serializer serializer);
+    @Deprecated
+    default <V> AsyncConsistentTreeMap<V> newAsyncConsistentTreeMap(String name, Serializer serializer) {
+        return newAsyncConsistentTreeMap((ConsistentTreeMapOptions) new ConsistentTreeMapOptions() {
+        }.withName(name).withSerializer(serializer));
+    }
+
+    /**
+     * Creates a new {@code AsyncConsistentTreeMap}.
+     *
+     * @param options tree map options
+     * @param <V> value type
+     * @return distributedTreeMap
+     */
+    <V> AsyncConsistentTreeMap<V> newAsyncConsistentTreeMap(ConsistentTreeMapOptions options);
 
     /**
      * Creates a new set backed {@code AsyncConsistentMultimap}.
@@ -69,8 +110,23 @@
      * @param <K> key type
      * @param <V> value type
      * @return set backed distributedMultimap
+     * @deprecated in Nightingale Release (1.13)
      */
-    <K, V> AsyncConsistentMultimap<K, V> newAsyncConsistentSetMultimap(String name, Serializer serializer);
+    @Deprecated
+    default <K, V> AsyncConsistentMultimap<K, V> newAsyncConsistentSetMultimap(String name, Serializer serializer) {
+        return newAsyncConsistentSetMultimap((ConsistentMultimapOptions) new ConsistentMultimapOptions() {
+        }.withName(name).withSerializer(serializer));
+    }
+
+    /**
+     * Creates a new set backed {@code AsyncConsistentMultimap}.
+     *
+     * @param options multimap options
+     * @param <K> key type
+     * @param <V> value type
+     * @return set backed distributedMultimap
+     */
+    <K, V> AsyncConsistentMultimap<K, V> newAsyncConsistentSetMultimap(ConsistentMultimapOptions options);
 
     /**
      * Creates a new {@code AsyncAtomicCounterMap}.
@@ -79,24 +135,64 @@
      * @param serializer serializer to use for serializing/deserializing keys
      * @param <K> key type
      * @return atomic counter map
+     * @deprecated in Nightingale Release (1.13)
      */
-    <K> AsyncAtomicCounterMap<K> newAsyncAtomicCounterMap(String name, Serializer serializer);
+    @Deprecated
+    default <K> AsyncAtomicCounterMap<K> newAsyncAtomicCounterMap(String name, Serializer serializer) {
+        return newAsyncAtomicCounterMap((AtomicCounterMapOptions) new AtomicCounterMapOptions() {
+        }.withName(name).withSerializer(serializer));
+    }
+
+    /**
+     * Creates a new {@code AsyncAtomicCounterMap}.
+     *
+     * @param options counter map options
+     * @param <K> key type
+     * @return atomic counter map
+     */
+    <K> AsyncAtomicCounterMap<K> newAsyncAtomicCounterMap(AtomicCounterMapOptions options);
 
     /**
      * Creates a new {@code AsyncAtomicCounter}.
      *
      * @param name counter name
      * @return counter
+     * @deprecated in Nightingale Release (1.13)
      */
-    AsyncAtomicCounter newAsyncCounter(String name);
+    @Deprecated
+    default AsyncAtomicCounter newAsyncCounter(String name) {
+        return newAsyncCounter((AtomicCounterOptions) new AtomicCounterOptions() {
+        }.withName(name));
+    }
+
+    /**
+     * Creates a new {@code AsyncAtomicCounter}.
+     *
+     * @param options counter options
+     * @return counter
+     */
+    AsyncAtomicCounter newAsyncCounter(AtomicCounterOptions options);
 
     /**
      * Creates a new {@code AsyncAtomixIdGenerator}.
      *
      * @param name ID generator name
      * @return ID generator
+     * @deprecated in Nightingale Release (1.13)
      */
-    AsyncAtomicIdGenerator newAsyncIdGenerator(String name);
+    @Deprecated
+    default AsyncAtomicIdGenerator newAsyncIdGenerator(String name) {
+        return newAsyncIdGenerator((AtomicIdGeneratorOptions) new AtomicIdGeneratorOptions() {
+        }.withName(name));
+    }
+
+    /**
+     * Creates a new {@code AsyncAtomixIdGenerator}.
+     *
+     * @param options ID generator options
+     * @return ID generator
+     */
+    AsyncAtomicIdGenerator newAsyncIdGenerator(AtomicIdGeneratorOptions options);
 
     /**
      * Creates a new {@code AsyncAtomicValue}.
@@ -105,8 +201,22 @@
      * @param serializer serializer to use for serializing/deserializing value type
      * @param <V> value type
      * @return value
+     * @deprecated in Nightingale Release (1.13)
      */
-    <V> AsyncAtomicValue<V> newAsyncAtomicValue(String name, Serializer serializer);
+    @Deprecated
+    default <V> AsyncAtomicValue<V> newAsyncAtomicValue(String name, Serializer serializer) {
+        return newAsyncAtomicValue((AtomicValueOptions) new AtomicValueOptions() {
+        }.withName(name).withSerializer(serializer));
+    }
+
+    /**
+     * Creates a new {@code AsyncAtomicValue}.
+     *
+     * @param options value options
+     * @param <V> value type
+     * @return value
+     */
+    <V> AsyncAtomicValue<V> newAsyncAtomicValue(AtomicValueOptions options);
 
     /**
      * Creates a new {@code AsyncDistributedSet}.
@@ -115,23 +225,52 @@
      * @param serializer serializer to use for serializing/deserializing set entries
      * @param <E> set entry type
      * @return set
+     * @deprecated in Nightingale Release (1.13)
      */
-    <E> AsyncDistributedSet<E> newAsyncDistributedSet(String name, Serializer serializer);
+    @Deprecated
+    default <E> AsyncDistributedSet<E> newAsyncDistributedSet(String name, Serializer serializer) {
+        return newAsyncDistributedSet((DistributedSetOptions) new DistributedSetOptions() {
+        }.withName(name).withSerializer(serializer));
+    }
+
+    /**
+     * Creates a new {@code AsyncDistributedSet}.
+     *
+     * @param options set options
+     * @param <E> set entry type
+     * @return set
+     */
+    <E> AsyncDistributedSet<E> newAsyncDistributedSet(DistributedSetOptions options);
 
     /**
      * Creates a new {@code AsyncDistributedLock}.
      *
      * @param name lock name
      * @return lock
+     * @deprecated in Nightingale Release (1.13)
      */
-    AsyncDistributedLock newAsyncDistributedLock(String name);
+    @Deprecated
+    default AsyncDistributedLock newAsyncDistributedLock(String name) {
+        return newAsyncDistributedLock((DistributedLockOptions) new DistributedLockOptions() {
+        }.withName(name));
+    }
+
+    /**
+     * Creates a new {@code AsyncDistributedLock}.
+     *
+     * @param options lock options
+     * @return lock
+     */
+    AsyncDistributedLock newAsyncDistributedLock(DistributedLockOptions options);
 
     /**
      * Creates a new {@code AsyncLeaderElector}.
      *
      * @param name leader elector name
      * @return leader elector
+     * @deprecated in Nightingale Release (1.13)
      */
+    @Deprecated
     default AsyncLeaderElector newAsyncLeaderElector(String name) {
         return newAsyncLeaderElector(name, DEFAULT_OPERATION_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
     }
@@ -143,8 +282,24 @@
      * @param electionTimeout leader election timeout
      * @param timeUnit leader election timeout time unit
      * @return leader elector
+     * @deprecated in Nightingale Release (1.13)
      */
-    AsyncLeaderElector newAsyncLeaderElector(String name, long electionTimeout, TimeUnit timeUnit);
+    @Deprecated
+    default AsyncLeaderElector newAsyncLeaderElector(String name, long electionTimeout, TimeUnit timeUnit) {
+        LeaderElectorOptions options = new LeaderElectorOptions() {
+        };
+        options.withName(name);
+        options.withElectionTimeout(electionTimeout, timeUnit);
+        return newAsyncLeaderElector(options);
+    }
+
+    /**
+     * Creates a new {@code AsyncLeaderElector}.
+     *
+     * @param options leader elector options
+     * @return leader elector
+     */
+    AsyncLeaderElector newAsyncLeaderElector(LeaderElectorOptions options);
 
     /**
      * Creates a new {@code WorkQueue}.
@@ -153,8 +308,22 @@
      * @param name work queue name
      * @param serializer serializer
      * @return work queue
+     * @deprecated in Nightingale Release (1.13)
      */
-    <E> WorkQueue<E> newWorkQueue(String name, Serializer serializer);
+    @Deprecated
+    default <E> WorkQueue<E> newWorkQueue(String name, Serializer serializer) {
+        return newWorkQueue((WorkQueueOptions) new WorkQueueOptions() {
+        }.withName(name).withSerializer(serializer));
+    }
+
+    /**
+     * Creates a new {@code WorkQueue}.
+     *
+     * @param <E> work element type
+     * @param options work queue options
+     * @return work queue
+     */
+    <E> WorkQueue<E> newWorkQueue(WorkQueueOptions options);
 
     /**
      * Creates a new {@code AsyncDocumentTree}.
@@ -163,7 +332,9 @@
      * @param name tree name
      * @param serializer serializer
      * @return document tree
+     * @deprecated in Nightingale Release (1.13)
      */
+    @Deprecated
     default <V> AsyncDocumentTree<V> newAsyncDocumentTree(String name, Serializer serializer) {
         return newAsyncDocumentTree(name, serializer, Ordering.NATURAL);
     }
@@ -176,8 +347,26 @@
      * @param serializer serializer
      * @param ordering tree node ordering
      * @return document tree
+     * @deprecated in Nightingale Release (1.13)
      */
-    <V> AsyncDocumentTree<V> newAsyncDocumentTree(String name, Serializer serializer, Ordering ordering);
+    @Deprecated
+    default <V> AsyncDocumentTree<V> newAsyncDocumentTree(String name, Serializer serializer, Ordering ordering) {
+        DocumentTreeOptions options = new DocumentTreeOptions() {
+        };
+        options.withName(name);
+        options.withSerializer(serializer);
+        options.withOrdering(ordering);
+        return newAsyncDocumentTree(options);
+    }
+
+    /**
+     * Creates a new {@code AsyncDocumentTree}.
+     *
+     * @param <V> document tree node value type
+     * @param options tree options
+     * @return document tree
+     */
+    <V> AsyncDocumentTree<V> newAsyncDocumentTree(DocumentTreeOptions options);
 
     /**
      * Returns the names of all created {@code AsyncConsistentMap} instances.
diff --git a/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveOptions.java b/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveOptions.java
new file mode 100644
index 0000000..c576375
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/primitives/DistributedPrimitiveOptions.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.primitives;
+
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.Version;
+import org.onosproject.store.service.DistributedPrimitive;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.RevisionType;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Abstract builder for distributed primitives.
+ *
+ * @param <O> distributed primitive options type
+ */
+public abstract class DistributedPrimitiveOptions<O extends DistributedPrimitiveOptions<O>> {
+
+    private final DistributedPrimitive.Type type;
+    private String name;
+    private ApplicationId applicationId;
+    private Serializer serializer;
+    private boolean partitionsDisabled = false;
+    private boolean meteringDisabled = false;
+    private boolean readOnly = false;
+    private boolean relaxedReadConsistency = false;
+    private int revisionNumber = 1;
+    private RevisionType revisionType = RevisionType.NONE;
+
+    public DistributedPrimitiveOptions(DistributedPrimitive.Type type) {
+        this.type = type;
+    }
+
+    /**
+     * Sets the primitive name.
+     *
+     * @param name primitive name
+     * @return this builder
+     */
+    public O withName(String name) {
+        this.name = name;
+        return (O) this;
+    }
+
+    /**
+     * Sets the serializer to use for transcoding info held in the primitive.
+     *
+     * @param serializer serializer
+     * @return this builder
+     */
+    public O withSerializer(Serializer serializer) {
+        this.serializer = serializer;
+        return (O) this;
+    }
+
+    /**
+     * Sets the application id that owns this primitive.
+     *
+     * @param applicationId application identifier
+     * @return this builder
+     */
+    public O withApplicationId(ApplicationId applicationId) {
+        this.applicationId = applicationId;
+        return (O) this;
+    }
+
+    /**
+     * Sets the primitive version.
+     *
+     * @param version the primitive version
+     * @return this builder
+     */
+    public O withVersion(Version version) {
+        return withRevisionNumber(version.toInt());
+    }
+
+    /**
+     * Sets the primitive revision.
+     *
+     * @param revision the primitive revision
+     * @return this builder
+     */
+    public O withRevisionNumber(int revision) {
+        this.revisionNumber = revision;
+        return (O) this;
+    }
+
+    /**
+     * Sets the primitive revision type.
+     *
+     * @param revisionType the revision type
+     * @return this builder
+     */
+    public O withRevisionType(RevisionType revisionType) {
+        this.revisionType = checkNotNull(revisionType);
+        return (O) this;
+    }
+
+    /**
+     * Disables recording usage stats for this primitive.
+     * @deprecated usage of this method is discouraged for most common scenarios.
+     * @return this builder
+     */
+    @Deprecated
+    public O withMeteringDisabled() {
+        this.meteringDisabled = true;
+        return (O) this;
+    }
+
+    /**
+     * Disables state changing operations on the returned distributed primitive.
+     * @return this builder
+     */
+    public O withUpdatesDisabled() {
+        this.readOnly = true;
+        return (O) this;
+    }
+
+    /**
+     * Turns on relaxed consistency for read operations.
+     * @return this builder
+     */
+    public O withRelaxedReadConsistency() {
+        this.relaxedReadConsistency = true;
+        return (O) this;
+    }
+
+    /**
+     * Returns if metering is enabled.
+     *
+     * @return {@code true} if yes; {@code false} otherwise
+     */
+    public final boolean meteringEnabled() {
+        return !meteringDisabled;
+    }
+
+    /**
+     * Returns if partitions are disabled.
+     *
+     * @return {@code true} if yes; {@code false} otherwise
+     */
+    public final boolean partitionsDisabled() {
+        return partitionsDisabled;
+    }
+
+    /**
+     * Returns if updates are disabled.
+     *
+     * @return {@code true} if yes; {@code false} otherwise
+     */
+    public final boolean readOnly() {
+        return readOnly;
+    }
+
+    /**
+     * Returns if consistency is relaxed for read operations.
+     *
+     * @return {@code true} if yes; {@code false} otherwise
+     */
+    public final boolean relaxedReadConsistency() {
+        return relaxedReadConsistency;
+    }
+
+    /**
+     * Returns the serializer.
+     *
+     * @return serializer
+     */
+    public final Serializer serializer() {
+        return serializer;
+    }
+
+    /**
+     * Returns the application identifier.
+     *
+     * @return application id
+     */
+    public final ApplicationId applicationId() {
+        return applicationId;
+    }
+
+    /**
+     * Returns the name of the primitive.
+     *
+     * @return primitive name
+     */
+    public final String name() {
+        return name;
+    }
+
+    /**
+     * Returns the primitive type.
+     *
+     * @return primitive type
+     */
+    public final DistributedPrimitive.Type type() {
+        return type;
+    }
+
+    /**
+     * Returns the primitive revision number.
+     *
+     * @return the primitive revision number
+     */
+    public final int revision() {
+        return revisionNumber;
+    }
+
+    /**
+     * Returns the primitive revision type.
+     *
+     * @return the primitive revision type
+     */
+    public RevisionType revisionType() {
+        return revisionType;
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicCounterBuilder.java b/core/api/src/main/java/org/onosproject/store/service/AtomicCounterBuilder.java
index e0f8efd..0fdd778 100644
--- a/core/api/src/main/java/org/onosproject/store/service/AtomicCounterBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicCounterBuilder.java
@@ -21,8 +21,6 @@
  * Builder for AtomicCounter.
  */
 public abstract class AtomicCounterBuilder
-    extends DistributedPrimitiveBuilder<AtomicCounterBuilder, AsyncAtomicCounter> {
-    public AtomicCounterBuilder() {
-        super(DistributedPrimitive.Type.COUNTER);
-    }
+    extends AtomicCounterOptions<AtomicCounterBuilder>
+    implements DistributedPrimitiveBuilder<AsyncAtomicCounter> {
 }
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicCounterMapBuilder.java b/core/api/src/main/java/org/onosproject/store/service/AtomicCounterMapBuilder.java
index 96c8e91..9598e34 100644
--- a/core/api/src/main/java/org/onosproject/store/service/AtomicCounterMapBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicCounterMapBuilder.java
@@ -21,10 +21,8 @@
  * Builder for AtomicCounterMap.
  */
 public abstract class AtomicCounterMapBuilder<K>
-        extends DistributedPrimitiveBuilder<AtomicCounterMapBuilder<K>, AtomicCounterMap<K>> {
-    public AtomicCounterMapBuilder() {
-        super(DistributedPrimitive.Type.COUNTER_MAP);
-    }
+    extends AtomicCounterMapOptions<AtomicCounterMapBuilder<K>, K>
+    implements DistributedPrimitiveBuilder<AtomicCounterMap<K>> {
 
     /**
      * Builds an async atomic counter map based on the configuration options
diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicCounterMapOptions.java b/core/api/src/main/java/org/onosproject/store/service/AtomicCounterMapOptions.java
new file mode 100644
index 0000000..f9c5d3e
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicCounterMapOptions.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for AtomicCounterMap.
+ */
+public abstract class AtomicCounterMapOptions<O extends AtomicCounterMapOptions<O, K>, K>
+        extends DistributedPrimitiveOptions<O> {
+    public AtomicCounterMapOptions() {
+        super(DistributedPrimitive.Type.COUNTER_MAP);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicCounterOptions.java b/core/api/src/main/java/org/onosproject/store/service/AtomicCounterOptions.java
new file mode 100644
index 0000000..1a0bd9b
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicCounterOptions.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Options for AtomicCounter.
+ */
+public abstract class AtomicCounterOptions<O extends AtomicCounterOptions<O>>
+    extends DistributedPrimitiveOptions<O> {
+    public AtomicCounterOptions() {
+        super(DistributedPrimitive.Type.COUNTER);
+    }
+}
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicIdGeneratorBuilder.java b/core/api/src/main/java/org/onosproject/store/service/AtomicIdGeneratorBuilder.java
index ef90642..b7d8e88 100644
--- a/core/api/src/main/java/org/onosproject/store/service/AtomicIdGeneratorBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicIdGeneratorBuilder.java
@@ -21,8 +21,6 @@
  * Builder for AtomicIdGenerator.
  */
 public abstract class AtomicIdGeneratorBuilder
-    extends DistributedPrimitiveBuilder<AtomicIdGeneratorBuilder, AsyncAtomicIdGenerator> {
-    public AtomicIdGeneratorBuilder() {
-        super(DistributedPrimitive.Type.ID_GENERATOR);
-    }
+    extends AtomicIdGeneratorOptions<AtomicIdGeneratorBuilder>
+    implements DistributedPrimitiveBuilder<AsyncAtomicIdGenerator> {
 }
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicIdGeneratorOptions.java b/core/api/src/main/java/org/onosproject/store/service/AtomicIdGeneratorOptions.java
new file mode 100644
index 0000000..44e2649
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicIdGeneratorOptions.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Options for AtomicIdGenerator.
+ */
+public abstract class AtomicIdGeneratorOptions<O extends AtomicIdGeneratorOptions<O>>
+    extends DistributedPrimitiveOptions<O> {
+    public AtomicIdGeneratorOptions() {
+        super(DistributedPrimitive.Type.ID_GENERATOR);
+    }
+}
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicValueBuilder.java b/core/api/src/main/java/org/onosproject/store/service/AtomicValueBuilder.java
index 10b26d3..4c08707 100644
--- a/core/api/src/main/java/org/onosproject/store/service/AtomicValueBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicValueBuilder.java
@@ -23,9 +23,6 @@
  * @param <V> atomic value type
  */
 public abstract class AtomicValueBuilder<V>
-    extends DistributedPrimitiveBuilder<AtomicValueBuilder<V>, AsyncAtomicValue<V>> {
-
-    public AtomicValueBuilder() {
-        super(DistributedPrimitive.Type.VALUE);
-    }
+    extends AtomicValueOptions<AtomicValueBuilder<V>, V>
+    implements DistributedPrimitiveBuilder<AsyncAtomicValue<V>> {
 }
diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicValueOptions.java b/core/api/src/main/java/org/onosproject/store/service/AtomicValueOptions.java
new file mode 100644
index 0000000..b00a7af
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicValueOptions.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for constructing new AtomicValue instances.
+ *
+ * @param <V> atomic value type
+ */
+public abstract class AtomicValueOptions<O extends AtomicValueOptions<O, V>, V> extends DistributedPrimitiveOptions<O> {
+    public AtomicValueOptions() {
+        super(DistributedPrimitive.Type.VALUE);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/ConsistentMapBuilder.java b/core/api/src/main/java/org/onosproject/store/service/ConsistentMapBuilder.java
index d991072..4773035 100644
--- a/core/api/src/main/java/org/onosproject/store/service/ConsistentMapBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/ConsistentMapBuilder.java
@@ -24,51 +24,8 @@
  * @param <V> type for map value
  */
 public abstract class ConsistentMapBuilder<K, V>
-    extends DistributedPrimitiveBuilder<ConsistentMapBuilder<K, V>, ConsistentMap<K, V>> {
-
-    private boolean nullValues = false;
-    private boolean purgeOnUninstall = false;
-
-    public ConsistentMapBuilder() {
-        super(DistributedPrimitive.Type.CONSISTENT_MAP);
-    }
-
-    /**
-     * Enables null values in the map.
-     *
-     * @return this builder
-     */
-    public ConsistentMapBuilder<K, V> withNullValues() {
-        nullValues = true;
-        return this;
-    }
-
-    /**
-     * Clears map contents when the owning application is uninstalled.
-     *
-     * @return this builder
-     */
-    public ConsistentMapBuilder<K, V> withPurgeOnUninstall() {
-        purgeOnUninstall = true;
-        return this;
-    }
-
-    /**
-     * Returns whether null values are supported by the map.
-     *
-     * @return {@code true} if null values are supported; {@code false} otherwise
-     */
-    public boolean nullValues() {
-        return nullValues;
-    }
-
-    /**
-     * Returns if map entries need to be cleared when owning application is uninstalled.
-     * @return {@code true} if yes; {@code false} otherwise.
-     */
-    public boolean purgeOnUninstall() {
-        return purgeOnUninstall;
-    }
+    extends ConsistentMapOptions<ConsistentMapBuilder<K, V>, K, V>
+    implements DistributedPrimitiveBuilder<ConsistentMap<K, V>> {
 
     /**
      * Builds an async consistent map based on the configuration options
diff --git a/core/api/src/main/java/org/onosproject/store/service/ConsistentMapOptions.java b/core/api/src/main/java/org/onosproject/store/service/ConsistentMapOptions.java
new file mode 100644
index 0000000..587789d
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/ConsistentMapOptions.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for {@link ConsistentMap} instances.
+ *
+ * @param <K> type for map key
+ * @param <V> type for map value
+ */
+public abstract class ConsistentMapOptions<O extends ConsistentMapOptions<O, K, V>, K, V>
+    extends DistributedPrimitiveOptions<O> {
+
+    private boolean nullValues = false;
+    private boolean purgeOnUninstall = false;
+
+    public ConsistentMapOptions() {
+        super(DistributedPrimitive.Type.CONSISTENT_MAP);
+    }
+
+    /**
+     * Enables null values in the map.
+     *
+     * @return this builder
+     */
+    public O withNullValues() {
+        nullValues = true;
+        return (O) this;
+    }
+
+    /**
+     * Clears map contents when the owning application is uninstalled.
+     *
+     * @return this builder
+     */
+    public O withPurgeOnUninstall() {
+        purgeOnUninstall = true;
+        return (O) this;
+    }
+
+    /**
+     * Returns whether null values are supported by the map.
+     *
+     * @return {@code true} if null values are supported; {@code false} otherwise
+     */
+    public boolean nullValues() {
+        return nullValues;
+    }
+
+    /**
+     * Returns if map entries need to be cleared when owning application is uninstalled.
+     * @return {@code true} if yes; {@code false} otherwise.
+     */
+    public boolean purgeOnUninstall() {
+        return purgeOnUninstall;
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/ConsistentMultimapBuilder.java b/core/api/src/main/java/org/onosproject/store/service/ConsistentMultimapBuilder.java
index 15f4606..3af5e65 100644
--- a/core/api/src/main/java/org/onosproject/store/service/ConsistentMultimapBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/ConsistentMultimapBuilder.java
@@ -22,34 +22,8 @@
  * A builder class for {@code AsyncConsistentMultimap}.
  */
 public abstract class ConsistentMultimapBuilder<K, V>
-        extends DistributedPrimitiveBuilder<ConsistentMultimapBuilder<K, V>,
-        ConsistentMultimap<K, V>> {
-
-    private boolean purgeOnUninstall = false;
-
-    public ConsistentMultimapBuilder() {
-        super(DistributedPrimitive.Type.CONSISTENT_MULTIMAP);
-    }
-
-    /**
-     * Clears multimap contents when the owning application is uninstalled.
-     *
-     * @return this builder
-     */
-    public ConsistentMultimapBuilder<K, V> withPurgeOnUninstall() {
-        purgeOnUninstall = true;
-        return this;
-    }
-
-    /**
-     * Returns if multimap entries need to be cleared when owning application
-     * is uninstalled.
-     *
-     * @return true if items are to be cleared on uninstall
-     */
-    public boolean purgeOnUninstall() {
-        return purgeOnUninstall;
-    }
+    extends ConsistentMultimapOptions<ConsistentMultimapBuilder<K, V>, K, V>
+    implements DistributedPrimitiveBuilder<ConsistentMultimap<K, V>> {
 
     /**
      * Builds the distributed multimap based on the configuration options
diff --git a/core/api/src/main/java/org/onosproject/store/service/ConsistentMultimapOptions.java b/core/api/src/main/java/org/onosproject/store/service/ConsistentMultimapOptions.java
new file mode 100644
index 0000000..84fe6bb
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/ConsistentMultimapOptions.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * A builder class for {@code AsyncConsistentMultimap}.
+ */
+public abstract class ConsistentMultimapOptions<O extends ConsistentMultimapOptions<O, K, V>, K, V>
+        extends DistributedPrimitiveOptions<O> {
+
+    private boolean purgeOnUninstall = false;
+
+    public ConsistentMultimapOptions() {
+        super(DistributedPrimitive.Type.CONSISTENT_MULTIMAP);
+    }
+
+    /**
+     * Clears multimap contents when the owning application is uninstalled.
+     *
+     * @return this builder
+     */
+    public O withPurgeOnUninstall() {
+        purgeOnUninstall = true;
+        return (O) this;
+    }
+
+    /**
+     * Returns if multimap entries need to be cleared when owning application
+     * is uninstalled.
+     *
+     * @return true if items are to be cleared on uninstall
+     */
+    public boolean purgeOnUninstall() {
+        return purgeOnUninstall;
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/ConsistentTreeMapBuilder.java b/core/api/src/main/java/org/onosproject/store/service/ConsistentTreeMapBuilder.java
index 6c8d3b0..fc7c2f9 100644
--- a/core/api/src/main/java/org/onosproject/store/service/ConsistentTreeMapBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/ConsistentTreeMapBuilder.java
@@ -22,32 +22,8 @@
  * Builder for {@link ConsistentTreeMap}.
  */
 public abstract class ConsistentTreeMapBuilder<V>
-        extends DistributedPrimitiveBuilder<ConsistentTreeMapBuilder<V>, ConsistentTreeMap<V>> {
-
-    private boolean purgeOnUninstall = false;
-
-    public ConsistentTreeMapBuilder() {
-        super(DistributedPrimitive.Type.CONSISTENT_TREEMAP);
-    }
-
-    /**
-     * Clears map contents when the owning application is uninstalled.
-     *
-     * @return this builder
-     */
-    public ConsistentTreeMapBuilder<V> withPurgeOnUninstall() {
-        purgeOnUninstall = true;
-        return this;
-    }
-
-    /**
-     * Return if map entries need to be cleared when owning application is uninstalled.
-     *
-     * @return true if items are to be cleared on uninstall
-     */
-    public boolean purgeOnUninstall() {
-        return purgeOnUninstall;
-    }
+    extends ConsistentTreeMapOptions<ConsistentTreeMapBuilder<V>, V>
+    implements DistributedPrimitiveBuilder<ConsistentTreeMap<V>> {
 
     /**
      * Builds the distributed tree map based on the configuration options supplied
diff --git a/core/api/src/main/java/org/onosproject/store/service/ConsistentTreeMapOptions.java b/core/api/src/main/java/org/onosproject/store/service/ConsistentTreeMapOptions.java
new file mode 100644
index 0000000..5725683
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/ConsistentTreeMapOptions.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for {@link ConsistentTreeMap}.
+ */
+public abstract class ConsistentTreeMapOptions<O extends ConsistentTreeMapOptions<O, V>, V>
+    extends DistributedPrimitiveOptions<O> {
+
+    private boolean purgeOnUninstall = false;
+
+    public ConsistentTreeMapOptions() {
+        super(DistributedPrimitive.Type.CONSISTENT_TREEMAP);
+    }
+
+    /**
+     * Clears map contents when the owning application is uninstalled.
+     *
+     * @return this builder
+     */
+    public O withPurgeOnUninstall() {
+        purgeOnUninstall = true;
+        return (O) this;
+    }
+
+    /**
+     * Return if map entries need to be cleared when owning application is uninstalled.
+     *
+     * @return true if items are to be cleared on uninstall
+     */
+    public boolean purgeOnUninstall() {
+        return purgeOnUninstall;
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/DistributedLockBuilder.java b/core/api/src/main/java/org/onosproject/store/service/DistributedLockBuilder.java
index 7e61c6a..32e77e3 100644
--- a/core/api/src/main/java/org/onosproject/store/service/DistributedLockBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/DistributedLockBuilder.java
@@ -21,8 +21,6 @@
  * Builder for DistributedLock.
  */
 public abstract class DistributedLockBuilder
-    extends DistributedPrimitiveBuilder<DistributedLockBuilder, AsyncDistributedLock> {
-    public DistributedLockBuilder() {
-        super(DistributedPrimitive.Type.LOCK);
-    }
+    extends DistributedLockOptions<DistributedLockBuilder>
+    implements DistributedPrimitiveBuilder<AsyncDistributedLock> {
 }
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/store/service/DistributedLockOptions.java b/core/api/src/main/java/org/onosproject/store/service/DistributedLockOptions.java
new file mode 100644
index 0000000..21a8c6f
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/DistributedLockOptions.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for DistributedLock.
+ */
+public abstract class DistributedLockOptions<O extends DistributedLockOptions<O>>
+    extends DistributedPrimitiveOptions<O> {
+    public DistributedLockOptions() {
+        super(DistributedPrimitive.Type.LOCK);
+    }
+}
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/store/service/DistributedSetBuilder.java b/core/api/src/main/java/org/onosproject/store/service/DistributedSetBuilder.java
index c80bd0e..1420e4b 100644
--- a/core/api/src/main/java/org/onosproject/store/service/DistributedSetBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/DistributedSetBuilder.java
@@ -22,30 +22,7 @@
  *
  * @param <E> type set elements.
  */
-public abstract class DistributedSetBuilder<E> extends DistributedPrimitiveBuilder<DistributedSetBuilder<E>,
-                                                                                   AsyncDistributedSet<E>> {
-
-    private boolean purgeOnUninstall = false;
-
-    public DistributedSetBuilder() {
-        super(DistributedPrimitive.Type.SET);
-    }
-
-    /**
-     * Enables clearing set contents when the owning application is uninstalled.
-     *
-     * @return this builder
-     */
-    public DistributedSetBuilder<E> withPurgeOnUninstall() {
-        purgeOnUninstall = true;
-        return this;
-    }
-
-    /**
-     * Returns if set contents need to be cleared when owning application is uninstalled.
-     * @return {@code true} if yes; {@code false} otherwise.
-     */
-    public boolean purgeOnUninstall() {
-        return purgeOnUninstall;
-    }
+public abstract class DistributedSetBuilder<E>
+    extends DistributedSetOptions<DistributedSetBuilder<E>, E>
+    implements DistributedPrimitiveBuilder<AsyncDistributedSet<E>> {
 }
diff --git a/core/api/src/main/java/org/onosproject/store/service/DistributedSetOptions.java b/core/api/src/main/java/org/onosproject/store/service/DistributedSetOptions.java
new file mode 100644
index 0000000..2c6efd0
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/DistributedSetOptions.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for distributed set.
+ *
+ * @param <E> type set elements.
+ */
+public abstract class DistributedSetOptions<O extends DistributedSetOptions<O, E>, E>
+    extends DistributedPrimitiveOptions<O> {
+
+    private boolean purgeOnUninstall = false;
+
+    public DistributedSetOptions() {
+        super(DistributedPrimitive.Type.SET);
+    }
+
+    /**
+     * Enables clearing set contents when the owning application is uninstalled.
+     *
+     * @return this builder
+     */
+    public O withPurgeOnUninstall() {
+        purgeOnUninstall = true;
+        return (O) this;
+    }
+
+    /**
+     * Returns if set contents need to be cleared when owning application is uninstalled.
+     * @return {@code true} if yes; {@code false} otherwise.
+     */
+    public boolean purgeOnUninstall() {
+        return purgeOnUninstall;
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/DocumentTreeBuilder.java b/core/api/src/main/java/org/onosproject/store/service/DocumentTreeBuilder.java
index 14ecd5c..fb012db 100644
--- a/core/api/src/main/java/org/onosproject/store/service/DocumentTreeBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/DocumentTreeBuilder.java
@@ -22,59 +22,8 @@
  * Builder for {@link DocumentTree}.
  */
 public abstract class DocumentTreeBuilder<V>
-        extends DistributedPrimitiveBuilder<DocumentTreeBuilder<V>, AsyncDocumentTree<V>> {
-
-    private boolean purgeOnUninstall = false;
-    private Ordering ordering = Ordering.NATURAL;
-
-    public DocumentTreeBuilder() {
-        super(DistributedPrimitive.Type.DOCUMENT_TREE);
-    }
-
-    /**
-     * Clears document tree contents when the owning application is uninstalled.
-     *
-     * @return this builder
-     */
-    public DocumentTreeBuilder<V> withPurgeOnUninstall() {
-        purgeOnUninstall = true;
-        return this;
-    }
-
-    /**
-     * Return if document tree entries need to be cleared when owning application is uninstalled.
-     *
-     * @return true if items are to be cleared on uninstall
-     */
-    public boolean purgeOnUninstall() {
-        return purgeOnUninstall;
-    }
-
-    /**
-     * Sets the ordering of the tree nodes.
-     * <p>
-     * When {@link AsyncDocumentTree#getChildren(DocumentPath)} is called, children will be returned according to
-     * the specified sort order.
-     *
-     * @param ordering ordering of the tree nodes
-     * @return this builder
-     */
-    public DocumentTreeBuilder<V> withOrdering(Ordering ordering) {
-        this.ordering = ordering;
-        return this;
-    }
-
-    /**
-     * Returns the ordering of tree nodes.
-     * <p>
-     * When {@link AsyncDocumentTree#getChildren(DocumentPath)} is called, children will be returned according to
-     * the specified sort order.
-     *
-     * @return the ordering of tree nodes
-     */
-    public Ordering ordering() {
-        return ordering;
-    }
+    extends DocumentTreeOptions<DocumentTreeBuilder<V>, V>
+    implements DistributedPrimitiveBuilder<AsyncDocumentTree<V>> {
 
     /**
      * Builds the distributed Document tree based on the configuration options supplied
diff --git a/core/api/src/main/java/org/onosproject/store/service/DocumentTreeOptions.java b/core/api/src/main/java/org/onosproject/store/service/DocumentTreeOptions.java
new file mode 100644
index 0000000..d93b9c3
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/DocumentTreeOptions.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for {@link DocumentTree}.
+ */
+public abstract class DocumentTreeOptions<O extends DocumentTreeOptions<O, V>, V>
+        extends DistributedPrimitiveOptions<O> {
+
+    private boolean purgeOnUninstall = false;
+    private Ordering ordering = Ordering.NATURAL;
+
+    public DocumentTreeOptions() {
+        super(DistributedPrimitive.Type.DOCUMENT_TREE);
+    }
+
+    /**
+     * Clears document tree contents when the owning application is uninstalled.
+     *
+     * @return this builder
+     */
+    public O withPurgeOnUninstall() {
+        purgeOnUninstall = true;
+        return (O) this;
+    }
+
+    /**
+     * Return if document tree entries need to be cleared when owning application is uninstalled.
+     *
+     * @return true if items are to be cleared on uninstall
+     */
+    public boolean purgeOnUninstall() {
+        return purgeOnUninstall;
+    }
+
+    /**
+     * Sets the ordering of the tree nodes.
+     * <p>
+     * When {@link AsyncDocumentTree#getChildren(DocumentPath)} is called, children will be returned according to
+     * the specified sort order.
+     *
+     * @param ordering ordering of the tree nodes
+     * @return this builder
+     */
+    public O withOrdering(Ordering ordering) {
+        this.ordering = ordering;
+        return (O) this;
+    }
+
+    /**
+     * Returns the ordering of tree nodes.
+     * <p>
+     * When {@link AsyncDocumentTree#getChildren(DocumentPath)} is called, children will be returned according to
+     * the specified sort order.
+     *
+     * @return the ordering of tree nodes
+     */
+    public Ordering ordering() {
+        return ordering;
+    }
+}
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/store/service/LeaderElectorBuilder.java b/core/api/src/main/java/org/onosproject/store/service/LeaderElectorBuilder.java
index d3d6951..aef492d 100644
--- a/core/api/src/main/java/org/onosproject/store/service/LeaderElectorBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/LeaderElectorBuilder.java
@@ -15,50 +15,12 @@
  */
 package org.onosproject.store.service;
 
-import java.util.concurrent.TimeUnit;
-
 import org.onosproject.store.primitives.DistributedPrimitiveBuilder;
 
 /**
  * Builder for constructing new {@link AsyncLeaderElector} instances.
  */
 public abstract class LeaderElectorBuilder
-    extends DistributedPrimitiveBuilder<LeaderElectorBuilder, AsyncLeaderElector> {
-
-    private long electionTimeoutMillis = DistributedPrimitive.DEFAULT_OPERATION_TIMEOUT_MILLIS;
-
-    public LeaderElectorBuilder() {
-        super(DistributedPrimitive.Type.LEADER_ELECTOR);
-    }
-
-    /**
-     * Sets the election timeout in milliseconds.
-     *
-     * @param electionTimeoutMillis the election timeout in milliseconds
-     * @return leader elector builder
-     */
-    public LeaderElectorBuilder withElectionTimeout(long electionTimeoutMillis) {
-        this.electionTimeoutMillis = electionTimeoutMillis;
-        return this;
-    }
-
-    /**
-     * Sets the election timeout.
-     *
-     * @param electionTimeout the election timeout
-     * @param timeUnit the timeout time unit
-     * @return leader elector builder
-     */
-    public LeaderElectorBuilder withElectionTimeout(long electionTimeout, TimeUnit timeUnit) {
-        return withElectionTimeout(timeUnit.toMillis(electionTimeout));
-    }
-
-    /**
-     * Returns the election timeout in milliseconds.
-     *
-     * @return the election timeout in milliseconds
-     */
-    public final long electionTimeoutMillis() {
-        return electionTimeoutMillis;
-    }
+    extends LeaderElectorOptions<LeaderElectorBuilder>
+    implements DistributedPrimitiveBuilder<AsyncLeaderElector> {
 }
diff --git a/core/api/src/main/java/org/onosproject/store/service/LeaderElectorOptions.java b/core/api/src/main/java/org/onosproject/store/service/LeaderElectorOptions.java
new file mode 100644
index 0000000..ff879b5
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/LeaderElectorOptions.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import java.util.concurrent.TimeUnit;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for constructing new {@link AsyncLeaderElector} instances.
+ */
+public abstract class LeaderElectorOptions<O extends LeaderElectorOptions<O>>
+    extends DistributedPrimitiveOptions<O> {
+
+    private long electionTimeoutMillis = DistributedPrimitive.DEFAULT_OPERATION_TIMEOUT_MILLIS;
+
+    public LeaderElectorOptions() {
+        super(DistributedPrimitive.Type.LEADER_ELECTOR);
+    }
+
+    /**
+     * Sets the election timeout in milliseconds.
+     *
+     * @param electionTimeoutMillis the election timeout in milliseconds
+     * @return leader elector builder
+     */
+    public O withElectionTimeout(long electionTimeoutMillis) {
+        this.electionTimeoutMillis = electionTimeoutMillis;
+        return (O) this;
+    }
+
+    /**
+     * Sets the election timeout.
+     *
+     * @param electionTimeout the election timeout
+     * @param timeUnit the timeout time unit
+     * @return leader elector builder
+     */
+    public O withElectionTimeout(long electionTimeout, TimeUnit timeUnit) {
+        return withElectionTimeout(timeUnit.toMillis(electionTimeout));
+    }
+
+    /**
+     * Returns the election timeout in milliseconds.
+     *
+     * @return the election timeout in milliseconds
+     */
+    public final long electionTimeoutMillis() {
+        return electionTimeoutMillis;
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/RevisionType.java b/core/api/src/main/java/org/onosproject/store/service/RevisionType.java
new file mode 100644
index 0000000..77152aa
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/RevisionType.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+/**
+ * Distributed primitive revision types.
+ * <p>
+ * Revision types dictate the semantics of new revisions of a distributed primitive. They indicate how the new
+ * revision is initialized and how it relates to prior revisions.
+ */
+public enum RevisionType {
+
+    /**
+     * A distributed primitive that is initialized with an empty state.
+     */
+    NONE,
+
+    /**
+     * A distributed primitive that is initialized from the previous revision and sets the previous revision to
+     * read-only mode.
+     */
+    VERSION,
+
+    /**
+     * A distributed primitive that is initialized from the state of the previous revision and to which changes to
+     * the previous revision are propagated.
+     */
+    PROPAGATE,
+
+    /**
+     * A distributed primitive that is initialized from the state of the previous revision and thereafter diverges.
+     */
+    ISOLATE,
+
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/TransactionContextBuilder.java b/core/api/src/main/java/org/onosproject/store/service/TransactionContextBuilder.java
index c9af8e9..d456d1c7 100644
--- a/core/api/src/main/java/org/onosproject/store/service/TransactionContextBuilder.java
+++ b/core/api/src/main/java/org/onosproject/store/service/TransactionContextBuilder.java
@@ -21,9 +21,6 @@
  * Abstract base class for a transaction context builder.
  */
 public abstract class TransactionContextBuilder
-    extends DistributedPrimitiveBuilder<TransactionContextBuilder, TransactionContext> {
-
-    public TransactionContextBuilder() {
-        super(DistributedPrimitive.Type.TRANSACTION_CONTEXT);
-    }
+    extends TransactionContextOptions<TransactionContextBuilder>
+    implements DistributedPrimitiveBuilder<TransactionContext> {
 }
diff --git a/core/api/src/main/java/org/onosproject/store/service/TransactionContextOptions.java b/core/api/src/main/java/org/onosproject/store/service/TransactionContextOptions.java
new file mode 100644
index 0000000..7336f2f
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/TransactionContextOptions.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Abstract base class for a transaction context builder.
+ */
+public abstract class TransactionContextOptions<O extends TransactionContextOptions<O>>
+    extends DistributedPrimitiveOptions<O> {
+    public TransactionContextOptions() {
+        super(DistributedPrimitive.Type.TRANSACTION_CONTEXT);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/WorkQueueBuilder.java b/core/api/src/main/java/org/onosproject/store/service/WorkQueueBuilder.java
new file mode 100644
index 0000000..52bf3ae
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/WorkQueueBuilder.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveBuilder;
+
+/**
+ * Builder for WorkQueue.
+ */
+public abstract class WorkQueueBuilder<E>
+    extends WorkQueueOptions<WorkQueueBuilder<E>, E>
+    implements DistributedPrimitiveBuilder<WorkQueue<E>> {
+}
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/store/service/WorkQueueOptions.java b/core/api/src/main/java/org/onosproject/store/service/WorkQueueOptions.java
new file mode 100644
index 0000000..8d5e23a
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/store/service/WorkQueueOptions.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.store.service;
+
+import org.onosproject.store.primitives.DistributedPrimitiveOptions;
+
+/**
+ * Builder for WorkQueue.
+ */
+public abstract class WorkQueueOptions<O extends WorkQueueOptions<O, E>, E>
+    extends DistributedPrimitiveOptions<O> {
+    public WorkQueueOptions() {
+        super(DistributedPrimitive.Type.LOCK);
+    }
+}
\ No newline at end of file
diff --git a/core/store/primitives/pom.xml b/core/store/primitives/pom.xml
index aaa9bdf..bbdf9a3 100644
--- a/core/store/primitives/pom.xml
+++ b/core/store/primitives/pom.xml
@@ -69,7 +69,7 @@
         <dependency>
             <groupId>io.atomix</groupId>
             <artifactId>atomix</artifactId>
-            <version>2.0.18</version>
+            <version>2.0.20</version>
         </dependency>
 
         <dependency>
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/FederatedDistributedPrimitiveCreator.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/FederatedDistributedPrimitiveCreator.java
index 0e53f77..b6f27f0 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/FederatedDistributedPrimitiveCreator.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/FederatedDistributedPrimitiveCreator.java
@@ -19,7 +19,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 
 import com.google.common.base.Charsets;
@@ -44,10 +43,20 @@
 import org.onosproject.store.service.AsyncDistributedSet;
 import org.onosproject.store.service.AsyncDocumentTree;
 import org.onosproject.store.service.AsyncLeaderElector;
+import org.onosproject.store.service.AtomicCounterMapOptions;
+import org.onosproject.store.service.AtomicCounterOptions;
+import org.onosproject.store.service.AtomicIdGeneratorOptions;
+import org.onosproject.store.service.AtomicValueOptions;
+import org.onosproject.store.service.ConsistentMapOptions;
+import org.onosproject.store.service.ConsistentMultimapOptions;
+import org.onosproject.store.service.ConsistentTreeMapOptions;
+import org.onosproject.store.service.DistributedLockOptions;
+import org.onosproject.store.service.DistributedSetOptions;
 import org.onosproject.store.service.DocumentPath;
-import org.onosproject.store.service.Ordering;
-import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.DocumentTreeOptions;
+import org.onosproject.store.service.LeaderElectorOptions;
 import org.onosproject.store.service.WorkQueue;
+import org.onosproject.store.service.WorkQueueOptions;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -72,13 +81,11 @@
     }
 
     @Override
-    public <K, V> AsyncConsistentMap<K, V> newAsyncConsistentMap(String name, Serializer serializer) {
-        checkNotNull(name);
-        checkNotNull(serializer);
+    public <K, V> AsyncConsistentMap<K, V> newAsyncConsistentMap(ConsistentMapOptions options) {
         Map<PartitionId, AsyncConsistentMap<byte[], byte[]>> maps =
                 Maps.transformValues(members,
                                      partition -> DistributedPrimitives.newTranscodingMap(
-                                             partition.<String, byte[]>newAsyncConsistentMap(name, null),
+                                             partition.<String, byte[]>newAsyncConsistentMap(options.name(), null),
                                              HexString::toHexString,
                                              HexString::fromHexString,
                                              Function.identity(),
@@ -87,78 +94,76 @@
             int bucket = Math.abs(Hashing.murmur3_32().hashBytes(key).asInt()) % buckets;
             return sortedMemberPartitionIds.get(Hashing.consistentHash(bucket, sortedMemberPartitionIds.size()));
         };
-        AsyncConsistentMap<byte[], byte[]> partitionedMap = new PartitionedAsyncConsistentMap<>(name, maps, hasher);
+        AsyncConsistentMap<byte[], byte[]> partitionedMap =
+            new PartitionedAsyncConsistentMap<>(options.name(), maps, hasher);
         return DistributedPrimitives.newTranscodingMap(partitionedMap,
-                key -> serializer.encode(key),
-                bytes -> serializer.decode(bytes),
-                value -> value == null ? null : serializer.encode(value),
-                bytes -> serializer.decode(bytes));
+                key -> options.serializer().encode(key),
+                bytes -> options.serializer().decode(bytes),
+                value -> value == null ? null : options.serializer().encode(value),
+                bytes -> options.serializer().decode(bytes));
     }
 
     @Override
-    public <V> AsyncConsistentTreeMap<V> newAsyncConsistentTreeMap(String name, Serializer serializer) {
-        return getCreator(name).newAsyncConsistentTreeMap(name, serializer);
+    public <V> AsyncConsistentTreeMap<V> newAsyncConsistentTreeMap(ConsistentTreeMapOptions options) {
+        return getCreator(options.name()).newAsyncConsistentTreeMap(options.name(), options.serializer());
     }
 
     @Override
-    public <K, V> AsyncConsistentMultimap<K, V> newAsyncConsistentSetMultimap(String name, Serializer serializer) {
-        return getCreator(name).newAsyncConsistentSetMultimap(name, serializer);
+    public <K, V> AsyncConsistentMultimap<K, V> newAsyncConsistentSetMultimap(ConsistentMultimapOptions options) {
+        return getCreator(options.name()).newAsyncConsistentSetMultimap(options);
     }
 
     @Override
-    public <E> AsyncDistributedSet<E> newAsyncDistributedSet(String name, Serializer serializer) {
-        return DistributedPrimitives.newSetFromMap(newAsyncConsistentMap(name, serializer));
+    public <E> AsyncDistributedSet<E> newAsyncDistributedSet(DistributedSetOptions options) {
+        return DistributedPrimitives.newSetFromMap(newAsyncConsistentMap(options.name(), options.serializer()));
     }
 
     @Override
-    public <K> AsyncAtomicCounterMap<K> newAsyncAtomicCounterMap(String name, Serializer serializer) {
-        return getCreator(name).newAsyncAtomicCounterMap(name, serializer);
+    public <K> AsyncAtomicCounterMap<K> newAsyncAtomicCounterMap(AtomicCounterMapOptions options) {
+        return getCreator(options.name()).newAsyncAtomicCounterMap(options);
     }
 
     @Override
-    public AsyncAtomicCounter newAsyncCounter(String name) {
-        return getCreator(name).newAsyncCounter(name);
+    public AsyncAtomicCounter newAsyncCounter(AtomicCounterOptions options) {
+        return getCreator(options.name()).newAsyncCounter(options);
     }
 
     @Override
-    public AsyncAtomicIdGenerator newAsyncIdGenerator(String name) {
-        return getCreator(name).newAsyncIdGenerator(name);
+    public AsyncAtomicIdGenerator newAsyncIdGenerator(AtomicIdGeneratorOptions options) {
+        return getCreator(options.name()).newAsyncIdGenerator(options);
     }
 
     @Override
-    public <V> AsyncAtomicValue<V> newAsyncAtomicValue(String name, Serializer serializer) {
-        return getCreator(name).newAsyncAtomicValue(name, serializer);
+    public <V> AsyncAtomicValue<V> newAsyncAtomicValue(AtomicValueOptions options) {
+        return getCreator(options.name()).newAsyncAtomicValue(options);
     }
 
     @Override
-    public AsyncDistributedLock newAsyncDistributedLock(String name) {
-        return getCreator(name).newAsyncDistributedLock(name);
+    public AsyncDistributedLock newAsyncDistributedLock(DistributedLockOptions options) {
+        return getCreator(options.name()).newAsyncDistributedLock(options);
     }
 
     @Override
-    public AsyncLeaderElector newAsyncLeaderElector(String name, long leaderTimeout, TimeUnit timeUnit) {
-        checkNotNull(name);
+    public AsyncLeaderElector newAsyncLeaderElector(LeaderElectorOptions options) {
         Map<PartitionId, AsyncLeaderElector> leaderElectors =
                 Maps.transformValues(members,
-                                     partition -> partition.newAsyncLeaderElector(name, leaderTimeout, timeUnit));
+                                     partition -> partition.newAsyncLeaderElector(options));
         Hasher<String> hasher = topic -> {
             int hashCode = Hashing.sha256().hashString(topic, Charsets.UTF_8).asInt();
             return sortedMemberPartitionIds.get(Math.abs(hashCode) % members.size());
         };
-        return new PartitionedAsyncLeaderElector(name, leaderElectors, hasher);
+        return new PartitionedAsyncLeaderElector(options.name(), leaderElectors, hasher);
     }
 
     @Override
-    public <E> WorkQueue<E> newWorkQueue(String name, Serializer serializer) {
-        return getCreator(name).newWorkQueue(name, serializer);
+    public <E> WorkQueue<E> newWorkQueue(WorkQueueOptions options) {
+        return getCreator(options.name()).newWorkQueue(options);
     }
 
     @Override
-    public <V> AsyncDocumentTree<V> newAsyncDocumentTree(String name, Serializer serializer, Ordering ordering) {
-        checkNotNull(name);
-        checkNotNull(serializer);
+    public <V> AsyncDocumentTree<V> newAsyncDocumentTree(DocumentTreeOptions options) {
         Map<PartitionId, AsyncDocumentTree<V>> trees =
-                Maps.transformValues(members, part -> part.<V>newAsyncDocumentTree(name, serializer, ordering));
+                Maps.transformValues(members, part -> part.<V>newAsyncDocumentTree(options));
         Hasher<DocumentPath> hasher = key -> {
             int bucket = (key == null) ? 0 :
                     Math.abs(Hashing.murmur3_32()
@@ -166,7 +171,7 @@
                                   .asInt()) % buckets;
             return sortedMemberPartitionIds.get(Hashing.consistentHash(bucket, sortedMemberPartitionIds.size()));
         };
-        return new PartitionedAsyncDocumentTree<>(name, trees, hasher);
+        return new PartitionedAsyncDocumentTree<>(options.name(), trees, hasher);
     }
 
     @Override
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StorageNamespaces.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StorageNamespaces.java
index 6639f72..4eaac99 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StorageNamespaces.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StorageNamespaces.java
@@ -64,6 +64,7 @@
 import io.atomix.protocols.raft.protocol.ResetRequest;
 import io.atomix.protocols.raft.protocol.VoteRequest;
 import io.atomix.protocols.raft.protocol.VoteResponse;
+import io.atomix.protocols.raft.service.PropagationStrategy;
 import io.atomix.protocols.raft.session.RaftSessionMetadata;
 import io.atomix.protocols.raft.session.SessionId;
 import io.atomix.protocols.raft.storage.log.entry.CloseSessionEntry;
@@ -149,6 +150,7 @@
             .register(RaftMember.Type.class)
             .register(Instant.class)
             .register(Configuration.class)
+            .register(PropagationStrategy.class)
             .build("RaftProtocol");
 
     /**
@@ -176,6 +178,7 @@
             .register(RaftMember.Type.class)
             .register(Instant.class)
             .register(Configuration.class)
+            .register(PropagationStrategy.class)
             .build("RaftStorage");
 
     private StorageNamespaces() {
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StoragePartitionClient.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StoragePartitionClient.java
index 2318d08..0438fe5 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StoragePartitionClient.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/StoragePartitionClient.java
@@ -18,7 +18,6 @@
 import java.time.Duration;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import com.google.common.base.Suppliers;
@@ -27,6 +26,7 @@
 import io.atomix.protocols.raft.cluster.MemberId;
 import io.atomix.protocols.raft.protocol.RaftClientProtocol;
 import io.atomix.protocols.raft.proxy.CommunicationStrategy;
+import io.atomix.protocols.raft.service.PropagationStrategy;
 import io.atomix.protocols.raft.session.RaftSessionMetadata;
 import org.onlab.util.HexString;
 import org.onosproject.store.primitives.DistributedPrimitiveCreator;
@@ -52,11 +52,22 @@
 import org.onosproject.store.service.AsyncDistributedSet;
 import org.onosproject.store.service.AsyncDocumentTree;
 import org.onosproject.store.service.AsyncLeaderElector;
+import org.onosproject.store.service.AtomicCounterMapOptions;
+import org.onosproject.store.service.AtomicCounterOptions;
+import org.onosproject.store.service.AtomicIdGeneratorOptions;
+import org.onosproject.store.service.AtomicValueOptions;
+import org.onosproject.store.service.ConsistentMapOptions;
+import org.onosproject.store.service.ConsistentMultimapOptions;
+import org.onosproject.store.service.ConsistentTreeMapOptions;
+import org.onosproject.store.service.DistributedLockOptions;
 import org.onosproject.store.service.DistributedPrimitive;
-import org.onosproject.store.service.Ordering;
+import org.onosproject.store.service.DistributedSetOptions;
+import org.onosproject.store.service.DocumentTreeOptions;
+import org.onosproject.store.service.LeaderElectorOptions;
 import org.onosproject.store.service.PartitionClientInfo;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.WorkQueue;
+import org.onosproject.store.service.WorkQueueOptions;
 import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
@@ -137,193 +148,212 @@
 
     @Override
     @SuppressWarnings("unchecked")
-    public <K, V> AsyncConsistentMap<K, V> newAsyncConsistentMap(String name, Serializer serializer) {
+    public <K, V> AsyncConsistentMap<K, V> newAsyncConsistentMap(ConsistentMapOptions options) {
         AtomixConsistentMap rawMap =
                 new AtomixConsistentMap(client.newProxyBuilder()
-                        .withName(name)
+                        .withName(options.name())
                         .withServiceType(DistributedPrimitive.Type.CONSISTENT_MAP.name())
                         .withReadConsistency(ReadConsistency.SEQUENTIAL)
                         .withCommunicationStrategy(CommunicationStrategy.ANY)
                         .withMinTimeout(MIN_TIMEOUT)
                         .withMaxTimeout(MAX_TIMEOUT)
                         .withMaxRetries(MAX_RETRIES)
+                        .withRevision(options.revision())
+                        .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                         .build()
                         .open()
                         .join());
 
-        if (serializer != null) {
+        if (options.serializer() != null) {
             return DistributedPrimitives.newTranscodingMap(rawMap,
-                    key -> HexString.toHexString(serializer.encode(key)),
-                    string -> serializer.decode(HexString.fromHexString(string)),
-                    value -> value == null ? null : serializer.encode(value),
-                    bytes -> serializer.decode(bytes));
+                    key -> HexString.toHexString(options.serializer().encode(key)),
+                    string -> options.serializer().decode(HexString.fromHexString(string)),
+                    value -> value == null ? null : options.serializer().encode(value),
+                    bytes -> options.serializer().decode(bytes));
         }
         return (AsyncConsistentMap<K, V>) rawMap;
     }
 
     @Override
     @SuppressWarnings("unchecked")
-    public <V> AsyncConsistentTreeMap<V> newAsyncConsistentTreeMap(String name, Serializer serializer) {
+    public <V> AsyncConsistentTreeMap<V> newAsyncConsistentTreeMap(ConsistentTreeMapOptions options) {
         AtomixConsistentTreeMap rawMap =
                 new AtomixConsistentTreeMap(client.newProxyBuilder()
-                        .withName(name)
+                        .withName(options.name())
                         .withServiceType(DistributedPrimitive.Type.CONSISTENT_TREEMAP.name())
                         .withReadConsistency(ReadConsistency.SEQUENTIAL)
                         .withCommunicationStrategy(CommunicationStrategy.ANY)
                         .withMinTimeout(MIN_TIMEOUT)
                         .withMaxTimeout(MAX_TIMEOUT)
                         .withMaxRetries(MAX_RETRIES)
+                        .withRevision(options.revision())
+                        .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                         .build()
                         .open()
                         .join());
 
-        if (serializer != null) {
+        if (options.serializer() != null) {
             return DistributedPrimitives.newTranscodingTreeMap(
                             rawMap,
-                            value -> value == null ? null : serializer.encode(value),
-                            bytes -> serializer.decode(bytes));
+                            value -> value == null ? null : options.serializer().encode(value),
+                            bytes -> options.serializer().decode(bytes));
         }
         return (AsyncConsistentTreeMap<V>) rawMap;
     }
 
     @Override
     @SuppressWarnings("unchecked")
-    public <K, V> AsyncConsistentMultimap<K, V> newAsyncConsistentSetMultimap(String name, Serializer serializer) {
+    public <K, V> AsyncConsistentMultimap<K, V> newAsyncConsistentSetMultimap(ConsistentMultimapOptions options) {
         AtomixConsistentSetMultimap rawMap =
                 new AtomixConsistentSetMultimap(client.newProxyBuilder()
-                        .withName(name)
+                        .withName(options.name())
                         .withServiceType(DistributedPrimitive.Type.CONSISTENT_MULTIMAP.name())
                         .withReadConsistency(ReadConsistency.SEQUENTIAL)
                         .withCommunicationStrategy(CommunicationStrategy.ANY)
                         .withMinTimeout(MIN_TIMEOUT)
                         .withMaxTimeout(MAX_TIMEOUT)
                         .withMaxRetries(MAX_RETRIES)
+                        .withRevision(options.revision())
+                        .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                         .build()
                         .open()
                         .join());
 
-        if (serializer != null) {
+        if (options.serializer() != null) {
             return DistributedPrimitives.newTranscodingMultimap(
                             rawMap,
-                            key -> HexString.toHexString(serializer.encode(key)),
-                            string -> serializer.decode(HexString.fromHexString(string)),
-                            value -> serializer.encode(value),
-                            bytes -> serializer.decode(bytes));
+                            key -> HexString.toHexString(options.serializer().encode(key)),
+                            string -> options.serializer().decode(HexString.fromHexString(string)),
+                            value -> options.serializer().encode(value),
+                            bytes -> options.serializer().decode(bytes));
         }
         return (AsyncConsistentMultimap<K, V>) rawMap;
     }
 
     @Override
-    public <E> AsyncDistributedSet<E> newAsyncDistributedSet(String name, Serializer serializer) {
-        return DistributedPrimitives.newSetFromMap(newAsyncConsistentMap(name, serializer));
+    public <E> AsyncDistributedSet<E> newAsyncDistributedSet(DistributedSetOptions options) {
+        return DistributedPrimitives.newSetFromMap(newAsyncConsistentMap(options.name(), options.serializer()));
     }
 
     @Override
     @SuppressWarnings("unchecked")
-    public <K> AsyncAtomicCounterMap<K> newAsyncAtomicCounterMap(String name, Serializer serializer) {
+    public <K> AsyncAtomicCounterMap<K> newAsyncAtomicCounterMap(AtomicCounterMapOptions options) {
         AtomixAtomicCounterMap rawMap = new AtomixAtomicCounterMap(client.newProxyBuilder()
-                .withName(name)
+                .withName(options.name())
                 .withServiceType(DistributedPrimitive.Type.COUNTER_MAP.name())
                 .withReadConsistency(ReadConsistency.LINEARIZABLE_LEASE)
                 .withCommunicationStrategy(CommunicationStrategy.LEADER)
                 .withMinTimeout(MIN_TIMEOUT)
                 .withMaxTimeout(MAX_TIMEOUT)
                 .withMaxRetries(MAX_RETRIES)
+                .withRevision(options.revision())
+                .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                 .build()
                 .open()
                 .join());
 
-        if (serializer != null) {
+        if (options.serializer() != null) {
             return DistributedPrimitives.newTranscodingAtomicCounterMap(
                             rawMap,
-                            key -> HexString.toHexString(serializer.encode(key)),
-                            string -> serializer.decode(HexString.fromHexString(string)));
+                            key -> HexString.toHexString(options.serializer().encode(key)),
+                            string -> options.serializer().decode(HexString.fromHexString(string)));
         }
         return (AsyncAtomicCounterMap<K>) rawMap;
     }
 
     @Override
-    public AsyncAtomicCounter newAsyncCounter(String name) {
+    public AsyncAtomicCounter newAsyncCounter(AtomicCounterOptions options) {
         return new AtomixCounter(client.newProxyBuilder()
-                .withName(name)
+                .withName(options.name())
                 .withServiceType(DistributedPrimitive.Type.COUNTER.name())
                 .withReadConsistency(ReadConsistency.LINEARIZABLE_LEASE)
                 .withCommunicationStrategy(CommunicationStrategy.LEADER)
                 .withMinTimeout(MIN_TIMEOUT)
                 .withMaxTimeout(MAX_TIMEOUT)
                 .withMaxRetries(MAX_RETRIES)
+                .withRevision(options.revision())
+                .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                 .build()
                 .open()
                 .join());
     }
 
     @Override
-    public AsyncAtomicIdGenerator newAsyncIdGenerator(String name) {
-        return new AtomixIdGenerator(newAsyncCounter(name));
+    public AsyncAtomicIdGenerator newAsyncIdGenerator(AtomicIdGeneratorOptions options) {
+        return new AtomixIdGenerator(newAsyncCounter(options.name()));
     }
 
     @Override
-    public <V> AsyncAtomicValue<V> newAsyncAtomicValue(String name, Serializer serializer) {
-        return new DefaultAsyncAtomicValue<>(name, serializer, onosAtomicValuesMap.get());
+    public <V> AsyncAtomicValue<V> newAsyncAtomicValue(AtomicValueOptions options) {
+        return new DefaultAsyncAtomicValue<>(options.name(), options.serializer(), onosAtomicValuesMap.get());
     }
 
     @Override
-    public <E> WorkQueue<E> newWorkQueue(String name, Serializer serializer) {
+    public <E> WorkQueue<E> newWorkQueue(WorkQueueOptions options) {
         AtomixWorkQueue atomixWorkQueue = new AtomixWorkQueue(client.newProxyBuilder()
-                .withName(name)
+                .withName(options.name())
                 .withServiceType(DistributedPrimitive.Type.WORK_QUEUE.name())
                 .withReadConsistency(ReadConsistency.LINEARIZABLE_LEASE)
                 .withCommunicationStrategy(CommunicationStrategy.LEADER)
                 .withMinTimeout(MIN_TIMEOUT)
                 .withMaxTimeout(MAX_TIMEOUT)
                 .withMaxRetries(MAX_RETRIES)
+                .withRevision(options.revision())
+                .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                 .build()
                 .open()
                 .join());
-        return new DefaultDistributedWorkQueue<>(atomixWorkQueue, serializer);
+        return new DefaultDistributedWorkQueue<>(atomixWorkQueue, options.serializer());
     }
 
     @Override
-    public <V> AsyncDocumentTree<V> newAsyncDocumentTree(String name, Serializer serializer, Ordering ordering) {
+    public <V> AsyncDocumentTree<V> newAsyncDocumentTree(DocumentTreeOptions options) {
+        String serviceType = String.format("%s-%s", DistributedPrimitive.Type.DOCUMENT_TREE.name(), options.ordering());
         AtomixDocumentTree atomixDocumentTree = new AtomixDocumentTree(client.newProxyBuilder()
-                .withName(name)
-                .withServiceType(String.format("%s-%s", DistributedPrimitive.Type.DOCUMENT_TREE.name(), ordering))
+                .withName(options.name())
+                .withServiceType(serviceType)
                 .withReadConsistency(ReadConsistency.SEQUENTIAL)
                 .withCommunicationStrategy(CommunicationStrategy.ANY)
                 .withMinTimeout(MIN_TIMEOUT)
                 .withMaxTimeout(MAX_TIMEOUT)
                 .withMaxRetries(MAX_RETRIES)
+                .withRevision(options.revision())
+                .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                 .build()
                 .open()
                 .join());
-        return new DefaultDistributedDocumentTree<>(name, atomixDocumentTree, serializer);
+        return new DefaultDistributedDocumentTree<>(options.name(), atomixDocumentTree, options.serializer());
     }
 
     @Override
-    public AsyncDistributedLock newAsyncDistributedLock(String name) {
+    public AsyncDistributedLock newAsyncDistributedLock(DistributedLockOptions options) {
         return new AtomixDistributedLock(client.newProxyBuilder()
-                .withName(name)
+                .withName(options.name())
                 .withServiceType(DistributedPrimitive.Type.LOCK.name())
                 .withReadConsistency(ReadConsistency.LINEARIZABLE)
                 .withCommunicationStrategy(CommunicationStrategy.LEADER)
                 .withMinTimeout(MIN_TIMEOUT)
                 .withMaxTimeout(MIN_TIMEOUT)
                 .withMaxRetries(MAX_RETRIES)
+                .withRevision(options.revision())
+                .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                 .build()
                 .open()
                 .join());
     }
 
     @Override
-    public AsyncLeaderElector newAsyncLeaderElector(String name, long leaderTimeout, TimeUnit timeUnit) {
+    public AsyncLeaderElector newAsyncLeaderElector(LeaderElectorOptions options) {
         return new AtomixLeaderElector(client.newProxyBuilder()
-                .withName(name)
+                .withName(options.name())
                 .withServiceType(DistributedPrimitive.Type.LEADER_ELECTOR.name())
                 .withReadConsistency(ReadConsistency.LINEARIZABLE)
                 .withCommunicationStrategy(CommunicationStrategy.LEADER)
-                .withMinTimeout(Duration.ofMillis(timeUnit.toMillis(leaderTimeout)))
+                .withMinTimeout(Duration.ofMillis(options.electionTimeoutMillis()))
                 .withMaxTimeout(MIN_TIMEOUT)
                 .withMaxRetries(MAX_RETRIES)
+                .withRevision(options.revision())
+                .withPropagationStrategy(PropagationStrategy.valueOf(options.revisionType().name()))
                 .build()
                 .open()
                 .join());
diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixDistributedLockServiceTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixDistributedLockServiceTest.java
index fb92eba..cf3e051 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixDistributedLockServiceTest.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixDistributedLockServiceTest.java
@@ -65,6 +65,7 @@
         expect(context.serviceId()).andReturn(ServiceId.from(1)).anyTimes();
         expect(context.currentIndex()).andReturn(index.get()).anyTimes();
         expect(context.currentOperation()).andReturn(OperationType.COMMAND).anyTimes();
+        expect(context.locked()).andReturn(false).anyTimes();
 
         RaftContext server = mock(RaftContext.class);
         expect(server.getProtocol()).andReturn(mock(RaftServerProtocol.class)).anyTimes();
diff --git a/features/features.xml b/features/features.xml
index eddb899..02c9805 100644
--- a/features/features.xml
+++ b/features/features.xml
@@ -59,7 +59,7 @@
         <bundle>mvn:com.typesafe/config/1.2.1</bundle>
         <bundle>mvn:com.googlecode.concurrent-trees/concurrent-trees/2.6.0</bundle>
         <bundle>mvn:commons-io/commons-io/2.4</bundle>
-        <bundle>mvn:io.atomix/atomix/2.0.18</bundle>
+        <bundle>mvn:io.atomix/atomix/2.0.20</bundle>
 
         <bundle>mvn:org.glassfish.jersey.core/jersey-client/2.26</bundle>
 
diff --git a/lib/BUCK b/lib/BUCK
index f742a37..1302f55 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -1,4 +1,4 @@
-# ***** This file was auto-generated at Mon, 2 Apr 2018 16:16:40 GMT. Do not edit this file manually. *****
+# ***** This file was auto-generated at Wed, 4 Apr 2018 19:53:12 GMT. Do not edit this file manually. *****
 # ***** Use onos-lib-gen *****
 
 pass_thru_pom(
@@ -207,10 +207,10 @@
 
 remote_jar (
   name = 'atomix',
-  out = 'atomix-2.0.18.jar',
-  url = 'mvn:io.atomix:atomix:jar:2.0.18',
-  sha1 = 'e5a9ea68155a7c97c591a4c40d608bf5f80e5c73',
-  maven_coords = 'io.atomix:atomix:2.0.18',
+  out = 'atomix-2.0.20.jar',
+  url = 'mvn:io.atomix:atomix:jar:2.0.20',
+  sha1 = '7039de42423b8cd80d6a99208d61f7ee7ec52e50',
+  maven_coords = 'io.atomix:atomix:2.0.20',
   visibility = [ 'PUBLIC' ],
 )
 
diff --git a/lib/deps.json b/lib/deps.json
index 692ffa6..8192ee7 100644
--- a/lib/deps.json
+++ b/lib/deps.json
@@ -116,7 +116,7 @@
     "aopalliance-repackaged": "mvn:org.glassfish.hk2.external:aopalliance-repackaged:2.5.0-b42",
     "amqp-client": "mvn:com.rabbitmq:amqp-client:jar:3.6.1",
     "asm": "mvn:org.ow2.asm:asm:5.0.4",
-    "atomix": "mvn:io.atomix:atomix:2.0.18",
+    "atomix": "mvn:io.atomix:atomix:2.0.20",
     "commons-codec": "mvn:commons-codec:commons-codec:1.10",
     "commons-collections": "mvn:commons-collections:commons-collections:3.2.2",
     "commons-configuration": "mvn:commons-configuration:commons-configuration:1.10",
