diff --git a/lib/private/app.php b/lib/private/app.php
index 74b21b2b107c359b2e84750461f55a34310eb35b..e51fe73cb191ce746c22ee1404106471418ff324 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -73,6 +73,16 @@ class OC_App {
 		return str_replace(array('\0', '/', '\\', '..'), '', $app);
 	}
 
+	/**
+	 * Check if an app is loaded
+	 *
+	 * @param string $app
+	 * @return bool
+	 */
+	public static function isAppLoaded($app) {
+		return in_array($app, self::$loadedApps, true);
+	}
+
 	/**
 	 * loads all apps
 	 *
diff --git a/lib/private/route/router.php b/lib/private/route/router.php
index 489923660927bed79d0c1057d7c4d6fe6aa975bc..33669452f2d60e8025a8dc7f8df15de839e90321 100644
--- a/lib/private/route/router.php
+++ b/lib/private/route/router.php
@@ -150,6 +150,12 @@ class Router implements IRouter {
 		\OC::$server->getEventLogger()->start('loadroutes' . $requestedApp, 'Loading Routes');
 		foreach ($routingFiles as $app => $file) {
 			if (!isset($this->loadedApps[$app])) {
+				if (!\OC_App::isAppLoaded($app)) {
+					// app MUST be loaded before app routes
+					// try again next time loadRoutes() is called
+					$this->loaded = false;
+					continue;
+				}
 				$this->loadedApps[$app] = true;
 				$this->useCollection($app);
 				$this->requireRouteFile($file, $app);