diff --git a/apps/dav/appinfo/app.php b/apps/dav/appinfo/app.php
index dd9e0e9c096b8f02f530d058084aa24c5620bd39..a1a2377fb3b230c4168a3486b303a7540f886326 100644
--- a/apps/dav/appinfo/app.php
+++ b/apps/dav/appinfo/app.php
@@ -29,7 +29,8 @@ use Symfony\Component\EventDispatcher\GenericEvent;
 
 \OC_App::loadApps(['dav']);
 
-$app = new Application();
+/** @var Application $app */
+$app = \OC::$server->query(Application::class);
 $app->registerHooks();
 
 \OC::$server->registerService('CardDAVSyncService', function() use ($app) {
diff --git a/apps/encryption/appinfo/app.php b/apps/encryption/appinfo/app.php
index a39464e21f89e13e799a3452e2f97da6a1873642..97d7e8f7488953086ae8f5fa99ec8b097135454d 100644
--- a/apps/encryption/appinfo/app.php
+++ b/apps/encryption/appinfo/app.php
@@ -28,7 +28,8 @@ namespace OCA\Encryption\AppInfo;
 
 $encryptionSystemReady = \OC::$server->getEncryptionManager()->isReady();
 
-$app = new Application();
+/** @var Application $app */
+$app = \OC::$server->query(Application::class);
 if ($encryptionSystemReady) {
 	$app->registerEncryptionModule();
 	$app->registerHooks();
diff --git a/apps/encryption/appinfo/routes.php b/apps/encryption/appinfo/routes.php
index 22f3af7fbfb74bd3a4ac28ba5cb1ded8bb111728..f7eb7ff57757282d8fb09e51bae28a15bc3ed514 100644
--- a/apps/encryption/appinfo/routes.php
+++ b/apps/encryption/appinfo/routes.php
@@ -1,4 +1,5 @@
 <?php
+declare(strict_types=1);
 /**
  * @copyright Copyright (c) 2016, ownCloud, Inc.
  *
@@ -21,41 +22,37 @@
  *
  */
 
-
-namespace OCA\Encryption\AppInfo;
-
-(new Application())->registerRoutes($this, array('routes' => array(
-
-	[
-		'name' => 'Recovery#adminRecovery',
-		'url' => '/ajax/adminRecovery',
-		'verb' => 'POST'
-	],
-	[
-		'name' => 'Settings#updatePrivateKeyPassword',
-		'url' => '/ajax/updatePrivateKeyPassword',
-		'verb' => 'POST'
-	],
-	[
-		'name' => 'Settings#setEncryptHomeStorage',
-		'url' => '/ajax/setEncryptHomeStorage',
-		'verb' => 'POST'
-	],
-	[
-		'name' => 'Recovery#changeRecoveryPassword',
-		'url' => '/ajax/changeRecoveryPassword',
-		'verb' => 'POST'
-	],
-	[
-		'name' => 'Recovery#userSetRecovery',
-		'url' => '/ajax/userSetRecovery',
-		'verb' => 'POST'
-	],
-	[
-		'name' => 'Status#getStatus',
-		'url' => '/ajax/getStatus',
-		'verb' => 'GET'
+return [
+	'routes' => [
+		[
+			'name' => 'Recovery#adminRecovery',
+			'url' => '/ajax/adminRecovery',
+			'verb' => 'POST'
+		],
+		[
+			'name' => 'Settings#updatePrivateKeyPassword',
+			'url' => '/ajax/updatePrivateKeyPassword',
+			'verb' => 'POST'
+		],
+		[
+			'name' => 'Settings#setEncryptHomeStorage',
+			'url' => '/ajax/setEncryptHomeStorage',
+			'verb' => 'POST'
+		],
+		[
+			'name' => 'Recovery#changeRecoveryPassword',
+			'url' => '/ajax/changeRecoveryPassword',
+			'verb' => 'POST'
+		],
+		[
+			'name' => 'Recovery#userSetRecovery',
+			'url' => '/ajax/userSetRecovery',
+			'verb' => 'POST'
+		],
+		[
+			'name' => 'Status#getStatus',
+			'url' => '/ajax/getStatus',
+			'verb' => 'GET'
+		],
 	]
-
-
-)));
+];
diff --git a/apps/federation/appinfo/app.php b/apps/federation/appinfo/app.php
index 6c53810dd2c2266c27fc25d0ffcc97971c076d8f..23be2dd21243085559348d29daf836d3d315ccfd 100644
--- a/apps/federation/appinfo/app.php
+++ b/apps/federation/appinfo/app.php
@@ -22,5 +22,6 @@
 
 namespace OCA\Federation\AppInfo;
 
-$app = new Application();
+/** @var Application $app */
+$app = \OC::$server->query(Application::class);
 $app->registerHooks();
diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php
index b085d79b8c86b5175d1c84778e67c211c9e96e07..26fce8d1713e2cfc776f42ff1811854f566b6049 100644
--- a/apps/files/appinfo/routes.php
+++ b/apps/files/appinfo/routes.php
@@ -29,7 +29,8 @@ declare(strict_types=1);
  */
 namespace OCA\Files\AppInfo;
 
-$application = new Application();
+/** @var Application $application */
+$application = \OC::$server->query(Application::class);
 $application->registerRoutes(
 	$this,
 	[
diff --git a/apps/files_trashbin/appinfo/routes.php b/apps/files_trashbin/appinfo/routes.php
index 20d52adf3f0346a840113b6c15d771b599b9feda..9f85e27bedc868ce74666a9d5034dbb2d751bdd5 100644
--- a/apps/files_trashbin/appinfo/routes.php
+++ b/apps/files_trashbin/appinfo/routes.php
@@ -1,4 +1,5 @@
 <?php
+declare(strict_types=1);
 /**
  * @copyright Copyright (c) 2016, ownCloud, Inc.
  * @copyright Copyright (c) 2016, Roeland Jago Douma <roeland@famdouma.nl>
@@ -22,10 +23,7 @@
  *
  */
 
-namespace OCA\Files_Trashbin\AppInfo;
-
-$application = new Application();
-$application->registerRoutes($this, [
+return [
 	'routes' => [
 		[
 			'name' => 'Preview#getPreview',
@@ -33,4 +31,4 @@ $application->registerRoutes($this, [
 			'verb' => 'GET',
 		],
 	],
-]);
+];
diff --git a/apps/files_trashbin/lib/AppInfo/Application.php b/apps/files_trashbin/lib/AppInfo/Application.php
index 4baa82a6b4b5554dd94c1fc824a126dd78aa8676..a2613a13b410109433802832c33f11f44cccd701 100644
--- a/apps/files_trashbin/lib/AppInfo/Application.php
+++ b/apps/files_trashbin/lib/AppInfo/Application.php
@@ -46,12 +46,7 @@ class Application extends App {
 		/*
 		 * Register expiration
 		 */
-		$container->registerService('Expiration', function($c) {
-			return  new Expiration(
-				$c->query('ServerContainer')->getConfig(),
-				$c->query(ITimeFactory::class)
-			);
-		});
+		$container->registerAlias('Expiration', Expiration::class);
 
 		/*
 		 * Register $principalBackend for the DAV collection
diff --git a/apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php b/apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php
index e19b7ce604f75b51ec424b35b1a6e628eaaa1f82..919317a7b7aa0d11ed51c7be340b2c9670728eae 100644
--- a/apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php
+++ b/apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php
@@ -62,7 +62,8 @@ class ExpireTrash extends \OC\BackgroundJob\TimedJob {
 	}
 
 	protected function fixDIForJobs() {
-		$application = new Application();
+		/** @var Application $application */
+		$application = \OC::$server->query(Application::class);
 		$this->userManager = \OC::$server->getUserManager();
 		$this->expiration = $application->getContainer()->query('Expiration');
 	}
diff --git a/apps/files_trashbin/lib/Expiration.php b/apps/files_trashbin/lib/Expiration.php
index c7ad4e29f1855a4a3ad30b1552e76e57d9d8b997..933375c953727a62eae2c0a01b6e76291e2094a7 100644
--- a/apps/files_trashbin/lib/Expiration.php
+++ b/apps/files_trashbin/lib/Expiration.php
@@ -49,7 +49,11 @@ class Expiration {
 
 	public function __construct(IConfig $config,ITimeFactory $timeFactory){
 		$this->timeFactory = $timeFactory;
-		$this->retentionObligation = $config->getSystemValue('trashbin_retention_obligation', 'auto');
+		$this->setRetentionObligation($config->getSystemValue('trashbin_retention_obligation', 'auto'));
+	}
+
+	public function setRetentionObligation(string $obligation) {
+		$this->retentionObligation = $obligation;
 
 		if ($this->retentionObligation !== 'disabled') {
 			$this->parseRetentionObligation();
diff --git a/apps/files_trashbin/lib/Trashbin.php b/apps/files_trashbin/lib/Trashbin.php
index a06a5145d999be72f12c4ab348b120fcd7976296..34138c2170563b99d9d316430e3b3062cade63cf 100644
--- a/apps/files_trashbin/lib/Trashbin.php
+++ b/apps/files_trashbin/lib/Trashbin.php
@@ -747,7 +747,8 @@ class Trashbin {
 	 */
 	private static function scheduleExpire($user) {
 		// let the admin disable auto expire
-		$application = new Application();
+		/** @var Application $application */
+		$application = \OC::$server->query(Application::class);
 		$expiration = $application->getContainer()->query('Expiration');
 		if ($expiration->isEnabled()) {
 			\OC::$server->getCommandBus()->push(new Expire($user));
@@ -764,7 +765,8 @@ class Trashbin {
 	 * @return int size of deleted files
 	 */
 	protected static function deleteFiles($files, $user, $availableSpace) {
-		$application = new Application();
+		/** @var Application $application */
+		$application = \OC::$server->query(Application::class);
 		$expiration = $application->getContainer()->query('Expiration');
 		$size = 0;
 
@@ -791,8 +793,8 @@ class Trashbin {
 	 * @return integer[] size of deleted files and number of deleted files
 	 */
 	public static function deleteExpiredFiles($files, $user) {
-		$application = new Application();
-		$expiration = $application->getContainer()->query('Expiration');
+		/** @var Expiration $expiration */
+		$expiration = \OC::$server->query(Expiration::class);
 		$size = 0;
 		$count = 0;
 		foreach ($files as $file) {
diff --git a/apps/files_trashbin/tests/TrashbinTest.php b/apps/files_trashbin/tests/TrashbinTest.php
index ae10e2730759e20885a6c67e04654ffdaa5a3f67..22b6e87317ca517a08db3e91887b733416721c40 100644
--- a/apps/files_trashbin/tests/TrashbinTest.php
+++ b/apps/files_trashbin/tests/TrashbinTest.php
@@ -67,7 +67,7 @@ class TrashbinTest extends \Test\TestCase {
 		// clear share hooks
 		\OC_Hook::clear('OCP\\Share');
 		\OC::registerShareHooks();
-		$application = new \OCA\Files_Sharing\AppInfo\Application();
+		$application = \OC::$server->query(\OCA\Files_Sharing\AppInfo\Application::class);
 		$application->registerMountProviders();
 
 		//disable encryption
@@ -76,7 +76,9 @@ class TrashbinTest extends \Test\TestCase {
 		$config = \OC::$server->getConfig();
 		//configure trashbin
 		self::$rememberRetentionObligation = $config->getSystemValue('trashbin_retention_obligation', \OCA\Files_Trashbin\Expiration::DEFAULT_RETENTION_OBLIGATION);
-		$config->setSystemValue('trashbin_retention_obligation', 'auto, 2');
+		/** @var \OCA\Files_Trashbin\Expiration $expiration */
+		$expiration = \OC::$server->query(\OCA\Files_Trashbin\Expiration::class);
+		$expiration->setRetentionObligation('auto, 2');
 
 		// register hooks
 		\OCA\Files_Trashbin\Trashbin::registerHooks();
@@ -94,7 +96,9 @@ class TrashbinTest extends \Test\TestCase {
 			$user->delete();
 		}
 
-		\OC::$server->getConfig()->setSystemValue('trashbin_retention_obligation', self::$rememberRetentionObligation);
+		/** @var \OCA\Files_Trashbin\Expiration $expiration */
+		$expiration = \OC::$server->query(\OCA\Files_Trashbin\Expiration::class);
+		$expiration->setRetentionObligation(self::$rememberRetentionObligation);
 
 		\OC_Hook::clear();
 
@@ -152,7 +156,9 @@ class TrashbinTest extends \Test\TestCase {
 	 */
 	public function testExpireOldFiles() {
 
-		$currentTime = time();
+		/** @var \OCP\AppFramework\Utility\ITimeFactory $time */
+		$time = \OC::$server->query(\OCP\AppFramework\Utility\ITimeFactory::class);
+		$currentTime = $time->getTime();
 		$expireAt = $currentTime - 2 * 24 * 60 * 60;
 		$expiredDate = $currentTime - 3 * 24 * 60 * 60;
 
@@ -684,9 +690,9 @@ class TrashbinForTesting extends \OCA\Files_Trashbin\Trashbin {
 	 * @param OCP\Files\FileInfo[] $files
 	 * @param integer $limit
 	 */
-	public function dummyDeleteExpiredFiles($files, $limit) {
+	public function dummyDeleteExpiredFiles($files) {
 		// dummy value for $retention_obligation because it is not needed here
-		return parent::deleteExpiredFiles($files, TrashbinTest::TEST_TRASHBIN_USER1, $limit, 0);
+		return parent::deleteExpiredFiles($files, TrashbinTest::TEST_TRASHBIN_USER1);
 	}
 
 	/**
diff --git a/apps/files_versions/appinfo/routes.php b/apps/files_versions/appinfo/routes.php
index 5fe6eaaee14f6e8873724f149d352f49336ac9a8..95722dd7780a9645a8d0074e3b7ea260c44e802a 100644
--- a/apps/files_versions/appinfo/routes.php
+++ b/apps/files_versions/appinfo/routes.php
@@ -26,7 +26,8 @@
 
 namespace OCA\Files_Versions\AppInfo;
 
-$application = new Application();
+/** @var Application $application */
+$application = \OC::$server->query(Application::class);
 $application->registerRoutes($this, [
 	'routes' => [
 		[
diff --git a/apps/files_versions/lib/Storage.php b/apps/files_versions/lib/Storage.php
index c42083ff352bb85bf0024b923e2152af140427df..168145ffec172a6d71053924590dc87960c8f55e 100644
--- a/apps/files_versions/lib/Storage.php
+++ b/apps/files_versions/lib/Storage.php
@@ -850,8 +850,8 @@ class Storage {
 	 * @return Expiration
 	 */
 	protected static function getExpiration(){
-		if (is_null(self::$application)) {
-			self::$application = new Application();
+		if (self::$application === null) {
+			self::$application = \OC::$server->query(Application::class);
 		}
 		return self::$application->getContainer()->query(Expiration::class);
 	}
diff --git a/apps/provisioning_api/lib/FederatedFileSharingFactory.php b/apps/provisioning_api/lib/FederatedFileSharingFactory.php
index e856b2a9bed6716736c8d36e3de0887e2920b06b..0c7bb7068dd6c0ab6fbd2aba74adf6adb1a483d8 100644
--- a/apps/provisioning_api/lib/FederatedFileSharingFactory.php
+++ b/apps/provisioning_api/lib/FederatedFileSharingFactory.php
@@ -25,9 +25,19 @@ declare(strict_types=1);
 namespace OCA\Provisioning_API;
 
 use OCA\FederatedFileSharing\AppInfo\Application;
+use OCP\IServerContainer;
 
 class FederatedFileSharingFactory {
+
+	/** @var IServerContainer */
+	private $serverContainer;
+
+	public function __construct(IServerContainer $serverContainer) {
+		$this->serverContainer = $serverContainer;
+	}
+
 	public function get(): Application {
-		return new Application();
+		return $this->serverContainer->query(Application::class);
 	}
+
 }
diff --git a/apps/settings/appinfo/routes.php b/apps/settings/appinfo/routes.php
index 3c80cc05386c2438947cde8e2ccefdbc1733e691..f4f29a5085b1c9c17b9cdd2e0e4d00e443ab2bb3 100644
--- a/apps/settings/appinfo/routes.php
+++ b/apps/settings/appinfo/routes.php
@@ -38,7 +38,8 @@ namespace OCA\Settings;
 
 use OCA\Settings\AppInfo\Application;
 
-$application = new Application();
+/** @var Application $application */
+$application = \OC::$server->query(Application::class);
 $this->useCollection('root');
 $application->registerRoutes($this, [
 	'resources' => [
diff --git a/apps/settings/lib/Settings/Personal/PersonalInfo.php b/apps/settings/lib/Settings/Personal/PersonalInfo.php
index b0c4d6faf483e6910eb219e7423fcf68d091b68e..1cf81ec9659ceb2f55a46105d0d42f2ca100dfd4 100644
--- a/apps/settings/lib/Settings/Personal/PersonalInfo.php
+++ b/apps/settings/lib/Settings/Personal/PersonalInfo.php
@@ -90,7 +90,7 @@ class PersonalInfo implements ISettings {
 		$federatedFileSharingEnabled = $this->appManager->isEnabledForUser('federatedfilesharing');
 		$lookupServerUploadEnabled = false;
 		if($federatedFileSharingEnabled) {
-			$federatedFileSharing = new Application();
+			$federatedFileSharing = \OC::$server->query(Application::class);
 			$shareProvider = $federatedFileSharing->getFederatedShareProvider();
 			$lookupServerUploadEnabled = $shareProvider->isLookupServerUploadEnabled();
 		}
diff --git a/core/routes.php b/core/routes.php
index 829fa8576c87800f94ef1aeda9099ae1fb076228..0e6efae59b56cdca86cb3fc5d600b8b8cf7a226d 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -34,7 +34,8 @@
 
 use OC\Core\Application;
 
-$application = new Application();
+/** @var Application $application */
+$application = \OC::$server->query(Application::class);
 $application->registerRoutes($this, [
 	'routes' => [
 		['name' => 'lost#email', 'url' => '/lostpassword/email', 'verb' => 'POST'],
diff --git a/lib/base.php b/lib/base.php
index 7674c16c26b5b57262118e5d5fb8b03077607f49..510a960e4350db167d244150485e69c418857eff 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -727,7 +727,7 @@ class OC {
 		// Make sure that the application class is not loaded before the database is setup
 		if ($systemConfig->getValue("installed", false)) {
 			OC_App::loadApp('settings');
-			$settings = new \OCA\Settings\AppInfo\Application();
+			$settings = \OC::$server->query(\OCA\Settings\AppInfo\Application::class);
 			$settings->register();
 		}
 
diff --git a/lib/private/Route/Router.php b/lib/private/Route/Router.php
index 3d91a33cd8a377b5e7c1b3391abccdf75d5b1ad2..4c83f251012cb977f27e39d3966466967ad20c2d 100644
--- a/lib/private/Route/Router.php
+++ b/lib/private/Route/Router.php
@@ -371,7 +371,7 @@ class Router implements IRouter {
 			$applicationClassName = $appNameSpace . '\\AppInfo\\Application';
 
 			if (class_exists($applicationClassName)) {
-				$application = new $applicationClassName();
+				$application = \OC::$server->query($applicationClassName);
 			} else {
 				$application = new App($appName);
 			}
diff --git a/lib/private/ServerContainer.php b/lib/private/ServerContainer.php
index b67b4d1e701535b9f4bef379a3b7f7397fab809f..704d207223bf2a18a6edc582d489a325109228b7 100644
--- a/lib/private/ServerContainer.php
+++ b/lib/private/ServerContainer.php
@@ -100,8 +100,9 @@ class ServerContainer extends SimpleContainer {
 			if (!isset($this->hasNoAppContainer[$namespace])) {
 				$applicationClassName = 'OCA\\' . $sensitiveNamespace . '\\AppInfo\\Application';
 				if (class_exists($applicationClassName)) {
-					new $applicationClassName();
+					$app = new $applicationClassName();
 					if (isset($this->appContainers[$namespace])) {
+						$this->appContainers[$namespace]->offsetSet($applicationClassName, $app);
 						return $this->appContainers[$namespace];
 					}
 				}