diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java
index 23355e9..85834a7 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java
@@ -89,7 +89,7 @@
     private ScheduledExecutorService electionRunner;
     private ScheduledExecutorService lockExecutor;
     private ScheduledExecutorService staleLeadershipPurgeExecutor;
-    private ScheduledExecutorService leadershipRefresher;
+    private ScheduledExecutorService leadershipStatusBroadcaster;
 
     private ConsistentMap<String, NodeId> leaderMap;
     private ConsistentMap<String, List<NodeId>> candidateMap;
@@ -106,7 +106,7 @@
     // The actual delay is randomly chosen between the interval [0, WAIT_BEFORE_RETRY_MILLIS)
     private static final int WAIT_BEFORE_RETRY_MILLIS = 150;
     private static final int DELAY_BETWEEN_LEADER_LOCK_ATTEMPTS_SEC = 2;
-    private static final int LEADERSHIP_REFRESH_INTERVAL_SEC = 2;
+    private static final int LEADERSHIP_STATUS_UPDATE_INTERVAL_SEC = 2;
     private static final int DELAY_BETWEEN_STALE_LEADERSHIP_PURGE_ATTEMPTS_SEC = 2;
 
     private final AtomicBoolean staleLeadershipPurgeScheduled = new AtomicBoolean(false);
@@ -135,8 +135,8 @@
                 4, groupedThreads("onos/store/leadership", "election-thread-%d"));
         staleLeadershipPurgeExecutor = Executors.newSingleThreadScheduledExecutor(
                 groupedThreads("onos/store/leadership", "stale-leadership-evictor"));
-        leadershipRefresher = Executors.newSingleThreadScheduledExecutor(
-                groupedThreads("onos/store/leadership", "refresh-thread"));
+        leadershipStatusBroadcaster = Executors.newSingleThreadScheduledExecutor(
+                groupedThreads("onos/store/leadership", "peer-updater"));
         clusterCommunicator.addSubscriber(
                 LEADERSHIP_EVENT_MESSAGE_SUBJECT,
                 SERIALIZER::decode,
@@ -148,8 +148,8 @@
         electionRunner.scheduleWithFixedDelay(
                 this::electLeaders, 0, DELAY_BETWEEN_LEADER_LOCK_ATTEMPTS_SEC, TimeUnit.SECONDS);
 
-        leadershipRefresher.scheduleWithFixedDelay(
-                this::refreshLeaderBoard, 0, LEADERSHIP_REFRESH_INTERVAL_SEC, TimeUnit.SECONDS);
+        leadershipStatusBroadcaster.scheduleWithFixedDelay(
+                this::sendLeadershipStatus, 0, LEADERSHIP_STATUS_UPDATE_INTERVAL_SEC, TimeUnit.SECONDS);
 
         listenerRegistry = new ListenerRegistry<>();
         eventDispatcher.addSink(LeadershipEvent.class, listenerRegistry);
@@ -173,7 +173,7 @@
         messageHandlingExecutor.shutdown();
         lockExecutor.shutdown();
         staleLeadershipPurgeExecutor.shutdown();
-        leadershipRefresher.shutdown();
+        leadershipStatusBroadcaster.shutdown();
 
         log.info("Stopped");
     }
@@ -458,7 +458,6 @@
             leaderBoard.compute(topic, (k, currentLeadership) -> {
                 if (currentLeadership == null || currentLeadership.epoch() <= leadershipUpdate.epoch()) {
                     updateAccepted.set(true);
-                    // FIXME: Removing entries from leaderboard is not safe and should be visited.
                     return null;
                 }
                 return currentLeadership;
@@ -580,36 +579,18 @@
         }
     }
 
-    private void refreshLeaderBoard() {
+    private void sendLeadershipStatus() {
         try {
-            Map<String, Leadership> newLeaderBoard = Maps.newHashMap();
-            leaderMap.entrySet().forEach(entry -> {
-                String path = entry.getKey();
-                Versioned<NodeId> leader = entry.getValue();
-                Leadership leadership = new Leadership(path,
-                                                       leader.value(),
-                                                       leader.version(),
-                                                       leader.creationTime());
-                newLeaderBoard.put(path, leadership);
-            });
-
-            // first take snapshot of current leader board.
-            Map<String, Leadership> currentLeaderBoard = ImmutableMap.copyOf(leaderBoard);
-
-            // evict stale leaders
-            Maps.difference(currentLeaderBoard, newLeaderBoard).entriesOnlyOnLeft().forEach((path, leadership) -> {
-                log.debug("Evicting {} from leaderboard. It is no longer active leader.", leadership);
-                onLeadershipEvent(new LeadershipEvent(LeadershipEvent.Type.LEADER_BOOTED, leadership));
-            });
-
-            // add missing leaders
-            Maps.difference(currentLeaderBoard, newLeaderBoard).entriesDiffering().forEach((path, difference) -> {
-                Leadership leadership = difference.rightValue();
-                log.debug("Adding {} to leaderboard. It is now the active leader.", leadership);
-                onLeadershipEvent(new LeadershipEvent(LeadershipEvent.Type.LEADER_ELECTED, leadership));
+            leaderBoard.forEach((path, leadership) -> {
+                if (leadership.leader().equals(localNodeId)) {
+                    LeadershipEvent event = new LeadershipEvent(LeadershipEvent.Type.LEADER_ELECTED, leadership);
+                    clusterCommunicator.broadcast(event,
+                            LEADERSHIP_EVENT_MESSAGE_SUBJECT,
+                            SERIALIZER::encode);
+                }
             });
         } catch (Exception e) {
-            log.debug("Failed to refresh leader board", e);
+            log.debug("Failed to send leadership updates", e);
         }
     }
 
