diff --git a/apps/routing/src/main/java/org/onosproject/routing/impl/SingleSwitchFibInstaller.java b/apps/routing/src/main/java/org/onosproject/routing/impl/SingleSwitchFibInstaller.java
index c036d8c..a295a14 100644
--- a/apps/routing/src/main/java/org/onosproject/routing/impl/SingleSwitchFibInstaller.java
+++ b/apps/routing/src/main/java/org/onosproject/routing/impl/SingleSwitchFibInstaller.java
@@ -215,7 +215,7 @@
 
         //clean up the routes.
         for (Map.Entry<IpPrefix, IpAddress> routes: prefixToNextHop.entrySet()) {
-            deleteRoute(new ResolvedRoute(routes.getKey(), null, null));
+            deleteRoute(new ResolvedRoute(routes.getKey(), null, null, null));
         }
 
         //clean up the filtering objective for interfaces.
diff --git a/apps/routing/src/test/java/org/onosproject/routing/impl/SingleSwitchFibInstallerTest.java b/apps/routing/src/test/java/org/onosproject/routing/impl/SingleSwitchFibInstallerTest.java
index 2621c9d..2b60f91 100644
--- a/apps/routing/src/test/java/org/onosproject/routing/impl/SingleSwitchFibInstallerTest.java
+++ b/apps/routing/src/test/java/org/onosproject/routing/impl/SingleSwitchFibInstallerTest.java
@@ -279,7 +279,7 @@
      */
     @Test
     public void testRouteAdd() {
-        ResolvedRoute resolvedRoute = new ResolvedRoute(PREFIX1, NEXT_HOP1, MAC1);
+        ResolvedRoute resolvedRoute = new ResolvedRoute(PREFIX1, NEXT_HOP1, MAC1, SW1_ETH1);
 
         // Create the next objective
         NextObjective nextObjective = createNextObjective(MAC1, MAC1, SW1_ETH1.port(), VlanId.NONE, true);
@@ -305,7 +305,7 @@
      */
     @Test
     public void testRouteAddWithVlan() {
-        ResolvedRoute route = new ResolvedRoute(PREFIX1, NEXT_HOP2, MAC2);
+        ResolvedRoute route = new ResolvedRoute(PREFIX1, NEXT_HOP2, MAC2, SW1_ETH2);
 
         // Create the next objective
         NextObjective nextObjective = createNextObjective(MAC2, MAC2, SW1_ETH2.port(), VLAN1, true);
@@ -335,7 +335,7 @@
         testRouteAdd();
         reset(flowObjectiveService);
 
-        ResolvedRoute route = new ResolvedRoute(PREFIX1, NEXT_HOP2, MAC2);
+        ResolvedRoute route = new ResolvedRoute(PREFIX1, NEXT_HOP2, MAC2, SW1_ETH2);
 
         // Create the next objective
         NextObjective nextObjective = createNextObjective(MAC2, MAC2, SW1_ETH2.port(), VLAN1, true);
@@ -365,7 +365,7 @@
         testRouteAdd();
 
         // Construct the existing route
-        ResolvedRoute route = new ResolvedRoute(PREFIX1, null, null);
+        ResolvedRoute route = new ResolvedRoute(PREFIX1, null, null, null);
 
         // Create the flow objective
         reset(flowObjectiveService);
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 762ce52..a764c83 100644
--- a/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java
+++ b/apps/sdnip/src/test/java/org/onosproject/sdnip/SdnIpFibTest.java
@@ -191,7 +191,7 @@
     @Test
     public void testRouteAddToNoVlan() {
         // Build the expected route
-        ResolvedRoute route = new ResolvedRoute(PREFIX1, IP3, MAC3);
+        ResolvedRoute route = new ResolvedRoute(PREFIX1, IP3, MAC3, SW3_ETH1);
 
         MultiPointToSinglePointIntent intent =
                 createIntentToThreeSrcOneTwo(PREFIX1);
@@ -215,7 +215,7 @@
     @Test
     public void testRouteAddToVlan() {
         // Build the expected route
-        ResolvedRoute route = new ResolvedRoute(PREFIX2, IP1, MAC1);
+        ResolvedRoute route = new ResolvedRoute(PREFIX2, IP1, MAC1, SW1_ETH1);
 
         MultiPointToSinglePointIntent intent = createIntentToOne(PREFIX2);
 
@@ -244,7 +244,7 @@
         testRouteAddToNoVlan();
 
         // Build the new route entries for prefix1 and prefix2
-        ResolvedRoute routePrefixOne = new ResolvedRoute(PREFIX1, IP1, MAC1);
+        ResolvedRoute routePrefixOne = new ResolvedRoute(PREFIX1, IP1, MAC1, SW1_ETH1);
 
         // Create the new expected intents
         MultiPointToSinglePointIntent newPrefixOneIntent = createIntentToOne(PREFIX1);
@@ -278,7 +278,7 @@
         testRouteAddToVlan();
 
         // Build the new route entries for prefix1 and prefix2
-        ResolvedRoute routePrefix = new ResolvedRoute(PREFIX2, IP3, MAC3);
+        ResolvedRoute routePrefix = new ResolvedRoute(PREFIX2, IP3, MAC3, SW3_ETH1);
 
         // Create the new expected intents
         MultiPointToSinglePointIntent newPrefixIntent =
@@ -310,7 +310,7 @@
         testRouteAddToNoVlan();
 
         // Construct the existing route entry
-        ResolvedRoute route = new ResolvedRoute(PREFIX1, null, null);
+        ResolvedRoute route = new ResolvedRoute(PREFIX1, null, null, null);
 
         // Create existing intent
         MultiPointToSinglePointIntent removedIntent =
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/NextHopData.java b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/NextHopData.java
new file mode 100644
index 0000000..2f05200
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/NextHopData.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.incubator.net.routing;
+
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Host;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * Stores next hop information.
+ */
+public class NextHopData {
+
+    private final MacAddress mac;
+    private final ConnectPoint location;
+
+    /**
+     * Creates a new instance.
+     *
+     * @param mac MAC address
+     * @param location Connect point
+     */
+    public NextHopData(MacAddress mac, ConnectPoint location) {
+        this.mac = mac;
+        this.location = location;
+    }
+
+    /**
+     * Returns the MAC address.
+     *
+     * @return MAC address
+     */
+    public MacAddress mac() {
+        return mac;
+    }
+
+    /**
+     * Returns the location.
+     *
+     * @return Connect point
+     */
+    public ConnectPoint location() {
+        return location;
+    }
+
+    /**
+     * Creates a new instance from a host.
+     *
+     * @param host Host information
+     * @return NextHopData instance
+     */
+    public static NextHopData fromHost(Host host) {
+        return new NextHopData(host.mac(), host.location());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mac, location);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+
+        if (!(other instanceof NextHopData)) {
+            return false;
+        }
+
+        NextHopData that = (NextHopData) other;
+
+        return Objects.equals(this.mac, that.mac) &&
+                Objects.equals(this.location, that.location);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("mac", mac)
+                .add("location", location)
+                .toString();
+    }
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/ResolvedRoute.java b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/ResolvedRoute.java
index 68f2feb..d6cb4b4 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/ResolvedRoute.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/ResolvedRoute.java
@@ -19,6 +19,7 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
 
 import java.util.Objects;
 
@@ -32,17 +33,20 @@
     private final IpPrefix prefix;
     private final IpAddress nextHop;
     private final MacAddress nextHopMac;
+    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
      */
-    public ResolvedRoute(Route route, MacAddress nextHopMac) {
+    public ResolvedRoute(Route route, MacAddress nextHopMac, ConnectPoint location) {
         this.prefix = route.prefix();
         this.nextHop = route.nextHop();
         this.nextHopMac = nextHopMac;
+        this.location = location;
     }
 
     /**
@@ -51,11 +55,14 @@
      * @param prefix route prefix
      * @param nextHop route next hop IP address
      * @param nextHopMac next hop MAC address
+     * @param location connect point where the next hop connects to
      */
-    public ResolvedRoute(IpPrefix prefix, IpAddress nextHop, MacAddress nextHopMac) {
+    public ResolvedRoute(IpPrefix prefix, IpAddress nextHop, MacAddress nextHopMac,
+                         ConnectPoint location) {
         this.prefix = prefix;
         this.nextHop = nextHop;
         this.nextHopMac = nextHopMac;
+        this.location = location;
     }
 
     /**
@@ -85,9 +92,18 @@
         return nextHopMac;
     }
 
+    /**
+     * Returns the next hop location.
+     *
+     * @return connect point where the next hop attaches to
+     */
+    public ConnectPoint location() {
+        return location;
+    }
+
     @Override
     public int hashCode() {
-        return Objects.hash(prefix, nextHop, nextHopMac);
+        return Objects.hash(prefix, nextHop, nextHopMac, location);
     }
 
     @Override
@@ -104,7 +120,8 @@
 
         return Objects.equals(this.prefix, that.prefix) &&
                 Objects.equals(this.nextHop, that.nextHop) &&
-                Objects.equals(this.nextHopMac, that.nextHopMac);
+                Objects.equals(this.nextHopMac, that.nextHopMac) &&
+                Objects.equals(this.location, that.location);
     }
 
     @Override
@@ -113,6 +130,7 @@
                 .add("prefix", prefix)
                 .add("nextHop", nextHop)
                 .add("nextHopMac", nextHopMac)
+                .add("location", location)
                 .toString();
     }
 }
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/RouteStore.java b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/RouteStore.java
index 9b75099..9eac65c 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/RouteStore.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/RouteStore.java
@@ -17,7 +17,6 @@
 package org.onosproject.incubator.net.routing;
 
 import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
 import org.onosproject.store.Store;
 
 import java.util.Collection;
@@ -78,30 +77,30 @@
      * Updates a next hop IP and MAC in the store.
      *
      * @param ip IP address
-     * @param mac MAC address
+     * @param nextHopData Information of the next hop
      */
-    void updateNextHop(IpAddress ip, MacAddress mac);
+    void updateNextHop(IpAddress ip, NextHopData nextHopData);
 
     /**
      * Removes a next hop IP and MAC from the store.
      *
      * @param ip IP address
-     * @param mac MAC address
+     * @param nextHopData Information of the next hop
      */
-    void removeNextHop(IpAddress ip, MacAddress mac);
+    void removeNextHop(IpAddress ip, NextHopData nextHopData);
 
     /**
      * Returns the MAC address of the given next hop.
      *
      * @param ip next hop IP
-     * @return MAC address
+     * @return Information of the next hop
      */
-    MacAddress getNextHop(IpAddress ip);
+    NextHopData getNextHop(IpAddress ip);
 
     /**
      * Returns all next hops in the route store.
      *
      * @return next hops
      */
-    Map<IpAddress, MacAddress> getNextHops();
+    Map<IpAddress, NextHopData> getNextHops();
 }
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/routing/impl/RouteManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/routing/impl/RouteManager.java
index a362316..4c0f59e 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/routing/impl/RouteManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/routing/impl/RouteManager.java
@@ -23,8 +23,8 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
 import org.onosproject.event.ListenerService;
+import org.onosproject.incubator.net.routing.NextHopData;
 import org.onosproject.incubator.net.routing.NextHop;
 import org.onosproject.incubator.net.routing.ResolvedRoute;
 import org.onosproject.incubator.net.routing.Route;
@@ -118,9 +118,12 @@
             routeStore.getRouteTables().forEach(table -> {
                 Collection<Route> routes = routeStore.getRoutes(table);
                 if (routes != null) {
-                    routes.forEach(route ->
-                        l.post(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED,
-                                        new ResolvedRoute(route, routeStore.getNextHop(route.nextHop())))));
+                    routes.forEach(route -> {
+                        NextHopData nextHopData = routeStore.getNextHop(route.nextHop());
+                            l.post(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED,
+                                    new ResolvedRoute(route, nextHopData.mac(),
+                                            nextHopData.location())));
+                    });
                 }
             });
 
@@ -174,7 +177,7 @@
     @Override
     public Set<NextHop> getNextHops() {
         return routeStore.getNextHops().entrySet().stream()
-                .map(entry -> new NextHop(entry.getKey(), entry.getValue()))
+                .map(entry -> new NextHop(entry.getKey(), entry.getValue().mac()))
                 .collect(Collectors.toSet());
     }
 
@@ -203,24 +206,24 @@
         // Monitor the IP address for updates of the MAC address
         hostService.startMonitoringIp(route.nextHop());
 
-        MacAddress nextHopMac = routeStore.getNextHop(route.nextHop());
-        if (nextHopMac == null) {
+        NextHopData nextHopData = routeStore.getNextHop(route.nextHop());
+        if (nextHopData == null) {
             Set<Host> hosts = hostService.getHostsByIp(route.nextHop());
             Optional<Host> host = hosts.stream().findFirst();
             if (host.isPresent()) {
-                nextHopMac = host.get().mac();
+                nextHopData = NextHopData.fromHost(host.get());
             }
         }
 
-        if (nextHopMac != null) {
-            routeStore.updateNextHop(route.nextHop(), nextHopMac);
+        if (nextHopData != null) {
+            routeStore.updateNextHop(route.nextHop(), nextHopData);
         }
     }
 
     private void hostUpdated(Host host) {
         synchronized (this) {
             for (IpAddress ip : host.ipAddresses()) {
-                routeStore.updateNextHop(ip, host.mac());
+                routeStore.updateNextHop(ip, NextHopData.fromHost(host));
             }
         }
     }
@@ -228,7 +231,7 @@
     private void hostRemoved(Host host) {
         synchronized (this) {
             for (IpAddress ip : host.ipAddresses()) {
-                routeStore.removeNextHop(ip, host.mac());
+                routeStore.removeNextHop(ip, NextHopData.fromHost(host));
             }
         }
     }
diff --git a/incubator/net/src/test/java/org/onosproject/incubator/net/routing/impl/RouteManagerTest.java b/incubator/net/src/test/java/org/onosproject/incubator/net/routing/impl/RouteManagerTest.java
index 9393062..86ba6f6 100644
--- a/incubator/net/src/test/java/org/onosproject/incubator/net/routing/impl/RouteManagerTest.java
+++ b/incubator/net/src/test/java/org/onosproject/incubator/net/routing/impl/RouteManagerTest.java
@@ -178,12 +178,12 @@
     @Test
     public void testRouteAdd() {
         Route route = new Route(Route.Source.STATIC, V4_PREFIX1, V4_NEXT_HOP1);
-        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1);
+        ResolvedRoute resolvedRoute = new ResolvedRoute(route, MAC1, CP1);
 
         verifyRouteAdd(route, resolvedRoute);
 
         route = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP1);
-        resolvedRoute = new ResolvedRoute(route, MAC3);
+        resolvedRoute = new ResolvedRoute(route, MAC3, CP1);
 
         verifyRouteAdd(route, resolvedRoute);
     }
@@ -215,7 +215,7 @@
     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 updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2);
+        ResolvedRoute updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2, CP1);
 
         verifyRouteRemoveThenAdd(route, updatedRoute, updatedResolvedRoute);
 
@@ -223,13 +223,13 @@
         // 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);
-        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2);
+        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC2, CP1);
 
         verifyRouteUpdated(route, updatedRoute, updatedResolvedRoute);
 
         route = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP1);
         updatedRoute = new Route(Route.Source.STATIC, V6_PREFIX1, V6_NEXT_HOP2);
-        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC4);
+        updatedResolvedRoute = new ResolvedRoute(updatedRoute, MAC4, CP1);
 
         verifyRouteRemoveThenAdd(route, updatedRoute, updatedResolvedRoute);
     }
@@ -248,7 +248,8 @@
         // First add the original route
         addRoute(original);
 
-        routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_REMOVED, new ResolvedRoute(original, null)));
+        routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_REMOVED,
+                new ResolvedRoute(original, null, null)));
         expectLastCall().once();
         routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, updatedResolvedRoute));
         expectLastCall().once();
@@ -308,7 +309,7 @@
         addRoute(route);
 
         RouteEvent withdrawRouteEvent = new RouteEvent(RouteEvent.Type.ROUTE_REMOVED,
-                new ResolvedRoute(route, null));
+                new ResolvedRoute(route, null, null));
 
         reset(routeListener);
         routeListener.event(withdrawRouteEvent);
@@ -346,7 +347,7 @@
         // Now when we send the event, we expect the FIB update to be sent
         reset(routeListener);
         routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED,
-                new ResolvedRoute(route, MAC1)));
+                new ResolvedRoute(route, MAC1, CP1)));
         replay(routeListener);
 
         // Send in the host event
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/LocalRouteStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/LocalRouteStore.java
index d687327..a1e3120 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/LocalRouteStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/LocalRouteStore.java
@@ -29,7 +29,7 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
+import org.onosproject.incubator.net.routing.NextHopData;
 import org.onosproject.incubator.net.routing.ResolvedRoute;
 import org.onosproject.incubator.net.routing.Route;
 import org.onosproject.incubator.net.routing.RouteEvent;
@@ -63,7 +63,7 @@
     private static final RouteTableId IPV4 = new RouteTableId("ipv4");
     private static final RouteTableId IPV6 = new RouteTableId("ipv6");
 
-    private Map<IpAddress, MacAddress> nextHops = new ConcurrentHashMap<>();
+    private Map<IpAddress, NextHopData> nextHops = new ConcurrentHashMap<>();
 
     @Activate
     public void activate() {
@@ -114,42 +114,42 @@
     }
 
     @Override
-    public void updateNextHop(IpAddress ip, MacAddress mac) {
+    public void updateNextHop(IpAddress ip, NextHopData nextHopData) {
         Collection<Route> routes = getDefaultRouteTable(ip).getRoutesForNextHop(ip);
 
-        if (!routes.isEmpty() && !mac.equals(nextHops.get(ip))) {
-            MacAddress oldMac = nextHops.put(ip, mac);
+        if (!routes.isEmpty() && !nextHopData.equals(nextHops.get(ip))) {
+            NextHopData oldNextHop = nextHops.put(ip, nextHopData);
 
             for (Route route : routes) {
-                if (oldMac == null) {
+                if (oldNextHop == null) {
                     notifyDelegate(new RouteEvent(RouteEvent.Type.ROUTE_ADDED,
-                            new ResolvedRoute(route, mac)));
+                            new ResolvedRoute(route, nextHopData.mac(), nextHopData.location())));
                 } else {
                     notifyDelegate(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED,
-                            new ResolvedRoute(route, mac)));
+                            new ResolvedRoute(route, nextHopData.mac(), nextHopData.location())));
                 }
             }
         }
     }
 
     @Override
-    public void removeNextHop(IpAddress ip, MacAddress mac) {
-        if (nextHops.remove(ip, mac)) {
+    public void removeNextHop(IpAddress ip, NextHopData nextHopData) {
+        if (nextHops.remove(ip, nextHopData)) {
             Collection<Route> routes = getDefaultRouteTable(ip).getRoutesForNextHop(ip);
             for (Route route : routes) {
                 notifyDelegate(new RouteEvent(RouteEvent.Type.ROUTE_REMOVED,
-                        new ResolvedRoute(route, null)));
+                        new ResolvedRoute(route, null, null)));
             }
         }
     }
 
     @Override
-    public MacAddress getNextHop(IpAddress ip) {
+    public NextHopData getNextHop(IpAddress ip) {
         return nextHops.get(ip);
     }
 
     @Override
-    public Map<IpAddress, MacAddress> getNextHops() {
+    public Map<IpAddress, NextHopData> getNextHops() {
         return ImmutableMap.copyOf(nextHops);
     }
 
@@ -223,25 +223,25 @@
                     return;
                 }
 
-                MacAddress nextHopMac = nextHops.get(route.nextHop());
+                NextHopData nextHopData = nextHops.get(route.nextHop());
 
                 if (oldRoute != null && !oldRoute.nextHop().equals(route.nextHop())) {
-                    if (nextHopMac == null) {
+                    if (nextHopData == null) {
                         // We don't know the new MAC address yet so delete the route
                         notifyDelegate(new RouteEvent(RouteEvent.Type.ROUTE_REMOVED,
-                                new ResolvedRoute(oldRoute, null)));
+                                new ResolvedRoute(oldRoute, null, null)));
                     } else {
                         // We know the new MAC address so update the route
                         notifyDelegate(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED,
-                                new ResolvedRoute(route, nextHopMac)));
+                                new ResolvedRoute(route, nextHopData.mac(), nextHopData.location())));
                     }
                     return;
                 }
 
 
-                if (nextHopMac != null) {
+                if (nextHopData != null) {
                     notifyDelegate(new RouteEvent(RouteEvent.Type.ROUTE_ADDED,
-                            new ResolvedRoute(route, nextHopMac)));
+                            new ResolvedRoute(route, nextHopData.mac(), nextHopData.location())));
                 }
             }
         }
@@ -259,7 +259,7 @@
                 if (removed != null) {
                     reverseIndex.remove(removed.nextHop(), removed);
                     notifyDelegate(new RouteEvent(RouteEvent.Type.ROUTE_REMOVED,
-                            new ResolvedRoute(route, null)));
+                            new ResolvedRoute(route, null, null)));
                 }
             }
         }
