diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
index 7dbbbeb..b99f33f 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/RouteHandler.java
@@ -33,6 +33,7 @@
 import org.slf4j.LoggerFactory;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Collection;
 import java.util.Objects;
@@ -235,91 +236,81 @@
         VlanId hostVlanId = event.subject().vlan();
         // map of nextId for prev port in each device
         Map<DeviceId, Integer> nextIdMap = new HashMap<>();
+        Set<HostLocation> prevLocations = event.prevSubject().locations();
+        Set<HostLocation> newLocations = event.subject().locations();
+        Set<ConnectPoint> connectPoints = newLocations.stream().map(l -> (ConnectPoint) l).collect(Collectors.toSet());
+        List<Set<IpPrefix>> batchedSubnets =
+                srManager.deviceConfiguration.getBatchedSubnets(event.subject().id());
 
-        affectedRoutes(hostMac, hostVlanId).forEach(affectedRoute -> {
-            IpPrefix prefix = affectedRoute.prefix();
-            Set<HostLocation> prevLocations = event.prevSubject().locations();
-            Set<HostLocation> newLocations = event.subject().locations();
+        batchedSubnets.forEach(subnets -> {
+            log.debug("HostMoved. populateSubnet {}, {}", newLocations, subnets);
+            srManager.defaultRoutingHandler.populateSubnet(connectPoints, subnets);
 
-            Set<ConnectPoint> connectPoints = newLocations.stream()
-                    .map(l -> (ConnectPoint) l).collect(Collectors.toSet());
-            log.debug("HostMoved. populateSubnet {}, {}", newLocations, prefix);
-            srManager.defaultRoutingHandler.populateSubnet(connectPoints, Sets.newHashSet(prefix));
+            subnets.forEach(prefix -> {
+                Set<DeviceId> newDeviceIds = newLocations.stream().map(HostLocation::deviceId)
+                        .collect(Collectors.toSet());
 
-            Set<DeviceId> newDeviceIds = newLocations.stream().map(HostLocation::deviceId)
-                    .collect(Collectors.toSet());
+                // Set of deviceIDs of the previous locations where the host was connected
+                // Used to determine if host moved to different connect points
+                // on same device or moved to a different device altogether
+                Set<DeviceId> oldDeviceIds = prevLocations.stream().map(HostLocation::deviceId)
+                        .collect(Collectors.toSet());
 
-            // Set of deviceIDs of the previous locations where the host was connected
-            // Used to determine if host moved to different connect points
-            // on same device or moved to a different device altogether
-            Set<DeviceId> oldDeviceIds = prevLocations.stream().map(HostLocation::deviceId)
-                    .collect(Collectors.toSet());
+                // For each old location
+                Sets.difference(prevLocations, newLocations).forEach(prevLocation -> {
+                    //find next Id for each old port, add to map
+                    int nextId = srManager.getNextIdForHostPort(prevLocation.deviceId(), hostMac,
+                                                                 hostVlanId, prevLocation.port());
+                    log.debug("HostMoved. NextId For Host {}, {}, {}, {} {}", prevLocation, prefix,
+                                                                 hostMac, hostVlanId, nextId);
 
-            // For each old location
-            Sets.difference(prevLocations, newLocations).forEach(prevLocation -> {
-                //find next Id for each old port, add to map
-                int nextId = srManager.getNextIdForHostPort(prevLocation.deviceId(), hostMac,
-                                                             hostVlanId, prevLocation.port());
-                log.debug("HostMoved. NextId For Host {}, {}, {}, {} {}", prevLocation, prefix,
-                                                             hostMac, hostVlanId, nextId);
+                    nextIdMap.put(prevLocation.deviceId(), nextId);
 
-                nextIdMap.put(prevLocation.deviceId(), nextId);
+                    // Remove flows for unchanged IPs only when the host moves from a switch to another.
+                    // Otherwise, do not remove and let the adding part update the old flow
+                    if (newDeviceIds.contains(prevLocation.deviceId())) {
+                        return;
+                    }
 
-                // Remove flows for unchanged IPs only when the host moves from a switch to another.
-                // Otherwise, do not remove and let the adding part update the old flow
-                if (newDeviceIds.contains(prevLocation.deviceId())) {
-                    return;
-                }
+                    log.debug("HostMoved. removeSubnet {}, {}", prevLocation, prefix);
+                    srManager.deviceConfiguration.removeSubnet(prevLocation, prefix);
 
-                log.debug("HostMoved. removeSubnet {}, {}", prevLocation, prefix);
-                srManager.deviceConfiguration.removeSubnet(prevLocation, prefix);
+                    // Do not remove flow from a device if the route is still reachable via its pair device.
+                    // populateSubnet will update the flow to point to its pair device via spine.
+                    DeviceId pairDeviceId = srManager.getPairDeviceId(prevLocation.deviceId()).orElse(null);
+                    if (newLocations.stream().anyMatch(n -> n.deviceId().equals(pairDeviceId))) {
+                        return;
+                    }
 
-                // Do not remove flow from a device if the route is still reachable via its pair device.
-                // populateSubnet will update the flow to point to its pair device via spine.
-                DeviceId pairDeviceId = srManager.getPairDeviceId(prevLocation.deviceId()).orElse(null);
-                if (newLocations.stream().anyMatch(n -> n.deviceId().equals(pairDeviceId))) {
-                    return;
-                }
+                    log.debug("HostMoved. revokeRoute {}, {}, {}, {}", prevLocation, prefix, hostMac, hostVlanId);
+                    srManager.defaultRoutingHandler.revokeRoute(prevLocation.deviceId(), prefix,
+                            hostMac, hostVlanId, prevLocation.port(), false);
+                });
 
-                log.debug("HostMoved. revokeRoute {}, {}, {}, {}", prevLocation, prefix, hostMac, hostVlanId);
-                srManager.defaultRoutingHandler.revokeRoute(prevLocation.deviceId(), prefix,
-                        hostMac, hostVlanId, prevLocation.port(), false);
+                // For each new location, add all new IPs.
+                Sets.difference(newLocations, prevLocations).forEach(newLocation -> {
+                    log.debug("HostMoved. addSubnet {}, {}", newLocation, prefix);
+                    srManager.deviceConfiguration.addSubnet(newLocation, prefix);
+
+                    //its a new connect point, not a move from an existing device, populateRoute
+                    if (!oldDeviceIds.contains(newLocation.deviceId())) {
+                       log.debug("HostMoved. populateRoute {}, {}, {}, {}", newLocation, prefix, hostMac, hostVlanId);
+                       srManager.defaultRoutingHandler.populateRoute(newLocation.deviceId(), prefix,
+                              hostMac, hostVlanId, newLocation.port(), false);
+                    } else {
+                      // update same flow to point to new nextObj
+                      VlanId vlanId = Optional.ofNullable(srManager.getInternalVlanId(newLocation)).orElse(hostVlanId);
+                      //use nextIdMap to send new port details to update the nextId group bucket
+                      log.debug("HostMoved. update L3 Ucast Group Bucket {}, {}, {} --> {}",
+                                             newLocation, hostMac, vlanId, nextIdMap.get(newLocation.deviceId()));
+                      srManager.updateMacVlanTreatment(newLocation.deviceId(), hostMac, vlanId,
+                              newLocation.port(), nextIdMap.get(newLocation.deviceId()));
+                    }
+                });
             });
-
-            // For each new location, add all new IPs.
-            Sets.difference(newLocations, prevLocations).forEach(newLocation -> {
-                log.debug("HostMoved. addSubnet {}, {}", newLocation, prefix);
-                srManager.deviceConfiguration.addSubnet(newLocation, prefix);
-
-                //its a new connect point, not a move from an existing device, populateRoute
-                if (!oldDeviceIds.contains(newLocation.deviceId())) {
-                   log.debug("HostMoved. populateRoute {}, {}, {}, {}", newLocation, prefix, hostMac, hostVlanId);
-                   srManager.defaultRoutingHandler.populateRoute(newLocation.deviceId(), prefix,
-                          hostMac, hostVlanId, newLocation.port(), false);
-                } else {
-                  // update same flow to point to new nextObj
-                  VlanId vlanId = Optional.ofNullable(srManager.getInternalVlanId(newLocation)).orElse(hostVlanId);
-                  //use nextIdMap to send new port details to update the nextId group bucket
-                  log.debug("HostMoved. update L3 Ucast Group Bucket {}, {}, {} --> {}",
-                                         newLocation, hostMac, vlanId, nextIdMap.get(newLocation.deviceId()));
-                  srManager.updateMacVlanTreatment(newLocation.deviceId(), hostMac, vlanId,
-                          newLocation.port(), nextIdMap.get(newLocation.deviceId()));
-                }
-            });
-
         });
     }
 
-    private Set<ResolvedRoute> affectedRoutes(MacAddress mac, VlanId vlanId) {
-        return srManager.routeService.getRouteTables().stream()
-                .map(routeTableId -> srManager.routeService.getRoutes(routeTableId))
-                .flatMap(Collection::stream)
-                .map(RouteInfo::allRoutes)
-                .flatMap(Collection::stream)
-                .filter(resolvedRoute -> mac.equals(resolvedRoute.nextHopMac()) &&
-                        vlanId.equals(resolvedRoute.nextHopVlan())).collect(Collectors.toSet());
-    }
-
     private boolean isReady() {
         return Objects.nonNull(srManager.deviceConfiguration) &&
                 Objects.nonNull(srManager.defaultRoutingHandler);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
index f2a971b..81a161f 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/config/DeviceConfiguration.java
@@ -32,6 +32,7 @@
 import org.onlab.packet.VlanId;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.HostId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.config.ConfigException;
 import org.onosproject.net.config.basics.InterfaceConfig;
@@ -53,6 +54,7 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -512,6 +514,40 @@
     }
 
     /**
+     * Returns batches of all subnets reachable via given next hop
+     * <p>
+     * First batch includes FPM and STATIC routes
+     * Second batch includes all other type of routes obtained from routeService, including DHCP routes.
+     *
+     * @param hostId next hop host id
+     * @return list of subnet batches, each batch includes a set of prefixes.
+     */
+    // TODO Querying routeService directly may be expensive. Some kind of reverse lookup cache should be developed.
+    public List<Set<IpPrefix>> getBatchedSubnets(HostId hostId) {
+        Set<IpPrefix> high = Sets.newHashSet();
+        Set<IpPrefix> low = Sets.newHashSet();
+
+        srManager.routeService.getRouteTables().stream()
+                .map(tableId -> srManager.routeService.getResolvedRoutes(tableId))
+                .flatMap(Collection::stream)
+                .forEach(resolvedRoute -> {
+                    // Continue if next hop is not what we are looking for
+                    if (!Objects.equals(hostId.mac(), resolvedRoute.nextHopMac()) ||
+                            !Objects.equals(hostId.vlanId(), resolvedRoute.nextHopVlan())) {
+                        return;
+                    }
+                    // Prioritize STATIC and FPM among others
+                    if (resolvedRoute.route().source() == Route.Source.STATIC ||
+                            resolvedRoute.route().source() == Route.Source.FPM) {
+                        high.add(resolvedRoute.prefix());
+                    } else {
+                        low.add(resolvedRoute.prefix());
+                    }
+                });
+        return Stream.of(high, low).filter(set -> !set.isEmpty()).collect(Collectors.toList());
+    }
+
+    /**
      * Returns batches of all subnets reachable on the given device.
      * <p>
      * First batch includes configured subnets, FPM and STATIC routes
diff --git a/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java b/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
index ade5d0c..2d365a2 100644
--- a/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
+++ b/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/RouteHandlerTest.java
@@ -18,6 +18,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.junit.Before;
@@ -407,6 +408,8 @@
         ROUTE_STORE.put(P1, Sets.newHashSet(RR3));
 
         reset(srManager.deviceConfiguration);
+        expect(srManager.deviceConfiguration.getBatchedSubnets(H3D.id()))
+                .andReturn(Lists.<Set<IpPrefix>>newArrayList(Sets.newHashSet(P1)));
         srManager.deviceConfiguration.removeSubnet(CP2, P1);
         expectLastCall().once();
         replay(srManager.deviceConfiguration);
@@ -455,6 +458,8 @@
         testDualHomedSingleLocationFail();
 
         reset(srManager.deviceConfiguration);
+        expect(srManager.deviceConfiguration.getBatchedSubnets(H3S.id()))
+                .andReturn(Lists.<Set<IpPrefix>>newArrayList(Sets.newHashSet(P1)));
         srManager.deviceConfiguration.addSubnet(CP2, P1);
         expectLastCall().once();
         replay(srManager.deviceConfiguration);
