diff --git a/core/api/src/main/java/org/onosproject/cluster/LeadershipService.java b/core/api/src/main/java/org/onosproject/cluster/LeadershipService.java
index 95fe723..560b7b6 100644
--- a/core/api/src/main/java/org/onosproject/cluster/LeadershipService.java
+++ b/core/api/src/main/java/org/onosproject/cluster/LeadershipService.java
@@ -89,14 +89,18 @@
      * Returns the current leader board.
      *
      * @return mapping from topic to leadership info.
+     * @deprecated 1.6.0 Goldeneye release. Replace usages with {@link #getLeadership(String)}
      */
+    @Deprecated
     Map<String, Leadership> getLeaderBoard();
 
     /**
      * Returns the candidate nodes for each topic.
      *
      * @return A mapping from topics to corresponding list of candidates.
+     * @deprecated 1.6.0 Goldeneye release. Replace usages with {@link #getLeadership(String)}
      */
+    @Deprecated
     default Map<String, List<NodeId>> getCandidates() {
         return ImmutableMap.copyOf(Maps.transformValues(getLeaderBoard(), v -> ImmutableList.copyOf(v.candidates())));
     }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentPartitionManager.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentPartitionManager.java
index 1db6534..0ac9647 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentPartitionManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentPartitionManager.java
@@ -43,6 +43,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * Manages the assignment of intent keyspace partitions to instances.
@@ -135,7 +136,8 @@
 
     @Override
     public boolean isMine(Key intentKey) {
-        return Objects.equals(leadershipService.getLeader(getPartitionPath(getPartitionForKey(intentKey))),
+        return Objects.equals(leadershipService.getLeadership(getPartitionPath(getPartitionForKey(intentKey)))
+                                               .leaderNodeId(),
                               localNodeId);
     }
 
@@ -177,24 +179,20 @@
 
         int myShare = (int) Math.ceil((double) NUM_PARTITIONS / activeNodes);
 
-        List<Leadership> myPartitions = leadershipService.getLeaderBoard().values()
-                .stream()
-                .filter(l -> localNodeId.equals(l.leaderNodeId()))
-                .filter(l -> l.topic().startsWith(ELECTION_PREFIX))
-                .collect(Collectors.toList());
+        List<String> myPartitions = IntStream.range(0, NUM_PARTITIONS)
+                                             .mapToObj(this::getPartitionPath)
+                                             .map(leadershipService::getLeadership)
+                                             .filter(Objects::nonNull)
+                                             .filter(leadership -> localNodeId.equals(leadership.leaderNodeId()))
+                                             .map(Leadership::topic)
+                                             .collect(Collectors.toList());
 
         int relinquish = myPartitions.size() - myShare;
 
-        if (relinquish <= 0) {
-            return;
-        }
-
         for (int i = 0; i < relinquish; i++) {
-            String topic = myPartitions.get(i).topic();
+            String topic = myPartitions.get(i);
             leadershipService.withdraw(topic);
-
-            executor.schedule(() -> recontest(topic),
-                              BACKOFF_TIME, TimeUnit.SECONDS);
+            executor.schedule(() -> recontest(topic), BACKOFF_TIME, TimeUnit.SECONDS);
         }
     }
 
diff --git a/core/store/dist/src/test/java/org/onosproject/store/intent/impl/IntentPartitionManagerTest.java b/core/store/dist/src/test/java/org/onosproject/store/intent/impl/IntentPartitionManagerTest.java
index 2ecd78d..89ee8d3 100644
--- a/core/store/dist/src/test/java/org/onosproject/store/intent/impl/IntentPartitionManagerTest.java
+++ b/core/store/dist/src/test/java/org/onosproject/store/intent/impl/IntentPartitionManagerTest.java
@@ -33,11 +33,11 @@
 import org.onosproject.net.intent.Key;
 
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Map;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+
 import static junit.framework.TestCase.assertFalse;
 import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.anyString;
@@ -100,29 +100,22 @@
      * @param numMine number of partitions that should be owned by the local node
      */
     private void setUpLeadershipService(int numMine) {
-
-        Map<String, Leadership> leaderBoard = new HashMap<>();
-
+        List<NodeId> allNodes = Arrays.asList(MY_NODE_ID, OTHER_NODE_ID);
         for (int i = 0; i < numMine; i++) {
-            expect(leadershipService.getLeader(ELECTION_PREFIX + i))
-                    .andReturn(MY_NODE_ID).anyTimes();
-            leaderBoard.put(ELECTION_PREFIX + i,
-                            new Leadership(ELECTION_PREFIX + i,
-                                    new Leader(MY_NODE_ID, 0, 0),
-                                    Arrays.asList(MY_NODE_ID)));
+            expect(leadershipService.getLeadership(ELECTION_PREFIX + i))
+                                    .andReturn(new Leadership(ELECTION_PREFIX + i,
+                                                              new Leader(MY_NODE_ID, 1, 1000),
+                                                              allNodes))
+                                    .anyTimes();
         }
 
         for (int i = numMine; i < IntentPartitionManager.NUM_PARTITIONS; i++) {
-            expect(leadershipService.getLeader(ELECTION_PREFIX + i))
-                    .andReturn(OTHER_NODE_ID).anyTimes();
-
-            leaderBoard.put(ELECTION_PREFIX + i,
-                            new Leadership(ELECTION_PREFIX + i,
-                                    new Leader(OTHER_NODE_ID, 0, 0),
-                                    Arrays.asList(OTHER_NODE_ID)));
+            expect(leadershipService.getLeadership(ELECTION_PREFIX + i))
+                                    .andReturn(new Leadership(ELECTION_PREFIX + i,
+                                                              new Leader(OTHER_NODE_ID, 1, 1000),
+                                                              allNodes))
+                                    .anyTimes();
         }
-
-        expect(leadershipService.getLeaderBoard()).andReturn(leaderBoard).anyTimes();
     }
 
     /**
