diff --git a/apps/encryption/templates/settings-admin.php b/apps/encryption/templates/settings-admin.php
index 405dbaf703f385ea7571ae25005142a4b7139b0d..efe9c44ece768b87e90fdb89edd3b7603c7390a3 100644
--- a/apps/encryption/templates/settings-admin.php
+++ b/apps/encryption/templates/settings-admin.php
@@ -1,6 +1,6 @@
 <?php
 /** @var array $_ */
-/** @var OC_L10N $l */
+/** @var \OCP\IL10N $l */
 script('encryption', 'settings-admin');
 script('core', 'multiselect');
 style('encryption', 'settings-admin');
diff --git a/apps/encryption/templates/settings-personal.php b/apps/encryption/templates/settings-personal.php
index b92a9a197230481ac05ee9bf01918241976ab5b9..2ea55e15c8094f807edee2731a4ecc2c488c956f 100644
--- a/apps/encryption/templates/settings-personal.php
+++ b/apps/encryption/templates/settings-personal.php
@@ -1,6 +1,6 @@
 <?php
 	/** @var array $_ */
-	/** @var OC_L10N $l */
+	/** @var \OCP\IL10N $l */
 script('encryption', 'settings-personal');
 script('core', 'multiselect');
 ?>
diff --git a/apps/federatedfilesharing/templates/settings-admin.php b/apps/federatedfilesharing/templates/settings-admin.php
index c454eeba17bf2f0842493564632c4c4f608ebc1d..3ffd4bd5b2750da9c77795e6f849e068627a60ad 100644
--- a/apps/federatedfilesharing/templates/settings-admin.php
+++ b/apps/federatedfilesharing/templates/settings-admin.php
@@ -1,5 +1,5 @@
 <?php
-/** @var OC_L10N $l */
+/** @var \OCP\IL10N $l */
 /** @var array $_ */
 script('federatedfilesharing', 'settings-admin');
 ?>
diff --git a/apps/federatedfilesharing/templates/settings-personal.php b/apps/federatedfilesharing/templates/settings-personal.php
index 6b43f70495f8f2770410e48bff1cc840de2a8770..98a1cd7f751f9603b3ce6c436224ba5a6c679b44 100644
--- a/apps/federatedfilesharing/templates/settings-personal.php
+++ b/apps/federatedfilesharing/templates/settings-personal.php
@@ -1,5 +1,5 @@
 <?php
-/** @var OC_L10N $l */
+/** @var \OCP\IL10N $l */
 /** @var array $_ */
 script('federatedfilesharing', 'settings-personal');
 style('federatedfilesharing', 'settings-personal');
diff --git a/apps/federation/templates/settings-admin.php b/apps/federation/templates/settings-admin.php
index 70d051ad7d6457b3b35118ee6f50edfaecd22d5b..8773851c7687a5b03e7e8fa476d1e678f37bbb17 100644
--- a/apps/federation/templates/settings-admin.php
+++ b/apps/federation/templates/settings-admin.php
@@ -2,7 +2,7 @@
 /** @var array $_ */
 use OCA\Federation\TrustedServers;
 
-/** @var OC_L10N $l */
+/** @var \OCP\IL10N $l */
 script('federation', 'settings-admin');
 style('federation', 'settings-admin')
 ?>
diff --git a/apps/files/lib/Helper.php b/apps/files/lib/Helper.php
index 26bc020c8711762c93a15a97701fa980846f9de8..b6b209dea70d11fccbcc300b7de8b4d94e4c6931 100644
--- a/apps/files/lib/Helper.php
+++ b/apps/files/lib/Helper.php
@@ -45,7 +45,7 @@ class Helper {
 	public static function buildFileStorageStatistics($dir) {
 		// information about storage capacities
 		$storageInfo = \OC_Helper::getStorageInfo($dir);
-		$l = new \OC_L10N('files');
+		$l = \OC::$server->getL10N('files');
 		$maxUploadFileSize = \OCP\Util::maxUploadFilesize($dir, $storageInfo['free']);
 		$maxHumanFileSize = \OCP\Util::humanFileSize($maxUploadFileSize);
 		$maxHumanFileSize = $l->t('Upload (max. %s)', array($maxHumanFileSize));
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index 92345d3063e1d3d95336077f3cd99be3e8eba96a..17958d330b776f0a4fd418e28a3d9fd9852bf2fb 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -1,4 +1,4 @@
-<?php /** @var $l OC_L10N */ ?>
+<?php /** @var $l \OCP\IL10N */ ?>
 <?php $_['appNavigation']->printPage(); ?>
 <div id="app-content">
 	<?php foreach ($_['appContents'] as $content) { ?>
diff --git a/apps/files/templates/recentlist.php b/apps/files/templates/recentlist.php
index 1667eb4cc8d9a81552daaeafc289b61fd104bf14..6c271a07f5fabdc48d689ae9689d63c2a077ac61 100644
--- a/apps/files/templates/recentlist.php
+++ b/apps/files/templates/recentlist.php
@@ -1,4 +1,4 @@
-<?php /** @var $l OC_L10N */ ?>
+<?php /** @var $l \OCP\IL10N */ ?>
 <div id='notification'></div>
 
 <div id="emptycontent" class="hidden"></div>
diff --git a/apps/files/tests/ActivityTest.php b/apps/files/tests/ActivityTest.php
index e6199013e8158c177830976205b8ec634595fc62..65e914c1a547850202daa75ccbbe0ce0f0f4c809 100644
--- a/apps/files/tests/ActivityTest.php
+++ b/apps/files/tests/ActivityTest.php
@@ -24,6 +24,8 @@
 namespace OCA\Files\Tests;
 
 use OCA\Files\Activity;
+use OCP\IL10N;
+use OCP\L10N\IFactory;
 use Test\TestCase;
 
 /**
@@ -77,12 +79,8 @@ class ActivityTest extends TestCase {
 			$this->config
 		);
 
-		$this->l10nFactory = $this->getMockBuilder('OCP\L10N\IFactory')
-			->disableOriginalConstructor()
-			->getMock();
-		$deL10n = $this->getMockBuilder('OC_L10N')
-			->disableOriginalConstructor()
-			->getMock();
+		$this->l10nFactory = $this->createMock(IFactory::class);
+		$deL10n = $this->createMock(IL10N::class);
 		$deL10n->expects($this->any())
 			->method('t')
 			->willReturnCallback(function ($argument) {
@@ -92,8 +90,8 @@ class ActivityTest extends TestCase {
 		$this->l10nFactory->expects($this->any())
 			->method('get')
 			->willReturnMap([
-				['files', null, new \OC_L10N('files', 'en')],
-				['files', 'en', new \OC_L10N('files', 'en')],
+				['files', null, \OC::$server->getL10N('files', 'en')],
+				['files', 'en', \OC::$server->getL10N('files', 'en')],
 				['files', 'de', $deL10n],
 			]);
 
diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php
index b4b4bfa92fcfcab4fe40e480c68a49581854e4e0..179aaa373b32d1a5fd622fc89e8061d67af2d384 100644
--- a/apps/files/tests/Controller/ViewControllerTest.php
+++ b/apps/files/tests/Controller/ViewControllerTest.php
@@ -137,7 +137,7 @@ class ViewControllerTest extends TestCase {
 				'appname' => 'files',
 				'script' => 'list.php',
 				'order' => 0,
-				'name' => (string)new \OC_L10N_String(new \OC_L10N('files'), 'All files', []),
+				'name' => \OC::$server->getL10N('files')->t('All files'),
 				'active' => false,
 				'icon' => '',
 			],
@@ -146,7 +146,7 @@ class ViewControllerTest extends TestCase {
 				'appname' => 'files',
 				'script' => 'recentlist.php',
 				'order' => 2,
-				'name' => (string)new \OC_L10N_String(new \OC_L10N('files'), 'Recent', []),
+				'name' => \OC::$server->getL10N('files')->t('Recent'),
 				'active' => false,
 				'icon' => '',
 			],
@@ -164,7 +164,7 @@ class ViewControllerTest extends TestCase {
 				'appname' => 'files_sharing',
 				'script' => 'list.php',
 				'order' => 10,
-				'name' => (string)new \OC_L10N_String(new \OC_L10N('files_sharing'), 'Shared with you', []),
+				'name' => \OC::$server->getL10N('files_sharing')->t('Shared with you'),
 				'active' => false,
 				'icon' => '',
 			],
@@ -173,7 +173,7 @@ class ViewControllerTest extends TestCase {
 				'appname' => 'files_sharing',
 				'script' => 'list.php',
 				'order' => 15,
-				'name' => (string)new \OC_L10N_String(new \OC_L10N('files_sharing'), 'Shared with others', []),
+				'name' => \OC::$server->getL10N('files_sharing')->t('Shared with others'),
 				'active' => false,
 				'icon' => '',
 			],
@@ -182,7 +182,7 @@ class ViewControllerTest extends TestCase {
 				'appname' => 'files_sharing',
 				'script' => 'list.php',
 				'order' => 20,
-				'name' => (string)new \OC_L10N_String(new \OC_L10N('files_sharing'), 'Shared by link', []),
+				'name' => \OC::$server->getL10N('files_sharing')->t('Shared by link', []),
 				'active' => false,
 				'icon' => '',
 			],
@@ -191,7 +191,7 @@ class ViewControllerTest extends TestCase {
 				'appname' => 'systemtags',
 				'script' => 'list.php',
 				'order' => 25,
-				'name' => (string)new \OC_L10N_String(new \OC_L10N('systemtags'), 'Tags', []),
+				'name' => \OC::$server->getL10N('systemtags')->t('Tags'),
 				'active' => false,
 				'icon' => '',
 			],
@@ -200,7 +200,7 @@ class ViewControllerTest extends TestCase {
 				'appname' => 'files_trashbin',
 				'script' => 'list.php',
 				'order' => 50,
-				'name' => (string)new \OC_L10N_String(new \OC_L10N('files_trashbin'), 'Deleted files', []),
+				'name' => \OC::$server->getL10N('files_trashbin')->t('Deleted files'),
 				'active' => false,
 				'icon' => '',
 				],
diff --git a/apps/files_external/tests/Command/ListCommandTest.php b/apps/files_external/tests/Command/ListCommandTest.php
index 7caf61cf57cbc9763d3c49b26731368800687f17..f2f9fa94c025a0ebbb518d0f62ea6cc7fb9327d0 100644
--- a/apps/files_external/tests/Command/ListCommandTest.php
+++ b/apps/files_external/tests/Command/ListCommandTest.php
@@ -53,7 +53,7 @@ class ListCommandTest extends CommandTest {
 	}
 
 	public function testListAuthIdentifier() {
-		$l10n = $this->getMock('\OC_L10N', null, [], '', false);
+		$l10n = $this->getMock('\OPC\IL10N', null, [], '', false);
 		$session = $this->createMock(ISession::class);
 		$crypto = $this->createMock(ICrypto::class);
 		$instance = $this->getInstance();
diff --git a/apps/files_sharing/templates/authenticate.php b/apps/files_sharing/templates/authenticate.php
index 909e839177cbad02cd242eb63c7341c936a1ebd8..fbc1d72a3331cc5592b42254d9b94276dc6ee5a8 100644
--- a/apps/files_sharing/templates/authenticate.php
+++ b/apps/files_sharing/templates/authenticate.php
@@ -1,6 +1,6 @@
 <?php
 	/** @var $_ array */
-	/** @var $l OC_L10N */
+	/** @var $l \OCP\IL10N */
 	style('files_sharing', 'authenticate');
 	script('files_sharing', 'authenticate'); 
 ?>
diff --git a/apps/files_sharing/templates/list.php b/apps/files_sharing/templates/list.php
index 785b2bc72a4cc48d70edb71187a4300b45313c95..ec13b5c1f77799e00bcb93938b84589880d4799c 100644
--- a/apps/files_sharing/templates/list.php
+++ b/apps/files_sharing/templates/list.php
@@ -1,4 +1,4 @@
-<?php /** @var $l OC_L10N */ ?>
+<?php /** @var $l \OCP\IL10N */ ?>
 <div id='notification'></div>
 
 <div id="emptycontent" class="hidden"></div>
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index 80c7d4d7460e82b80fb73fbe59f16836e2d65238..e1a816e7feeb9a162965a06afd2e9483a3866c52 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -1,5 +1,5 @@
 <?php
-/** @var $l OC_L10N */
+/** @var $l \OCP\IL10N */
 /** @var $_ array */
 ?>
 
diff --git a/apps/files_trashbin/templates/index.php b/apps/files_trashbin/templates/index.php
index 9ea8a9d14c4d4b2b1e3c8f70ca7adff491893ed7..c3f0304d40883a4e4203f0107377682ed9308bc5 100644
--- a/apps/files_trashbin/templates/index.php
+++ b/apps/files_trashbin/templates/index.php
@@ -1,4 +1,4 @@
-<?php /** @var $l OC_L10N */ ?>
+<?php /** @var $l \OCP\IL10N */ ?>
 <div id="controls">
 	<div id="file_action_panel"></div>
 </div>
diff --git a/core/templates/404.php b/core/templates/404.php
index a0d2f0160b7e99e89c479fb0419739adca9ff7e7..79a67b3ce2c57433a678fd1381305f423121cddd 100644
--- a/core/templates/404.php
+++ b/core/templates/404.php
@@ -1,6 +1,6 @@
 <?php
 /** @var $_ array */
-/** @var $l OC_L10N */
+/** @var $l \OCP\IL10N */
 /** @var $theme OC_Theme */
 // @codeCoverageIgnoreStart
 if(!isset($_)) {//also provide standalone error page
diff --git a/core/templates/exception.php b/core/templates/exception.php
index 899ea29456c4e0a0bdaf3090ec3773d40818b887..e90a326815595af9eb82b1ac62f197446c1d92f8 100644
--- a/core/templates/exception.php
+++ b/core/templates/exception.php
@@ -1,6 +1,6 @@
 <?php
 	/** @var array $_ */
-	/** @var OC_L10N $l */
+	/** @var \OCP\IL10N $l */
 
 style('core', ['styles', 'header']);
 ?>
diff --git a/core/templates/login.php b/core/templates/login.php
index 36ed59e9309329eaba20ee9b7ff98d00834e6e95..46045f86b506979a5bd7b9deac868996844a0066 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -1,4 +1,4 @@
-<?php /** @var $l OC_L10N */ ?>
+<?php /** @var $l \OCP\IL10N */ ?>
 <?php
 vendor_script('jsTimezoneDetect/jstz');
 script('core', [
diff --git a/core/templates/twofactorshowchallenge.php b/core/templates/twofactorshowchallenge.php
index 197de8a288e9efbfe6e8eb1cbc804e10e4ddb23d..20b92be952020057f1383f2b3d9c3d396ac25def 100644
--- a/core/templates/twofactorshowchallenge.php
+++ b/core/templates/twofactorshowchallenge.php
@@ -1,5 +1,5 @@
 <?php
-/** @var $l OC_L10N */
+/** @var $l \OCP\IL10N */
 /** @var $_ array */
 /* @var $error boolean */
 $error = $_['error'];
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index 671093ff08bdbcee5c605c613ce36cf389dcb216..a1e845f132ecbd2b86e41397ae294e3e5e5d1b1e 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -533,6 +533,9 @@ class DIContainer extends SimpleContainer implements IAppContainer {
 		$this->query('OC\CapabilitiesManager')->registerCapability(function() use ($serviceName) {
 			return $this->query($serviceName);
 		});
+	}
 
+	public function query($name) {
+		return parent::query($name);
 	}
 }
diff --git a/lib/private/Setup/AbstractDatabase.php b/lib/private/Setup/AbstractDatabase.php
index 47c3e5ee1c68ae094fd055e3333201996450de6f..2b9d7afb367bf7db8a395c010636f489a3e0a866 100644
--- a/lib/private/Setup/AbstractDatabase.php
+++ b/lib/private/Setup/AbstractDatabase.php
@@ -29,12 +29,13 @@ namespace OC\Setup;
 use OC\AllConfig;
 use OC\DB\ConnectionFactory;
 use OCP\IConfig;
+use OCP\IL10N;
 use OCP\ILogger;
 use OCP\Security\ISecureRandom;
 
 abstract class AbstractDatabase {
 
-	/** @var \OC_L10N */
+	/** @var IL10N */
 	protected $trans;
 	/** @var string */
 	protected $dbDefinitionFile;
@@ -57,7 +58,7 @@ abstract class AbstractDatabase {
 	/** @var ISecureRandom */
 	protected $random;
 
-	public function __construct($trans, $dbDefinitionFile, IConfig $config, ILogger $logger, ISecureRandom $random) {
+	public function __construct(IL10N $trans, $dbDefinitionFile, IConfig $config, ILogger $logger, ISecureRandom $random) {
 		$this->trans = $trans;
 		$this->dbDefinitionFile = $dbDefinitionFile;
 		$this->config = $config;
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index 9f89174e7f96e62cf2760c10e05fd81bf93269b3..7878737bdef5a74854b97a760cff092778eb4787 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -127,7 +127,7 @@ class TemplateLayout extends \OC_Template {
 
 		}
 		// Send the language to our layouts
-		$this->assign('language', \OC_L10N::findLanguage());
+		$this->assign('language', \OC::$server->getL10NFactory()->findLanguage());
 
 		if(\OC::$server->getSystemConfig()->getValue('installed', false)) {
 			if (empty(self::$versionHash)) {
diff --git a/lib/private/legacy/l10n.php b/lib/private/legacy/l10n.php
deleted file mode 100644
index 94eff197ab610445cacac9f07d708bc8635dfebc..0000000000000000000000000000000000000000
--- a/lib/private/legacy/l10n.php
+++ /dev/null
@@ -1,343 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Bernhard Posselt <dev@bernhard-posselt.com>
- * @author Jakob Sack <mail@jakobsack.de>
- * @author Jan-Christoph Borchardt <hey@jancborchardt.net>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Robin McCorkell <robin@mccorkell.me.uk>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Thomas Tanghus <thomas@tanghus.net>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program.  If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-/**
- * This class is for i18n and l10n
- * @deprecated 9.0.0 Use \OC::$server->getL10NFactory()->get() instead
- */
-class OC_L10N implements \OCP\IL10N {
-	/**
-	 * cache
-	 */
-	protected static $cache = array();
-	protected static $availableLanguages = array();
-
-	/**
-	 * The best language
-	 */
-	protected static $language = '';
-
-	/**
-	 * App of this object
-	 */
-	protected $app;
-
-	/**
-	 * Language of this object
-	 */
-	protected $lang;
-
-	/**
-	 * Translations
-	 */
-	private $translations = array();
-
-	/**
-	 * Plural forms (string)
-	 */
-	private $pluralFormString = 'nplurals=2; plural=(n != 1);';
-
-	/**
-	 * Plural forms (function)
-	 */
-	private $pluralFormFunction = null;
-
-	/**
-	 * The constructor
-	 * @param string $app app requesting l10n
-	 * @param string $lang default: null Language
-	 *
-	 * If language is not set, the constructor tries to find the right
-	 * language.
-	 * @deprecated 9.0.0 Use \OC::$server->getL10NFactory()->get() instead
-	 */
-	public function __construct($app, $lang = null) {
-		$app = \OC_App::cleanAppId($app);
-		$this->app = $app;
-
-		if ($lang !== null) {
-			$lang = str_replace(array('\0', '/', '\\', '..'), '', $lang);
-		}
-
-		// Find the right language
-		if ($app !== 'test' && !\OC::$server->getL10NFactory()->languageExists($app, $lang)) {
-			$lang = \OC::$server->getL10NFactory()->findLanguage($app);
-		}
-
-		$this->lang = $lang;
-	}
-
-	/**
-	 * @param $transFile
-	 * @return bool
-	 */
-	public function load($transFile) {
-		$this->app = true;
-
-		$json = json_decode(file_get_contents($transFile), true);
-		if (!is_array($json)) {
-			$jsonError = json_last_error();
-			\OC::$server->getLogger()->warning("Failed to load $transFile - json error code: $jsonError", ['app' => 'l10n']);
-			return false;
-		}
-
-		$this->pluralFormString = $json['pluralForm'];
-		$translations = $json['translations'];
-
-		$this->translations = array_merge($this->translations, $translations);
-
-		return true;
-	}
-
-	protected function init() {
-		if ($this->app === true) {
-			return;
-		}
-		$app = $this->app;
-		$lang = $this->lang;
-		$this->app = true;
-
-		/** @var \OC\L10N\Factory $factory */
-		$factory = \OC::$server->getL10NFactory();
-		$languageFiles = $factory->getL10nFilesForApp($app, $lang);
-
-		$this->translations = [];
-		foreach ($languageFiles as $languageFile) {
-			$this->load($languageFile);
-		}
-	}
-
-	/**
-	 * Translating
-	 * @param string $text The text we need a translation for
-	 * @param array $parameters default:array() Parameters for sprintf
-	 * @return \OC_L10N_String Translation or the same text
-	 *
-	 * Returns the translation. If no translation is found, $text will be
-	 * returned.
-	 */
-	public function t($text, $parameters = array()) {
-		return new OC_L10N_String($this, $text, $parameters);
-	}
-
-	/**
-	 * Translating
-	 * @param string $text_singular the string to translate for exactly one object
-	 * @param string $text_plural the string to translate for n objects
-	 * @param integer $count Number of objects
-	 * @param array $parameters default:array() Parameters for sprintf
-	 * @return \OC_L10N_String Translation or the same text
-	 *
-	 * Returns the translation. If no translation is found, $text will be
-	 * returned. %n will be replaced with the number of objects.
-	 *
-	 * The correct plural is determined by the plural_forms-function
-	 * provided by the po file.
-	 *
-	 */
-	public function n($text_singular, $text_plural, $count, $parameters = array()) {
-		$this->init();
-		$identifier = "_${text_singular}_::_${text_plural}_";
-		if( array_key_exists($identifier, $this->translations)) {
-			return new OC_L10N_String( $this, $identifier, $parameters, $count );
-		}else{
-			if($count === 1) {
-				return new OC_L10N_String($this, $text_singular, $parameters, $count);
-			}else{
-				return new OC_L10N_String($this, $text_plural, $parameters, $count);
-			}
-		}
-	}
-
-	/**
-	 * getTranslations
-	 * @return array Fetch all translations
-	 *
-	 * Returns an associative array with all translations
-	 */
-	public function getTranslations() {
-		$this->init();
-		return $this->translations;
-	}
-
-	/**
-	 * getPluralFormFunction
-	 * @return string the plural form function
-	 *
-	 * returned function accepts the argument $n
-	 */
-	public function getPluralFormFunction() {
-		$this->init();
-		if (is_null($this->pluralFormFunction)) {
-			$this->pluralFormFunction = \OC::$server->getL10NFactory()->createPluralFunction($this->pluralFormString);
-		}
-		return $this->pluralFormFunction;
-	}
-
-	/**
-	 * Localization
-	 * @param string $type Type of localization
-	 * @param array|int|string $data parameters for this localization
-	 * @param array $options
-	 * @return string|false
-	 *
-	 * Returns the localized data.
-	 *
-	 * Implemented types:
-	 *  - date
-	 *    - Creates a date
-	 *    - params: timestamp (int/string)
-	 *  - datetime
-	 *    - Creates date and time
-	 *    - params: timestamp (int/string)
-	 *  - time
-	 *    - Creates a time
-	 *    - params: timestamp (int/string)
-	 *  - firstday: Returns the first day of the week (0 sunday - 6 saturday)
-	 *  - jsdate: Returns the short JS date format
-	 */
-	public function l($type, $data, $options = array()) {
-		if ($type === 'firstday') {
-			return $this->getFirstWeekDay();
-		}
-		if ($type === 'jsdate') {
-			return $this->getDateFormat();
-		}
-
-		$this->init();
-		$value = new DateTime();
-		if($data instanceof DateTime) {
-			$value = $data;
-		} elseif(is_string($data) && !is_numeric($data)) {
-			$data = strtotime($data);
-			$value->setTimestamp($data);
-		} else {
-			$value->setTimestamp($data);
-		}
-
-		// Use the language of the instance
-		$locale = $this->transformToCLDRLocale($this->getLanguageCode());
-
-		$options = array_merge(array('width' => 'long'), $options);
-		$width = $options['width'];
-		switch($type) {
-			case 'date':
-				return Punic\Calendar::formatDate($value, $width, $locale);
-			case 'datetime':
-				return Punic\Calendar::formatDatetime($value, $width, $locale);
-			case 'time':
-				return Punic\Calendar::formatTime($value, $width, $locale);
-			default:
-				return false;
-		}
-	}
-
-	/**
-	 * The code (en, de, ...) of the language that is used for this OC_L10N object
-	 *
-	 * @return string language
-	 */
-	public function getLanguageCode() {
-		return $this->lang;
-	}
-
-	/**
-	 * @return string
-	 * @throws \Punic\Exception\ValueNotInList
-	 * @deprecated 9.0.0 Use $this->l('jsdate', null) instead
-	 */
-	public function getDateFormat() {
-		$locale = $this->transformToCLDRLocale($this->getLanguageCode());
-		return Punic\Calendar::getDateFormat('short', $locale);
-	}
-
-	/**
-	 * @return int
-	 * @deprecated 9.0.0 Use $this->l('firstday', null) instead
-	 */
-	public function getFirstWeekDay() {
-		$locale = $this->transformToCLDRLocale($this->getLanguageCode());
-		return Punic\Calendar::getFirstWeekday($locale);
-	}
-
-	/**
-	 * @param string $locale
-	 * @return string
-	 */
-	private function transformToCLDRLocale($locale) {
-		if ($locale === 'sr@latin') {
-			return 'sr_latn';
-		}
-
-		return $locale;
-	}
-
-	/**
-	 * find the best language
-	 * @param string $app
-	 * @return string language
-	 *
-	 * If nothing works it returns 'en'
-	 * @deprecated 9.0.0 Use \OC::$server->getL10NFactory()->findLanguage() instead
-	 */
-	public static function findLanguage($app = null) {
-		return \OC::$server->getL10NFactory()->findLanguage($app);
-	}
-
-	/**
-	 * @return string
-	 * @deprecated 9.0.0 Use \OC::$server->getL10NFactory()->setLanguageFromRequest() instead
-	 */
-	public static function setLanguageFromRequest() {
-		return \OC::$server->getL10NFactory()->setLanguageFromRequest();
-	}
-
-	/**
-	 * find all available languages for an app
-	 * @param string $app App that needs to be translated
-	 * @return array an array of available languages
-	 * @deprecated 9.0.0 Use \OC::$server->getL10NFactory()->findAvailableLanguages() instead
-	 */
-	public static function findAvailableLanguages($app=null) {
-		return \OC::$server->getL10NFactory()->findAvailableLanguages($app);
-	}
-
-	/**
-	 * @param string $app
-	 * @param string $lang
-	 * @return bool
-	 * @deprecated 9.0.0 Use \OC::$server->getL10NFactory()->languageExists() instead
-	 */
-	public static function languageExists($app, $lang) {
-		return \OC::$server->getL10NFactory()->languageExists($app, $lang);
-	}
-}
diff --git a/lib/private/legacy/l10n/string.php b/lib/private/legacy/l10n/string.php
index 3d9d72e06902ad1637db2d57a08447e7628f6686..1410db6d730387744cc2db07b453236d6c636cf4 100644
--- a/lib/private/legacy/l10n/string.php
+++ b/lib/private/legacy/l10n/string.php
@@ -27,7 +27,7 @@
  */
 
 class OC_L10N_String implements JsonSerializable {
-	/** @var \OC_L10N|\OC\L10N\L10N */
+	/** @var \OC\L10N\L10N */
 	protected $l10n;
 
 	/** @var string */
@@ -40,12 +40,12 @@ class OC_L10N_String implements JsonSerializable {
 	protected $count;
 
 	/**
-	 * @param \OC_L10N|\OC\L10N\L10N $l10n
+	 * @param \OC\L10N\L10N $l10n
 	 * @param string|string[] $text
 	 * @param array $parameters
 	 * @param int $count
 	 */
-	public function __construct($l10n, $text, $parameters, $count = 1) {
+	public function __construct(\OC\L10N\L10N $l10n, $text, $parameters, $count = 1) {
 		$this->l10n = $l10n;
 		$this->text = $text;
 		$this->parameters = $parameters;
diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php
index 42fd0ba7db3ab62555374a4054ed01a954a6bd2d..e4c2caeafd7a55828e8e0eaae9c6af16e265f3d0 100644
--- a/lib/private/legacy/util.php
+++ b/lib/private/legacy/util.php
@@ -526,7 +526,7 @@ class OC_Util {
 	 */
 	public static function addTranslations($application, $languageCode = null, $prepend = false) {
 		if (is_null($languageCode)) {
-			$languageCode = \OC_L10N::findLanguage($application);
+			$languageCode = \OC::$server->getL10NFactory()->findLanguage($application);
 		}
 		if (!empty($application)) {
 			$path = "$application/l10n/$languageCode";
diff --git a/lib/public/Util.php b/lib/public/Util.php
index d5b0752553d3470302d8f0f14560059b73e7916c..08661fd88ca45b8075f0627a42fd9b25afe67380 100644
--- a/lib/public/Util.php
+++ b/lib/public/Util.php
@@ -195,7 +195,7 @@ class Util {
 	 * get l10n object
 	 * @param string $application
 	 * @param string|null $language
-	 * @return \OC_L10N
+	 * @return \OCP\IL10N
 	 * @since 6.0.0 - parameter $language was added in 8.0.0
 	 */
 	public static function getL10N($application, $language = null) {
diff --git a/settings/personal.php b/settings/personal.php
index a0d08aa0bd57a62b40538357c1b71b8a97d147ae..01c358de3aefa4cd7a77ea22e3d934506f9d48fc 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -68,7 +68,7 @@ $storageInfo=OC_Helper::getStorageInfo('/');
 $user = OC::$server->getUserManager()->get(OC_User::getUser());
 $email = $user->getEMailAddress();
 
-$userLang=$config->getUserValue( OC_User::getUser(), 'core', 'lang', OC_L10N::findLanguage() );
+$userLang=$config->getUserValue( OC_User::getUser(), 'core', 'lang', \OC::$server->getL10NFactory()->findLanguage() );
 $languageCodes = \OC::$server->getL10NFactory()->findAvailableLanguages();
 
 // array of common languages
diff --git a/tests/lib/DateTimeFormatterTest.php b/tests/lib/DateTimeFormatterTest.php
index 0d185128e2735475168c82e6dab910a33e50c710..85884c9bfb4c41f3c15d59f37071f3dfb225a659 100644
--- a/tests/lib/DateTimeFormatterTest.php
+++ b/tests/lib/DateTimeFormatterTest.php
@@ -34,7 +34,7 @@ class DateTimeFormatterTest extends TestCase {
 
 	protected function setUp() {
 		parent::setUp();
-		$this->formatter = new \OC\DateTimeFormatter(new \DateTimeZone('UTC'), new \OC_L10N('lib', 'en'));
+		$this->formatter = new \OC\DateTimeFormatter(new \DateTimeZone('UTC'), \OC::$server->getL10N('lib', 'en'));
 	}
 
 	protected function getTimestampAgo($time, $seconds = 0, $minutes = 0, $hours = 0, $days = 0, $years = 0) {
@@ -43,7 +43,7 @@ class DateTimeFormatterTest extends TestCase {
 
 	public function formatTimeSpanData() {
 		$time = 1416916800; // Use a fixed timestamp so we don't switch days/years with the getTimestampAgo
-		$deL10N = new \OC_L10N('lib', 'de');
+		$deL10N = \OC::$server->getL10N('lib', 'de');
 		return array(
 			array('seconds ago',	$time, $time),
 			array('1 minute ago',	$this->getTimestampAgo($time, 30, 1), $time),
@@ -81,7 +81,7 @@ class DateTimeFormatterTest extends TestCase {
 
 	public function formatDateSpanData() {
 		$time = 1416916800; // Use a fixed timestamp so we don't switch days/years with the getTimestampAgo
-		$deL10N = new \OC_L10N('lib', 'de');
+		$deL10N = \OC::$server->getL10N('lib', 'de');
 		return array(
 			// Normal testing
 			array('today',			$this->getTimestampAgo($time, 30, 15), $time),
diff --git a/tests/lib/L10N/L10nLegacyTest.php b/tests/lib/L10N/L10nLegacyTest.php
deleted file mode 100644
index 71b4e21f1a12af25ed82a6bdaf9863a1d90e3053..0000000000000000000000000000000000000000
--- a/tests/lib/L10N/L10nLegacyTest.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-/**
- * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-namespace Test\L10N;
-
-
-use OC_L10N;
-use DateTime;
-
-/**
- * Class Test_L10n
- */
-class L10nLegacyTest extends \Test\TestCase {
-
-	public function testGermanPluralTranslations() {
-		$l = new OC_L10N('test');
-		$transFile = \OC::$SERVERROOT.'/tests/data/l10n/de.json';
-
-		$l->load($transFile);
-		$this->assertEquals('1 Datei', (string)$l->n('%n file', '%n files', 1));
-		$this->assertEquals('2 Dateien', (string)$l->n('%n file', '%n files', 2));
-	}
-
-	public function testRussianPluralTranslations() {
-		$l = new OC_L10N('test');
-		$transFile = \OC::$SERVERROOT.'/tests/data/l10n/ru.json';
-
-		$l->load($transFile);
-		$this->assertEquals('1 файл', (string)$l->n('%n file', '%n files', 1));
-		$this->assertEquals('2 файла', (string)$l->n('%n file', '%n files', 2));
-		$this->assertEquals('6 файлов', (string)$l->n('%n file', '%n files', 6));
-		$this->assertEquals('21 файл', (string)$l->n('%n file', '%n files', 21));
-		$this->assertEquals('22 файла', (string)$l->n('%n file', '%n files', 22));
-		$this->assertEquals('26 файлов', (string)$l->n('%n file', '%n files', 26));
-
-		/*
-		  1 file	1 файл	1 папка
-		2-4 files	2-4 файла	2-4 папки
-		5-20 files	5-20 файлов	5-20 папок
-		21 files	21 файл	21 папка
-		22-24 files	22-24 файла	22-24 папки
-		25-30 files	25-30 файлов	25-30 папок
-		etc
-		100 files	100 файлов,	100 папок
-		1000 files	1000 файлов	1000 папок
-		*/
-	}
-
-	public function testCzechPluralTranslations() {
-		$l = new OC_L10N('test');
-		$transFile = \OC::$SERVERROOT.'/tests/data/l10n/cs.json';
-
-		$l->load($transFile);
-		$this->assertEquals('1 okno', (string)$l->n('%n window', '%n windows', 1));
-		$this->assertEquals('2 okna', (string)$l->n('%n window', '%n windows', 2));
-		$this->assertEquals('5 oken', (string)$l->n('%n window', '%n windows', 5));
-	}
-
-	public function localizationDataProvider() {
-		return array(
-			// timestamp as string
-			array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'datetime', '1234567890'),
-			array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'datetime', '1234567890'),
-			array('February 13, 2009', 'en', 'date', '1234567890'),
-			array('13. Februar 2009', 'de', 'date', '1234567890'),
-			array('11:31:30 PM GMT+0', 'en', 'time', '1234567890'),
-			array('23:31:30 GMT+0', 'de', 'time', '1234567890'),
-
-			// timestamp as int
-			array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'datetime', 1234567890),
-			array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'datetime', 1234567890),
-			array('February 13, 2009', 'en', 'date', 1234567890),
-			array('13. Februar 2009', 'de', 'date', 1234567890),
-			array('11:31:30 PM GMT+0', 'en', 'time', 1234567890),
-			array('23:31:30 GMT+0', 'de', 'time', 1234567890),
-
-			// DateTime object
-			array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'datetime', new DateTime('@1234567890')),
-			array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'datetime', new DateTime('@1234567890')),
-			array('February 13, 2009', 'en', 'date', new DateTime('@1234567890')),
-			array('13. Februar 2009', 'de', 'date', new DateTime('@1234567890')),
-			array('11:31:30 PM GMT+0', 'en', 'time', new DateTime('@1234567890')),
-			array('23:31:30 GMT+0', 'de', 'time', new DateTime('@1234567890')),
-
-			// en_GB
-			array('13 February 2009 at 23:31:30 GMT+0', 'en_GB', 'datetime', new DateTime('@1234567890')),
-			array('13 February 2009', 'en_GB', 'date', new DateTime('@1234567890')),
-			array('23:31:30 GMT+0', 'en_GB', 'time', new DateTime('@1234567890')),
-			array('13 February 2009 at 23:31:30 GMT+0', 'en-GB', 'datetime', new DateTime('@1234567890')),
-			array('13 February 2009', 'en-GB', 'date', new DateTime('@1234567890')),
-			array('23:31:30 GMT+0', 'en-GB', 'time', new DateTime('@1234567890')),
-		);
-	}
-
-	/**
-	 * @dataProvider localizationDataProvider
-	 */
-	public function testNumericStringLocalization($expectedDate, $lang, $type, $value) {
-		$l = new OC_L10N('test', $lang);
-		$this->assertSame($expectedDate, $l->l($type, $value));
-	}
-
-	public function firstDayDataProvider() {
-		return array(
-			array(1, 'de'),
-			array(0, 'en'),
-		);
-	}
-
-	/**
-	 * @dataProvider firstDayDataProvider
-	 * @param $expected
-	 * @param $lang
-	 */
-	public function testFirstWeekDay($expected, $lang) {
-		$l = new OC_L10N('test', $lang);
-		$this->assertSame($expected, $l->l('firstday', 'firstday'));
-	}
-
-	public function testFactoryGetLanguageCode() {
-		$factory = new \OC\L10N\Factory(
-			$this->getMockBuilder('OCP\IConfig')->getMock(),
-			$this->getMockBuilder('OCP\IRequest')->getMock(),
-			$this->getMockBuilder('OCP\IUserSession')->getMock(),
-			\OC::$SERVERROOT);
-		$l = $factory->get('lib', 'de');
-		$this->assertEquals('de', $l->getLanguageCode());
-	}
-
-	public function testServiceGetLanguageCode() {
-		$l = \OC::$server->getL10N('lib', 'de');
-		$this->assertEquals('de', $l->getLanguageCode());
-	}
-}
diff --git a/tests/lib/UtilTest.php b/tests/lib/UtilTest.php
index a1671191ab8846faa9dc1323cdc95eae819d47ed..60e50f750ea336a2ce7e39461699f1593e98f602 100644
--- a/tests/lib/UtilTest.php
+++ b/tests/lib/UtilTest.php
@@ -91,7 +91,7 @@ class UtilTest extends \Test\TestCase {
 
 		$selectedTimeZone = \OC::$server->getDateTimeZone()->getTimeZone(1350129205);
 		$this->assertEquals($expectedTimeZone, $selectedTimeZone->getName());
-		$newDateTimeFormatter = new \OC\DateTimeFormatter($selectedTimeZone, new \OC_L10N('lib', 'en'));
+		$newDateTimeFormatter = new \OC\DateTimeFormatter($selectedTimeZone, \OC::$server->getL10N('lib', 'en'));
 		$this->overwriteService('DateTimeFormatter', $newDateTimeFormatter);
 
 		$result = OC_Util::formatDate(1350129205, false);