diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentSetMultimapTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentSetMultimapTest.java
index b1ec1f8..2d01912 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentSetMultimapTest.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentSetMultimapTest.java
@@ -16,22 +16,21 @@
 
 package org.onosproject.store.primitives.resources.impl;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multiset;
-import com.google.common.collect.TreeMultiset;
-import io.atomix.resource.ResourceType;
-import org.apache.commons.collections.keyvalue.DefaultMapEntry;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.onlab.util.Tools;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multiset;
+import com.google.common.collect.TreeMultiset;
+import io.atomix.protocols.raft.proxy.RaftProxy;
+import io.atomix.protocols.raft.service.RaftService;
+import org.apache.commons.collections.keyvalue.DefaultMapEntry;
+import org.junit.Test;
+import org.onlab.util.Tools;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -39,7 +38,7 @@
 /**
  * Tests the {@link AtomixConsistentSetMultimap}.
  */
-public class AtomixConsistentSetMultimapTest extends AtomixTestBase {
+public class AtomixConsistentSetMultimapTest extends AtomixTestBase<AtomixConsistentSetMultimap> {
     private final String keyOne = "hello";
     private final String keyTwo = "goodbye";
     private final String keyThree = "foo";
@@ -55,19 +54,14 @@
                                                               valueThree,
                                                               valueFour);
 
-    @BeforeClass
-    public static void preTestSetup() throws Throwable {
-        createCopycatServers(3);
-    }
-
-    @AfterClass
-    public static void postTestCleanup() throws Exception {
-        clearTests();
+    @Override
+    protected RaftService createService() {
+        return new AtomixConsistentSetMultimapService();
     }
 
     @Override
-    protected ResourceType resourceType() {
-        return new ResourceType(AtomixConsistentSetMultimap.class);
+    protected AtomixConsistentSetMultimap createPrimitive(RaftProxy proxy) {
+        return new AtomixConsistentSetMultimap(proxy);
     }
 
     /**
@@ -154,9 +148,10 @@
             });
         });
 
+        final String[] removedKey = new String[1];
+
         //Test behavior after removals
         allValues.forEach(value -> {
-            final String[] removedKey = new String[1];
             allKeys.forEach(key -> {
                 map.remove(key, value)
                         .thenAccept(result -> assertTrue(result)).join();
@@ -164,11 +159,12 @@
                         .thenAccept(result -> assertFalse(result)).join();
                 removedKey[0] = key;
             });
-            //Check that contains key works properly for removed keys
-            map.containsKey(removedKey[0])
-                    .thenAccept(result -> assertFalse(result));
         });
 
+        //Check that contains key works properly for removed keys
+        map.containsKey(removedKey[0])
+                .thenAccept(result -> assertFalse(result));
+
         //Check that contains value works correctly for removed values
         allValues.forEach(value -> {
             map.containsValue(value)
@@ -403,9 +399,7 @@
 
     private AtomixConsistentSetMultimap createResource(String mapName) {
         try {
-            AtomixConsistentSetMultimap map = createAtomixClient().
-                    getResource(mapName, AtomixConsistentSetMultimap.class)
-                    .join();
+            AtomixConsistentSetMultimap map = newPrimitive(mapName);
             return map;
         } catch (Throwable e) {
             throw new RuntimeException(e.toString());
