diff --git a/src/test/java/net/onrc/onos/core/datastore/topology/KVSwitchTest.java b/src/test/java/net/onrc/onos/core/datastore/topology/KVSwitchTest.java
index 607e0fb..fac33f5 100644
--- a/src/test/java/net/onrc/onos/core/datastore/topology/KVSwitchTest.java
+++ b/src/test/java/net/onrc/onos/core/datastore/topology/KVSwitchTest.java
@@ -8,6 +8,7 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
 
 import net.onrc.onos.core.datastore.DataStoreClient;
 import net.onrc.onos.core.datastore.IKVTable;
@@ -31,14 +32,16 @@
         System.setProperty("net.onrc.onos.core.datastore.hazelcast.client.attemptLimit", "0");
     }
 
+    private static final String namespace = UUID.randomUUID().toString();
+
     IKVTable switchTable;
     static final Long DPID1 = 0x1L;
     KVSwitch sw1;
 
     @Before
     public void setUp() throws Exception {
-        switchTable = DataStoreClient.getClient().getTable(KVSwitch.GLOBAL_SWITCH_TABLE_NAME);
-        sw1 = new KVSwitch(DPID1);
+        switchTable = DataStoreClient.getClient().getTable(namespace + KVSwitch.SWITCH_TABLE_SUFFIX);
+        sw1 = new KVSwitch(DPID1, namespace);
     }
 
     @After
@@ -48,7 +51,7 @@
 
     public KVSwitch assertSwitchInDataStore(final Long dpid, final STATUS status) {
         try {
-            final KVSwitch sw = new KVSwitch(dpid);
+            final KVSwitch sw = new KVSwitch(dpid, namespace);
             sw.read();
             assertNotEquals(DataStoreClient.getClient().getVersionNonexistant(), sw.getVersion());
             assertEquals(dpid, sw.getDpid());
@@ -61,7 +64,7 @@
     }
 
     public void assertSwitchNotInDataStore(final Long dpid) {
-        final KVSwitch sw = new KVSwitch(dpid);
+        final KVSwitch sw = new KVSwitch(dpid, namespace);
         try {
             sw.read();
             fail("Switch was not supposed to be there in datastore");
@@ -75,14 +78,14 @@
         final int NUM_SWITCHES = 100;
         Map<Long, KVSwitch> expected = new HashMap<>();
         for (long dpid = 1; dpid <= NUM_SWITCHES; ++dpid) {
-            KVSwitch sw = new KVSwitch(dpid);
+            KVSwitch sw = new KVSwitch(dpid, namespace);
             sw.setStatus(STATUS.ACTIVE);
             sw.create();
             assertNotEquals(DataStoreClient.getClient().getVersionNonexistant(), sw.getVersion());
             expected.put(sw.getDpid(), sw);
         }
 
-        Iterable<KVSwitch> switches = KVSwitch.getAllSwitches();
+        Iterable<KVSwitch> switches = KVSwitch.getAllSwitches(namespace);
 
         for (KVSwitch sw : switches) {
             KVSwitch expectedSw = expected.get(sw.getDpid());
@@ -110,7 +113,7 @@
     @Test(expected = ObjectExistsException.class)
     public void testCreateFailAlreadyExist() throws ObjectExistsException {
         // setup pre-existing Switch
-        KVSwitch sw = new KVSwitch(DPID1);
+        KVSwitch sw = new KVSwitch(DPID1, namespace);
         sw.forceCreate();
         assertNotEquals(DataStoreClient.getClient().getVersionNonexistant(), sw.getVersion());
         assertSwitchInDataStore(DPID1, STATUS.INACTIVE);
@@ -123,7 +126,7 @@
     @Test
     public void testForceCreate() {
         // setup pre-existing Switch
-        KVSwitch sw = new KVSwitch(DPID1);
+        KVSwitch sw = new KVSwitch(DPID1, namespace);
         sw.forceCreate();
         assertNotEquals(DataStoreClient.getClient().getVersionNonexistant(), sw.getVersion());
         assertSwitchInDataStore(DPID1, STATUS.INACTIVE);
@@ -141,7 +144,7 @@
     @Test
     public void testRead() throws ObjectDoesntExistException {
         // setup pre-existing Switch
-        KVSwitch sw = new KVSwitch(DPID1);
+        KVSwitch sw = new KVSwitch(DPID1, namespace);
         sw.setStatus(STATUS.ACTIVE);
         sw.forceCreate();
         assertNotEquals(DataStoreClient.getClient().getVersionNonexistant(), sw.getVersion());
@@ -164,7 +167,7 @@
     @Test
     public void testUpdate() throws ObjectDoesntExistException, WrongVersionException {
         // setup pre-existing Switch
-        KVSwitch sw = new KVSwitch(DPID1);
+        KVSwitch sw = new KVSwitch(DPID1, namespace);
         sw.setStatus(STATUS.ACTIVE);
         sw.forceCreate();
         assertNotEquals(DataStoreClient.getClient().getVersionNonexistant(), sw.getVersion());
@@ -185,7 +188,7 @@
     @Test
     public void testDelete() throws ObjectDoesntExistException, WrongVersionException {
         // setup pre-existing Switch
-        KVSwitch sw = new KVSwitch(DPID1);
+        KVSwitch sw = new KVSwitch(DPID1, namespace);
         sw.setStatus(STATUS.ACTIVE);
         sw.forceCreate();
         assertNotEquals(DataStoreClient.getClient().getVersionNonexistant(), sw.getVersion());
@@ -205,7 +208,7 @@
     @Test
     public void testForceDelete() {
         // setup pre-existing Switch
-        KVSwitch sw = new KVSwitch(DPID1);
+        KVSwitch sw = new KVSwitch(DPID1, namespace);
         sw.setStatus(STATUS.ACTIVE);
         sw.forceCreate();
         assertNotEquals(DataStoreClient.getClient().getVersionNonexistant(), sw.getVersion());
diff --git a/src/test/java/net/onrc/onos/core/datastore/topology/KVTopologyTest.java b/src/test/java/net/onrc/onos/core/datastore/topology/KVTopologyTest.java
index 7921099..ff37995 100644
--- a/src/test/java/net/onrc/onos/core/datastore/topology/KVTopologyTest.java
+++ b/src/test/java/net/onrc/onos/core/datastore/topology/KVTopologyTest.java
@@ -17,6 +17,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.UUID;
 
 import net.onrc.onos.core.datastore.DataStoreClient;
 import net.onrc.onos.core.datastore.IKVClient;
@@ -57,19 +58,21 @@
 
     private static final Long DPID1 = 0x1L;
 
+    private static final String namespace = UUID.randomUUID().toString();
+
     @Before
     @After
     public void wipeTopology() throws Exception {
-        IKVTable switchTable = DataStoreClient.getClient().getTable(KVSwitch.GLOBAL_SWITCH_TABLE_NAME);
+        IKVTable switchTable = DataStoreClient.getClient().getTable(namespace + KVSwitch.SWITCH_TABLE_SUFFIX);
         DataStoreClient.getClient().dropTable(switchTable);
 
-        IKVTable portTable = DataStoreClient.getClient().getTable(KVPort.GLOBAL_PORT_TABLE_NAME);
+        IKVTable portTable = DataStoreClient.getClient().getTable(namespace + KVPort.PORT_TABLE_SUFFIX);
         DataStoreClient.getClient().dropTable(portTable);
 
-        IKVTable linkTable = DataStoreClient.getClient().getTable(KVLink.GLOBAL_LINK_TABLE_NAME);
+        IKVTable linkTable = DataStoreClient.getClient().getTable(namespace + KVLink.LINK_TABLE_SUFFIX);
         DataStoreClient.getClient().dropTable(linkTable);
 
-        IKVTable deviceTable = DataStoreClient.getClient().getTable(KVDevice.GLOBAL_DEVICE_TABLE_NAME);
+        IKVTable deviceTable = DataStoreClient.getClient().getTable(namespace + KVDevice.DEVICE_TABLE_SUFFIX);
         DataStoreClient.getClient().dropTable(deviceTable);
     }
 
@@ -77,7 +80,7 @@
     public void basicSwitchTest() {
         // create switch 0x1
         try {
-            KVSwitch sw = new KVSwitch(DPID1);
+            KVSwitch sw = new KVSwitch(DPID1, namespace);
             sw.setStatus(KVSwitch.STATUS.ACTIVE);
             sw.create();
             assertNotEquals(VERSION_NONEXISTENT, sw.getVersion());
@@ -89,7 +92,7 @@
         }
 
         // read switch 0x1
-        KVSwitch swRead = new KVSwitch(DPID1);
+        KVSwitch swRead = new KVSwitch(DPID1, namespace);
         try {
             swRead.read();
             assertNotEquals(VERSION_NONEXISTENT, swRead.getVersion());
@@ -113,7 +116,7 @@
         }
 
         // read 0x1 again and delete
-        KVSwitch swRead2 = new KVSwitch(DPID1);
+        KVSwitch swRead2 = new KVSwitch(DPID1, namespace);
         try {
             swRead2.read();
             assertNotEquals(VERSION_NONEXISTENT, swRead2.getVersion());
@@ -133,7 +136,7 @@
         }
 
         // make sure 0x1 is deleted
-        KVObject swRead3 = new KVSwitch(DPID1);
+        KVObject swRead3 = new KVSwitch(DPID1, namespace);
         try {
             swRead3.read();
             fail(swRead3 + " was supposed to be deleted, but read succeed");
@@ -155,7 +158,7 @@
 
         // d1 - s1p1 - s1 - s1p2 - s2p1 - s2 - s2p2
 
-        KVSwitch sw1 = new KVSwitch(DPID1);
+        KVSwitch sw1 = new KVSwitch(DPID1, namespace);
         sw1.setStatus(KVSwitch.STATUS.ACTIVE);
         try {
             sw1.create();
@@ -167,9 +170,9 @@
             fail("Switch creation failed " + e);
         }
 
-        KVPort sw1p1 = new KVPort(DPID1, SW1_PORTNO1);
+        KVPort sw1p1 = new KVPort(DPID1, SW1_PORTNO1, namespace);
         sw1p1.setStatus(KVPort.STATUS.ACTIVE);
-        KVPort sw1p2 = new KVPort(DPID1, SW1_PORTNO2);
+        KVPort sw1p2 = new KVPort(DPID1, SW1_PORTNO2, namespace);
         sw1p2.setStatus(KVPort.STATUS.ACTIVE);
         try {
             sw1p1.create();
@@ -198,7 +201,7 @@
             fail("Switch update failed " + e);
         }
 
-        KVDevice d1 = new KVDevice(DEVICE1_MAC_SW1P1);
+        KVDevice d1 = new KVDevice(DEVICE1_MAC_SW1P1, namespace);
         d1.addPortId(sw1p1.getId());
 
         try {
@@ -222,14 +225,14 @@
             fail("Device creation failed " + e);
         }
 
-        KVSwitch sw2 = new KVSwitch(DPID2);
+        KVSwitch sw2 = new KVSwitch(DPID2, namespace);
         sw2.setStatus(KVSwitch.STATUS.ACTIVE);
-        KVPort sw2p1 = new KVPort(DPID2, SW2_PORTNO1);
+        KVPort sw2p1 = new KVPort(DPID2, SW2_PORTNO1, namespace);
         sw2p1.setStatus(KVPort.STATUS.ACTIVE);
-        KVPort sw2p2 = new KVPort(DPID2, SW2_PORTNO2);
+        KVPort sw2p2 = new KVPort(DPID2, SW2_PORTNO2, namespace);
         sw2p2.setStatus(KVPort.STATUS.ACTIVE);
 
-        KVDevice d2 = new KVDevice(DEVICE2_MAC_SW2P2);
+        KVDevice d2 = new KVDevice(DEVICE2_MAC_SW2P2, namespace);
         d2.addPortId(sw2p2.getId());
 
         IKVClient client = DataStoreClient.getClient();
@@ -263,7 +266,7 @@
             assertArrayEquals(sw2p2.getId(), d2.getAllPortIds().iterator().next());
         }
 
-        KVLink l1 = new KVLink(DPID1, SW1_PORTNO2, DPID2, SW2_PORTNO1);
+        KVLink l1 = new KVLink(DPID1, SW1_PORTNO2, DPID2, SW2_PORTNO1, namespace);
         l1.setStatus(KVLink.STATUS.ACTIVE);
 
         try {
@@ -299,7 +302,7 @@
 
 
     private static void topologyWalk() {
-        Iterable<KVSwitch> swIt = KVSwitch.getAllSwitches();
+        Iterable<KVSwitch> swIt = KVSwitch.getAllSwitches(namespace);
         List<Long> switchesExpected = new ArrayList<>(Arrays.asList(DPID1, DPID2));
 
         System.out.println("Enumerating Switches start");
@@ -313,7 +316,7 @@
         }
         System.out.println("Enumerating Switches end");
 
-        KVSwitch sw1 = new KVSwitch(DPID1);
+        KVSwitch sw1 = new KVSwitch(DPID1, namespace);
         try {
             sw1.read();
             assertNotEquals(VERSION_NONEXISTENT, sw1.getVersion());
@@ -324,7 +327,7 @@
             fail("Reading switch failed " + e);
         }
 
-        KVSwitch sw2 = new KVSwitch(DPID2);
+        KVSwitch sw2 = new KVSwitch(DPID2, namespace);
         if (KVObject.multiRead(Arrays.asList(sw2))) {
             fail("Failed to read switch " + sw2);
         } else {
@@ -341,7 +344,7 @@
             put(DPID2, new ArrayList<>(Arrays.asList(SW2_PORTNO1, SW2_PORTNO2)));
         } };
 
-        for (KVPort port : KVPort.getAllPorts()) {
+        for (KVPort port : KVPort.getAllPorts(namespace)) {
             System.out.println(port + " @ " + port.getVersion());
             assertNotEquals(VERSION_NONEXISTENT, port.getVersion());
             assertEquals(KVPort.STATUS.ACTIVE, port.getStatus());
@@ -360,7 +363,7 @@
             put(DEVICE2_MAC_SW2P2, KVPort.getPortID(DPID2, SW2_PORTNO2));
         } };
 
-        for (KVDevice device : KVDevice.getAllDevices()) {
+        for (KVDevice device : KVDevice.getAllDevices(namespace)) {
             System.out.println(device + " @ " + device.getVersion());
             assertNotEquals(VERSION_NONEXISTENT, device.getVersion());
 
@@ -369,7 +372,7 @@
             expectedDevice.remove(device.getMac());
         }
 
-        for (KVLink link : KVLink.getAllLinks()) {
+        for (KVLink link : KVLink.getAllLinks(namespace)) {
             System.out.println(link + " @ " + link.getVersion());
             assertNotEquals(VERSION_NONEXISTENT, link.getVersion());
 
@@ -385,7 +388,7 @@
 
     private static void topologyDelete() {
 
-        for (KVSwitch sw : KVSwitch.getAllSwitches()) {
+        for (KVSwitch sw : KVSwitch.getAllSwitches(namespace)) {
             try {
                 sw.read();
                 sw.delete();
@@ -396,7 +399,7 @@
             }
         }
 
-        for (KVPort p : KVPort.getAllPorts()) {
+        for (KVPort p : KVPort.getAllPorts(namespace)) {
             try {
                 p.read();
                 p.delete();
@@ -407,12 +410,12 @@
             }
         }
 
-        for (KVDevice d : KVDevice.getAllDevices()) {
+        for (KVDevice d : KVDevice.getAllDevices(namespace)) {
             d.forceDelete();
             assertNotEquals(VERSION_NONEXISTENT, d.getVersion());
         }
 
-        for (KVLink l : KVLink.getAllLinks()) {
+        for (KVLink l : KVLink.getAllLinks(namespace)) {
             try {
                 l.read();
                 l.delete();
