diff --git a/lib/base.php b/lib/base.php
index 5b211a2d180b4f262262e9313f98f0b49f33a0eb..7f666daceb25d4ee368789f6eb438a59f342542e 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -1005,7 +1005,7 @@ class OC {
 					OC_App::loadApps(['filesystem', 'logging']);
 					OC_App::loadApps();
 				}
-				OC::$server->getRouter()->match(\OC::$server->getRequest()->getRawPathInfo());
+				OC::$server->get(\OC\Route\Router::class)->match(\OC::$server->getRequest()->getRawPathInfo());
 				return;
 			} catch (Symfony\Component\Routing\Exception\ResourceNotFoundException $e) {
 				//header('HTTP/1.0 404 Not Found');
diff --git a/lib/private/AppFramework/Routing/RouteConfig.php b/lib/private/AppFramework/Routing/RouteConfig.php
index 1921ce651283f2daacd6c1c09ce105cef1abb1b3..b382e7eb4b033b9122ea1c0c37cadc669edd0bd9 100644
--- a/lib/private/AppFramework/Routing/RouteConfig.php
+++ b/lib/private/AppFramework/Routing/RouteConfig.php
@@ -32,7 +32,7 @@ declare(strict_types=1);
 namespace OC\AppFramework\Routing;
 
 use OC\AppFramework\DependencyInjection\DIContainer;
-use OCP\Route\IRouter;
+use OC\Route\Router;
 
 /**
  * Class RouteConfig
@@ -42,7 +42,7 @@ class RouteConfig {
 	/** @var DIContainer */
 	private $container;
 
-	/** @var IRouter */
+	/** @var Router */
 	private $router;
 
 	/** @var array */
@@ -65,11 +65,11 @@ class RouteConfig {
 
 	/**
 	 * @param \OC\AppFramework\DependencyInjection\DIContainer $container
-	 * @param \OCP\Route\IRouter $router
+	 * @param \OC\Route\Router $router
 	 * @param array $routes
 	 * @internal param $appName
 	 */
-	public function __construct(DIContainer $container, IRouter $router, $routes) {
+	public function __construct(DIContainer $container, Router $router, $routes) {
 		$this->routes = $routes;
 		$this->container = $container;
 		$this->router = $router;
diff --git a/lib/private/Route/Router.php b/lib/private/Route/Router.php
index 4e1264666e4948a6ee213e430e1db5a52ed92fbc..134e2cdadf08dc9591ab16b6e466a13f9aafc2ca 100644
--- a/lib/private/Route/Router.php
+++ b/lib/private/Route/Router.php
@@ -177,14 +177,6 @@ class Router implements IRouter {
 		\OC::$server->getEventLogger()->end('loadroutes' . $requestedApp);
 	}
 
-	/**
-	 * @return string
-	 * @deprecated
-	 */
-	public function getCacheKey() {
-		return '';
-	}
-
 	/**
 	 * @param string $name
 	 * @return \Symfony\Component\Routing\RouteCollection
diff --git a/lib/private/URLGenerator.php b/lib/private/URLGenerator.php
index d7de6cf92a2b68e03c9314aa59d0198762e247bc..f0de31568f4d647ecdebaeb436203186219acd75 100644
--- a/lib/private/URLGenerator.php
+++ b/lib/private/URLGenerator.php
@@ -39,12 +39,12 @@ declare(strict_types=1);
 
 namespace OC;
 
+use OC\Route\Router;
 use OCA\Theming\ThemingDefaults;
 use OCP\ICacheFactory;
 use OCP\IConfig;
 use OCP\IRequest;
 use OCP\IURLGenerator;
-use OCP\Route\IRouter;
 use RuntimeException;
 
 /**
@@ -57,13 +57,13 @@ class URLGenerator implements IURLGenerator {
 	private $cacheFactory;
 	/** @var IRequest */
 	private $request;
-	/** @var IRouter*/
+	/** @var Router */
 	private $router;
 
 	public function __construct(IConfig $config,
 								ICacheFactory $cacheFactory,
 								IRequest $request,
-								IRouter $router) {
+								Router $router) {
 		$this->config = $config;
 		$this->cacheFactory = $cacheFactory;
 		$this->request = $request;
diff --git a/lib/public/AppFramework/App.php b/lib/public/AppFramework/App.php
index 06d4b36384feae56be5a38b2974b4b1279d7b159..4cbd1f8d32c3192cc169ba7ce0b156c50f2c1ebd 100644
--- a/lib/public/AppFramework/App.php
+++ b/lib/public/AppFramework/App.php
@@ -41,6 +41,7 @@ declare(strict_types=1);
 namespace OCP\AppFramework;
 
 use OC\AppFramework\Routing\RouteConfig;
+use OC\Route\Router;
 use OC\ServerContainer;
 use OCP\Route\IRouter;
 
@@ -146,6 +147,10 @@ class App {
 	 * @deprecated 20.0.0 Just return an array from your routes.php
 	 */
 	public function registerRoutes(IRouter $router, array $routes) {
+		if (!($router instanceof Router)) {
+			throw new \RuntimeException('Can only setup routes with real router');
+		}
+
 		$routeConfig = new RouteConfig($this->container, $router, $routes);
 		$routeConfig->register();
 	}
diff --git a/lib/public/Route/IRouter.php b/lib/public/Route/IRouter.php
index d837265ac71e6fef329244833a5ee7de576df3b8..cb51cc0b640643e6dffe9415b4a5474c02807b01 100644
--- a/lib/public/Route/IRouter.php
+++ b/lib/public/Route/IRouter.php
@@ -36,50 +36,6 @@ namespace OCP\Route;
  */
 interface IRouter {
 
-	/**
-	 * Get the files to load the routes from
-	 *
-	 * @return string[]
-	 * @since 7.0.0
-	 * @deprecated 9.0.0
-	 */
-	public function getRoutingFiles();
-
-	/**
-	 * @return string
-	 * @since 7.0.0
-	 * @deprecated 9.0.0
-	 */
-	public function getCacheKey();
-
-	/**
-	 * Loads the routes
-	 *
-	 * @param null|string $app
-	 * @since 7.0.0
-	 * @deprecated 9.0.0
-	 */
-	public function loadRoutes($app = null);
-
-	/**
-	 * Sets the collection to use for adding routes
-	 *
-	 * @param string $name Name of the collection to use.
-	 * @return void
-	 * @since 7.0.0
-	 * @deprecated 9.0.0
-	 */
-	public function useCollection($name);
-
-	/**
-	 * returns the current collection name in use for adding routes
-	 *
-	 * @return string the collection name
-	 * @since 8.0.0
-	 * @deprecated 9.0.0
-	 */
-	public function getCurrentCollection();
-
 	/**
 	 * Create a \OCP\Route\IRoute.
 	 *
@@ -92,35 +48,4 @@ interface IRouter {
 	 * @deprecated 9.0.0
 	 */
 	public function create($name, $pattern, array $defaults = [], array $requirements = []);
-
-	/**
-	 * Find the route matching $url.
-	 *
-	 * @param string $url The url to find
-	 * @throws \Exception
-	 * @return void
-	 * @since 7.0.0
-	 * @deprecated 9.0.0
-	 */
-	public function match($url);
-
-	/**
-	 * Get the url generator
-	 *
-	 * @since 7.0.0
-	 * @deprecated 9.0.0
-	 */
-	public function getGenerator();
-
-	/**
-	 * Generate url based on $name and $parameters
-	 *
-	 * @param string $name Name of the route to use.
-	 * @param array $parameters Parameters for the route
-	 * @param bool $absolute
-	 * @return string
-	 * @since 7.0.0
-	 * @deprecated 9.0.0
-	 */
-	public function generate($name, $parameters = [], $absolute = false);
 }
diff --git a/ocs/v1.php b/ocs/v1.php
index f4ddc80804a39496f7effda89d9ddc6d1b5ef5f9..e513857658424b706698ad7f6cf5dbf97063af52 100644
--- a/ocs/v1.php
+++ b/ocs/v1.php
@@ -58,7 +58,7 @@ try {
 	// load all apps to get all api routes properly setup
 	OC_App::loadApps();
 
-	OC::$server->getRouter()->match('/ocsapp'.\OC::$server->getRequest()->getRawPathInfo());
+	OC::$server->get(\OC\Route\Router::class)->match('/ocsapp'.\OC::$server->getRequest()->getRawPathInfo());
 } catch (ResourceNotFoundException $e) {
 	OC_API::setContentType();
 
diff --git a/tests/lib/UrlGeneratorTest.php b/tests/lib/UrlGeneratorTest.php
index b5db39dbf39c3bd453cb7f791f8e318b9e9d2a75..dd2eb2ddc631a6b0263a00f6d05196999c510241 100644
--- a/tests/lib/UrlGeneratorTest.php
+++ b/tests/lib/UrlGeneratorTest.php
@@ -8,11 +8,11 @@
 
 namespace Test;
 
+use OC\Route\Router;
 use OCP\ICacheFactory;
 use OCP\IConfig;
 use OCP\IRequest;
 use OCP\IURLGenerator;
-use OCP\Route\IRouter;
 
 /**
  * Class UrlGeneratorTest
@@ -27,7 +27,7 @@ class UrlGeneratorTest extends \Test\TestCase {
 	private $cacheFactory;
 	/** @var \PHPUnit\Framework\MockObject\MockObject|IRequest */
 	private $request;
-	/** @var \PHPUnit\Framework\MockObject\MockObject|IRouter */
+	/** @var \PHPUnit\Framework\MockObject\MockObject|Router */
 	private $router;
 	/** @var IURLGenerator */
 	private $urlGenerator;
@@ -39,7 +39,7 @@ class UrlGeneratorTest extends \Test\TestCase {
 		$this->config = $this->createMock(IConfig::class);
 		$this->cacheFactory = $this->createMock(ICacheFactory::class);
 		$this->request = $this->createMock(IRequest::class);
-		$this->router = $this->createMock(IRouter::class);
+		$this->router = $this->createMock(Router::class);
 		$this->urlGenerator = new \OC\URLGenerator(
 			$this->config,
 			$this->cacheFactory,