diff --git a/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedClusterStore.java b/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedClusterStore.java
index fb0626c..e6163a9 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedClusterStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedClusterStore.java
@@ -18,6 +18,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
+
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -234,7 +235,7 @@
                     .filter(node -> !(node.id().equals(localNode.id())))
                     .collect(Collectors.toSet());
             State state = nodeStates.get(localNode.id());
-            byte[] hbMessagePayload = SERIALIZER.encode(new HeartbeatMessage(localNode, state, peers));
+            byte[] hbMessagePayload = SERIALIZER.encode(new HeartbeatMessage(localNode, state));
             peers.forEach((node) -> {
                 heartbeatToPeer(hbMessagePayload, node);
                 State currentState = nodeStates.get(node.id());
@@ -277,32 +278,25 @@
         @Override
         public void accept(Endpoint sender, byte[] message) {
             HeartbeatMessage hb = SERIALIZER.decode(message);
-            failureDetector.report(hb.source().id());
-            updateState(hb.source().id(), hb.state);
-            hb.knownPeers().forEach(node -> {
-                allNodes.put(node.id(), node);
-            });
+            if (clusterMetadataService.getClusterMetadata().getNodes().contains(hb.source())) {
+                failureDetector.report(hb.source().id());
+                updateState(hb.source().id(), hb.state);
+            }
         }
     }
 
     private static class HeartbeatMessage {
         private ControllerNode source;
         private State state;
-        private Set<ControllerNode> knownPeers;
 
-        public HeartbeatMessage(ControllerNode source, State state, Set<ControllerNode> members) {
+        public HeartbeatMessage(ControllerNode source, State state) {
             this.source = source;
             this.state = state != null ? state : State.ACTIVE;
-            this.knownPeers = ImmutableSet.copyOf(members);
         }
 
         public ControllerNode source() {
             return source;
         }
-
-        public Set<ControllerNode> knownPeers() {
-            return knownPeers;
-        }
     }
 
     @Override
@@ -371,7 +365,6 @@
 
     /**
      * Restarts heartbeatSender executor.
-     *
      */
     private void restartHeartbeatSender() {
         try {
@@ -385,23 +378,4 @@
             log.warn(e.getMessage());
         }
     }
-
-    /**
-     * Gets current heartbeat interval.
-     *
-     * @return heartbeatInterval
-     */
-    private int getHeartbeatInterval() {
-        return heartbeatInterval;
-    }
-
-    /**
-     * Gets current Phi failure threshold for Accrual Failure Detector.
-     *
-     * @return phiFailureThreshold
-     */
-    private int getPhiFailureThreshold() {
-        return phiFailureThreshold;
-    }
-
 }
\ No newline at end of file
