diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AsyncConsistentSetMultimapTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AsyncConsistentSetMultimapTest.java
index bb7677e..e033937 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AsyncConsistentSetMultimapTest.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AsyncConsistentSetMultimapTest.java
@@ -19,20 +19,18 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multiset;
 import com.google.common.collect.TreeMultiset;
-import com.google.common.io.Files;
 import io.atomix.resource.ResourceType;
 import org.apache.commons.collections.keyvalue.DefaultMapEntry;
-import org.junit.Ignore;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onlab.util.Tools;
 
-import java.io.File;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -41,9 +39,7 @@
 /**
  * Tests the {@link AsyncConsistentSetMultimap}.
  */
-@Ignore
 public class AsyncConsistentSetMultimapTest extends AtomixTestBase {
-    private final File testDir = Files.createTempDir();
     private final String keyOne = "hello";
     private final String keyTwo = "goodbye";
     private final String keyThree = "foo";
@@ -58,7 +54,16 @@
                                                               valueTwo,
                                                               valueThree,
                                                               valueFour);
-    private final AtomicInteger port = new AtomicInteger(49200);
+
+    @BeforeClass
+    public static void preTestSetup() throws Throwable {
+        createCopycatServers(3);
+    }
+
+    @AfterClass
+    public static void postTestCleanup() throws Exception {
+        clearTests();
+    }
 
     @Override
     protected ResourceType resourceType() {
@@ -71,8 +76,7 @@
      */
     @Test
     public void testSize() throws Throwable {
-        clearTests();
-        AsyncConsistentSetMultimap map = createResource(3);
+        AsyncConsistentSetMultimap map = createResource("testOneMap");
         //Simplest operation case
         map.isEmpty().thenAccept(result -> assertTrue(result));
         map.put(keyOne, valueOne).
@@ -114,7 +118,6 @@
         map.isEmpty().thenAccept(result -> assertTrue(result));
 
         map.destroy().join();
-        clearTests();
     }
 
     /**
@@ -122,8 +125,7 @@
      */
     @Test
     public void containsTest() throws Throwable {
-        clearTests();
-        AsyncConsistentSetMultimap map = createResource(3);
+        AsyncConsistentSetMultimap map = createResource("testTwoMap");
 
         //Populate the maps
         allKeys.forEach(key -> {
@@ -174,7 +176,6 @@
         });
 
         map.destroy().join();
-        clearTests();
     }
 
     /**
@@ -183,8 +184,7 @@
      */
     @Test
     public void addAndRemoveTest() throws Exception {
-        clearTests();
-        AsyncConsistentSetMultimap map = createResource(3);
+        AsyncConsistentSetMultimap map = createResource("testThreeMap");
 
         //Test single put
         allKeys.forEach(key -> {
@@ -309,7 +309,6 @@
         });
 
         map.destroy().join();
-        clearTests();
     }
 
     /**
@@ -319,8 +318,7 @@
      */
     @Test
     public void testAccessors() throws Exception {
-        clearTests();
-        AsyncConsistentSetMultimap map = createResource(3);
+        AsyncConsistentSetMultimap map = createResource("testFourMap");
 
         //Populate for full map behavior tests
         allKeys.forEach(key -> {
@@ -400,15 +398,13 @@
         map.entries()
                 .thenAccept(result -> assertTrue(result.isEmpty())).join();
 
-        map.destroy();
-        clearTests();
+        map.destroy().join();
     }
 
-    private AsyncConsistentSetMultimap createResource(int clusterSize) {
+    private AsyncConsistentSetMultimap createResource(String mapName) {
         try {
-            createCopycatServers(clusterSize);
             AsyncConsistentSetMultimap map = createAtomixClient().
-                    getResource("testMap", AsyncConsistentSetMultimap.class)
+                    getResource("mapName", AsyncConsistentSetMultimap.class)
                     .join();
             return map;
         } catch (Throwable e) {
diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapTest.java
index df29b5e..130662b 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapTest.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapTest.java
@@ -18,7 +18,8 @@
 import com.google.common.base.Throwables;
 import com.google.common.collect.Sets;
 import io.atomix.resource.ResourceType;
-import org.junit.Ignore;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onlab.util.Tools;
 import org.onosproject.store.primitives.MapUpdate;
@@ -49,9 +50,17 @@
 /**
  * Unit tests for {@link AtomixConsistentMap}.
  */
-@Ignore
 public class AtomixConsistentMapTest extends AtomixTestBase {
 
+    @BeforeClass
+    public static void preTestSetup() throws Throwable {
+        createCopycatServers(3);
+    }
+
+    @AfterClass
+    public static void postTestCleanup() throws Exception {
+        clearTests();
+    }
     @Override
     protected ResourceType resourceType() {
         return new ResourceType(AtomixConsistentMap.class);
@@ -98,12 +107,11 @@
     }
 
     protected void basicMapOperationTests(int clusterSize) throws Throwable {
-        createCopycatServers(clusterSize);
-
         final byte[] rawFooValue = Tools.getBytesUtf8("Hello foo!");
         final byte[] rawBarValue = Tools.getBytesUtf8("Hello bar!");
 
-        AtomixConsistentMap map = createAtomixClient().getResource("test", AtomixConsistentMap.class).join();
+        AtomixConsistentMap map = createAtomixClient().getResource("testBasicMapOperationMap",
+                                                                   AtomixConsistentMap.class).join();
 
         map.isEmpty().thenAccept(result -> {
             assertTrue(result);
@@ -228,12 +236,12 @@
     }
 
     public void mapComputeOperationTests(int clusterSize) throws Throwable {
-        createCopycatServers(clusterSize);
         final byte[] value1 = Tools.getBytesUtf8("value1");
         final byte[] value2 = Tools.getBytesUtf8("value2");
         final byte[] value3 = Tools.getBytesUtf8("value3");
 
-        AtomixConsistentMap map = createAtomixClient().getResource("test", AtomixConsistentMap.class).join();
+        AtomixConsistentMap map = createAtomixClient().getResource("testMapComputeOperationsMap",
+                                                                   AtomixConsistentMap.class).join();
 
         map.computeIfAbsent("foo", k -> value1).thenAccept(result -> {
             assertTrue(Arrays.equals(Versioned.valueOrElse(result, null), value1));
@@ -266,12 +274,12 @@
 
 
     protected void mapListenerTests(int clusterSize) throws Throwable {
-        createCopycatServers(clusterSize);
         final byte[] value1 = Tools.getBytesUtf8("value1");
         final byte[] value2 = Tools.getBytesUtf8("value2");
         final byte[] value3 = Tools.getBytesUtf8("value3");
 
-        AtomixConsistentMap map = createAtomixClient().getResource("test", AtomixConsistentMap.class).join();
+        AtomixConsistentMap map = createAtomixClient().getResource("testMapListenerMap",
+                                                                   AtomixConsistentMap.class).join();
         TestMapEventListener listener = new TestMapEventListener();
 
         // add listener; insert new value into map and verify an INSERT event is received.
@@ -326,11 +334,11 @@
     }
 
     protected void transactionCommitTests(int clusterSize) throws Throwable {
-        createCopycatServers(clusterSize);
         final byte[] value1 = Tools.getBytesUtf8("value1");
         final byte[] value2 = Tools.getBytesUtf8("value2");
 
-        AtomixConsistentMap map = createAtomixClient().getResource("test", AtomixConsistentMap.class).join();
+        AtomixConsistentMap map = createAtomixClient().getResource("testCommitTestsMap",
+                                                                   AtomixConsistentMap.class).join();
         TestMapEventListener listener = new TestMapEventListener();
 
         map.addListener(listener).join();
@@ -421,11 +429,11 @@
     }
 
     protected void transactionRollbackTests(int clusterSize) throws Throwable {
-        createCopycatServers(clusterSize);
         final byte[] value1 = Tools.getBytesUtf8("value1");
         final byte[] value2 = Tools.getBytesUtf8("value2");
 
-        AtomixConsistentMap map = createAtomixClient().getResource("test", AtomixConsistentMap.class).join();
+        AtomixConsistentMap map = createAtomixClient().getResource("testTransactionRollbackTestsMap",
+                                                                   AtomixConsistentMap.class).join();
         TestMapEventListener listener = new TestMapEventListener();
 
         map.addListener(listener).join();
diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorTest.java
index 6fb064b..7b07b4b 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorTest.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorTest.java
@@ -20,7 +20,8 @@
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Consumer;
 
-import org.junit.Ignore;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
@@ -36,13 +37,22 @@
 /**
  * Unit tests for {@link AtomixLeaderElector}.
  */
-@Ignore
 public class AtomixLeaderElectorTest extends AtomixTestBase {
 
     NodeId node1 = new NodeId("node1");
     NodeId node2 = new NodeId("node2");
     NodeId node3 = new NodeId("node3");
 
+    @BeforeClass
+    public static void preTestSetup() throws Throwable {
+        createCopycatServers(3);
+    }
+
+    @AfterClass
+    public static void postTestCleanup() throws Exception {
+        clearTests();
+    }
+
     @Override
     protected ResourceType resourceType() {
         return new ResourceType(AtomixLeaderElector.class);
@@ -54,9 +64,9 @@
     }
 
     private void leaderElectorRunTests(int numServers) throws Throwable {
-        createCopycatServers(numServers);
         Atomix client1 = createAtomixClient();
-        AtomixLeaderElector elector1 = client1.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector1 = client1.getResource("test-elector-run",
+                                                           AtomixLeaderElector.class).join();
         elector1.run("foo", node1).thenAccept(result -> {
             assertEquals(node1, result.leaderNodeId());
             assertEquals(1, result.leader().term());
@@ -64,7 +74,8 @@
             assertEquals(node1, result.candidates().get(0));
         }).join();
         Atomix client2 = createAtomixClient();
-        AtomixLeaderElector elector2 = client2.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector2 = client2.getResource("test-elector-run",
+                                                           AtomixLeaderElector.class).join();
         elector2.run("foo", node2).thenAccept(result -> {
             assertEquals(node1, result.leaderNodeId());
             assertEquals(1, result.leader().term());
@@ -80,12 +91,13 @@
     }
 
     private void leaderElectorWithdrawTests(int numServers) throws Throwable {
-        createCopycatServers(numServers);
         Atomix client1 = createAtomixClient();
-        AtomixLeaderElector elector1 = client1.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector1 = client1.getResource("test-elector-withdraw",
+                                                           AtomixLeaderElector.class).join();
         elector1.run("foo", node1).join();
         Atomix client2 = createAtomixClient();
-        AtomixLeaderElector elector2 = client2.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector2 = client2.getResource("test-elector-withdraw",
+                                                           AtomixLeaderElector.class).join();
         elector2.run("foo", node2).join();
 
         LeaderEventListener listener1 = new LeaderEventListener();
@@ -117,13 +129,15 @@
     }
 
     private void leaderElectorAnointTests(int numServers) throws Throwable {
-        createCopycatServers(numServers);
         Atomix client1 = createAtomixClient();
-        AtomixLeaderElector elector1 = client1.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector1 = client1.getResource("test-elector-anoint",
+                                                           AtomixLeaderElector.class).join();
         Atomix client2 = createAtomixClient();
-        AtomixLeaderElector elector2 = client2.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector2 = client2.getResource("test-elector-anoint",
+                                                           AtomixLeaderElector.class).join();
         Atomix client3 = createAtomixClient();
-        AtomixLeaderElector elector3 = client3.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector3 = client3.getResource("test-elector-anoint",
+                                                           AtomixLeaderElector.class).join();
         elector1.run("foo", node1).join();
         elector2.run("foo", node2).join();
 
@@ -171,13 +185,15 @@
     }
 
     private void leaderElectorPromoteTests(int numServers) throws Throwable {
-        createCopycatServers(numServers);
         AtomixClient client1 = createAtomixClient();
-        AtomixLeaderElector elector1 = client1.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector1 = client1.getResource("test-elector-promote",
+                                                           AtomixLeaderElector.class).join();
         AtomixClient client2 = createAtomixClient();
-        AtomixLeaderElector elector2 = client2.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector2 = client2.getResource("test-elector-promote",
+                                                           AtomixLeaderElector.class).join();
         AtomixClient client3 = createAtomixClient();
-        AtomixLeaderElector elector3 = client3.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector3 = client3.getResource("test-elector-promote",
+                                                           AtomixLeaderElector.class).join();
         elector1.run("foo", node1).join();
         elector2.run("foo", node2).join();
 
@@ -229,12 +245,13 @@
     }
 
     private void leaderElectorLeaderSessionCloseTests(int numServers) throws Throwable {
-        createCopycatServers(numServers);
         AtomixClient client1 = createAtomixClient();
-        AtomixLeaderElector elector1 = client1.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector1 = client1.getResource("test-elector-leader-session-close",
+                                                           AtomixLeaderElector.class).join();
         elector1.run("foo", node1).join();
         Atomix client2 = createAtomixClient();
-        AtomixLeaderElector elector2 = client2.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector2 = client2.getResource("test-elector-leader-session-close",
+                                                           AtomixLeaderElector.class).join();
         LeaderEventListener listener = new LeaderEventListener();
         elector2.run("foo", node2).join();
         elector2.addChangeListener(listener).join();
@@ -252,12 +269,13 @@
     }
 
     private void leaderElectorNonLeaderSessionCloseTests(int numServers) throws Throwable {
-        createCopycatServers(numServers);
         Atomix client1 = createAtomixClient();
-        AtomixLeaderElector elector1 = client1.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector1 = client1.getResource("test-elector-non-leader-session-close",
+                                                           AtomixLeaderElector.class).join();
         elector1.run("foo", node1).join();
         AtomixClient client2 = createAtomixClient();
-        AtomixLeaderElector elector2 = client2.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector2 = client2.getResource("test-elector-non-leader-session-close",
+                                                           AtomixLeaderElector.class).join();
         LeaderEventListener listener = new LeaderEventListener();
         elector2.run("foo", node2).join();
         elector1.addChangeListener(listener).join();
@@ -275,11 +293,12 @@
     }
 
     private void leaderElectorQueryTests(int numServers) throws Throwable {
-        createCopycatServers(numServers);
         Atomix client1 = createAtomixClient();
         Atomix client2 = createAtomixClient();
-        AtomixLeaderElector elector1 = client1.getResource("test-elector", AtomixLeaderElector.class).join();
-        AtomixLeaderElector elector2 = client2.getResource("test-elector", AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector1 = client1.getResource("test-elector-query",
+                                                           AtomixLeaderElector.class).join();
+        AtomixLeaderElector elector2 = client2.getResource("test-elector-query",
+                                                           AtomixLeaderElector.class).join();
         elector1.run("foo", node1).join();
         elector2.run("foo", node2).join();
         elector2.run("bar", node2).join();
diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixLongTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixLongTest.java
index c24cc7d..b1a5b7c 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixLongTest.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixLongTest.java
@@ -18,7 +18,8 @@
 import io.atomix.Atomix;
 import io.atomix.resource.ResourceType;
 import io.atomix.variables.DistributedLong;
-import org.junit.Ignore;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -28,9 +29,18 @@
 /**git s
  * Unit tests for {@link AtomixCounter}.
  */
-@Ignore
 public class AtomixLongTest extends AtomixTestBase {
 
+    @BeforeClass
+    public static void preTestSetup() throws Throwable {
+        createCopycatServers(3);
+    }
+
+    @AfterClass
+    public static void postTestCleanup() throws Exception {
+        clearTests();
+    }
+
     @Override
     protected ResourceType resourceType() {
         return new ResourceType(DistributedLong.class);
@@ -42,9 +52,9 @@
     }
 
     protected void basicOperationsTest(int clusterSize) throws Throwable {
-        createCopycatServers(clusterSize);
         Atomix atomix = createAtomixClient();
-        AtomixCounter along = new AtomixCounter("test-long", atomix.getLong("test-long").join());
+        AtomixCounter along = new AtomixCounter("test-long-basic-operations",
+                                                atomix.getLong("test-long").join());
         assertEquals(0, along.get().join().longValue());
         assertEquals(1, along.incrementAndGet().join().longValue());
         along.set(100).join();
diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixTestBase.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixTestBase.java
index 01c33ec..db52ce9 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixTestBase.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixTestBase.java
@@ -27,8 +27,6 @@
 import io.atomix.copycat.server.storage.StorageLevel;
 import io.atomix.manager.internal.ResourceManagerState;
 import io.atomix.resource.ResourceType;
-import org.junit.After;
-import org.junit.Before;
 import org.onlab.junit.TestTools;
 import org.onosproject.store.primitives.impl.CatalystSerializers;
 
@@ -43,18 +41,18 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * Base class for various Atomix* tests.
+ * Base class for various Atomix tests.
  */
 public abstract class AtomixTestBase {
-    private static final File TEST_DIR = new File("target/test-logs");
-    protected LocalServerRegistry registry;
-    protected final AtomicInteger port = new AtomicInteger(49200);
-    protected List<Address> members;
-    protected List<CopycatClient> copycatClients = new ArrayList<>();
-    protected List<CopycatServer> copycatServers = new ArrayList<>();
-    protected List<AtomixClient> atomixClients = new ArrayList<>();
-    protected List<CopycatServer> atomixServers = new ArrayList<>();
-    protected Serializer serializer = CatalystSerializers.getSerializer();
+    protected static File testDir;
+    protected static LocalServerRegistry registry = new LocalServerRegistry();
+    protected static List<Address> members = new ArrayList<>();
+    protected static List<CopycatClient> copycatClients = new ArrayList<>();
+    protected static List<CopycatServer> copycatServers = new ArrayList<>();
+    protected static List<AtomixClient> atomixClients = new ArrayList<>();
+    protected static List<CopycatServer> atomixServers = new ArrayList<>();
+    protected static Serializer serializer = CatalystSerializers.getSerializer();
+    protected static AtomicInteger port = new AtomicInteger(49200);
 
     /**
      * Creates a new resource state machine.
@@ -68,7 +66,7 @@
      *
      * @return The next server address.
      */
-    private Address nextAddress() {
+    private static Address nextAddress() {
         Address address = new Address("127.0.0.1",
                           TestTools.findAvailablePort(port.getAndIncrement()));
         members.add(address);
@@ -78,7 +76,8 @@
     /**
      * Creates a set of Copycat servers.
      */
-    protected List<CopycatServer> createCopycatServers(int nodes) throws Throwable {
+    protected static List<CopycatServer> createCopycatServers(int nodes)
+            throws Throwable {
         CountDownLatch latch = new CountDownLatch(nodes);
         List<CopycatServer> servers = new ArrayList<>();
 
@@ -91,20 +90,18 @@
             if (members.size() <= 1) {
                 server.bootstrap().thenRun(latch::countDown).join();
             } else {
-                server.join(members).thenRun(latch::countDown);
+                server.join(members).join();
             }
             servers.add(server);
         }
 
-        Uninterruptibles.awaitUninterruptibly(latch);
-
         return servers;
     }
 
     /**
      * Creates a Copycat server.
      */
-    protected CopycatServer createCopycatServer(Address address) {
+    protected static CopycatServer createCopycatServer(Address address) {
         CopycatServer server = CopycatServer.builder(address)
                 .withTransport(NettyTransport.builder().withThreads(1).build())
                 .withStorage(Storage.builder()
@@ -120,23 +117,21 @@
         return server;
     }
 
-    @Before
-    @After
-    public void clearTests() throws Exception {
+    public static void clearTests() throws Exception {
         registry = new LocalServerRegistry();
         members = new ArrayList<>();
 
         CompletableFuture<Void> closeClients =
                 CompletableFuture.allOf(atomixClients.stream()
-                                                     .map(AtomixClient::close)
-                                                     .toArray(CompletableFuture[]::new));
+                                         .map(AtomixClient::close)
+                                         .toArray(CompletableFuture[]::new));
 
-        closeClients.thenCompose(v -> CompletableFuture.allOf(copycatServers.stream()
+        closeClients
+                .thenCompose(v -> CompletableFuture
+                        .allOf(copycatServers.stream()
                 .map(CopycatServer::shutdown)
                 .toArray(CompletableFuture[]::new))).join();
 
-        deleteDirectory(TEST_DIR);
-
         atomixClients = new ArrayList<>();
 
         copycatServers = new ArrayList<>();
