diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectNextListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectNextListCommand.java
index f7a6b51..18b2033 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectNextListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectNextListCommand.java
@@ -18,7 +18,6 @@
 
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.flowobjective.NextObjective;
 import org.onosproject.segmentrouting.xconnect.api.XconnectKey;
 import org.onosproject.segmentrouting.xconnect.api.XconnectService;
 
@@ -39,7 +38,7 @@
         print(xconnectService.getNext());
     }
 
-    private void print(Map<XconnectKey, NextObjective> nextStore) {
+    private void print(Map<XconnectKey, Integer> nextStore) {
         ArrayList<XconnectKey> a = new ArrayList<>(nextStore.keySet());
         a.sort(Comparator
                 .comparing((XconnectKey o) -> o.deviceId().toString())
@@ -50,7 +49,7 @@
             builder.append("\n")
                     .append(k)
                     .append(" --> ")
-                    .append(nextStore.get(k).id())
+                    .append(nextStore.get(k))
         );
         print(builder.toString());
     }
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectService.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectService.java
index dfdc422..25f1b01 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectService.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectService.java
@@ -21,7 +21,6 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
-import org.onosproject.net.flowobjective.NextObjective;
 
 import java.util.Set;
 
@@ -78,7 +77,7 @@
      *
      * @return current contents of the xconnectNextObjStore
      */
-    ImmutableMap<XconnectKey, NextObjective> getNext();
+    ImmutableMap<XconnectKey, Integer> getNext();
 
     /**
      * Removes given next ID from Xconnect next objective store.
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
index e571811..a7eb664 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
@@ -114,7 +114,7 @@
 
     private ApplicationId appId;
     private ConsistentMap<XconnectKey, Set<PortNumber>> xconnectStore;
-    private ConsistentMap<XconnectKey, NextObjective> xconnectNextObjStore;
+    private ConsistentMap<XconnectKey, Integer> xconnectNextObjStore;
 
     private final MapEventListener<XconnectKey, Set<PortNumber>> xconnectListener = new XconnectMapListener();
     private final DeviceListener deviceListener = new InternalDeviceListener();
@@ -138,7 +138,7 @@
                 .build();
         xconnectStore.addListener(xconnectListener);
 
-        xconnectNextObjStore = storageService.<XconnectKey, NextObjective>consistentMapBuilder()
+        xconnectNextObjStore = storageService.<XconnectKey, Integer>consistentMapBuilder()
                 .withName("onos-sr-xconnect-next")
                 .withRelaxedReadConsistency()
                 .withSerializer(Serializer.using(serializer.build()))
@@ -194,7 +194,7 @@
     }
 
     @Override
-    public ImmutableMap<XconnectKey, NextObjective> getNext() {
+    public ImmutableMap<XconnectKey, Integer> getNext() {
         if (xconnectNextObjStore != null) {
             return ImmutableMap.copyOf(xconnectNextObjStore.asJavaMap());
         } else {
@@ -205,7 +205,7 @@
     @Override
     public void removeNextId(int nextId) {
         xconnectNextObjStore.entrySet().forEach(e -> {
-            if (e.getValue().value().id() == nextId) {
+            if (e.getValue().value() == nextId) {
                 xconnectNextObjStore.remove(e.getKey());
             }
         });
@@ -260,13 +260,13 @@
         }
     }
 
-    void init(DeviceId deviceId) {
+    private void init(DeviceId deviceId) {
         getXconnects().stream()
                 .filter(desc -> desc.key().deviceId().equals(deviceId))
                 .forEach(desc -> populateXConnect(desc.key(), desc.ports()));
     }
 
-    void cleanup(DeviceId deviceId) {
+    private void cleanup(DeviceId deviceId) {
         xconnectNextObjStore.entrySet().stream()
                 .filter(entry -> entry.getKey().deviceId().equals(deviceId))
                 .forEach(entry -> xconnectNextObjStore.remove(entry.getKey()));
@@ -316,11 +316,11 @@
      * @param key XConnect store key
      * @param ports XConnect ports
      */
-    private NextObjective populateNext(XconnectKey key, Set<PortNumber> ports) {
-        NextObjective nextObj;
+    private int populateNext(XconnectKey key, Set<PortNumber> ports) {
         if (xconnectNextObjStore.containsKey(key)) {
-            nextObj = xconnectNextObjStore.get(key).value();
-            log.debug("NextObj for {} found, id={}", key, nextObj.id());
+            int nextId = xconnectNextObjStore.get(key).value();
+            log.debug("NextObj for {} found, id={}", key, nextId);
+            return nextId;
         } else {
             NextObjective.Builder nextObjBuilder = nextObjBuilder(key, ports);
             ObjectiveContext nextContext = new DefaultObjectiveContext(
@@ -331,22 +331,22 @@
                         log.warn("Failed to add XConnect NextObj for {}: {}", key, error);
                         srService.invalidateNextObj(objective.id());
                     });
-            nextObj = nextObjBuilder.add(nextContext);
+            NextObjective nextObj = nextObjBuilder.add(nextContext);
             flowObjectiveService.next(key.deviceId(), nextObj);
-            xconnectNextObjStore.put(key, nextObj);
+            xconnectNextObjStore.put(key, nextObj.id());
             log.debug("NextObj for {} not found. Creating new NextObj with id={}", key, nextObj.id());
+            return nextObj.id();
         }
-        return nextObj;
     }
 
     /**
      * Populates bridging forwarding objectives for given XConnect.
      *
      * @param key XConnect store key
-     * @param nextObj next objective
+     * @param nextId next objective id
      */
-    private void populateFwd(XconnectKey key, NextObjective nextObj) {
-        ForwardingObjective.Builder fwdObjBuilder = fwdObjBuilder(key, nextObj.id());
+    private void populateFwd(XconnectKey key, int nextId) {
+        ForwardingObjective.Builder fwdObjBuilder = fwdObjBuilder(key, nextId);
         ObjectiveContext fwdContext = new DefaultObjectiveContext(
                 (objective) -> log.debug("XConnect FwdObj for {} populated", key),
                 (objective, error) ->
@@ -383,9 +383,9 @@
         ports = addPairPort(key.deviceId(), ports);
         revokeFilter(key, ports);
         if (xconnectNextObjStore.containsKey(key)) {
-            NextObjective nextObj = xconnectNextObjStore.get(key).value();
-            revokeFwd(key, nextObj, null);
-            revokeNext(key, nextObj, null);
+            int nextId = xconnectNextObjStore.get(key).value();
+            revokeFwd(key, nextId, null);
+            revokeNext(key, ports, nextId, null);
         } else {
             log.warn("NextObj for {} does not exist in the store.", key);
         }
@@ -415,10 +415,11 @@
      * Revokes next objectives for given XConnect.
      *
      * @param key XConnect store key
-     * @param nextObj next objective
+     * @param ports ports in the XConnect
+     * @param nextId next objective id
      * @param nextFuture completable future for this next objective operation
      */
-    private void revokeNext(XconnectKey key, NextObjective nextObj,
+    private void revokeNext(XconnectKey key, Set<PortNumber> ports, int nextId,
                             CompletableFuture<ObjectiveError> nextFuture) {
         ObjectiveContext context = new ObjectiveContext() {
             @Override
@@ -438,7 +439,7 @@
                 srService.invalidateNextObj(objective.id());
             }
         };
-        flowObjectiveService.next(key.deviceId(), nextObj.copy().remove(context));
+        flowObjectiveService.next(key.deviceId(), nextObjBuilder(key, ports, nextId).remove(context));
         xconnectNextObjStore.remove(key);
     }
 
@@ -446,12 +447,11 @@
      * Revokes bridging forwarding objectives for given XConnect.
      *
      * @param key XConnect store key
-     * @param nextObj next objective
+     * @param nextId next objective id
      * @param fwdFuture completable future for this forwarding objective operation
      */
-    private void revokeFwd(XconnectKey key, NextObjective nextObj,
-                           CompletableFuture<ObjectiveError> fwdFuture) {
-        ForwardingObjective.Builder fwdObjBuilder = fwdObjBuilder(key, nextObj.id());
+    private void revokeFwd(XconnectKey key, int nextId, CompletableFuture<ObjectiveError> fwdFuture) {
+        ForwardingObjective.Builder fwdObjBuilder = fwdObjBuilder(key, nextId);
         ObjectiveContext context = new ObjectiveContext() {
             @Override
             public void onSuccess(Objective objective) {
@@ -509,13 +509,13 @@
         CompletableFuture<ObjectiveError> nextFuture = new CompletableFuture<>();
 
         if (xconnectNextObjStore.containsKey(key)) {
-            NextObjective nextObj = xconnectNextObjStore.get(key).value();
-            revokeFwd(key, nextObj, fwdFuture);
+            int nextId = xconnectNextObjStore.get(key).value();
+            revokeFwd(key, nextId, fwdFuture);
 
             fwdFuture.thenAcceptAsync(fwdStatus -> {
                 if (fwdStatus == null) {
                     log.debug("Fwd removed. Now remove group {}", key);
-                    revokeNext(key, nextObj, nextFuture);
+                    revokeNext(key, prevPorts, nextId, nextFuture);
                 }
             });
 
@@ -531,14 +531,14 @@
     }
 
     /**
-     * Creates a next objective builder for XConnect.
+     * Creates a next objective builder for XConnect with given nextId.
      *
      * @param key XConnect key
      * @param ports set of XConnect ports
+     * @param nextId next objective id
      * @return next objective builder
      */
-    private NextObjective.Builder nextObjBuilder(XconnectKey key, Set<PortNumber> ports) {
-        int nextId = flowObjectiveService.allocateNextId();
+    private NextObjective.Builder nextObjBuilder(XconnectKey key, Set<PortNumber> ports, int nextId) {
         TrafficSelector metadata =
                 DefaultTrafficSelector.builder().matchVlanId(key.vlanId()).build();
         NextObjective.Builder nextObjBuilder = DefaultNextObjective
@@ -554,6 +554,19 @@
     }
 
     /**
+     * Creates a next objective builder for XConnect.
+     *
+     * @param key XConnect key
+     * @param ports set of XConnect ports
+     * @return next objective builder
+     */
+    private NextObjective.Builder nextObjBuilder(XconnectKey key, Set<PortNumber> ports) {
+        int nextId = flowObjectiveService.allocateNextId();
+        return nextObjBuilder(key, ports, nextId);
+    }
+
+
+    /**
      * Creates a bridging forwarding objective builder for XConnect.
      *
      * @param key XConnect key
