diff --git a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/SdnIp.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/SdnIp.java
index eddf7e4..4c81c15 100644
--- a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/SdnIp.java
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/SdnIp.java
@@ -167,7 +167,7 @@
             if (!event.subject().topic().equals(appId.name())) {
                 return;         // Not our topic: ignore
             }
-            if (!event.subject().leader().id().equals(
+            if (!event.subject().leader().equals(
                         localControllerNode.id())) {
                 return;         // The event is not about this instance: ignore
             }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/LeaderCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/LeaderCommand.java
index 7ea3ebb..ec99614 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/LeaderCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/LeaderCommand.java
@@ -37,7 +37,7 @@
         Map<String, Leadership> leaderBoard = leaderService.getLeaderBoard();
         print(FMT, "Topic", "Leader");
         for (String topic : leaderBoard.keySet()) {
-            print(FMT, topic, leaderBoard.get(topic).leader().id());
+            print(FMT, topic, leaderBoard.get(topic).leader());
         }
     }
 
diff --git a/core/api/src/main/java/org/onlab/onos/cluster/Leadership.java b/core/api/src/main/java/org/onlab/onos/cluster/Leadership.java
index cf247f5..6be7c9b 100644
--- a/core/api/src/main/java/org/onlab/onos/cluster/Leadership.java
+++ b/core/api/src/main/java/org/onlab/onos/cluster/Leadership.java
@@ -10,10 +10,10 @@
 public class Leadership {
 
     private final String topic;
-    private final ControllerNode leader;
+    private final NodeId leader;
     private final long epoch;
 
-    public Leadership(String topic, ControllerNode leader, long epoch) {
+    public Leadership(String topic, NodeId leader, long epoch) {
         this.topic = topic;
         this.leader = leader;
         this.epoch = epoch;
@@ -28,10 +28,10 @@
     }
 
     /**
-     * The leader for this topic.
+     * The nodeId of leader for this topic.
      * @return leader node.
      */
-    public ControllerNode leader() {
+    public NodeId leader() {
         return leader;
     }
 
diff --git a/core/api/src/main/java/org/onlab/onos/cluster/LeadershipService.java b/core/api/src/main/java/org/onlab/onos/cluster/LeadershipService.java
index bb89572..2709b7f 100644
--- a/core/api/src/main/java/org/onlab/onos/cluster/LeadershipService.java
+++ b/core/api/src/main/java/org/onlab/onos/cluster/LeadershipService.java
@@ -29,9 +29,9 @@
     /**
      * Gets the most recent leader for the topic.
      * @param path topic
-     * @return node who is the leader, null if so such topic exists.
+     * @return nodeId of the leader, null if so such topic exists.
      */
-    ControllerNode getLeader(String path);
+    NodeId getLeader(String path);
 
     /**
      * Joins the leadership contest.
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/HazelcastLeadershipService.java b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/HazelcastLeadershipService.java
index 928ebb1..801b0b3 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/HazelcastLeadershipService.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/HazelcastLeadershipService.java
@@ -31,7 +31,6 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.cluster.ClusterService;
-import org.onlab.onos.cluster.ControllerNode;
 import org.onlab.onos.cluster.Leadership;
 import org.onlab.onos.cluster.LeadershipEvent;
 import org.onlab.onos.cluster.LeadershipEventListener;
@@ -100,11 +99,11 @@
     private AbstractListenerRegistry<LeadershipEvent, LeadershipEventListener>
         listenerRegistry;
     private final Map<String, Topic> topics = Maps.newConcurrentMap();
-    private ControllerNode localNode;
+    private NodeId localNodeId;
 
     @Activate
     protected void activate() {
-        localNode = clusterService.getLocalNode();
+        localNodeId = clusterService.getLocalNode().id();
         listenerRegistry = new AbstractListenerRegistry<>();
         eventDispatcher.addSink(LeadershipEvent.class, listenerRegistry);
 
@@ -124,7 +123,7 @@
     }
 
     @Override
-    public ControllerNode getLeader(String path) {
+    public NodeId getLeader(String path) {
         Topic topic = topics.get(path);
         if (topic == null) {
             return null;
@@ -177,7 +176,7 @@
         private volatile long lastLeadershipUpdateMs = 0;
         private ExecutorService leaderElectionExecutor;
 
-        private ControllerNode leader;
+        private NodeId leader;
         private Lock leaderLock;
         private Future<?> getLockFuture;
         private Future<?> periodicProcessingFuture;
@@ -198,7 +197,7 @@
          *
          * @return the leader for the topic
          */
-        private ControllerNode leader() {
+        private NodeId leader() {
             return leader;
         }
 
@@ -254,7 +253,7 @@
         public void onMessage(Message<byte[]> message) {
             LeadershipEvent leadershipEvent =
                 SERIALIZER.decode(message.getMessageObject());
-            NodeId eventLeaderId = leadershipEvent.subject().leader().id();
+            NodeId eventLeaderId = leadershipEvent.subject().leader();
 
             log.debug("Leadership Event: time = {} type = {} event = {}",
                       leadershipEvent.time(), leadershipEvent.type(),
@@ -262,7 +261,7 @@
             if (!leadershipEvent.subject().topic().equals(topicName)) {
                 return;         // Not our topic: ignore
             }
-            if (eventLeaderId.equals(localNode.id())) {
+            if (eventLeaderId.equals(localNodeId)) {
                 return;         // My own message: ignore
             }
 
@@ -276,7 +275,7 @@
                     // leadership and run for re-election.
                     //
                     if ((leader != null) &&
-                        leader.id().equals(localNode.id())) {
+                        leader.equals(localNodeId)) {
                         getLockFuture.cancel(true);
                     } else {
                         // Just update the current leader
@@ -288,7 +287,7 @@
                 case LEADER_BOOTED:
                     // Remove the state for the current leader
                     if ((leader != null) &&
-                        eventLeaderId.equals(leader.id())) {
+                        eventLeaderId.equals(leader)) {
                         leader = null;
                     }
                     eventDispatcher.post(leadershipEvent);
@@ -312,13 +311,13 @@
                 synchronized (this) {
                     LeadershipEvent leadershipEvent;
                     if (leader != null) {
-                        if (leader.id().equals(localNode.id())) {
+                        if (leader.equals(localNodeId)) {
                             //
                             // Advertise ourselves as the leader
                             //
                             leadershipEvent = new LeadershipEvent(
                                 LeadershipEvent.Type.LEADER_REELECTED,
-                                new Leadership(topicName, localNode, 0));
+                                new Leadership(topicName, localNodeId, 0));
                             // Dispatch to all remote instances
                             leaderTopic.publish(SERIALIZER.encode(leadershipEvent));
                         } else {
@@ -379,10 +378,10 @@
                     // This instance is now the leader
                     //
                     log.info("Leader Elected for topic {}", topicName);
-                    leader = localNode;
+                    leader = localNodeId;
                     leadershipEvent = new LeadershipEvent(
                         LeadershipEvent.Type.LEADER_ELECTED,
-                        new Leadership(topicName, localNode, 0));
+                        new Leadership(topicName, localNodeId, 0));
                     eventDispatcher.post(leadershipEvent);
                     leaderTopic.publish(SERIALIZER.encode(leadershipEvent));
                 }
@@ -403,12 +402,12 @@
                     // If we reach here, we should release the leadership
                     log.debug("Leader Lock Released for topic {}", topicName);
                     if ((leader != null) &&
-                        leader.id().equals(localNode.id())) {
+                        leader.equals(localNodeId)) {
                         leader = null;
                     }
                     leadershipEvent = new LeadershipEvent(
                                 LeadershipEvent.Type.LEADER_BOOTED,
-                                new Leadership(topicName, localNode, 0));
+                                new Leadership(topicName, localNodeId, 0));
                     eventDispatcher.post(leadershipEvent);
                     leaderTopic.publish(SERIALIZER.encode(leadershipEvent));
                     leaderLock.unlock();
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/LeadershipManager.java b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/LeadershipManager.java
index e490c48..ee447fd 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/LeadershipManager.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/LeadershipManager.java
@@ -11,7 +11,6 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
-import com.google.common.collect.ImmutableMap;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -19,11 +18,11 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.cluster.ClusterService;
-import org.onlab.onos.cluster.ControllerNode;
 import org.onlab.onos.cluster.Leadership;
 import org.onlab.onos.cluster.LeadershipEvent;
 import org.onlab.onos.cluster.LeadershipEventListener;
 import org.onlab.onos.cluster.LeadershipService;
+import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService;
 import org.onlab.onos.store.cluster.messaging.ClusterMessage;
 import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler;
@@ -36,6 +35,7 @@
 import org.onlab.util.KryoNamespace;
 import org.slf4j.Logger;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
@@ -77,7 +77,7 @@
 
     private final Map<String, Lock> openContests = Maps.newConcurrentMap();
     private final Set<LeadershipEventListener> listeners = Sets.newIdentityHashSet();
-    private ControllerNode localNode;
+    private NodeId localNodeId;
 
     private final LeadershipEventListener peerAdvertiser = new PeerAdvertiser();
     private final LeadershipEventListener leaderBoardUpdater = new LeaderBoardUpdater();
@@ -94,7 +94,7 @@
 
     @Activate
     public void activate() {
-        localNode = clusterService.getLocalNode();
+        localNodeId = clusterService.getLocalNode().id();
 
         addListener(peerAdvertiser);
         addListener(leaderBoardUpdater);
@@ -120,7 +120,7 @@
 
 
     @Override
-    public ControllerNode getLeader(String path) {
+    public NodeId getLeader(String path) {
         synchronized (leaderBoard) {
             Leadership leadership = leaderBoard.get(path);
             if (leadership != null) {
@@ -155,7 +155,7 @@
             notifyListeners(
                     new LeadershipEvent(
                             LeadershipEvent.Type.LEADER_BOOTED,
-                            new Leadership(lock.path(), localNode, lock.epoch())));
+                            new Leadership(lock.path(), localNodeId, lock.epoch())));
         }
     }
 
@@ -201,7 +201,7 @@
                 notifyListeners(
                         new LeadershipEvent(
                                 LeadershipEvent.Type.LEADER_ELECTED,
-                                new Leadership(lock.path(), localNode, lock.epoch())));
+                                new Leadership(lock.path(), localNodeId, lock.epoch())));
                 return;
             } else {
                 log.warn("Failed to acquire lock for {}. Will retry in {} ms", path, WAIT_BEFORE_RETRY_MS, error);
@@ -236,7 +236,7 @@
                 notifyListeners(
                         new LeadershipEvent(
                                 LeadershipEvent.Type.LEADER_REELECTED,
-                                new Leadership(lock.path(), localNode, lock.epoch())));
+                                new Leadership(lock.path(), localNodeId, lock.epoch())));
                 threadPool.schedule(this, TERM_DURATION_MS / 2, TimeUnit.MILLISECONDS);
             } else {
                 // Check if this node already withdrew from the contest, in which case
@@ -245,7 +245,7 @@
                     notifyListeners(
                             new LeadershipEvent(
                                     LeadershipEvent.Type.LEADER_BOOTED,
-                                    new Leadership(lock.path(), localNode, lock.epoch())));
+                                    new Leadership(lock.path(), localNodeId, lock.epoch())));
                     // Retry leadership after a brief wait.
                     threadPool.schedule(new TryLeadership(lock), WAIT_BEFORE_RETRY_MS, TimeUnit.MILLISECONDS);
                 }
@@ -270,11 +270,11 @@
         @Override
         public void event(LeadershipEvent event) {
             // publish events originating on this host.
-            if (event.subject().leader().equals(localNode)) {
+            if (event.subject().leader().equals(localNodeId)) {
                 try {
                     clusterCommunicator.broadcast(
                             new ClusterMessage(
-                                    localNode.id(),
+                                    localNodeId,
                                     LEADERSHIP_UPDATES,
                                     SERIALIZER.encode(event)));
                 } catch (IOException e) {
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/HazelcastIntentBatchQueue.java b/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/HazelcastIntentBatchQueue.java
index 9d9b833..70bf95b 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/HazelcastIntentBatchQueue.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/HazelcastIntentBatchQueue.java
@@ -15,12 +15,12 @@
  */
 package org.onlab.onos.store.intent.impl;
 
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.hazelcast.core.HazelcastInstance;
-import com.hazelcast.core.IQueue;
-import com.hazelcast.core.ItemEvent;
-import com.hazelcast.core.ItemListener;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -29,10 +29,10 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.cluster.ClusterService;
-import org.onlab.onos.cluster.ControllerNode;
 import org.onlab.onos.cluster.LeadershipEvent;
 import org.onlab.onos.cluster.LeadershipEventListener;
 import org.onlab.onos.cluster.LeadershipService;
+import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.core.ApplicationId;
 import org.onlab.onos.core.CoreService;
 import org.onlab.onos.event.AbstractListenerRegistry;
@@ -50,12 +50,12 @@
 import org.onlab.util.KryoNamespace;
 import org.slf4j.Logger;
 
-import java.util.Map;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static org.slf4j.LoggerFactory.getLogger;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.hazelcast.core.HazelcastInstance;
+import com.hazelcast.core.IQueue;
+import com.hazelcast.core.ItemEvent;
+import com.hazelcast.core.ItemListener;
 
 @Component(immediate = true)
 @Service
@@ -82,7 +82,7 @@
 
 
     private HazelcastInstance theInstance;
-    private ControllerNode localControllerNode;
+    private NodeId localControllerNodeId;
     protected StoreSerializer serializer;
     private IntentBatchDelegate delegate;
     private InternalLeaderListener leaderListener = new InternalLeaderListener();
@@ -98,7 +98,7 @@
     @Activate
     public void activate() {
         theInstance = storeService.getHazelcastInstance();
-        localControllerNode = clusterService.getLocalNode();
+        localControllerNodeId = clusterService.getLocalNode().id();
         leadershipService.addListener(leaderListener);
 
         serializer = new KryoSerializer() {
@@ -254,7 +254,7 @@
             if (!topic.startsWith(TOPIC_BASE)) {
                 return;         // Not our topic: ignore
             }
-            if (!event.subject().leader().id().equals(localControllerNode.id())) {
+            if (!event.subject().leader().equals(localControllerNodeId)) {
                 // run for leadership
                 getQueue(getAppId(topic));
                 return;         // The event is not about this instance: ignore
diff --git a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleLeadershipManager.java b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleLeadershipManager.java
index cbebcda..b10ac60 100644
--- a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleLeadershipManager.java
+++ b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleLeadershipManager.java
@@ -10,12 +10,12 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.cluster.ClusterService;
-import org.onlab.onos.cluster.ControllerNode;
 import org.onlab.onos.cluster.Leadership;
 import org.onlab.onos.cluster.LeadershipEvent;
 import org.onlab.onos.cluster.LeadershipEvent.Type;
 import org.onlab.onos.cluster.LeadershipEventListener;
 import org.onlab.onos.cluster.LeadershipService;
+import org.onlab.onos.cluster.NodeId;
 
 /**
  * A trivial implementation of the leadership service.
@@ -35,8 +35,8 @@
     private Map<String, Boolean> elections = new ConcurrentHashMap<>();
 
     @Override
-    public ControllerNode getLeader(String path) {
-        return elections.get(path) ? clusterService.getLocalNode() : null;
+    public NodeId getLeader(String path) {
+        return elections.get(path) ? clusterService.getLocalNode().id() : null;
     }
 
     @Override
@@ -44,7 +44,7 @@
         elections.put(path, true);
         for (LeadershipEventListener listener : listeners) {
             listener.event(new LeadershipEvent(Type.LEADER_ELECTED,
-                    new Leadership(path, clusterService.getLocalNode(), 0)));
+                    new Leadership(path, clusterService.getLocalNode().id(), 0)));
         }
     }
 
@@ -53,7 +53,7 @@
         elections.remove(path);
         for (LeadershipEventListener listener : listeners) {
             listener.event(new LeadershipEvent(Type.LEADER_BOOTED,
-                    new Leadership(path, clusterService.getLocalNode(), 0)));
+                    new Leadership(path, clusterService.getLocalNode().id(), 0)));
         }
     }
 
