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 5fa88a7..f44ec1f 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
@@ -15,9 +15,6 @@
  */
 package org.onosproject.store.primitives;
 
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
 import org.onosproject.store.service.AsyncAtomicCounter;
 import org.onosproject.store.service.AsyncAtomicCounterMap;
 import org.onosproject.store.service.AsyncAtomicIdGenerator;
@@ -40,12 +37,10 @@
 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;
+import java.util.Set;
 
 /**
  * Interface for entity that can create instances of different distributed primitives.
@@ -55,22 +50,6 @@
     /**
      * Creates a new {@code AsyncConsistentMap}.
      *
-     * @param name map name
-     * @param serializer serializer to use for serializing/deserializing map entries
-     * @param <K> key type
-     * @param <V> value type
-     * @return map
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
@@ -81,21 +60,6 @@
     /**
      * Creates a new {@code AsyncConsistentTreeMap}.
      *
-     * @param name tree name
-     * @param serializer serializer to use for serializing/deserializing map entries
-     * @param <V> value type
-     * @return distributedTreeMap
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
@@ -105,22 +69,6 @@
     /**
      * Creates a new set backed {@code AsyncConsistentMultimap}.
      *
-     * @param name multimap name
-     * @param serializer serializer to use for serializing/deserializing
-     * @param <K> key type
-     * @param <V> value type
-     * @return set backed distributedMultimap
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
@@ -131,21 +79,6 @@
     /**
      * Creates a new {@code AsyncAtomicCounterMap}.
      *
-     * @param name counter map name
-     * @param serializer serializer to use for serializing/deserializing keys
-     * @param <K> key type
-     * @return atomic counter map
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
@@ -155,19 +88,6 @@
     /**
      * Creates a new {@code AsyncAtomicCounter}.
      *
-     * @param name counter name
-     * @return counter
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @Deprecated
-    default AsyncAtomicCounter newAsyncCounter(String name) {
-        return newAsyncCounter((AtomicCounterOptions) new AtomicCounterOptions() {
-        }.withName(name));
-    }
-
-    /**
-     * Creates a new {@code AsyncAtomicCounter}.
-     *
      * @param options counter options
      * @return counter
      */
@@ -176,19 +96,6 @@
     /**
      * Creates a new {@code AsyncAtomixIdGenerator}.
      *
-     * @param name ID generator name
-     * @return ID generator
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
      */
@@ -197,21 +104,6 @@
     /**
      * Creates a new {@code AsyncAtomicValue}.
      *
-     * @param name value name
-     * @param serializer serializer to use for serializing/deserializing value type
-     * @param <V> value type
-     * @return value
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
@@ -221,21 +113,6 @@
     /**
      * Creates a new {@code AsyncDistributedSet}.
      *
-     * @param name set name
-     * @param serializer serializer to use for serializing/deserializing set entries
-     * @param <E> set entry type
-     * @return set
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
@@ -245,19 +122,6 @@
     /**
      * Creates a new {@code AsyncDistributedLock}.
      *
-     * @param name lock name
-     * @return lock
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @Deprecated
-    default AsyncDistributedLock newAsyncDistributedLock(String name) {
-        return newAsyncDistributedLock((DistributedLockOptions) new DistributedLockOptions() {
-        }.withName(name));
-    }
-
-    /**
-     * Creates a new {@code AsyncDistributedLock}.
-     *
      * @param options lock options
      * @return lock
      */
@@ -266,36 +130,6 @@
     /**
      * 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);
-    }
-
-    /**
-     * Creates a new {@code AsyncLeaderElector}.
-     *
-     * @param name leader elector name
-     * @param electionTimeout leader election timeout
-     * @param timeUnit leader election timeout time unit
-     * @return leader elector
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
      */
@@ -305,21 +139,6 @@
      * Creates a new {@code WorkQueue}.
      *
      * @param <E> work element type
-     * @param name work queue name
-     * @param serializer serializer
-     * @return work queue
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
      */
@@ -329,40 +148,6 @@
      * Creates a new {@code AsyncDocumentTree}.
      *
      * @param <V> document tree node value type
-     * @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);
-    }
-
-    /**
-     * Creates a new {@code AsyncDocumentTree}.
-     *
-     * @param <V> document tree node value type
-     * @param name tree name
-     * @param serializer serializer
-     * @param ordering tree node ordering
-     * @return document tree
-     * @deprecated in Nightingale Release (1.13)
-     */
-    @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
      */
