diff --git a/apps/route-service/api/src/main/java/org/onosproject/routeservice/ResolvedRoute.java b/apps/route-service/api/src/main/java/org/onosproject/routeservice/ResolvedRoute.java
index 0d52c8b..855fac4 100644
--- a/apps/route-service/api/src/main/java/org/onosproject/routeservice/ResolvedRoute.java
+++ b/apps/route-service/api/src/main/java/org/onosproject/routeservice/ResolvedRoute.java
@@ -20,7 +20,6 @@
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
-import org.onosproject.net.ConnectPoint;
 
 import java.util.Objects;
 
@@ -35,39 +34,6 @@
     private final Route route;
     private final MacAddress nextHopMac;
     private final VlanId nextHopVlan;
-    private final ConnectPoint location;
-
-    /**
-     * Creates a new resolved route.
-     *
-     * @param route input route
-     * @param nextHopMac next hop MAC address
-     * @param location connect point where the next hop connects to
-     * @deprecated in 1.11 ("Loon")
-     */
-    @Deprecated
-    public ResolvedRoute(Route route, MacAddress nextHopMac, ConnectPoint location) {
-        this(route, nextHopMac, VlanId.NONE, location);
-    }
-
-    /**
-     * Creates a new resolved route.
-     *
-     * @param route input route
-     * @param nextHopMac next hop MAC address
-     * @param nextHopVlan next hop VLAN ID
-     * @param location connect point where the next hop connects to
-     * @deprecated in 1.11 ("Loon")
-     */
-    @Deprecated
-    public ResolvedRoute(Route route, MacAddress nextHopMac, VlanId nextHopVlan,
-                         ConnectPoint location) {
-        this.route = route;
-        this.nextHopMac = nextHopMac;
-        this.nextHopVlan = nextHopVlan;
-        this.location = location;
-    }
-
 
     /**
      * Creates a new resolved route.
@@ -90,7 +56,6 @@
         this.route = route;
         this.nextHopMac = nextHopMac;
         this.nextHopVlan = nextHopVlan;
-        this.location = null;
     }
 
     /**
@@ -138,17 +103,6 @@
         return nextHopVlan;
     }
 
-    /**
-     * Returns the next hop location.
-     *
-     * @return connect point where the next hop attaches to
-     * @deprecated in 1.11 ("Loon")
-     */
-    @Deprecated
-    public ConnectPoint location() {
-        return location;
-    }
-
     @Override
     public int hashCode() {
         return Objects.hash(route, nextHopMac, nextHopVlan);
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
index e3924a7..d45415b 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
@@ -205,7 +205,7 @@
     private ResolvedRoute tryResolve(Route route) {
         ResolvedRoute resolvedRoute = resolve(route);
         if (resolvedRoute == null) {
-            resolvedRoute = new ResolvedRoute(route, null, null, null);
+            resolvedRoute = new ResolvedRoute(route, null, null);
         }
         return resolvedRoute;
     }
@@ -252,7 +252,7 @@
         Set<Host> hosts = hostService.getHostsByIp(route.nextHop());
 
         return hosts.stream().findFirst()
-                .map(host -> new ResolvedRoute(route, host.mac(), host.vlan(), host.location()))
+                .map(host -> new ResolvedRoute(route, host.mac(), host.vlan()))
                 .orElse(null);
     }
 
diff --git a/apps/route-service/app/src/test/java/org/onosproject/routeservice/impl/RouteManagerTest.java b/apps/route-service/app/src/test/java/org/onosproject/routeservice/impl/RouteManagerTest.java
index 8457ac4..3c02572 100644
--- a/apps/route-service/app/src/test/java/org/onosproject/routeservice/impl/RouteManagerTest.java
+++ b/apps/route-service/app/src/test/java/org/onosproject/routeservice/impl/RouteManagerTest.java
@@ -209,12 +209,12 @@
     @Test
     public void testRouteAdd() {
         Route route = new Route(Route.Source.STATIC, V4_PREFIX1, V4_NEXT_HOP1);
-        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1, CP1);
+        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1);
 
         verifyRouteAdd(route, resolvedRoute);
 
         route = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP1);
-        resolvedRoute = new ResolvedRoute(route, MAC3, CP1);
+        resolvedRoute = new ResolvedRoute(route, MAC3);
 
         verifyRouteAdd(route, resolvedRoute);
     }
@@ -247,8 +247,8 @@
     public void testRouteUpdate() {
         Route route = new Route(Route.Source.STATIC, V4_PREFIX1, V4_NEXT_HOP1);
         Route updatedRoute = new Route(Route.Source.STATIC, V4_PREFIX1, V4_NEXT_HOP2);
-        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1, CP1);
-        ResolvedRoute updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2, CP1);
+        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1);
+        ResolvedRoute updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2);
 
         verifyRouteUpdated(route, updatedRoute, resolvedRoute, updatedResolvedRoute);
 
@@ -256,15 +256,15 @@
         // In this case we expect to receive a ROUTE_UPDATED event.
         route = new Route(Route.Source.STATIC, V4_PREFIX2, V4_NEXT_HOP1);
         updatedRoute = new Route(Route.Source.STATIC, V4_PREFIX2, V4_NEXT_HOP2);
-        resolvedRoute = new ResolvedRoute(route, MAC1, CP1);
-        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2, CP1);
+        resolvedRoute = new ResolvedRoute(route, MAC1);
+        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2);
 
         verifyRouteUpdated(route, updatedRoute, resolvedRoute, updatedResolvedRoute);
 
         route = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP1);
         updatedRoute = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP2);
-        resolvedRoute = new ResolvedRoute(route, MAC3, CP1);
-        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC4, CP1);
+        resolvedRoute = new ResolvedRoute(route, MAC3);
+        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC4);
 
         verifyRouteUpdated(route, updatedRoute, resolvedRoute, updatedResolvedRoute);
     }
@@ -303,12 +303,12 @@
     @Test
     public void testRouteDelete() {
         Route route = new Route(Route.Source.STATIC, V4_PREFIX1, V4_NEXT_HOP1);
-        ResolvedRoute removedResolvedRoute = new ResolvedRoute(route, MAC1, CP1);
+        ResolvedRoute removedResolvedRoute = new ResolvedRoute(route, MAC1);
 
         verifyDelete(route, removedResolvedRoute);
 
         route = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP1);
-        removedResolvedRoute = new ResolvedRoute(route, MAC3, CP1);
+        removedResolvedRoute = new ResolvedRoute(route, MAC3);
 
         verifyDelete(route, removedResolvedRoute);
     }
@@ -362,7 +362,7 @@
 
         // Now when we send the event, we expect the FIB update to be sent
         reset(routeListener);
-        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1, CP1);
+        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1);
         routeListener.event(event(RouteEvent.Type.ROUTE_ADDED, resolvedRoute, null,
                 Sets.newHashSet(resolvedRoute), null));
         replay(routeListener);
diff --git a/apps/routing/fibinstaller/src/test/java/org/onosproject/routing/fibinstaller/FibInstallerTest.java b/apps/routing/fibinstaller/src/test/java/org/onosproject/routing/fibinstaller/FibInstallerTest.java
index d591d6d..d0083c6 100644
--- a/apps/routing/fibinstaller/src/test/java/org/onosproject/routing/fibinstaller/FibInstallerTest.java
+++ b/apps/routing/fibinstaller/src/test/java/org/onosproject/routing/fibinstaller/FibInstallerTest.java
@@ -284,7 +284,7 @@
      */
     @Test
     public void testRouteAdd() {
-        ResolvedRoute resolvedRoute = createRoute(PREFIX1, NEXT_HOP1, MAC1, SW1_ETH1);
+        ResolvedRoute resolvedRoute = createRoute(PREFIX1, NEXT_HOP1, MAC1);
 
         // Create the next objective
         NextObjective nextObjective = createNextObjective(MAC1, MAC1, SW1_ETH1.port(), VlanId.NONE, true);
@@ -310,7 +310,7 @@
      */
     @Test
     public void testRouteAddWithVlan() {
-        ResolvedRoute route = createRoute(PREFIX1, NEXT_HOP2, MAC2, SW1_ETH2);
+        ResolvedRoute route = createRoute(PREFIX1, NEXT_HOP2, MAC2);
 
         // Create the next objective
         NextObjective nextObjective = createNextObjective(MAC2, MAC2, SW1_ETH2.port(), VLAN1, true);
@@ -340,8 +340,8 @@
         testRouteAdd();
         reset(flowObjectiveService);
 
-        ResolvedRoute oldRoute = createRoute(PREFIX1, NEXT_HOP1, MAC1, SW1_ETH1);
-        ResolvedRoute route = createRoute(PREFIX1, NEXT_HOP2, MAC2, SW1_ETH2);
+        ResolvedRoute oldRoute = createRoute(PREFIX1, NEXT_HOP1, MAC1);
+        ResolvedRoute route = createRoute(PREFIX1, NEXT_HOP2, MAC2);
 
         // Create the next objective
         NextObjective nextObjective = createNextObjective(MAC2, MAC2, SW1_ETH2.port(), VLAN1, true);
@@ -371,7 +371,7 @@
         testRouteAdd();
 
         // Construct the existing route
-        ResolvedRoute route = createRoute(PREFIX1, NEXT_HOP1, MAC1, SW1_ETH1);
+        ResolvedRoute route = createRoute(PREFIX1, NEXT_HOP1, MAC1);
 
         // Create the flow objective
         reset(flowObjectiveService);
@@ -386,9 +386,9 @@
     }
 
     private static ResolvedRoute createRoute(IpPrefix prefix, IpAddress nextHop,
-                                             MacAddress nextHopMac, ConnectPoint location) {
+                                             MacAddress nextHopMac) {
         return new ResolvedRoute(
-                new Route(Route.Source.UNDEFINED, prefix, nextHop), nextHopMac, location);
+                new Route(Route.Source.UNDEFINED, prefix, nextHop), nextHopMac);
     }
 
     private class TestInterfaceService extends InterfaceServiceAdapter {
diff --git a/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java b/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java
index 8a5868a..c662270 100644
--- a/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java
+++ b/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java
@@ -193,7 +193,7 @@
     @Test
     public void testRouteAddToNoVlan() {
         // Build the expected route
-        ResolvedRoute route = createRoute(PREFIX1, IP3, MAC3, SW3_ETH1);
+        ResolvedRoute route = createRoute(PREFIX1, IP3, MAC3);
 
         MultiPointToSinglePointIntent intent =
                 createIntentToThreeSrcOneTwo(PREFIX1);
@@ -217,7 +217,7 @@
     @Test
     public void testRouteAddToVlan() {
         // Build the expected route
-        ResolvedRoute route = createRoute(PREFIX2, IP1, MAC1, SW1_ETH1);
+        ResolvedRoute route = createRoute(PREFIX2, IP1, MAC1);
 
         MultiPointToSinglePointIntent intent = createIntentToOne(PREFIX2);
 
@@ -246,8 +246,8 @@
         testRouteAddToNoVlan();
 
         // Build the new route entries for prefix1 and prefix2
-        ResolvedRoute oldRoutePrefixOne = createRoute(PREFIX1, IP3, MAC3, SW3_ETH1);
-        ResolvedRoute routePrefixOne = createRoute(PREFIX1, IP1, MAC1, SW1_ETH1);
+        ResolvedRoute oldRoutePrefixOne = createRoute(PREFIX1, IP3, MAC3);
+        ResolvedRoute routePrefixOne = createRoute(PREFIX1, IP1, MAC1);
 
         // Create the new expected intents
         MultiPointToSinglePointIntent newPrefixOneIntent = createIntentToOne(PREFIX1);
@@ -281,8 +281,8 @@
         testRouteAddToVlan();
 
         // Build the new route entries for prefix1 and prefix2
-        ResolvedRoute oldRoutePrefix = createRoute(PREFIX2, IP1, MAC1, SW1_ETH1);
-        ResolvedRoute routePrefix = createRoute(PREFIX2, IP3, MAC3, SW3_ETH1);
+        ResolvedRoute oldRoutePrefix = createRoute(PREFIX2, IP1, MAC1);
+        ResolvedRoute routePrefix = createRoute(PREFIX2, IP3, MAC3);
 
         // Create the new expected intents
         MultiPointToSinglePointIntent newPrefixIntent =
@@ -314,7 +314,7 @@
         testRouteAddToNoVlan();
 
         // Construct the existing route entry
-        ResolvedRoute route = createRoute(PREFIX1, IP3, MAC3, SW3_ETH1);
+        ResolvedRoute route = createRoute(PREFIX1, IP3, MAC3);
 
         // Create existing intent
         MultiPointToSinglePointIntent removedIntent =
@@ -625,9 +625,9 @@
     }
 
     private static ResolvedRoute createRoute(IpPrefix prefix, IpAddress nextHop,
-                                             MacAddress nextHopMac, ConnectPoint location) {
+                                             MacAddress nextHopMac) {
         return new ResolvedRoute(
-                new Route(Route.Source.UNDEFINED, prefix, nextHop), nextHopMac, location);
+                new Route(Route.Source.UNDEFINED, prefix, nextHop), nextHopMac);
     }
 
     private class TestCoreService extends CoreServiceAdapter {
