diff --git a/cli/src/main/java/org/onosproject/cli/net/NextHopsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/NextHopsListCommand.java
deleted file mode 100644
index 9d8bb91..0000000
--- a/cli/src/main/java/org/onosproject/cli/net/NextHopsListCommand.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.cli.net;
-
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.incubator.net.routing.NextHop;
-import org.onosproject.incubator.net.routing.Route;
-import org.onosproject.incubator.net.routing.RouteService;
-
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * Command to show information about routing next hops.
- */
-@Command(scope = "onos", name = "next-hops",
-        description = "Lists all next hops in the route store")
-public class NextHopsListCommand extends AbstractShellCommand {
-
-    private static final String FORMAT_HEADER =
-        "   Network            Next Hop";
-    private static final String FORMAT_ROUTE =
-        "   %-18s %-15s";
-
-    private static final String FORMAT_TABLE = "Table: %s";
-    private static final String FORMAT_TOTAL = "   Total: %d";
-
-    private static final String FORMAT = "ip=%s, mac=%s, loc=%s, numRoutes=%s";
-
-    @Override
-    protected void execute() {
-        RouteService service = AbstractShellCommand.get(RouteService.class);
-
-        Set<NextHop> nextHops = service.getNextHops();
-
-        nextHops.forEach(nextHop -> {
-            Collection<Route> routes = service.getRoutesForNextHop(nextHop.ip());
-            print(FORMAT, nextHop.ip(), nextHop.mac(), nextHop.location(), routes.size());
-        });
-    }
-
-}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index d718406..1a20343 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -573,9 +573,6 @@
         <command>
             <action class="org.onosproject.cli.net.RouteRemoveCommand"/>
         </command>
-        <command>
-            <action class="org.onosproject.cli.net.NextHopsListCommand"/>
-        </command>
 
         <command>
             <action class="org.onosproject.cli.net.GlobalLabelCommand"/>
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/NextHop.java b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/NextHop.java
deleted file mode 100644
index 0241742..0000000
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/NextHop.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.net.ConnectPoint;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * Describes a routing next hop.
- */
-public class NextHop {
-
-    private final IpAddress ip;
-    private final NextHopData nextHopData;
-
-    /**
-     * Creates a new next hop.
-     *
-     * @param ip IP address
-     * @param nextHopData Next hop data
-     */
-    public NextHop(IpAddress ip, NextHopData nextHopData) {
-        this.ip = ip;
-        this.nextHopData = nextHopData;
-    }
-
-    /**
-     * Returns the IP address of the next hop.
-     *
-     * @return IP address
-     */
-    public IpAddress ip() {
-        return ip;
-    }
-
-    /**
-     * Returns the MAC address of the next hop.
-     *
-     * @return MAC address
-     */
-    public MacAddress mac() {
-        return nextHopData.mac();
-    }
-
-    /**
-     * Returns the location of the next hop.
-     *
-     * @return Connect point
-     */
-    public ConnectPoint location() {
-        return nextHopData.location();
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(ip, nextHopData);
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) {
-            return true;
-        }
-
-        if (!(other instanceof NextHop)) {
-            return false;
-        }
-
-        NextHop that = (NextHop) other;
-
-        return Objects.equals(this.ip, that.ip) &&
-                Objects.equals(this.nextHopData, that.nextHopData);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("ip", ip)
-                .add("nextHopData", nextHopData)
-                .toString();
-    }
-}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/RouteService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/RouteService.java
index 4a298ba..c123dc3 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/routing/RouteService.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/routing/RouteService.java
@@ -20,9 +20,7 @@
 import org.onosproject.event.ListenerService;
 
 import java.util.Collection;
-import java.util.Map;
 import java.util.Optional;
-import java.util.Set;
 
 /**
  * Unicast IP route service.
@@ -30,16 +28,6 @@
 public interface RouteService extends ListenerService<RouteEvent, RouteListener> {
 
     /**
-     * Returns all routes for all route tables in the system.
-     *
-     * @return map of route table name to routes in that table
-     * @deprecated in Kingfisher release. Use {@link #getRoutes(RouteTableId)}
-     * instead.
-     */
-    @Deprecated
-    Map<RouteTableId, Collection<Route>> getAllRoutes();
-
-    /**
      * Returns information about all routes in the given route table.
      *
      * @param id route table ID
@@ -55,6 +43,14 @@
     Collection<RouteTableId> getRouteTables();
 
     /**
+     * Performs a longest prefix lookup on the given IP address.
+     *
+     * @param ip IP address to look up
+     * @return most specific matching route, if one exists
+     */
+    Optional<ResolvedRoute> longestPrefixLookup(IpAddress ip);
+
+    /**
      * Performs a longest prefix match on the given IP address. The call will
      * return the route with the most specific prefix that contains the given
      * IP address.
@@ -66,30 +62,4 @@
      */
     @Deprecated
     Route longestPrefixMatch(IpAddress ip);
-
-    /**
-     * Performs a longest prefix lookup on the given IP address.
-     *
-     * @param ip IP address to look up
-     * @return most specific matching route, if one exists
-     */
-    Optional<ResolvedRoute> longestPrefixLookup(IpAddress ip);
-
-    /**
-     * Returns the routes for the given next hop.
-     *
-     * @param nextHop next hop IP address
-     * @return routes for this next hop
-     */
-    @Deprecated
-    Collection<Route> getRoutesForNextHop(IpAddress nextHop);
-
-    /**
-     * Returns all next hops in the route store.
-     *
-     * @return set of next hops
-     */
-    @Deprecated
-    Set<NextHop> getNextHops();
-
 }
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 27ec1c3..0d2eb23 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
@@ -22,7 +22,6 @@
 import org.onosproject.store.Store;
 
 import java.util.Collection;
-import java.util.Map;
 import java.util.Set;
 
 /**
@@ -78,49 +77,4 @@
     @Beta
     RouteSet getRoutes(IpPrefix prefix);
 
-    /**
-     * Updates a next hop information in the store.
-     *
-     * @param ip IP address
-     * @param nextHopData Information of the next hop
-     */
-    @Deprecated
-    void updateNextHop(IpAddress ip, NextHopData nextHopData);
-
-    /**
-     * Removes a next hop information from the store.
-     *
-     * @param ip IP address
-     * @param nextHopData Information of the next hop
-     */
-    @Deprecated
-    void removeNextHop(IpAddress ip, NextHopData nextHopData);
-
-    /**
-     * Returns the information of the given next hop.
-     *
-     * @param ip next hop IP
-     * @return Information of the next hop
-     */
-    @Deprecated
-    NextHopData getNextHop(IpAddress ip);
-
-    /**
-     * Returns all next hops in the route store.
-     *
-     * @return next hops
-     */
-    @Deprecated
-    Map<IpAddress, NextHopData> getNextHops();
-
-    /**
-     * Performs a longest prefix match with the given IP address.
-     *
-     * @param ip IP to look up
-     * @return longest prefix match route
-     * @deprecated in Kingfisher release. Now handled by the manager instead of
-     * the store
-     */
-    @Deprecated
-    Route longestPrefixMatch(IpAddress ip);
 }
diff --git a/incubator/api/src/test/java/org/onosproject/incubator/net/routing/RouteServiceAdapter.java b/incubator/api/src/test/java/org/onosproject/incubator/net/routing/RouteServiceAdapter.java
index a13f5c8..e81fc30 100644
--- a/incubator/api/src/test/java/org/onosproject/incubator/net/routing/RouteServiceAdapter.java
+++ b/incubator/api/src/test/java/org/onosproject/incubator/net/routing/RouteServiceAdapter.java
@@ -19,9 +19,7 @@
 import org.onlab.packet.IpAddress;
 
 import java.util.Collection;
-import java.util.Map;
 import java.util.Optional;
-import java.util.Set;
 
 /**
  * Adapter class for the route service.
@@ -38,11 +36,6 @@
     }
 
     @Override
-    public Map<RouteTableId, Collection<Route>> getAllRoutes() {
-        return null;
-    }
-
-    @Override
     public Collection<RouteInfo> getRoutes(RouteTableId id) {
         return null;
     }
@@ -63,16 +56,6 @@
     }
 
     @Override
-    public Collection<Route> getRoutesForNextHop(IpAddress nextHop) {
-        return null;
-    }
-
-    @Override
-    public Set<NextHop> getNextHops() {
-        return null;
-    }
-
-    @Override
     public void addListener(RouteListener listener) {
 
     }
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 267bb69..f057942 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
@@ -26,7 +26,6 @@
 import org.onlab.packet.IpPrefix;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.incubator.net.routing.InternalRouteEvent;
-import org.onosproject.incubator.net.routing.NextHop;
 import org.onosproject.incubator.net.routing.ResolvedRoute;
 import org.onosproject.incubator.net.routing.Route;
 import org.onosproject.incubator.net.routing.RouteAdminService;
@@ -48,7 +47,6 @@
 
 import javax.annotation.concurrent.GuardedBy;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
@@ -59,7 +57,6 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadFactory;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
@@ -175,14 +172,6 @@
         }
     }
 
-    @Override
-    public Map<RouteTableId, Collection<Route>> getAllRoutes() {
-        return routeStore.getRouteTables().stream()
-                .collect(Collectors.toMap(Function.identity(),
-                        table -> (table == null) ?
-                                 Collections.emptySet() : reformatRoutes(routeStore.getRoutes(table))));
-    }
-
     private Collection<Route> reformatRoutes(Collection<RouteSet> routeSets) {
         return routeSets.stream().flatMap(r -> r.routes().stream()).collect(Collectors.toList());
     }
@@ -214,30 +203,11 @@
     }
 
     @Override
-    public Route longestPrefixMatch(IpAddress ip) {
-        return longestPrefixLookup(ip)
-                .map(ResolvedRoute::route)
-                .orElse(null);
-    }
-
-    @Override
     public Optional<ResolvedRoute> longestPrefixLookup(IpAddress ip) {
         return resolvedRouteStore.longestPrefixMatch(ip);
     }
 
     @Override
-    public Collection<Route> getRoutesForNextHop(IpAddress nextHop) {
-        return routeStore.getRoutesForNextHop(nextHop);
-    }
-
-    @Override
-    public Set<NextHop> getNextHops() {
-        return routeStore.getNextHops().entrySet().stream()
-                .map(entry -> new NextHop(entry.getKey(), entry.getValue()))
-                .collect(Collectors.toSet());
-    }
-
-    @Override
     public void update(Collection<Route> routes) {
         synchronized (this) {
             routes.forEach(route -> {
@@ -257,6 +227,13 @@
         }
     }
 
+    @Override
+    public Route longestPrefixMatch(IpAddress ip) {
+        return longestPrefixLookup(ip)
+                .map(ResolvedRoute::route)
+                .orElse(null);
+    }
+
     private ResolvedRoute resolve(Route route) {
         hostService.startMonitoringIp(route.nextHop());
         Set<Host> hosts = hostService.getHostsByIp(route.nextHop());
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/DistributedRouteStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/DistributedRouteStore.java
index 34e281a..9f0ae4f 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/DistributedRouteStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/DistributedRouteStore.java
@@ -21,7 +21,6 @@
 import org.onlab.packet.IpPrefix;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.incubator.net.routing.InternalRouteEvent;
-import org.onosproject.incubator.net.routing.NextHopData;
 import org.onosproject.incubator.net.routing.Route;
 import org.onosproject.incubator.net.routing.RouteSet;
 import org.onosproject.incubator.net.routing.RouteStore;
@@ -137,12 +136,6 @@
     }
 
     @Override
-    public Route longestPrefixMatch(IpAddress ip) {
-        // Not supported
-        return null;
-    }
-
-    @Override
     public Collection<Route> getRoutesForNextHop(IpAddress ip) {
         return getDefaultRouteTable(ip).getRoutesForNextHop(ip);
     }
@@ -152,28 +145,6 @@
         return getDefaultRouteTable(prefix.address()).getRoutes(prefix);
     }
 
-    @Override
-    public void updateNextHop(IpAddress ip, NextHopData nextHopData) {
-        // Not supported
-    }
-
-    @Override
-    public void removeNextHop(IpAddress ip, NextHopData nextHopData) {
-        // Not supported
-    }
-
-    @Override
-    public NextHopData getNextHop(IpAddress ip) {
-        // Not supported
-        return null;
-    }
-
-    @Override
-    public Map<IpAddress, NextHopData> getNextHops() {
-        // Not supported
-        return Collections.emptyMap();
-    }
-
     private void createRouteTable(RouteTableId tableId) {
         routeTables.computeIfAbsent(tableId, id -> new DefaultRouteTable(id, ourDelegate, storageService, executor));
     }
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 508c2f1..04663e2 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
@@ -23,7 +23,6 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.incubator.net.routing.InternalRouteEvent;
-import org.onosproject.incubator.net.routing.NextHopData;
 import org.onosproject.incubator.net.routing.Route;
 import org.onosproject.incubator.net.routing.RouteSet;
 import org.onosproject.incubator.net.routing.RouteStore;
@@ -102,11 +101,6 @@
     }
 
     @Override
-    public Route longestPrefixMatch(IpAddress ip) {
-        return getDefaultRouteTable(ip).longestPrefixMatch(ip);
-    }
-
-    @Override
     public Collection<Route> getRoutesForNextHop(IpAddress ip) {
         return getDefaultRouteTable(ip).getRoutesForNextHop(ip);
     }
@@ -116,28 +110,6 @@
         return getDefaultRouteTable(prefix.address()).getRoutes(prefix);
     }
 
-    @Override
-    public void updateNextHop(IpAddress ip, NextHopData nextHopData) {
-        // No longer needed
-    }
-
-    @Override
-    public void removeNextHop(IpAddress ip, NextHopData nextHopData) {
-        // No longer needed
-    }
-
-    @Override
-    public NextHopData getNextHop(IpAddress ip) {
-        // No longer needed
-        return null;
-    }
-
-    @Override
-    public Map<IpAddress, NextHopData> getNextHops() {
-        // No longer needed
-        return Collections.emptyMap();
-    }
-
     private RouteTable getDefaultRouteTable(Route route) {
         return getDefaultRouteTable(route.prefix().address());
     }
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/RouteStoreImpl.java b/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/RouteStoreImpl.java
index c07f3a6..4d1f5f0 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/RouteStoreImpl.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/routing/impl/RouteStoreImpl.java
@@ -28,7 +28,6 @@
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.incubator.net.routing.InternalRouteEvent;
-import org.onosproject.incubator.net.routing.NextHopData;
 import org.onosproject.incubator.net.routing.Route;
 import org.onosproject.incubator.net.routing.RouteSet;
 import org.onosproject.incubator.net.routing.RouteStore;
@@ -43,7 +42,6 @@
 
 import java.util.Collection;
 import java.util.Dictionary;
-import java.util.Map;
 import java.util.Set;
 
 /**
@@ -154,11 +152,6 @@
     }
 
     @Override
-    public Route longestPrefixMatch(IpAddress ip) {
-        return currentRouteStore.longestPrefixMatch(ip);
-    }
-
-    @Override
     public Collection<Route> getRoutesForNextHop(IpAddress ip) {
         return currentRouteStore.getRoutesForNextHop(ip);
     }
@@ -167,24 +160,4 @@
     public RouteSet getRoutes(IpPrefix prefix) {
         return currentRouteStore.getRoutes(prefix);
     }
-
-    @Override
-    public void updateNextHop(IpAddress ip, NextHopData nextHopData) {
-        currentRouteStore.updateNextHop(ip, nextHopData);
-    }
-
-    @Override
-    public void removeNextHop(IpAddress ip, NextHopData nextHopData) {
-        currentRouteStore.removeNextHop(ip, nextHopData);
-    }
-
-    @Override
-    public NextHopData getNextHop(IpAddress ip) {
-        return currentRouteStore.getNextHop(ip);
-    }
-
-    @Override
-    public Map<IpAddress, NextHopData> getNextHops() {
-        return currentRouteStore.getNextHops();
-    }
 }
