diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
index b960e02ced741c0eecd0a5535eb963bd386195f7..aeb0008a7b94443094bf77e9f316fc2625faea5a 100644
--- a/apps/files/ajax/upload.php
+++ b/apps/files/ajax/upload.php
@@ -1,5 +1,7 @@
 <?php
 
+\OC::$server->getSession()->close();
+
 // Firefox and Konqueror tries to download application/json for me.  --Arthur
 OCP\JSON::setContentTypeHeader('text/plain');
 
@@ -64,13 +66,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::$server->getSession()->close();
-}
-
 
 // get array with current storage stats (e.g. max file size)
 $storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir);
diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php
index 55f2df783c466c367005eed8ec8432f43a9026af..a358a46a6e74445f332d39f8eac0bc282044de64 100644
--- a/apps/files_encryption/lib/proxy.php
+++ b/apps/files_encryption/lib/proxy.php
@@ -91,7 +91,6 @@ class Proxy extends \OC_FileProxy {
 	private function shouldEncrypt($path, $mode = 'w') {
 
 		$userId = Helper::getUser($path);
-		$session = new Session(new \OC\Files\View());
 
 		// don't call the crypt stream wrapper, if...
 		if (
diff --git a/apps/files_encryption/lib/session.php b/apps/files_encryption/lib/session.php
index 7bd4fd02421da2ecb3239f3f8823b9701231061b..132748b6ea58a859cae6583038c418f5b11738c4 100644
--- a/apps/files_encryption/lib/session.php
+++ b/apps/files_encryption/lib/session.php
@@ -29,6 +29,7 @@ namespace OCA\Encryption;
 class Session {
 
 	private $view;
+	private static $publicShareKey = false;
 
 	const NOT_INITIALIZED = '0';
 	const INIT_EXECUTED = '1';
@@ -92,7 +93,7 @@ class Session {
 
 		}
 
-		if (\OCA\Encryption\Helper::isPublicAccess()) {
+		if (\OCA\Encryption\Helper::isPublicAccess() && !self::getPublicSharePrivateKey()) {
 			// Disable encryption proxy to prevent recursive calls
 			$proxyStatus = \OC_FileProxy::$enabled;
 			\OC_FileProxy::$enabled = false;
@@ -100,9 +101,7 @@ class Session {
 			$encryptedKey = $this->view->file_get_contents(
 				'/owncloud_private_key/' . $publicShareKeyId . '.private.key');
 			$privateKey = Crypt::decryptPrivateKey($encryptedKey, '');
-			$this->setPublicSharePrivateKey($privateKey);
-
-			$this->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL);
+			self::setPublicSharePrivateKey($privateKey);
 
 			\OC_FileProxy::$enabled = $proxyStatus;
 		}
@@ -127,8 +126,8 @@ class Session {
 	 * remove keys from session
 	 */
 	public function removeKeys() {
-		\OC::$session->remove('publicSharePrivateKey');
-		\OC::$session->remove('privateKey');
+		\OC::$server->getSession()->remove('publicSharePrivateKey');
+		\OC::$server->getSession()->remove('privateKey');
 	}
 
 	/**
@@ -164,6 +163,8 @@ class Session {
 	public function getInitialized() {
 		if (!is_null(\OC::$server->getSession()->get('encryptionInitialized'))) {
 			return \OC::$server->getSession()->get('encryptionInitialized');
+		} else if (\OCA\Encryption\Helper::isPublicAccess() && self::getPublicSharePrivateKey()) {
+			return self::INIT_SUCCESSFUL;
 		} else {
 			return self::NOT_INITIALIZED;
 		}
@@ -177,7 +178,7 @@ class Session {
 	public function getPrivateKey() {
 		// return the public share private key if this is a public access
 		if (\OCA\Encryption\Helper::isPublicAccess()) {
-			return $this->getPublicSharePrivateKey();
+			return self::getPublicSharePrivateKey();
 		} else {
 			if (!is_null(\OC::$server->getSession()->get('privateKey'))) {
 				return \OC::$server->getSession()->get('privateKey');
@@ -192,12 +193,9 @@ class Session {
 	 * @param string $privateKey
 	 * @return bool
 	 */
-	public function setPublicSharePrivateKey($privateKey) {
-
-		\OC::$server->getSession()->set('publicSharePrivateKey', $privateKey);
-
+	private static function setPublicSharePrivateKey($privateKey) {
+		self::$publicShareKey = $privateKey;
 		return true;
-
 	}
 
 	/**
@@ -205,13 +203,8 @@ class Session {
 	 * @return string $privateKey
 	 *
 	 */
-	public function getPublicSharePrivateKey() {
-
-		if (!is_null(\OC::$server->getSession()->get('publicSharePrivateKey'))) {
-			return \OC::$server->getSession()->get('publicSharePrivateKey');
-		} else {
-			return false;
-		}
+	private static function getPublicSharePrivateKey() {
+		return self::$publicShareKey;
 	}
 
 }
diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php
index 076df3c46f62ce39bdae65ae07cde3ca4aaa51c0..7518292131ca0d11e3f2a82442e819dea3d4c6d3 100644
--- a/apps/files_sharing/lib/controllers/sharecontroller.php
+++ b/apps/files_sharing/lib/controllers/sharecontroller.php
@@ -203,7 +203,6 @@ class ShareController extends Controller {
 	/**
 	 * @PublicPage
 	 * @NoCSRFRequired
-	 * @UseSession
 	 *
 	 * @param string $token
 	 * @param string $files
@@ -213,12 +212,6 @@ class ShareController extends Controller {
 	public function downloadShare($token, $files = null, $path = '') {
 		\OC_User::setIncognitoMode(true);
 
-		// FIXME: Use DI once there is a suitable class
-		if (!\OCP\App::isEnabled('files_encryption')) {
-			// encryption app requires the session to store the keys in
-			\OC::$server->getSession()->close();
-		}
-
 		$linkItem = OCP\Share::getShareByToken($token, false);
 
 		// Share is password protected - check whether the user is permitted to access the share
@@ -244,7 +237,7 @@ class ShareController extends Controller {
 			}
 
 			// FIXME: The exit is required here because otherwise the AppFramework is trying to add headers as well
-			// after dispatching the request which results in a "Cannot modify header information" notice. 
+			// after dispatching the request which results in a "Cannot modify header information" notice.
 			OC_Files::get($originalSharePath, $files_list, $_SERVER['REQUEST_METHOD'] == 'HEAD');
 			exit();
 		} else {