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
