diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
index 15cdc57..306ebc5 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
@@ -28,7 +28,6 @@
 /**
  * Device object.
  * <p/>
- * TODO switch to ProtoBuf, etc.
  */
 public class KVDevice extends KVObject {
     private static final Logger log = LoggerFactory.getLogger(KVDevice.class);
@@ -48,21 +47,29 @@
         }
     };
 
-    public static final String GLOBAL_DEVICE_TABLE_NAME = "G:Device";
-
-    // FIXME these should be Enum or some number, not String
-    private static final String PROP_MAC = "mac";
-    private static final String PROP_PORT_IDS = "port-ids";
+    static final String DEVICE_TABLE_SUFFIX = ":Device";
 
     private final byte[] mac;
     private TreeSet<byte[]> portIds;
-    private transient boolean isPortIdsModified;
 
-    // Assuming mac is unique cluster-wide
+    /**
+     * Generate a DeviceID from MAC address.
+     * <p/>
+     * We're assuming MAC address can be an unique identifier for Device.
+     *
+     * @param mac MAC address
+     * @return DeviceID
+     */
     public static byte[] getDeviceID(final byte[] mac) {
         return DeviceEvent.getDeviceID(mac).array();
     }
 
+    /**
+     * Gets the MAC address from DeviceID.
+     *
+     * @param key DeviceID
+     * @return MAC address
+     */
     public static byte[] getMacFromKey(final byte[] key) {
         ByteBuffer keyBuf = ByteBuffer.wrap(key);
         if (keyBuf.getChar() != 'D') {
@@ -73,80 +80,175 @@
         return mac;
     }
 
+    /**
+     * KVDevice constructor for default namespace.
+     *
+     * @param mac MAC address
+     */
     public KVDevice(final byte[] mac) {
-        super(DataStoreClient.getClient().getTable(GLOBAL_DEVICE_TABLE_NAME), getDeviceID(mac));
-
-        this.mac = mac.clone();
-        this.portIds = new TreeSet<>(ByteArrayComparator.BYTEARRAY_COMPARATOR);
-        this.isPortIdsModified = true;
+        this(mac, DEFAULT_NAMESPACE);
     }
 
     /**
-     * Get an instance from Key.
+     * KVDevice constructor for specified namespace.
      *
-     * @param key
-     * @return
+     * @param mac MAC address
+     * @param namespace namespace to create this object
+     */
+    public KVDevice(final byte[] mac, final String namespace) {
+        super(DataStoreClient.getClient()
+                .getTable(namespace + DEVICE_TABLE_SUFFIX),
+                getDeviceID(mac), namespace);
+
+        this.mac = mac.clone();
+        this.portIds = new TreeSet<>(ByteArrayComparator.BYTEARRAY_COMPARATOR);
+    }
+
+    /**
+     * Gets an instance from DeviceID in default namespace.
+     *
+     * @param key DeviceID
+     * @return KVDevice instance
      * @note You need to call `read()` to get the DB content.
      */
     public static KVDevice createFromKey(final byte[] key) {
-        return new KVDevice(getMacFromKey(key));
+        return createFromKey(key, DEFAULT_NAMESPACE);
     }
 
+    /**
+     * Gets an instance from DeviceID in specified namespace.
+     *
+     * @param key DeviceID
+     * @param namespace namespace to create this object in
+     * @return KVDevice instance
+     * @note You need to call `read()` to get the DB content.
+     */
+    public static KVDevice createFromKey(final byte[] key, final String namespace) {
+        return new KVDevice(getMacFromKey(key), namespace);
+    }
+
+    /**
+     * Gets all the Devices in default namespace.
+     *
+     * @return Devices
+     */
     public static Iterable<KVDevice> getAllDevices() {
-        return new DeviceEnumerator();
+        return new DeviceEnumerator(DEFAULT_NAMESPACE);
     }
 
+    /**
+     * Gets all the Devices in specified namespace.
+     *
+     * @param namespace namespace to iterate over
+     * @return Devices
+     */
+    public static Iterable<KVDevice> getAllDevices(final String namespace) {
+        return new DeviceEnumerator(namespace);
+    }
+
+    /**
+     * Utility class to provide Iterable interface.
+     */
     public static class DeviceEnumerator implements Iterable<KVDevice> {
 
+        private final String namespace;
+
+        /**
+         * Constructor to iterate Links in specified namespace.
+         *
+         * @param namespace namespace to iterate through
+         */
+        public DeviceEnumerator(final String namespace) {
+            this.namespace = namespace;
+        }
+
         @Override
         public Iterator<KVDevice> iterator() {
-            return new DeviceIterator();
+            return new DeviceIterator(namespace);
         }
     }
 
+    /**
+     * Utility class to provide Iterator over all the Device objects.
+     */
     public static class DeviceIterator extends AbstractObjectIterator<KVDevice> {
 
-        public DeviceIterator() {
-            super(DataStoreClient.getClient().getTable(GLOBAL_DEVICE_TABLE_NAME));
+        /**
+         * Constructor to create an iterator to iterate all the Devices
+         * in specified namespace.
+         *
+         * @param namespace namespace to iterate through
+         */
+        public DeviceIterator(final String namespace) {
+            super(DataStoreClient.getClient()
+                    .getTable(namespace + DEVICE_TABLE_SUFFIX), namespace);
         }
 
         @Override
         public KVDevice next() {
             IKVEntry o = enumerator.next();
-            KVDevice e = KVDevice.createFromKey(o.getKey());
+            KVDevice e = KVDevice.createFromKey(o.getKey(), namespace);
             e.deserialize(o.getValue(), o.getVersion());
             return e;
         }
     }
 
+    /**
+     * Gets the MAC address.
+     *
+     * @return MAC address
+     */
     public byte[] getMac() {
         return mac.clone();
     }
 
+    /**
+     * Gets the DeviceID.
+     *
+     * @return DeviceID
+     */
     public byte[] getId() {
         return getKey();
     }
 
+    /**
+     * Add a port to this Device's attachment points.
+     *
+     * @param portId PortID of the port which this Device is attached
+     */
     public void addPortId(final byte[] portId) {
-        // TODO: Should we copy portId, or reference is OK.
-        isPortIdsModified |= portIds.add(portId);
-    }
-
-    public void removePortId(final byte[] portId) {
-        isPortIdsModified |= portIds.remove(portId);
-    }
-
-    public void emptyPortIds() {
-        portIds.clear();
-        this.isPortIdsModified = true;
-    }
-
-    public void addAllToPortIds(final Collection<byte[]> newPortIds) {
-        // TODO: Should we copy portId, or reference is OK.
-        isPortIdsModified |= portIds.addAll(newPortIds);
+        portIds.add(portId.clone());
     }
 
     /**
+     * Remove a port from this Device's attachment points.
+     *
+     * @param portId PortID to remove
+     */
+    public void removePortId(final byte[] portId) {
+        portIds.remove(portId);
+    }
+
+    /**
+     * Empty this Device's attachment points.
+     */
+    public void emptyPortIds() {
+        portIds.clear();
+    }
+
+    /**
+     * Add ports to this Device's attachment points.
+     *
+     * @param newPortIds PortIDs which this Device is attached
+     */
+    public void addAllToPortIds(final Collection<byte[]> newPortIds) {
+        // TODO: Should we copy each portId, or reference is OK.
+        portIds.addAll(newPortIds);
+    }
+
+    /**
+     * Gets all the PortIDs which this Device is attached.
+     *
      * @return Unmodifiable Set view of all the PortIds;
      */
     public Set<byte[]> getAllPortIds() {
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
index 2e4d079..4ad9b74 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVLink.java
@@ -40,19 +40,38 @@
         }
     };
 
+    /**
+     * Internal data structure to represent a port on a switch.
+     */
     public static class SwitchPort {
         public final Long dpid;
         public final Long number;
 
+        /**
+         * Constructor.
+         *
+         * @param dpid datapath ID of this switch port
+         * @param number port number of this port on switch({@code dpid})
+         */
         public SwitchPort(final Long dpid, final Long number) {
             this.dpid = dpid;
             this.number = number;
         }
 
+        /**
+         * Gets the PortID of a port this object represent.
+         *
+         * @return PortID
+         */
         public byte[] getPortID() {
             return KVPort.getPortID(dpid, number);
         }
 
+        /**
+         * Gets the SwitchID of a switch this object represent.
+         *
+         * @return SwitchID
+         */
         public byte[] getSwitchID() {
             return KVSwitch.getSwitchID(dpid);
         }
@@ -64,9 +83,12 @@
 
     }
 
-    public static final String GLOBAL_LINK_TABLE_NAME = "G:Link";
+    static final String LINK_TABLE_SUFFIX = ":Link";
 
     // must not re-order enum members, ordinal will be sent over wire
+    /**
+     * Status.
+     */
     public enum STATUS {
         INACTIVE, ACTIVE;
     }
@@ -75,16 +97,37 @@
     private final SwitchPort dst;
     private STATUS status;
 
+    /**
+     * Generate a LinkID from Link 4-tuples.
+     *
+     * @param srcDpid source DPID
+     * @param srcPortNo source port number
+     * @param dstDpid destination DPID
+     * @param dstPortNo destination port number
+     * @return LinkID
+     */
     public static byte[] getLinkID(final Long srcDpid, final Long srcPortNo,
                                    final Long dstDpid, final Long dstPortNo) {
         return LinkEvent.getLinkID(srcDpid, srcPortNo, dstDpid,
                 dstPortNo).array();
     }
 
+    /**
+     * Gets Link 4-tuples from LinkID.
+     *
+     * @param key LinkID
+     * @return Link 4-tuple: [src DPID, src PortNo, dst DPID, dst PortNo]
+     */
     public static long[] getLinkTupleFromKey(final byte[] key) {
         return getLinkTupleFromKey(ByteBuffer.wrap(key));
     }
 
+    /**
+     * Gets Link 4-tuples from LinkID.
+     *
+     * @param keyBuf LinkID
+     * @return Link 4-tuple: [src DPID, src PortNo, dst DPID, dst PortNo]
+     */
     public static long[] getLinkTupleFromKey(final ByteBuffer keyBuf) {
         if (keyBuf.getChar() != 'L') {
             throw new IllegalArgumentException("Invalid Link key");
@@ -102,10 +145,36 @@
         return tuple;
     }
 
+
+    /**
+     * KVLink constructor for default namespace.
+     *
+     * @param srcDpid source DPID
+     * @param srcPortNo source port number
+     * @param dstDpid destination DPID
+     * @param dstPortNo destination port number
+     */
     public KVLink(final Long srcDpid, final Long srcPortNo,
                   final Long dstDpid, final Long dstPortNo) {
-        super(DataStoreClient.getClient().getTable(GLOBAL_LINK_TABLE_NAME), getLinkID(srcDpid,
-                srcPortNo, dstDpid, dstPortNo));
+        this(srcDpid, srcPortNo, dstDpid, dstPortNo, DEFAULT_NAMESPACE);
+    }
+
+    /**
+     * KVLink constructor for specified namespace.
+     *
+     * @param srcDpid source DPID
+     * @param srcPortNo source port number
+     * @param dstDpid destination DPID
+     * @param dstPortNo destination port number
+     * @param namespace namespace to create this object
+     */
+    public KVLink(final Long srcDpid, final Long srcPortNo,
+                  final Long dstDpid, final Long dstPortNo,
+                  final String namespace) {
+        super(DataStoreClient.getClient()
+                .getTable(namespace + LINK_TABLE_SUFFIX),
+                getLinkID(srcDpid, srcPortNo, dstDpid, dstPortNo),
+                namespace);
 
         src = new SwitchPort(srcDpid, srcPortNo);
         dst = new SwitchPort(dstDpid, dstPortNo);
@@ -113,61 +182,139 @@
     }
 
     /**
-     * Get an instance from Key.
+     * Gets an instance from LinkID in default namespace.
      *
-     * @param key
+     * @param key LinkID
      * @return KVLink instance
      * @note You need to call `read()` to get the DB content.
      */
     public static KVLink createFromKey(final byte[] key) {
+        return createFromKey(key, DEFAULT_NAMESPACE);
+    }
+
+    /**
+     * Gets an instance from LinkID in specified namespace.
+     *
+     * @param key LinkID
+     * @param namespace namespace to create this object in
+     * @return KVLink instance
+     * @note You need to call `read()` to get the DB content.
+     */
+    public static KVLink createFromKey(final byte[] key, final String namespace) {
         long[] linkTuple = getLinkTupleFromKey(key);
-        return new KVLink(linkTuple[0], linkTuple[1], linkTuple[2],
-                linkTuple[3]);
+        return new KVLink(linkTuple[0], linkTuple[1],
+                          linkTuple[2], linkTuple[3],
+                          namespace);
     }
 
+    /**
+     * Gets all the Links in default namespace.
+     *
+     * @return Links
+     */
     public static Iterable<KVLink> getAllLinks() {
-        return new LinkEnumerator();
+        return getAllLinks(DEFAULT_NAMESPACE);
     }
 
+    /**
+     * Gets all the Links in specified namespace.
+     *
+     * @param namespace namespace to iterate over
+     * @return Links
+     */
+    public static Iterable<KVLink> getAllLinks(final String namespace) {
+        return new LinkEnumerator(namespace);
+    }
+
+    /**
+     * Utility class to provide Iterable interface.
+     */
     public static class LinkEnumerator implements Iterable<KVLink> {
 
+        private final String namespace;
+
+        /**
+         * Constructor to iterate Links in specified namespace.
+         *
+         * @param namespace namespace to iterate through
+         */
+        public LinkEnumerator(final String namespace) {
+            this.namespace = namespace;
+        }
+
         @Override
         public Iterator<KVLink> iterator() {
-            return new LinkIterator();
+            return new LinkIterator(namespace);
         }
     }
 
+    /**
+     * Utility class to provide Iterator over all the Link objects.
+     */
     public static class LinkIterator extends AbstractObjectIterator<KVLink> {
 
-        public LinkIterator() {
-            super(DataStoreClient.getClient().getTable(GLOBAL_LINK_TABLE_NAME));
+        /**
+         * Constructor to create an iterator to iterate all the Links
+         * in specified namespace.
+         *
+         * @param namespace namespace to iterate through
+         */
+        public LinkIterator(final String namespace) {
+            super(DataStoreClient.getClient()
+                    .getTable(namespace + LINK_TABLE_SUFFIX),
+                    namespace);
         }
 
         @Override
         public KVLink next() {
             IKVEntry o = enumerator.next();
-            KVLink e = KVLink.createFromKey(o.getKey());
+            KVLink e = KVLink.createFromKey(o.getKey(), namespace);
             e.deserialize(o.getValue(), o.getVersion());
             return e;
         }
     }
 
+    /**
+     * Gets the status.
+     *
+     * @return status
+     */
     public STATUS getStatus() {
         return status;
     }
 
+    /**
+     * Sets the status.
+     *
+     * @param status new status
+     */
     public void setStatus(final STATUS status) {
         this.status = status;
     }
 
+    /**
+     * Gets the source SwitchPort object.
+     *
+     * @return source SwitchPort object
+     */
     public SwitchPort getSrc() {
         return src;
     }
 
+    /**
+     * Gets the destination SwitchPort object.
+     *
+     * @return destination SwitchPort object
+     */
     public SwitchPort getDst() {
         return dst;
     }
 
+    /**
+     * Gets the LinkID of this object.
+     *
+     * @return LinkID
+     */
     public byte[] getId() {
         return getKey();
     }
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVPort.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVPort.java
index c0894c1..d166566 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVPort.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVPort.java
@@ -44,9 +44,12 @@
         }
     };
 
-    public static final String GLOBAL_PORT_TABLE_NAME = "G:Port";
+    static final String PORT_TABLE_SUFFIX = ":Port";
 
     // must not re-order enum members, ordinal will be sent over wire
+    /**
+     * Status.
+     */
     public enum STATUS {
         INACTIVE, ACTIVE;
     }
@@ -56,14 +59,33 @@
 
     private STATUS status;
 
+    /**
+     * Generate a PortID from port pair (dpid, number).
+     *
+     * @param dpid DPID of a switch it reside on.
+     * @param number port number of this
+     * @return PortID
+     */
     public static byte[] getPortID(final Long dpid, final Long number) {
         return PortEvent.getPortID(dpid, number).array();
     }
 
+    /**
+     * Gets the port pair from PortID.
+     *
+     * @param key PortID
+     * @return port pair (dpid, number)
+     */
     public static long[] getPortPairFromKey(final byte[] key) {
         return getPortPairFromKey(ByteBuffer.wrap(key));
     }
 
+    /**
+     * Gets the port pair from PortID.
+     *
+     * @param keyBuf PortID
+     * @return port pair (dpid, number)
+     */
     public static long[] getPortPairFromKey(final ByteBuffer keyBuf) {
         if (keyBuf.getChar() != 'S') {
             throw new IllegalArgumentException("Invalid Port key:" + keyBuf
@@ -82,20 +104,47 @@
 
     }
 
+    /**
+     * Gets the port number from PortID.
+     *
+     * @param key PortID
+     * @return port number
+     */
     public static long getDpidFromKey(final byte[] key) {
         return getPortPairFromKey(key)[0];
     }
 
+    /**
+     * Gets the dpid of an switch from PortID.
+     *
+     * @param key PortID
+     * @return dpid
+     */
     public static long getNumberFromKey(final byte[] key) {
         return getPortPairFromKey(key)[1];
     }
 
-    // FIXME specify DPID,number here, or Should caller specify the key it self?
-    // In other words, should layer above have the control of the ID?
+    /**
+     * KVPort constructor for default namespace.
+     *
+     * @param dpid DPID of the switch this port is on
+     * @param number port number of this port
+     */
     public KVPort(final Long dpid, final Long number) {
-        super(DataStoreClient.getClient().getTable(GLOBAL_PORT_TABLE_NAME), getPortID(dpid, number));
+        this(dpid, number, DEFAULT_NAMESPACE);
+    }
 
-        // TODO Auto-generated constructor stub
+    /**
+     * KVPort constructor for specified namespace.
+     *
+     * @param dpid DPID of the switch this port is on
+     * @param number port number of this port
+     * @param namespace namespace to create this object
+     */
+    public KVPort(final Long dpid, final Long number, final String namespace) {
+        super(DataStoreClient.getClient()
+                .getTable(namespace + PORT_TABLE_SUFFIX),
+                getPortID(dpid, number), namespace);
 
         this.dpid = dpid;
         this.number = number;
@@ -103,60 +152,136 @@
     }
 
     /**
-     * Get an instance from Key.
+     * Gets an instance from PortID in default namespace.
      *
-     * @param key
-     * @return KVPort instance
+     * @param key PortID
+     * @return {@link KVPort} instance
      * @note You need to call `read()` to get the DB content.
      */
     public static KVPort createFromKey(final byte[] key) {
+        return createFromKey(key, DEFAULT_NAMESPACE);
+    }
+
+    /**
+     * Gets an instance from PortID in specified namespace.
+     *
+     * @param key PortID
+     * @param namespace namespace to create this object.
+     * @return {@link KVPort} instance
+     * @note You need to call `read()` to get the DB content.
+     */
+    public static KVPort createFromKey(final byte[] key, final String namespace) {
         long[] pair = getPortPairFromKey(key);
-        return new KVPort(pair[0], pair[1]);
+        return new KVPort(pair[0], pair[1], namespace);
     }
 
+    /**
+     * Gets all the Ports in default namespace.
+     *
+     * @return Ports
+     */
     public static Iterable<KVPort> getAllPorts() {
-        return new PortEnumerator();
+        return getAllPorts(DEFAULT_NAMESPACE);
     }
 
+    /**
+     * Gets all the Ports in specified namespace.
+     *
+     * @param namespace namespace to iterate over
+     * @return Ports
+     */
+    public static Iterable<KVPort> getAllPorts(final String namespace) {
+        return new PortEnumerator(namespace);
+    }
+
+    /**
+     * Utility class to provide Iterable interface.
+     */
     public static class PortEnumerator implements Iterable<KVPort> {
 
+        private final String namespace;
+
+        /**
+         * Constructor to iterate Ports in specified namespace.
+         *
+         * @param namespace namespace to iterate through
+         */
+        public PortEnumerator(final String namespace) {
+            this.namespace = namespace;
+        }
+
         @Override
         public Iterator<KVPort> iterator() {
-            return new PortIterator();
+            return new PortIterator(namespace);
         }
     }
 
+    /**
+     * Utility class to provide Iterator over all the Port objects.
+     */
     public static class PortIterator extends AbstractObjectIterator<KVPort> {
 
-        public PortIterator() {
-            super(DataStoreClient.getClient().getTable(GLOBAL_PORT_TABLE_NAME));
+        /**
+         * Constructor to create an iterator to iterate all the Ports
+         * in specified namespace.
+         *
+         * @param namespace namespace to iterate through
+         */
+        public PortIterator(final String namespace) {
+            super(DataStoreClient.getClient()
+                    .getTable(namespace + PORT_TABLE_SUFFIX), namespace);
         }
 
         @Override
         public KVPort next() {
             IKVEntry o = enumerator.next();
-            KVPort e = KVPort.createFromKey(o.getKey());
+            KVPort e = KVPort.createFromKey(o.getKey(), namespace);
             e.deserialize(o.getValue(), o.getVersion());
             return e;
         }
     }
 
+    /**
+     * Gets the status.
+     *
+     * @return status
+     */
     public STATUS getStatus() {
         return status;
     }
 
+    /**
+     * Sets the status.
+     *
+     * @param status new status
+     */
     public void setStatus(final STATUS status) {
         this.status = status;
     }
 
+    /**
+     * Gets the DPID of the switch this port is on.
+     *
+     * @return DPID of the switch this port is on
+     */
     public Long getDpid() {
         return dpid;
     }
 
+    /**
+     * Gets the port number of this port.
+     *
+     * @return port number of this port
+     */
     public Long getNumber() {
         return number;
     }
 
+    /**
+     * Gets the PortID.
+     *
+     * @return PortID
+     */
     public byte[] getId() {
         return getKey();
     }
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVSwitch.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVSwitch.java
index a38e17d..aed08be 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVSwitch.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVSwitch.java
@@ -43,9 +43,12 @@
         }
     };
 
-    public static final String GLOBAL_SWITCH_TABLE_NAME = "G:Switch";
+    static final String SWITCH_TABLE_SUFFIX = ":Switch";
 
     // must not re-order enum members, ordinal will be sent over wire
+    /**
+     * Status.
+     */
     public enum STATUS {
         INACTIVE, ACTIVE;
     }
@@ -53,14 +56,32 @@
     private final Long dpid;
     private STATUS status;
 
+    /**
+     * Generate a SwitchID from dpid.
+     *
+     * @param dpid dpid of the switch
+     * @return SwitchID
+     */
     public static byte[] getSwitchID(final Long dpid) {
         return SwitchEvent.getSwitchID(dpid).array();
     }
 
+    /**
+     * Gets the DPID from SwitchID.
+     *
+     * @param key SwitchID
+     * @return dpid
+     */
     public static long getDpidFromKey(final byte[] key) {
         return getDpidFromKey(ByteBuffer.wrap(key));
     }
 
+    /**
+     * Gets the DPID from SwitchID.
+     *
+     * @param keyBuf SwitchID
+     * @return dpid
+     */
     public static long getDpidFromKey(final ByteBuffer keyBuf) {
         if (keyBuf.getChar() != 'S') {
             throw new IllegalArgumentException("Invalid Switch key");
@@ -68,65 +89,154 @@
         return keyBuf.getLong();
     }
 
-    // FIXME specify DPID here, or Should caller specify the key it self?
-    // In other words, should layer above have the control of the ID?
+    // FIXME Should the parameter be DPID here, or should caller specify the key?
+    // Should layer above have the control of the ID computation/generation?
+    /**
+     * KVSwitch constructor for default namespace.
+     *
+     * @param dpid dpid of this switch
+     */
     public KVSwitch(final Long dpid) {
-        super(DataStoreClient.getClient().getTable(GLOBAL_SWITCH_TABLE_NAME), getSwitchID(dpid));
-
-        this.dpid = dpid;
-        this.status = STATUS.INACTIVE;
+        this(dpid, KVObject.DEFAULT_NAMESPACE);
     }
 
     /**
-     * Get an instance from Key.
+     * KVSwitch constructor for specified namespace.
      *
-     * @param key
-     * @return KVSwitch instance
+     * @param dpid dpid of this switch
+     * @param namespace namespace to create this object
+     */
+    public KVSwitch(final Long dpid, final String namespace) {
+        super(DataStoreClient.getClient()
+                .getTable(namespace + SWITCH_TABLE_SUFFIX),
+                getSwitchID(dpid), namespace);
+
+        this.dpid = dpid;
+        this.status = STATUS.INACTIVE;
+        // may need to store namespace here or at KVObject.
+    }
+
+    /**
+     * Gets an instance from SwitchID in default namespace.
+     *
+     * @param key SwitchID
+     * @return {@link KVSwitch} instance
      * @note You need to call `read()` to get the DB content.
      */
     public static KVSwitch createFromKey(final byte[] key) {
         return new KVSwitch(getDpidFromKey(key));
     }
 
-    public static Iterable<KVSwitch> getAllSwitches() {
-        return new SwitchEnumerator();
+    /**
+     * Gets an instance from SwitchID in specified namespace.
+     *
+     * @param key SwitchID
+     * @param namespace namespace to create this object
+     * @return {@link KVSwitch} instance
+     * @note You need to call `read()` to get the DB content.
+     */
+    public static KVSwitch createFromKey(final byte[] key, final String namespace) {
+        return new KVSwitch(getDpidFromKey(key), namespace);
     }
 
+    /**
+     * Gets all the switches in default namespace.
+     *
+     * @return All the {@link KVSwitch}
+     */
+    public static Iterable<KVSwitch> getAllSwitches() {
+        return getAllSwitches(DEFAULT_NAMESPACE);
+    }
+
+    /**
+     * Gets all the switches in specified namespace.
+     *
+     * @param namespace Namespace to get all switches.
+     * @return All the {@link KVSwitch}
+     */
+    public static Iterable<KVSwitch> getAllSwitches(final String namespace) {
+        return new SwitchEnumerator(namespace);
+    }
+
+    /**
+     * Utility class to provide Iterable interface.
+     */
     public static class SwitchEnumerator implements Iterable<KVSwitch> {
 
+        private final String namespace;
+
+        /**
+         * Constructor to iterate Ports in specified namespace.
+         *
+         * @param namespace namespace to iterate through
+         */
+        public SwitchEnumerator(final String namespace) {
+            this.namespace = namespace;
+        }
+
         @Override
         public Iterator<KVSwitch> iterator() {
-            return new SwitchIterator();
+            return new SwitchIterator(namespace);
         }
     }
 
+    /**
+     * Utility class to provide Iterator over all the Switch objects.
+     */
     public static class SwitchIterator extends AbstractObjectIterator<KVSwitch> {
 
-        public SwitchIterator() {
-            super(DataStoreClient.getClient().getTable(GLOBAL_SWITCH_TABLE_NAME));
+        /**
+         * Constructor to create an iterator to iterate all the Switches
+         * in specified namespace.
+         *
+         * @param namespace namespace to iterate through
+         */
+        public SwitchIterator(final String namespace) {
+            super(DataStoreClient.getClient()
+                    .getTable(namespace + SWITCH_TABLE_SUFFIX), namespace);
         }
 
         @Override
         public KVSwitch next() {
             IKVEntry o = enumerator.next();
-            KVSwitch e = KVSwitch.createFromKey(o.getKey());
+            KVSwitch e = KVSwitch.createFromKey(o.getKey(), namespace);
             e.deserialize(o.getValue(), o.getVersion());
             return e;
         }
     }
 
+    /**
+     * Gets the status.
+     *
+     * @return status
+     */
     public STATUS getStatus() {
         return status;
     }
 
+    /**
+     * Sets the status.
+     *
+     * @param status new status
+     */
     public void setStatus(final STATUS status) {
         this.status = status;
     }
 
+    /**
+     * Gets the DPID of the switch this port is on.
+     *
+     * @return DPID of the switch this port is on
+     */
     public Long getDpid() {
         return dpid;
     }
 
+    /**
+     * Gets the SwitchID.
+     *
+     * @return SwitchID
+     */
     public byte[] getId() {
         return getKey();
     }
diff --git a/src/main/java/net/onrc/onos/core/datastore/utils/KVObject.java b/src/main/java/net/onrc/onos/core/datastore/utils/KVObject.java
index aad0310..15666b2 100644
--- a/src/main/java/net/onrc/onos/core/datastore/utils/KVObject.java
+++ b/src/main/java/net/onrc/onos/core/datastore/utils/KVObject.java
@@ -44,12 +44,18 @@
         }
     };
 
+    /**
+     * Default namespace name for KVObject.
+     */
+    public static final String DEFAULT_NAMESPACE = "G";
+
+    private final String namespace;
     private final IKVTable table;
     private final byte[] key;
 
     /**
-     * serialized value version stored on data store or
-     * {@link IKVTable.getVersionNonexistant()} if is a new object.
+     * Serialized-value version stored on data store or
+     * {@link IKVTable.getVersionNonexistant()} if it is a new object.
      */
     private long version;
 
@@ -58,17 +64,36 @@
      */
     private Map<Object, Object> propertyMap;
 
-    public KVObject(final IKVTable table, final byte[] key) {
-        this(table, key, null, table.getVersionNonexistant());
+    /**
+     * KVObject constructor without value secified for specified namespace.
+     *
+     * @param table table where this object resides
+     * @param key Key or ID of this object
+     * @param namespace namespace where this object resides
+     */
+    public KVObject(final IKVTable table, final byte[] key, final String namespace) {
+        this(table, key, null, table.getVersionNonexistant(), namespace);
     }
 
-    public KVObject(final IKVTable table, final byte[] key, final byte[] value, final long version) {
+    /**
+     * KVObject constructor for specified namespace.
+     *
+     * @param table table where this object resides
+     * @param key Key or ID of this object
+     * @param value Value blob representation of this object
+     * @param version version of this Value blob
+     * @param namespace namespace where this object resides
+     */
+    public KVObject(final IKVTable table, final byte[] key,
+                    final byte[] value, final long version,
+                    final String namespace) {
         if (table == null) {
             throw new IllegalArgumentException("table cannot be null");
         }
         if (key == null) {
             throw new IllegalArgumentException("key cannot be null");
         }
+        this.namespace = namespace;
         this.table = table;
         this.key = key.clone();
         this.version = version;
@@ -79,24 +104,47 @@
         }
     }
 
-    protected static KVObject createFromKey(final byte[] key) {
-        // Equivalent of this method is expected to be implemented by SubClasses
-        throw new UnsupportedOperationException(
-                "createFromKey() is not expected to be called for RCObject");
+    /**
+     * Gets the namespace which this object reside.
+     *
+     * @return the namespace which this object reside
+     */
+    public String getNamespace() {
+        return namespace;
     }
 
+    /**
+     * Gets the table where this object resides.
+     *
+     * @return table where this object resides
+     */
     public IKVTable getTable() {
         return table;
     }
 
+    /**
+     * Gets the table ID of the table where this object resides.
+     *
+     * @return the table ID of the table where this object resides
+     */
     public IKVTableID getTableId() {
         return table.getTableId();
     }
 
+    /**
+     * Gets the Key or ID of this object.
+     *
+     * @return Key or ID of this object
+     */
     public byte[] getKey() {
         return key.clone();
     }
 
+    /**
+     * Gets the version of this objects value blob.
+     *
+     * @return version of this objects value blob
+     */
     public long getVersion() {
         return version;
     }
@@ -111,6 +159,12 @@
         return this.propertyMap;
     }
 
+    /**
+     * Replaces the user-defined object properties.
+     *
+     * @param newMap new user-defined object properties
+     * @return old user-defined object properties
+     */
     protected Map<Object, Object> replacePropertyMap(final Map<Object, Object> newMap) {
         Map<Object, Object> oldMap = this.propertyMap;
         this.propertyMap = newMap;
@@ -128,10 +182,16 @@
         return serializePropertyMap(DEFAULT_KRYO.get(), this.propertyMap);
     }
 
+    /**
+     * Serialize user-defined object properties.
+     *
+     * @param kryo {@link Kryo} instance to use for serialization
+     * @param propMap user-defined object properties
+     * @return serialized byte array
+     */
     protected byte[] serializePropertyMap(final Kryo kryo,
                                           final Map<Object, Object> propMap) {
 
-
         // value
         byte[] rcTemp = new byte[1024 * 1024];
         Output output = new Output(rcTemp);
@@ -183,7 +243,15 @@
         return true;
     }
 
-    protected <T extends Map<?, ?>> T deserializePropertyMap(final Kryo kryo,
+    /**
+     * Deserialize user-defined object properties.
+     *
+     * @param kryo {@link Kryo} instance to use for deserialization
+     * @param bytes serialized byte array
+     * @param type Type of user-defined object properties
+     * @return user-defined object properties
+     */
+    protected static <T extends Map<?, ?>> T deserializePropertyMap(final Kryo kryo,
                                                              final byte[] bytes, final Class<T> type) {
 
         if (bytes == null || bytes.length == 0) {
@@ -433,9 +501,16 @@
             Iterator<E> {
 
         protected Iterator<IKVEntry> enumerator;
+        protected final String namespace;
 
+        @Deprecated
         public AbstractObjectIterator(final IKVTable table) {
+            this(table, DEFAULT_NAMESPACE);
+        }
+
+        public AbstractObjectIterator(final IKVTable table, final String namespace) {
             this.enumerator = table.getAllEntries().iterator();
+            this.namespace = namespace;
         }
 
         @Override
@@ -452,6 +527,9 @@
         //          return obj;
         //      }
 
+        /**
+         * Not implemented.
+         */
         @Deprecated
         @Override
         public void remove() {
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();
