diff --git a/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java b/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java
index e6e1f82..1194e18 100644
--- a/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java
+++ b/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java
@@ -23,6 +23,7 @@
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.onrc.onos.api.registry.ILocalSwitchMastershipListener;
 import net.onrc.onos.core.packet.Ethernet;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 import org.openflow.protocol.OFMessage;
 import org.openflow.protocol.OFType;
@@ -116,9 +117,11 @@
     public Map<String, String> getControllerNodeIPs();
 
     /**
-     * Gets the ID of the controller
+     * Gets the unique ID used to identify this ONOS instance in the cluster.
+     *
+     * @return ONOS Instance ID.
      */
-    public String getControllerId();
+    public OnosInstanceId getOnosInstanceId();
 
     /**
      * Add a switch listener
diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
index e34c958..a502711 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
@@ -68,6 +68,7 @@
 import net.onrc.onos.core.registry.IControllerRegistryService.ControlChangeCallback;
 import net.onrc.onos.core.registry.RegistryException;
 import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 import org.jboss.netty.bootstrap.ServerBootstrap;
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -180,7 +181,7 @@
     protected int workerThreads = 0;
     // The id for this controller node. Should be unique for each controller
     // node in a controller cluster.
-    protected String controllerId = "localhost";
+    private OnosInstanceId onosInstanceId = new OnosInstanceId("localhost");
 
     // The current role of the controller.
     // If the controller isn't configured to support roles, then this is null.
@@ -1648,8 +1649,8 @@
     }
 
     @Override
-    public String getControllerId() {
-        return controllerId;
+    public OnosInstanceId getOnosInstanceId() {
+        return onosInstanceId;
     }
 
     // **************
@@ -1814,18 +1815,18 @@
         log.debug("Number of worker threads set to {}", this.workerThreads);
         String controllerId = configParams.get("controllerid");
         if (controllerId != null) {
-            this.controllerId = controllerId;
+            this.onosInstanceId = new OnosInstanceId(controllerId);
         } else {
             //Try to get the hostname of the machine and use that for controller ID
             try {
                 String hostname = java.net.InetAddress.getLocalHost().getHostName();
-                this.controllerId = hostname;
+                this.onosInstanceId = new OnosInstanceId(hostname);
             } catch (UnknownHostException e) {
                 // Can't get hostname, we'll just use the default
             }
         }
 
-        log.debug("ControllerId set to {}", this.controllerId);
+        log.debug("ControllerId set to {}", this.onosInstanceId);
     }
 
     private void initVendorMessages() {
@@ -1880,7 +1881,7 @@
                     LogMessageDoc.CHECK_CONTROLLER)
     public void startupComponents() {
         try {
-            registryService.registerController(controllerId);
+            registryService.registerController(onosInstanceId.toString());
         } catch (RegistryException e) {
             log.warn("Registry service error: {}", e.getMessage());
         }
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 aa897be..2e4b138 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
@@ -53,26 +53,26 @@
     private TreeSet<byte[]> portIds;
 
     /**
-     * Generate a DeviceID from MAC address.
+     * Generate a HostID from MAC address.
      * <p/>
      * We're assuming MAC address can be an unique identifier for Host.
      *
      * @param mac MAC address
-     * @return DeviceID
+     * @return HostID
      */
-    public static byte[] getDeviceID(final byte[] mac) {
-        return HostEvent.getDeviceID(mac).array();
+    public static byte[] getHostID(final byte[] mac) {
+        return HostEvent.getHostID(mac).array();
     }
 
     /**
-     * Gets the MAC address from DeviceID.
+     * Gets the MAC address from HostID.
      *
-     * @param key DeviceID
+     * @param key HostID
      * @return MAC address
      */
     public static byte[] getMacFromKey(final byte[] key) {
         ByteBuffer keyBuf = ByteBuffer.wrap(key);
-        if (keyBuf.getChar() != 'D') {
+        if (keyBuf.getChar() != 'H') {
             throw new IllegalArgumentException("Invalid Host key");
         }
         byte[] mac = new byte[keyBuf.remaining()];
@@ -98,18 +98,18 @@
     public KVDevice(final byte[] mac, final String namespace) {
         super(DataStoreClient.getClient()
                 .getTable(namespace + DEVICE_TABLE_SUFFIX),
-                getDeviceID(mac), namespace);
+                getHostID(mac), namespace);
 
         this.mac = mac.clone();
         this.portIds = new TreeSet<>(ByteArrayComparator.BYTEARRAY_COMPARATOR);
     }
 
     /**
-     * Gets an instance from DeviceID in default namespace.
+     * Gets an instance from HostID in default namespace.
      * <p/>
      * Note: You need to call `read()` to get the DB content.
      *
-     * @param key DeviceID
+     * @param key HostID
      * @return KVDevice instance
      */
     public static KVDevice createFromKey(final byte[] key) {
@@ -117,11 +117,11 @@
     }
 
     /**
-     * Gets an instance from DeviceID in specified namespace.
+     * Gets an instance from HostID in specified namespace.
      * <p/>
      * Note: You need to call `read()` to get the DB content.
      *
-     * @param key DeviceID
+     * @param key HostID
      * @param namespace namespace to create this object in
      * @return KVDevice instance
      */
@@ -205,9 +205,9 @@
     }
 
     /**
-     * Gets the DeviceID.
+     * Gets the HostID.
      *
-     * @return DeviceID
+     * @return HostID
      */
     public byte[] getId() {
         return getKey();
diff --git a/src/main/java/net/onrc/onos/core/registry/IControllerRegistryService.java b/src/main/java/net/onrc/onos/core/registry/IControllerRegistryService.java
index 5af1ac1..cfc47c8 100644
--- a/src/main/java/net/onrc/onos/core/registry/IControllerRegistryService.java
+++ b/src/main/java/net/onrc/onos/core/registry/IControllerRegistryService.java
@@ -5,6 +5,7 @@
 import java.util.Map;
 
 import net.floodlightcontroller.core.module.IFloodlightService;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 /**
  * A registry service that allows ONOS to register controllers and switches
@@ -81,11 +82,11 @@
     public boolean isClusterLeader();
 
     /**
-     * Get the unique ID used to identify this controller in the cluster.
+     * Gets the unique ID used to identify this ONOS instance in the cluster.
      *
-     * @return controller ID.
+     * @return ONOS Instance ID.
      */
-    public String getControllerId();
+    public OnosInstanceId getOnosInstanceId();
 
     /**
      * Register a controller to the ONOS cluster. Must be called before
diff --git a/src/main/java/net/onrc/onos/core/registry/StandaloneRegistry.java b/src/main/java/net/onrc/onos/core/registry/StandaloneRegistry.java
index 0b552f1..bec8bb4 100644
--- a/src/main/java/net/onrc/onos/core/registry/StandaloneRegistry.java
+++ b/src/main/java/net/onrc/onos/core/registry/StandaloneRegistry.java
@@ -15,6 +15,7 @@
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.restserver.IRestApiService;
 import net.onrc.onos.core.registry.web.RegistryWebRoutable;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 import org.apache.commons.lang.NotImplementedException;
 import org.openflow.util.HexString;
@@ -32,7 +33,7 @@
 
     private IRestApiService restApi;
 
-    private String registeredControllerId;
+    private OnosInstanceId onosInstanceId;
     private Map<String, ControlChangeCallback> switchCallbacks;
 
     private long blockTop;
@@ -46,7 +47,7 @@
     @Override
     public void requestControl(long dpid, ControlChangeCallback cb)
             throws RegistryException {
-        if (registeredControllerId == null) {
+        if (onosInstanceId == null) {
             throw new IllegalStateException(
                     "Must register a controller before calling requestControl");
         }
@@ -83,32 +84,32 @@
     }
 
     @Override
-    public String getControllerId() {
-        return registeredControllerId;
+    public OnosInstanceId getOnosInstanceId() {
+        return onosInstanceId;
     }
 
     @Override
     public void registerController(String controllerId)
             throws RegistryException {
-        if (registeredControllerId != null) {
+        if (onosInstanceId != null) {
             throw new RegistryException(
-                    "Controller already registered with id " + registeredControllerId);
+                    "Controller already registered with id " + onosInstanceId);
         }
-        registeredControllerId = controllerId;
+        onosInstanceId = new OnosInstanceId(controllerId);
     }
 
     @Override
     public Collection<String> getAllControllers() throws RegistryException {
-        //List<String> l = new ArrayList<String>();
-        //l.add(registeredControllerId);
-        //return l;
-        return Collections.singletonList(registeredControllerId);
+        if (onosInstanceId == null) {
+            return new ArrayList<String>();
+        }
+        return Collections.singletonList(onosInstanceId.toString());
     }
 
     @Override
     public String getControllerForSwitch(long dpid) throws RegistryException {
         return (switchCallbacks.get(HexString.toHexString(dpid)) == null)
-                ? null : registeredControllerId;
+            ? null : onosInstanceId.toString();
     }
 
     @Override
@@ -120,7 +121,7 @@
             log.debug("Switch _{}", strSwitch);
             List<ControllerRegistryEntry> list =
                     new ArrayList<ControllerRegistryEntry>();
-            list.add(new ControllerRegistryEntry(registeredControllerId, 0));
+            list.add(new ControllerRegistryEntry(onosInstanceId.toString(), 0));
 
             switches.put(strSwitch, list);
         }
diff --git a/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java b/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
index ce68ec2..fb7b573 100644
--- a/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
+++ b/src/main/java/net/onrc/onos/core/registry/ZookeeperRegistry.java
@@ -22,6 +22,7 @@
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.restserver.IRestApiService;
 import net.onrc.onos.core.registry.web.RegistryWebRoutable;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.curator.RetryPolicy;
@@ -60,7 +61,7 @@
 
     private static final Logger log = LoggerFactory.getLogger(ZookeeperRegistry.class);
 
-    private String controllerId;
+    private OnosInstanceId onosInstanceId;
 
     private IRestApiService restApi;
 
@@ -255,7 +256,7 @@
             throws RegistryException {
         log.info("Requesting control for {}", HexString.toHexString(dpid));
 
-        if (controllerId == null) {
+        if (onosInstanceId == null) {
             throw new IllegalStateException("Must register a controller before"
                     + " calling requestControl");
         }
@@ -270,7 +271,8 @@
         String latchPath = SWITCH_LATCHES_PATH + "/" + dpidStr;
 
         LeaderLatch latch =
-                new LeaderLatch(curatorFrameworkClient, latchPath, controllerId);
+            new LeaderLatch(curatorFrameworkClient, latchPath,
+                            onosInstanceId.toString());
         SwitchLeaderListener listener = new SwitchLeaderListener(dpidStr);
         latch.addListener(listener);
 
@@ -348,8 +350,8 @@
     }
 
     @Override
-    public String getControllerId() {
-        return controllerId;
+    public OnosInstanceId getOnosInstanceId() {
+        return onosInstanceId;
     }
 
     @Override
@@ -369,18 +371,18 @@
 
     @Override
     public void registerController(String id) throws RegistryException {
-        if (controllerId != null) {
+        if (onosInstanceId != null) {
             throw new RegistryException(
-                    "Controller already registered with id " + controllerId);
+                    "Controller already registered with id " + onosInstanceId);
         }
 
-        controllerId = id;
+        onosInstanceId = new OnosInstanceId(id);
 
         try {
             ServiceInstance<ControllerService> thisInstance =
                     ServiceInstance.<ControllerService>builder()
                     .name(CONTROLLER_SERVICE_NAME)
-                    .payload(new ControllerService(controllerId))
+                    .payload(new ControllerService(onosInstanceId.toString()))
                     .build();
 
             serviceDiscovery.registerService(thisInstance);
@@ -646,12 +648,13 @@
         // NOTE: We have to do it here, because during the init stage
         // we don't know the Controller ID.
         //
-        if (controllerId == null) {
-            log.error("Error on startup: unknown ControllerId");
+        if (onosInstanceId == null) {
+            log.error("Error on startup: unknown ONOS Instance ID");
+            return;
         }
         clusterLeaderLatch = new LeaderLatch(curatorFrameworkClient,
                 CLUSTER_LEADER_PATH,
-                controllerId);
+                onosInstanceId.toString());
         clusterLeaderListener = new ClusterLeaderListener();
         clusterLeaderLatch.addListener(clusterLeaderListener);
         try {
diff --git a/src/main/java/net/onrc/onos/core/topology/Host.java b/src/main/java/net/onrc/onos/core/topology/Host.java
index 71ede78..05849c5 100644
--- a/src/main/java/net/onrc/onos/core/topology/Host.java
+++ b/src/main/java/net/onrc/onos/core/topology/Host.java
@@ -16,27 +16,27 @@
 @JsonSerialize(using = HostSerializer.class)
 public interface Host extends ITopologyElement {
     /**
-     * Get the device MAC address.
+     * Gets the Host MAC address.
      *
-     * @return the device MAC address.
+     * @return the Host MAC address.
      */
     public MACAddress getMacAddress();
 
     /**
-     * Get the device attachment points.
+     * Gets the Host attachment points.
      * <p/>
      * TODO: There is only 1 attachment point right now.
      * TODO: Add requirement for Iteration order? Latest observed port first.
      *
-     * @return the device attachment points.
+     * @return the Host attachment points.
      */
     public Iterable<Port> getAttachmentPoints();
 
     /**
-     * Get the device last seen time.
+     * Gest the Host last seen time.
      * <p/>
      *
-     * @return the device last seen time. (UTC in ms)
+     * @return the Host last seen time. (UTC in ms)
      */
     public long getLastSeenTime();
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/HostEvent.java b/src/main/java/net/onrc/onos/core/topology/HostEvent.java
index c35764e..ebaf688 100644
--- a/src/main/java/net/onrc/onos/core/topology/HostEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/HostEvent.java
@@ -18,7 +18,7 @@
  * <p/>
  * Host event differ from other events.
  * Host Event represent add/remove of attachmentPoint.
- * Not add/remove of the DeviceObject itself.
+ * Not add/remove of the Host Object itself.
  * <p/>
  * Multiple attachmentPoints can be specified to batch events into 1 object.
  * Each should be treated as independent events.
@@ -146,16 +146,16 @@
     }
 
     // Assuming mac is unique cluster-wide
-    public static ByteBuffer getDeviceID(final byte[] mac) {
+    public static ByteBuffer getHostID(final byte[] mac) {
         return (ByteBuffer) ByteBuffer.allocate(2 + mac.length)
-                .putChar('D').put(mac).flip();
+                .putChar('H').put(mac).flip();
     }
 
     public byte[] getID() {
-        return getDeviceID(mac.toBytes()).array();
+        return getHostID(mac.toBytes()).array();
     }
 
     public ByteBuffer getIDasByteBuffer() {
-        return getDeviceID(mac.toBytes());
+        return getHostID(mac.toBytes());
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/HostImpl.java b/src/main/java/net/onrc/onos/core/topology/HostImpl.java
index 3120015..289e1e0 100644
--- a/src/main/java/net/onrc/onos/core/topology/HostImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/HostImpl.java
@@ -77,7 +77,7 @@
      */
     @Override
     public String getType() {
-        // FIXME assuming device is always in packet layer for now.
+        // FIXME assuming Host is always in packet layer for now.
         return TopologyElement.TYPE_PACKET_LAYER;
     }
 
diff --git a/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java b/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
index 5ed36a3..5668e2f 100644
--- a/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
@@ -7,6 +7,7 @@
 import net.floodlightcontroller.core.IFloodlightProviderService.Role;
 import net.onrc.onos.core.topology.web.serializers.MastershipEventSerializer;
 import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 import org.apache.commons.lang.Validate;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
@@ -22,7 +23,7 @@
 public class MastershipEvent extends TopologyElement<MastershipEvent> {
 
     private final Dpid dpid;
-    private final String onosInstanceId;
+    private final OnosInstanceId onosInstanceId;
     private final Role role;
 
     /**
@@ -42,7 +43,8 @@
      * @param onosInstanceId the ONOS Instance ID
      * @param role the ONOS instance role for the switch.
      */
-    public MastershipEvent(Dpid dpid, String onosInstanceId, Role role) {
+    public MastershipEvent(Dpid dpid, OnosInstanceId onosInstanceId,
+                           Role role) {
         Validate.notNull(dpid);
         Validate.notNull(onosInstanceId);
 
@@ -77,7 +79,7 @@
      *
      * @return the ONOS Instance ID.
      */
-    public String getOnosInstanceId() {
+    public OnosInstanceId getOnosInstanceId() {
         return onosInstanceId;
     }
 
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
index 3b6a5e9..cb7c54f 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
@@ -397,7 +397,8 @@
     public void controllerRoleChanged(Dpid dpid, Role role) {
         log.debug("Local switch controller mastership role changed: dpid = {} role = {}", dpid, role);
         MastershipEvent mastershipEvent =
-            new MastershipEvent(dpid, registryService.getControllerId(), role);
+            new MastershipEvent(dpid, registryService.getOnosInstanceId(),
+                                role);
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
@@ -414,7 +415,8 @@
         Role role = Role.SLAVE;         // TODO: Should be Role.UNKNOWN
 
         MastershipEvent mastershipEvent =
-            new MastershipEvent(dpid, registryService.getControllerId(), role);
+            new MastershipEvent(dpid, registryService.getOnosInstanceId(),
+                                role);
         // FIXME should be merging, with existing attrs, etc..
         // TODO define attr name as constant somewhere.
         // TODO populate appropriate attributes.
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/MastershipEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/MastershipEventSerializer.java
index 296c605..d8c8da7 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/serializers/MastershipEventSerializer.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/MastershipEventSerializer.java
@@ -48,7 +48,7 @@
         jsonGenerator.writeStringField("dpid",
                                        mastershipEvent.getDpid().toString());
         jsonGenerator.writeStringField("onosInstanceId",
-                                       mastershipEvent.getOnosInstanceId());
+                                       mastershipEvent.getOnosInstanceId().toString());
         jsonGenerator.writeStringField("role",
                                        mastershipEvent.getRole().name());
         jsonGenerator.writeObjectFieldStart("stringAttributes");
diff --git a/src/main/java/net/onrc/onos/core/util/OnosInstanceId.java b/src/main/java/net/onrc/onos/core/util/OnosInstanceId.java
new file mode 100644
index 0000000..34e370a
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/OnosInstanceId.java
@@ -0,0 +1,47 @@
+package net.onrc.onos.core.util;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * The class representing an ONOS Instance ID.
+ *
+ * This class is immutable.
+ */
+public final class OnosInstanceId {
+    private final String id;
+
+    /**
+     * Constructor from a string value.
+     *
+     * @param id the value to use.
+     */
+    public OnosInstanceId(String id) {
+        this.id = checkNotNull(id);
+        checkArgument(!id.isEmpty(), "Empty ONOS Instance ID");
+    }
+
+    @Override
+    public int hashCode() {
+        return id.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+
+        if (!(obj instanceof OnosInstanceId)) {
+            return false;
+        }
+
+        OnosInstanceId that = (OnosInstanceId) obj;
+        return this.id.equals(that.id);
+    }
+
+    @Override
+    public String toString() {
+        return id;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
index 47b2349..4ab832e 100644
--- a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
+++ b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
@@ -56,6 +56,7 @@
 import net.onrc.onos.core.util.IPv6;
 import net.onrc.onos.core.util.IPv6Net;
 import net.onrc.onos.core.util.LinkTuple;
+import net.onrc.onos.core.util.OnosInstanceId;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.Switch;
 import net.onrc.onos.core.util.SwitchPort;
@@ -201,18 +202,19 @@
         kryo.register(LinkTuple.class);
 
         // New data model-related classes
+        kryo.register(AdminStatus.class);
+        kryo.register(ConcurrentHashMap.class);
+        kryo.register(ConfigState.class);
         kryo.register(HostEvent.class);
         kryo.register(LinkedList.class);
         kryo.register(LinkEvent.class);
         kryo.register(MastershipEvent.class);
+        kryo.register(OnosInstanceId.class);
         kryo.register(PortEvent.class);
         kryo.register(Role.class);
         kryo.register(SwitchEvent.class);
-        kryo.register(TopologyEvent.class);
         kryo.register(TopologyElement.class);
-        kryo.register(ConcurrentHashMap.class);
-        kryo.register(ConfigState.class);
-        kryo.register(AdminStatus.class);
+        kryo.register(TopologyEvent.class);
 
         // Intent-related classes
         kryo.register(Path.class);
diff --git a/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java b/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java
index dec61fd..31e57c4 100644
--- a/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java
+++ b/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java
@@ -44,6 +44,7 @@
 import net.floodlightcontroller.core.util.ListenerDispatcher;
 import net.onrc.onos.api.registry.ILocalSwitchMastershipListener;
 import net.onrc.onos.core.packet.Ethernet;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 import org.openflow.protocol.OFMessage;
 import org.openflow.protocol.OFPacketIn;
@@ -269,8 +270,8 @@
     }
 
     @Override
-    public String getControllerId() {
-        return "localhost";
+    public OnosInstanceId getOnosInstanceId() {
+        return new OnosInstanceId("localhost");
     }
 
     @Override
diff --git a/src/test/java/net/onrc/onos/core/registry/StandaloneRegistryTest.java b/src/test/java/net/onrc/onos/core/registry/StandaloneRegistryTest.java
index 6eb6687..88a1177 100644
--- a/src/test/java/net/onrc/onos/core/registry/StandaloneRegistryTest.java
+++ b/src/test/java/net/onrc/onos/core/registry/StandaloneRegistryTest.java
@@ -18,6 +18,7 @@
 
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.onrc.onos.core.registry.IControllerRegistryService.ControlChangeCallback;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 import org.junit.After;
 import org.junit.Before;
@@ -185,25 +186,26 @@
     }
 
     /**
-     * Test if {@link StandaloneRegistry#getControllerId()} can return correct ID.
+     * Test if {@link StandaloneRegistry#getOnosInstanceId()} can return
+     * correct ID.
      *
      * @throws RegistryException
      */
     @Test
-    public void testGetControllerId() throws RegistryException {
+    public void testGetOnosInstanceId() throws RegistryException {
         String controllerIdToRegister = "test";
 
         // try before controller is registered
-        String controllerId = registry.getControllerId();
-        assertNull(controllerId);
+        OnosInstanceId onosInstanceId = registry.getOnosInstanceId();
+        assertNull(onosInstanceId);
 
         // register
         registry.registerController(controllerIdToRegister);
 
-        // call getControllerId and verify
-        controllerId = registry.getControllerId();
-        assertNotNull(controllerId);
-        assertEquals(controllerIdToRegister, controllerId);
+        // call getOnosInstanceId and verify
+        onosInstanceId = registry.getOnosInstanceId();
+        assertNotNull(onosInstanceId);
+        assertEquals(controllerIdToRegister, onosInstanceId.toString());
     }
 
     /**
diff --git a/src/test/java/net/onrc/onos/core/registry/ZookeeperRegistryTest.java b/src/test/java/net/onrc/onos/core/registry/ZookeeperRegistryTest.java
index ca56736..5490162 100644
--- a/src/test/java/net/onrc/onos/core/registry/ZookeeperRegistryTest.java
+++ b/src/test/java/net/onrc/onos/core/registry/ZookeeperRegistryTest.java
@@ -9,6 +9,7 @@
 import net.floodlightcontroller.test.FloodlightTestCase;
 import net.onrc.onos.core.registry.StandaloneRegistryTest.LoggingCallback;
 import net.onrc.onos.core.registry.ZookeeperRegistry.SwitchLeaderListener;
+import net.onrc.onos.core.util.OnosInstanceId;
 
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.framework.CuratorFramework;
@@ -115,25 +116,26 @@
     }
 
     /**
-     * Test if {@link ZookeeperRegistry#getControllerId()} correctly returns registered ID.
+     * Test if {@link ZookeeperRegistry#getOnosInstanceId()} correctly returns
+     * registered ID.
      *
      * @throws Exception
      */
     @Test
-    public void testGetControllerId() throws Exception {
+    public void testGetOnosInstanceId() throws Exception {
         String controllerIdToRegister = "controller1";
 
         // try before controller is registered
-        String controllerId = registry.getControllerId();
-        assertNull(controllerId);
+        OnosInstanceId onosInstanceId = registry.getOnosInstanceId();
+        assertNull(onosInstanceId);
 
         // register
         registry.registerController(controllerIdToRegister);
 
-        // call getControllerId and verify
-        controllerId = registry.getControllerId();
-        assertNotNull(controllerId);
-        assertEquals(controllerIdToRegister, controllerId);
+        // call getOnosInstanceId and verify
+        onosInstanceId = registry.getOnosInstanceId();
+        assertNotNull(onosInstanceId);
+        assertEquals(controllerIdToRegister, onosInstanceId.toString());
     }
 
     /**
diff --git a/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java b/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
index 79dfc89..ae0a936 100644
--- a/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/topology/TopologyManagerTest.java
@@ -22,6 +22,7 @@
 import net.onrc.onos.core.metrics.OnosMetrics;
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.OnosInstanceId;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 import net.onrc.onos.core.util.TestUtils;
@@ -277,7 +278,8 @@
 
         // Generate a new Switch Mastership event
         Dpid dpid = new Dpid(100L);
-        String onosInstanceId = "ONOS-Test-Instance-ID";
+        OnosInstanceId onosInstanceId =
+            new OnosInstanceId("ONOS-Test-Instance-ID");
         Role role = Role.MASTER;
         MastershipEvent mastershipEvent =
             new MastershipEvent(dpid, onosInstanceId, role);
@@ -303,7 +305,8 @@
 
         // Generate a new Switch Mastership event
         Dpid dpid = new Dpid(100L);
-        String onosInstanceId = "ONOS-Test-Instance-ID";
+        OnosInstanceId onosInstanceId =
+            new OnosInstanceId("ONOS-Test-Instance-ID");
         Role role = Role.MASTER;
         MastershipEvent mastershipEvent =
             new MastershipEvent(dpid, onosInstanceId, role);
diff --git a/src/test/java/net/onrc/onos/core/util/OnosInstanceIdTest.java b/src/test/java/net/onrc/onos/core/util/OnosInstanceIdTest.java
new file mode 100644
index 0000000..bec3cd8
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/util/OnosInstanceIdTest.java
@@ -0,0 +1,79 @@
+package net.onrc.onos.core.util;
+
+import org.junit.Test;
+
+import static net.onrc.onos.core.util.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Tests for class {@link OnosInstanceId}.
+ */
+public class OnosInstanceIdTest {
+    /**
+     * Tests the immutability of {@link OnosInstanceId}.
+     */
+    @Test
+    public void testImmutable() {
+        assertThatClassIsImmutable(OnosInstanceId.class);
+    }
+
+    /**
+     * Tests valid class constructor for a string.
+     */
+    @Test
+    public void testConstructorForString() {
+        OnosInstanceId id = new OnosInstanceId("ONOS-ID");
+        assertEquals(id.toString(), "ONOS-ID");
+    }
+
+    /**
+     * Tests invalid class constructor for a null string.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testInvalidConstructorNullString() {
+        OnosInstanceId id = new OnosInstanceId(null);
+    }
+
+    /**
+     * Tests invalid class constructor for an empty string.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testInvalidConstructors() {
+        // Check constructor for invalid ID: empty string
+        OnosInstanceId id = new OnosInstanceId("");
+    }
+
+    /**
+     * Tests equality of {@link OnosInstanceId}.
+     */
+    @Test
+    public void testEquality() {
+        OnosInstanceId id1 = new OnosInstanceId("ONOS-ID");
+        OnosInstanceId id2 = new OnosInstanceId("ONOS-ID");
+
+        assertThat(id1, is(id2));
+    }
+
+    /**
+     * Tests non-equality of {@link OnosInstanceId}.
+     */
+    @Test
+    public void testNonEquality() {
+        OnosInstanceId id1 = new OnosInstanceId("ONOS-ID1");
+        OnosInstanceId id2 = new OnosInstanceId("ONOS-ID2");
+
+        assertThat(id1, is(not(id2)));
+    }
+
+    /**
+     * Tests object string representation.
+     */
+    @Test
+    public void testToString() {
+        OnosInstanceId id = new OnosInstanceId("ONOS-ID");
+        assertEquals("ONOS-ID", id.toString());
+    }
+}
