diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/RouteHandler.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
index c82b39b..214ba6b 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
@@ -22,9 +22,9 @@
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
 import org.onosproject.routeservice.ResolvedRoute;
 import org.onosproject.routeservice.RouteEvent;
-import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,22 +38,24 @@
     private static final Logger log = LoggerFactory.getLogger(RouteHandler.class);
     private final SegmentRoutingManager srManager;
 
-    public RouteHandler(SegmentRoutingManager srManager) {
+    RouteHandler(SegmentRoutingManager srManager) {
         this.srManager = srManager;
     }
 
     protected void init(DeviceId deviceId) {
-        srManager.routeService.getRouteTables().forEach(routeTableId -> {
-            srManager.routeService.getRoutes(routeTableId).forEach(routeInfo -> {
-                routeInfo.allRoutes().stream()
-                        .filter(resolvedRoute -> resolvedRoute.location() != null &&
-                                resolvedRoute.location().deviceId().equals(deviceId))
-                        .forEach(this::processRouteAddedInternal);
-            });
-        });
+        srManager.routeService.getRouteTables().forEach(routeTableId ->
+            srManager.routeService.getRoutes(routeTableId).forEach(routeInfo ->
+                routeInfo.allRoutes().forEach(resolvedRoute ->
+                    srManager.nextHopLocations(resolvedRoute).stream()
+                            .filter(location -> deviceId.equals(location.deviceId()))
+                            .forEach(location -> processRouteAddedInternal(resolvedRoute)
+                    )
+                )
+            )
+        );
     }
 
-    protected void processRouteAdded(RouteEvent event) {
+    void processRouteAdded(RouteEvent event) {
         log.info("processRouteAdded {}", event);
         processRouteAddedInternal(event.subject());
     }
@@ -67,7 +69,12 @@
         IpPrefix prefix = route.prefix();
         MacAddress nextHopMac = route.nextHopMac();
         VlanId nextHopVlan = route.nextHopVlan();
-        ConnectPoint location = route.location();
+        ConnectPoint location = srManager.nextHopLocations(route).stream().findFirst().orElse(null);
+
+        if (location == null) {
+            log.info("{} ignored. Cannot find nexthop location", prefix);
+            return;
+        }
 
         srManager.deviceConfiguration.addSubnet(location, prefix);
         // XXX need to handle the case where there are two connectpoints
@@ -77,13 +84,13 @@
                 nextHopMac, nextHopVlan, location.port());
     }
 
-    protected void processRouteUpdated(RouteEvent event) {
+    void processRouteUpdated(RouteEvent event) {
         log.info("processRouteUpdated {}", event);
         processRouteRemovedInternal(event.prevSubject());
         processRouteAddedInternal(event.subject());
     }
 
-    protected void processRouteRemoved(RouteEvent event) {
+    void processRouteRemoved(RouteEvent event) {
         log.info("processRouteRemoved {}", event);
         processRouteRemovedInternal(event.subject());
     }
@@ -97,7 +104,12 @@
         IpPrefix prefix = route.prefix();
         MacAddress nextHopMac = route.nextHopMac();
         VlanId nextHopVlan = route.nextHopVlan();
-        ConnectPoint location = route.location();
+        ConnectPoint location = srManager.nextHopLocations(route).stream().findFirst().orElse(null);
+
+        if (location == null) {
+            log.info("{} ignored. Cannot find nexthop location", prefix);
+            return;
+        }
 
         srManager.deviceConfiguration.removeSubnet(location, prefix);
         srManager.defaultRoutingHandler.revokeSubnet(ImmutableSet.of(prefix));
