diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php
index aed53d5db5a33de4f8a7cb48cb2a0b15e1ff5a53..323b70706ce1dda148944c3504a2c020bbad0159 100644
--- a/apps/files/ajax/delete.php
+++ b/apps/files/ajax/delete.php
@@ -2,7 +2,7 @@
 
 OCP\JSON::checkLoggedIn();
 OCP\JSON::callCheck();
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 
 // Get data
diff --git a/apps/files/ajax/download.php b/apps/files/ajax/download.php
index 4b4a7f8948d4d2bbd1a2a19fec65484b79fa1285..b2e144c4b8f5540859dd2e37573c40bb0d9fc3af 100644
--- a/apps/files/ajax/download.php
+++ b/apps/files/ajax/download.php
@@ -23,7 +23,7 @@
 
 // Check if we are a user
 OCP\User::checkLoggedIn();
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 $files = $_GET["files"];
 $dir = $_GET["dir"];
diff --git a/apps/files/ajax/getstoragestats.php b/apps/files/ajax/getstoragestats.php
index dd8af39bada3ec55abb2c0fde56b000463823faa..4ab5b9a779c6d084e95679a55394fc0976761e00 100644
--- a/apps/files/ajax/getstoragestats.php
+++ b/apps/files/ajax/getstoragestats.php
@@ -7,7 +7,7 @@ if (isset($_GET['dir'])) {
 }
 
 OCP\JSON::checkLoggedIn();
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 // send back json
 OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics($dir)));
diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php
index b4641343ed4f2b0c534c888f5dfc23668ca60e0f..2f2f7054566b6fe75dc8fd2fc0823dc60c553ead 100644
--- a/apps/files/ajax/list.php
+++ b/apps/files/ajax/list.php
@@ -1,7 +1,7 @@
 <?php
 
 OCP\JSON::checkLoggedIn();
-\OC::$session->close();
+\OC::$server->getSession()->close();
 $l = OC_L10N::get('files');
 
 // Load the files
diff --git a/apps/files/ajax/mimeicon.php b/apps/files/ajax/mimeicon.php
index 6557ff941ac1dc8095d9f62ce7948fcce2e5e49b..fdbcc441a7844eeaab32b0220e8c037dfbaffc8b 100644
--- a/apps/files/ajax/mimeicon.php
+++ b/apps/files/ajax/mimeicon.php
@@ -1,4 +1,4 @@
 <?php
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 print OC_Helper::mimetypeIcon($_GET['mime']);
diff --git a/apps/files/ajax/move.php b/apps/files/ajax/move.php
index 0a8dbc24a650abb41f5616f140c51fe0b5e628a8..e9a34a1b2f9c72ce7287d10ca05655366ad0a545 100644
--- a/apps/files/ajax/move.php
+++ b/apps/files/ajax/move.php
@@ -2,7 +2,7 @@
 
 OCP\JSON::checkLoggedIn();
 OCP\JSON::callCheck();
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 // Get data
 $dir = stripslashes($_POST["dir"]);
diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php
index 9cfe51a6218e635e80cadb3ea53f00c803ad528d..8173816af3a82af0f7fb6c875ed30ddfc3659189 100644
--- a/apps/files/ajax/newfile.php
+++ b/apps/files/ajax/newfile.php
@@ -7,7 +7,7 @@ if(!OC_User::isLoggedIn()) {
 	exit;
 }
 
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 // Get the params
 $dir = isset( $_REQUEST['dir'] ) ? '/'.trim($_REQUEST['dir'], '/\\') : '';
diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php
index 89c241189d71cf8f0fc3332e4c79925e58a79d4b..4ea2ee71de29508d78ca383fdc8171ae9cc8b04c 100644
--- a/apps/files/ajax/newfolder.php
+++ b/apps/files/ajax/newfolder.php
@@ -5,7 +5,7 @@
 
 OCP\JSON::checkLoggedIn();
 OCP\JSON::callCheck();
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 // Get the params
 $dir = isset( $_POST['dir'] ) ? stripslashes($_POST['dir']) : '';
diff --git a/apps/files/ajax/rename.php b/apps/files/ajax/rename.php
index fa3ddace63d4b887d077bd78bee231589dc5aade..e5fdf8af98c07268acd1dceea61062dc3d91bbf8 100644
--- a/apps/files/ajax/rename.php
+++ b/apps/files/ajax/rename.php
@@ -23,7 +23,7 @@
 
 OCP\JSON::checkLoggedIn();
 OCP\JSON::callCheck();
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 $files = new \OCA\Files\App(
 	\OC\Files\Filesystem::getView(),
diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php
index d5d884838013407ced18732a3b576a4ab5000c7d..3ec7f9394b115e2d1a29be20e47a2f41de4b5a49 100644
--- a/apps/files/ajax/scan.php
+++ b/apps/files/ajax/scan.php
@@ -1,6 +1,6 @@
 <?php
 set_time_limit(0); //scanning can take ages
-\OC::$session->close();
+\OC::$server->getSession()->close();
 
 $force = (isset($_GET['force']) and ($_GET['force'] === 'true'));
 $dir = isset($_GET['dir']) ? $_GET['dir'] : '';
diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
index b737d5f8710aa7fe975a3b29f65b321d225126df..4eca13f1933848391bba23520181c87c912f6b4c 100644
--- a/apps/files/ajax/upload.php
+++ b/apps/files/ajax/upload.php
@@ -68,7 +68,7 @@ if (empty($_POST['dirToken'])) {
 OCP\JSON::callCheck();
 if (!\OCP\App::isEnabled('files_encryption')) {
 	// encryption app need to create keys later, so can't close too early
-	\OC::$session->close();
+	\OC::$server->getSession()->close();
 }
 
 
diff --git a/apps/files_encryption/lib/session.php b/apps/files_encryption/lib/session.php
index ff8fbd24ecbbc44e5a58274cf6e10a12ac88ad65..7bd4fd02421da2ecb3239f3f8823b9701231061b 100644
--- a/apps/files_encryption/lib/session.php
+++ b/apps/files_encryption/lib/session.php
@@ -117,7 +117,7 @@ class Session {
 	 */
 	public function setPrivateKey($privateKey) {
 
-		\OC::$session->set('privateKey', $privateKey);
+		\OC::$server->getSession()->set('privateKey', $privateKey);
 
 		return true;
 
@@ -140,7 +140,7 @@ class Session {
 	 */
 	public function setInitialized($init) {
 
-		\OC::$session->set('encryptionInitialized', $init);
+		\OC::$server->getSession()->set('encryptionInitialized', $init);
 
 		return true;
 
@@ -150,8 +150,8 @@ class Session {
 	 * remove encryption keys and init status from session
 	 */
 	public function closeSession() {
-		\OC::$session->remove('encryptionInitialized');
-		\OC::$session->remove('privateKey');
+		\OC::$server->getSession()->remove('encryptionInitialized');
+		\OC::$server->getSession()->remove('privateKey');
 	}
 
 
@@ -162,8 +162,8 @@ class Session {
 	 * @note this doesn not indicate of the init was successful, we just remeber the try!
 	 */
 	public function getInitialized() {
-		if (!is_null(\OC::$session->get('encryptionInitialized'))) {
-			return \OC::$session->get('encryptionInitialized');
+		if (!is_null(\OC::$server->getSession()->get('encryptionInitialized'))) {
+			return \OC::$server->getSession()->get('encryptionInitialized');
 		} else {
 			return self::NOT_INITIALIZED;
 		}
@@ -179,8 +179,8 @@ class Session {
 		if (\OCA\Encryption\Helper::isPublicAccess()) {
 			return $this->getPublicSharePrivateKey();
 		} else {
-			if (!is_null(\OC::$session->get('privateKey'))) {
-				return \OC::$session->get('privateKey');
+			if (!is_null(\OC::$server->getSession()->get('privateKey'))) {
+				return \OC::$server->getSession()->get('privateKey');
 			} else {
 				return false;
 			}
@@ -194,7 +194,7 @@ class Session {
 	 */
 	public function setPublicSharePrivateKey($privateKey) {
 
-		\OC::$session->set('publicSharePrivateKey', $privateKey);
+		\OC::$server->getSession()->set('publicSharePrivateKey', $privateKey);
 
 		return true;
 
@@ -207,8 +207,8 @@ class Session {
 	 */
 	public function getPublicSharePrivateKey() {
 
-		if (!is_null(\OC::$session->get('publicSharePrivateKey'))) {
-			return \OC::$session->get('publicSharePrivateKey');
+		if (!is_null(\OC::$server->getSession()->get('publicSharePrivateKey'))) {
+			return \OC::$server->getSession()->get('publicSharePrivateKey');
 		} else {
 			return false;
 		}
diff --git a/apps/files_external/lib/smb_oc.php b/apps/files_external/lib/smb_oc.php
index 0c79c06c5df13863b68d295c4466f5d04234ae87..e6f3aaf40528bb5c848fafd659bd30d096744553 100644
--- a/apps/files_external/lib/smb_oc.php
+++ b/apps/files_external/lib/smb_oc.php
@@ -14,12 +14,12 @@ class SMB_OC extends \OC\Files\Storage\SMB {
 	private $username_as_share;
 
 	public function __construct($params) {
-		if (isset($params['host']) && \OC::$session->exists('smb-credentials')) {
+		if (isset($params['host']) && \OC::$server->getSession()->exists('smb-credentials')) {
 			$host=$params['host'];
 			$this->username_as_share = ($params['username_as_share'] === 'true');
 
-			$params_auth = \OC::$session->get('smb-credentials');
-			$user = \OC::$session->get('loginname');
+			$params_auth = \OC::$server->getSession()->get('smb-credentials');
+			$user = \OC::$server->getSession()->get('loginname');
 			$password = $params_auth['password'];
 
 			$root=isset($params['root'])?$params['root']:'/';
@@ -45,7 +45,7 @@ class SMB_OC extends \OC\Files\Storage\SMB {
 	}
 
 	public static function login( $params ) {
-		\OC::$session->set('smb-credentials', $params);
+		\OC::$server->getSession()->set('smb-credentials', $params);
 	}
 
 	public function isSharable($path) {
diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php
index f444404c2b18e458055291e3ae37b865713d5efe..e7ca4fcccd4e25f9e765af3ba561b0b2ffd36f1a 100644
--- a/apps/files_sharing/lib/helper.php
+++ b/apps/files_sharing/lib/helper.php
@@ -106,7 +106,7 @@ class Helper {
 					return false;
 				} else {
 					// Save item id in session for future requests
-					\OC::$session->set('public_link_authenticated', $linkItem['id']);
+					\OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']);
 				}
 			} else {
 				\OCP\Util::writeLog('share', 'Unknown share type '.$linkItem['share_type']
@@ -117,8 +117,8 @@ class Helper {
 		}
 		else {
 			// not authenticated ?
-			if ( ! \OC::$session->exists('public_link_authenticated')
-				|| \OC::$session->get('public_link_authenticated') !== $linkItem['id']) {
+			if ( ! \OC::$server->getSession()->exists('public_link_authenticated')
+				|| \OC::$server->getSession()->get('public_link_authenticated') !== $linkItem['id']) {
 				return false;
 			}
 		}
diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php
index 746bdf87c17dd779d39314f156fd96aeea90c3f3..bcf99d01edb2c20b4d97a57cca6d78c67470422e 100644
--- a/apps/files_sharing/public.php
+++ b/apps/files_sharing/public.php
@@ -63,7 +63,7 @@ if (isset($path)) {
 					exit();
 				} else {
 					// Save item id in session for future requests
-					\OC::$session->set('public_link_authenticated', $linkItem['id']);
+					\OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']);
 				}
 			} else {
 				OCP\Util::writeLog('share', 'Unknown share type '.$linkItem['share_type']
@@ -76,8 +76,8 @@ if (isset($path)) {
 
 		} else {
 			// Check if item id is set in session
-			if ( ! \OC::$session->exists('public_link_authenticated')
-				|| \OC::$session->get('public_link_authenticated') !== $linkItem['id']
+			if ( ! \OC::$server->getSession()->exists('public_link_authenticated')
+				|| \OC::$server->getSession()->get('public_link_authenticated') !== $linkItem['id']
 			) {
 				// Prompt for password
 				OCP\Util::addStyle('files_sharing', 'authenticate');
diff --git a/cron.php b/cron.php
index f0acd2f04920ad00221403659c2ed9525896430b..c48f17ed095fc6ec4b181d200c01789d25f60b00 100644
--- a/cron.php
+++ b/cron.php
@@ -56,10 +56,10 @@ try {
 	// load all apps to get all api routes properly setup
 	OC_App::loadApps();
 
-	\OC::$session->close();
+	\OC::$server->getSession()->close();
 
 	// initialize a dummy memory session
-	\OC::$session = new \OC\Session\Memory('');
+	\OC::$server->setSession(new \OC\Session\Memory(''));
 
 	$logger = \OC_Log::$object;
 
diff --git a/lib/base.php b/lib/base.php
index 1c69d6f5671f8e4e6401e6453a1be9010fca43b8..2dd107411f052d9b02fb31b119633fa1060a4453 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -71,6 +71,7 @@ class OC {
 	public static $CLI = false;
 
 	/**
+	 * @deprecated use \OC::$session->getSession() instead
 	 * @var \OC\Session\Session
 	 */
 	public static $session = null;
@@ -375,19 +376,20 @@ class OC {
 		$cookie_path = OC::$WEBROOT ? : '/';
 		ini_set('session.cookie_path', $cookie_path);
 
-		//set the session object to a dummy session so code relying on the session existing still works
-		self::$session = new \OC\Session\Memory('');
-
 		// Let the session name be changed in the initSession Hook
 		$sessionName = OC_Util::getInstanceId();
 
 		try {
 			// Allow session apps to create a custom session object
 			$useCustomSession = false;
-			OC_Hook::emit('OC', 'initSession', array('session' => &self::$session, 'sessionName' => &$sessionName, 'useCustomSession' => &$useCustomSession));
-			if(!$useCustomSession) {
+			$session = self::$server->getSession();
+			OC_Hook::emit('OC', 'initSession', array('session' => &$session, 'sessionName' => &$sessionName, 'useCustomSession' => &$useCustomSession));
+			if($useCustomSession) {
+				// use the session reference as the new Session
+				self::$server->setSession($session);
+			} else {
 				// set the session name to the instance id - which is unique
-				self::$session = new \OC\Session\Internal($sessionName);
+				self::$server->setSession(new \OC\Session\Internal($sessionName));
 			}
 			// if session cant be started break with http 500 error
 		} catch (Exception $e) {
@@ -398,15 +400,19 @@ class OC {
 
 		$sessionLifeTime = self::getSessionLifeTime();
 		// regenerate session id periodically to avoid session fixation
-		if (!self::$session->exists('SID_CREATED')) {
-			self::$session->set('SID_CREATED', time());
-		} else if (time() - self::$session->get('SID_CREATED') > $sessionLifeTime / 2) {
+		/**
+		 * @var \OCP\ISession $session
+		 */
+		$session = self::$server->getSession();
+		if (!$session->exists('SID_CREATED')) {
+			$session->set('SID_CREATED', time());
+		} else if (time() - $session->get('SID_CREATED') > $sessionLifeTime / 2) {
 			session_regenerate_id(true);
-			self::$session->set('SID_CREATED', time());
+			$session->set('SID_CREATED', time());
 		}
 
 		// session timeout
-		if (self::$session->exists('LAST_ACTIVITY') && (time() - self::$session->get('LAST_ACTIVITY') > $sessionLifeTime)) {
+		if ($session->exists('LAST_ACTIVITY') && (time() - $session->get('LAST_ACTIVITY') > $sessionLifeTime)) {
 			if (isset($_COOKIE[session_name()])) {
 				setcookie(session_name(), '', time() - 42000, $cookie_path);
 			}
@@ -415,7 +421,7 @@ class OC {
 			session_start();
 		}
 
-		self::$session->set('LAST_ACTIVITY', time());
+		$session->set('LAST_ACTIVITY', time());
 	}
 
 	/**
@@ -447,9 +453,6 @@ class OC {
 		self::$loader->registerPrefix('Pimple', '3rdparty/Pimple');
 		spl_autoload_register(array(self::$loader, 'load'));
 
-		// make a dummy session available as early as possible since error pages need it
-		self::$session = new \OC\Session\Memory('');
-
 		// set some stuff
 		//ob_start();
 		error_reporting(E_ALL | E_STRICT);
@@ -544,7 +547,7 @@ class OC {
 
 		// User and Groups
 		if (!OC_Config::getValue("installed", false)) {
-			self::$session->set('user_id', '');
+			self::$server->getSession()->set('user_id', '');
 		}
 
 		OC_User::useBackend(new OC_User_Database());
@@ -783,7 +786,7 @@ class OC {
 					if (isset($_COOKIE['oc_ignore_php_auth_user'])) {
 						// Ignore HTTP Authentication for 5 more mintues.
 						setcookie('oc_ignore_php_auth_user', $_SERVER['PHP_AUTH_USER'], time() + 300, OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : ''));
-					} elseif ($_SERVER['PHP_AUTH_USER'] === self::$session->get('loginname')) {
+					} elseif ($_SERVER['PHP_AUTH_USER'] === self::$server->getSession()->get('loginname')) {
 						// Ignore HTTP Authentication to allow a different user to log in.
 						setcookie('oc_ignore_php_auth_user', $_SERVER['PHP_AUTH_USER'], 0, OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : ''));
 					}
@@ -930,7 +933,7 @@ class OC {
 		if (OC_User::login($_POST["user"], $_POST["password"])) {
 			// setting up the time zone
 			if (isset($_POST['timezone-offset'])) {
-				self::$session->set('timezone', $_POST['timezone-offset']);
+				self::$server->getSession()->set('timezone', $_POST['timezone-offset']);
 			}
 
 			$userid = OC_User::getUser();
diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php
index 61a2333eceeb38d4ddad732ebd50098b869d2fc5..e7efa3fa219a73ce64aaba5676716141014a54b7 100644
--- a/lib/private/appframework/dependencyinjection/dicontainer.php
+++ b/lib/private/appframework/dependencyinjection/dicontainer.php
@@ -191,7 +191,7 @@ class DIContainer extends SimpleContainer implements IAppContainer{
 	}
 
 	private function getUserId() {
-		return \OC::$session->get('user_id');
+		return \OC::$server->getSession()->get('user_id');
 	}
 
 	/**
diff --git a/lib/private/connector/sabre/auth.php b/lib/private/connector/sabre/auth.php
index b1ef698583d246bade233bd9a6020af0ff2582e5..6e1baca93323aaae9b1bc76618c280996a1ddf4b 100644
--- a/lib/private/connector/sabre/auth.php
+++ b/lib/private/connector/sabre/auth.php
@@ -78,7 +78,7 @@ class OC_Connector_Sabre_Auth extends \Sabre\DAV\Auth\Backend\AbstractBasic {
 		$result = $this->auth($server, $realm);
 
 		// close the session - right after authentication there is not need to write to the session any more
-		\OC::$session->close();
+		\OC::$server->getSession()->close();
 
 		return $result;
     }
diff --git a/lib/private/server.php b/lib/private/server.php
index aab3c82bfeb8dd8a610045bfd621d65711799481..53aab7a586a0a38a6961a9c6bc6ced768c6920ba 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -10,6 +10,7 @@ use OC\DB\ConnectionWrapper;
 use OC\Files\Node\Root;
 use OC\Files\View;
 use OCP\IServerContainer;
+use OCP\ISession;
 
 /**
  * Class Server
@@ -31,8 +32,8 @@ class Server extends SimpleContainer implements IServerContainer {
 				$urlParams = array();
 			}
 
-			if (\OC::$session->exists('requesttoken')) {
-				$requestToken = \OC::$session->get('requesttoken');
+			if (\OC::$server->getSession()->exists('requesttoken')) {
+				$requestToken = \OC::$server->getSession()->get('requesttoken');
 			} else {
 				$requestToken = false;
 			}
@@ -100,7 +101,7 @@ class Server extends SimpleContainer implements IServerContainer {
 			 * @var \OC\User\Manager $manager
 			 */
 			$manager = $c->query('UserManager');
-			$userSession = new \OC\User\Session($manager, \OC::$session);
+			$userSession = new \OC\User\Session($manager, new \OC\Session\Memory(''));
 			$userSession->listen('\OC\User', 'preCreateUser', function ($uid, $password) {
 				\OC_Hook::emit('OC_User', 'pre_createUser', array('run' => true, 'uid' => $uid, 'password' => $password));
 			});
@@ -327,6 +328,20 @@ class Server extends SimpleContainer implements IServerContainer {
 		return $this->query('UserSession');
 	}
 
+	/**
+	 * @return \OCP\ISession
+	 */
+	function getSession() {
+		return $this->query('UserSession')->getSession();
+	}
+
+	/**
+	 * @param \OCP\ISession $session
+	 */
+	function setSession(\OCP\ISession $session) {
+		return $this->query('UserSession')->setSession($session);
+	}
+
 	/**
 	 * @return \OC\NavigationManager
 	 */
@@ -392,15 +407,6 @@ class Server extends SimpleContainer implements IServerContainer {
 		return $this->query('MemCacheFactory');
 	}
 
-	/**
-	 * Returns the current session
-	 *
-	 * @return \OCP\ISession
-	 */
-	function getSession() {
-		return \OC::$session;
-	}
-
 	/**
 	 * Returns the current session
 	 *
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index faa6453d64023a0571c155e77702d87f5dcb4e73..c3593beac45e28625f792495060d557ca972d1a0 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -1855,8 +1855,8 @@ class Share extends \OC\Share\Constants {
 			return true;
 		}
 
-		if ( \OC::$session->exists('public_link_authenticated')
-			&& \OC::$session->get('public_link_authenticated') === $linkItem['id'] ) {
+		if ( \OC::$server->getSession()->exists('public_link_authenticated')
+			&& \OC::$server->getSession()->get('public_link_authenticated') === $linkItem['id'] ) {
 			return true;
 		}
 
diff --git a/lib/private/template.php b/lib/private/template.php
index 173345cc001807b6219d3e78e1224764722c1dc0..d6afe1a3e4071d387b71d04d98123863d611234f 100644
--- a/lib/private/template.php
+++ b/lib/private/template.php
@@ -52,7 +52,7 @@ class OC_Template extends \OC\Template\Base {
 		// Read the detected formfactor and use the right file name.
 		$fext = self::getFormFactorExtension();
 
-		$requesttoken = OC::$session ? OC_Util::callRegister() : '';
+		$requesttoken = OC::$server->getSession() ? OC_Util::callRegister() : '';
 
 		$parts = explode('/', $app); // fix translation when app is something like core/lostpassword
 		$l10n = OC_L10N::get($parts[0]);
@@ -101,20 +101,20 @@ class OC_Template extends \OC\Template\Base {
 	 */
 	static public function getFormFactorExtension()
 	{
-		if (!\OC::$session) {
+		if (!\OC::$server->getSession()) {
 			return '';
 		}
 		// if the formfactor is not yet autodetected do the
 		// autodetection now. For possible formfactors check the
 		// detectFormfactor documentation
-		if (!\OC::$session->exists('formfactor')) {
-			\OC::$session->set('formfactor', self::detectFormfactor());
+		if (!\OC::$server->getSession()->exists('formfactor')) {
+			\OC::$server->getSession()->set('formfactor', self::detectFormfactor());
 		}
 		// allow manual override via GET parameter
 		if(isset($_GET['formfactor'])) {
-			\OC::$session->set('formfactor', $_GET['formfactor']);
+			\OC::$server->getSession()->set('formfactor', $_GET['formfactor']);
 		}
-		$formfactor = \OC::$session->get('formfactor');
+		$formfactor = \OC::$server->getSession()->get('formfactor');
 		if($formfactor==='default') {
 			$fext='';
 		}elseif($formfactor==='mobile') {
diff --git a/lib/private/user.php b/lib/private/user.php
index cdef4d8fe652d0c5da1f12200db389d61d648561..c9b1522f85acb9d3dbd200ce9c209dcd2a6efe90 100644
--- a/lib/private/user.php
+++ b/lib/private/user.php
@@ -300,7 +300,7 @@ class OC_User {
 	 * Sets user id for session and triggers emit
 	 */
 	public static function setUserId($uid) {
-		OC::$session->set('user_id', $uid);
+		\OC::$server->getSession()->set('user_id', $uid);
 	}
 
 	/**
@@ -337,8 +337,8 @@ class OC_User {
 	 * Checks if the user is logged in
 	 */
 	public static function isLoggedIn() {
-		if (\OC::$session->get('user_id') !== null && self::$incognitoMode === false) {
-			return self::userExists(\OC::$session->get('user_id'));
+		if (\OC::$server->getSession()->get('user_id') !== null && self::$incognitoMode === false) {
+			return self::userExists(\OC::$server->getSession()->get('user_id'));
 		}
 		return false;
 	}
@@ -386,7 +386,7 @@ class OC_User {
 	 * @return string uid or false
 	 */
 	public static function getUser() {
-		$uid = OC::$session ? OC::$session->get('user_id') : null;
+		$uid = \OC::$server->getSession() ? \OC::$server->getSession()->get('user_id') : null;
 		if (!is_null($uid) && self::$incognitoMode === false) {
 			return $uid;
 		} else {
diff --git a/lib/private/user/session.php b/lib/private/user/session.php
index 6abf8fb80d2ad4eaecc39dc454c0a01101e713ef..11938db50764301612d3591d9c4159945560f58b 100644
--- a/lib/private/user/session.php
+++ b/lib/private/user/session.php
@@ -47,10 +47,10 @@ class Session implements IUserSession, Emitter {
 	protected $activeUser;
 
 	/**
-	 * @param \OC\User\Manager $manager
-	 * @param \OC\Session\Session $session
+	 * @param \OCP\IUserManager $manager
+	 * @param \OCP\ISession $session
 	 */
-	public function __construct($manager, $session) {
+	public function __construct(\OCP\IUserManager $manager, \OCP\ISession $session) {
 		$this->manager = $manager;
 		$this->session = $session;
 	}
@@ -82,6 +82,44 @@ class Session implements IUserSession, Emitter {
 		return $this->manager;
 	}
 
+	/**
+	 * get the session object
+	 *
+	 * @return \OCP\ISession
+	 */
+	public function getSession() {
+		// fetch the deprecated \OC::$session if it changed for backwards compatibility
+		if (isset(\OC::$session) && \OC::$session !== $this->session) {
+			\OC::$server->getLogger()->warning(
+				'One of your installed apps still seems to use the deprecated '.
+				'\OC::$session and has replaced it with a new instance. Please file a bug against it.'.
+				'Closing and replacing session in UserSession instance.'
+			);
+			$this->setSession(\OC::$session);
+		}
+		return $this->session;
+	}
+
+	/**
+	 * set the session object
+	 *
+	 * @param \OCP\ISession $session
+	 */
+	public function setSession(\OCP\ISession $session) {
+		if ($this->session instanceof \OCP\ISession) {
+			$this->session->close();
+		}
+		$this->session = $session;
+
+		// maintain deprecated \OC::$session
+		if (\OC::$session !== $this->session) {
+			if (\OC::$session instanceof \OCP\ISession) {
+				\OC::$session->close();
+			}
+			\OC::$session = $session;
+		}
+	}
+
 	/**
 	 * set the currently active user
 	 *
diff --git a/lib/private/util.php b/lib/private/util.php
index 4307560a928384c3ddd44ce31619c5ad980d7d21..c79f374771c331026e036104be618a5d9fd5cdb6 100755
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -384,11 +384,11 @@ class OC_Util {
 	 * @return string timestamp
 	 * @description adjust to clients timezone if we know it
 	 */
-	public static function formatDate($timestamp, $dateOnly = false) {
-		if (\OC::$session->exists('timezone')) {
+	public static function formatDate( $timestamp, $dateOnly = false) {
+		if(\OC::$server->getSession()->exists('timezone')) {
 			$systemTimeZone = intval(date('O'));
 			$systemTimeZone = (round($systemTimeZone / 100, 0) * 60) + ($systemTimeZone % 100);
-			$clientTimeZone = \OC::$session->get('timezone') * 60;
+			$clientTimeZone = \OC::$server->getSession()->get('timezone') * 60;
 			$offset = $clientTimeZone - $systemTimeZone;
 			$timestamp = $timestamp + $offset * 60;
 		}
@@ -412,7 +412,7 @@ class OC_Util {
 		}
 
 		// Assume that if checkServer() succeeded before in this session, then all is fine.
-		if (\OC::$session->exists('checkServer_succeeded') && \OC::$session->get('checkServer_succeeded')) {
+		if (\OC::$server->getSession()->exists('checkServer_succeeded') && \OC::$server->getSession()->get('checkServer_succeeded')) {
 			return $errors;
 		}
 
@@ -615,7 +615,7 @@ class OC_Util {
 		$errors = array_merge($errors, self::checkDatabaseVersion());
 
 		// Cache the result of this function
-		\OC::$session->set('checkServer_succeeded', count($errors) == 0);
+		\OC::$server->getSession()->set('checkServer_succeeded', count($errors) == 0);
 
 		return $errors;
 	}
@@ -938,13 +938,13 @@ class OC_Util {
 	 */
 	public static function callRegister() {
 		// Check if a token exists
-		if (!\OC::$session->exists('requesttoken')) {
+		if (!\OC::$server->getSession()->exists('requesttoken')) {
 			// No valid token found, generate a new one.
 			$requestToken = self::generateRandomBytes(20);
-			\OC::$session->set('requesttoken', $requestToken);
+			\OC::$server->getSession()->set('requesttoken', $requestToken);
 		} else {
 			// Valid token already exists, send it
-			$requestToken = \OC::$session->get('requesttoken');
+			$requestToken = \OC::$server->getSession()->get('requesttoken');
 		}
 		return ($requestToken);
 	}
diff --git a/tests/lib/ocs/privatedata.php b/tests/lib/ocs/privatedata.php
index 530750fabeae7f92251bb71a756721ca3ed36448..534fc21b07aa2e28cbf9c09a33a24098252478f5 100644
--- a/tests/lib/ocs/privatedata.php
+++ b/tests/lib/ocs/privatedata.php
@@ -26,7 +26,7 @@ class Test_OC_OCS_Privatedata extends PHPUnit_Framework_TestCase
 	private $appKey;
 
 	public function setUp() {
-		\OC::$session->set('user_id', 'user1');
+		\OC::$server->getSession()->set('user_id', 'user1');
 		$this->appKey = uniqid('app');
 	}
 
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index 59056003fca0af798edbfb5a31fcea8a5fec36d3..0a8d7856915fe662f701262d25dc4d18d85a491d 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -740,7 +740,7 @@ class Test_Share extends PHPUnit_Framework_TestCase {
 	 * @param $item
 	 */
 	public function testCheckPasswordProtectedShare($expected, $item) {
-		\OC::$session->set('public_link_authenticated', 100);
+		\OC::$server->getSession()->set('public_link_authenticated', 100);
 		$result = \OCP\Share::checkPasswordProtectedShare($item);
 		$this->assertEquals($expected, $result);
 	}
@@ -767,8 +767,8 @@ class Test_Share extends PHPUnit_Framework_TestCase {
 			return true;
 		}
 
-		if ( \OC::$session->exists('public_link_authenticated')
-			&& \OC::$session->get('public_link_authenticated') === $linkItem['id'] ) {
+		if ( \OC::$server->getSession()->exists('public_link_authenticated')
+			&& \OC::$server->getSession()->get('public_link_authenticated') === $linkItem['id'] ) {
 			return true;
 		}
 		 * */
diff --git a/tests/startsessionlistener.php b/tests/startsessionlistener.php
index ba049559c6e5cb74748c67afa3fc2dfb421758a4..1f3573555ca5cce77773e0fcee8020f74fabc8b7 100644
--- a/tests/startsessionlistener.php
+++ b/tests/startsessionlistener.php
@@ -31,9 +31,9 @@ class StartSessionListener implements PHPUnit_Framework_TestListener {
 
 	public function endTest(PHPUnit_Framework_Test $test, $time) {
 		// reopen the session - only allowed for memory session
-		if (\OC::$session instanceof \OC\Session\Memory) {
+		if (\OC::$server->getSession() instanceof \OC\Session\Memory) {
 			/** @var $session \OC\Session\Memory */
-			$session = \OC::$session;
+			$session = \OC::$server->getSession();
 			$session->reopen();
 		}
 	}