diff --git a/apps/files_sharing/lib/permissions.php b/apps/files_sharing/lib/permissions.php
index f32ebabe40d4763821d0824be65b11d0cd045b99..2c4dce36332b5f4fdab8a0e65a46aa87bc7d03f1 100644
--- a/apps/files_sharing/lib/permissions.php
+++ b/apps/files_sharing/lib/permissions.php
@@ -27,25 +27,13 @@ class Shared_Permissions extends Permissions {
 	 *
 	 * @param int $fileId
 	 * @param string $user
-	 * @return int (-1 if file no permissions set)
+	 * @return int permissions
 	 */
 	public function get($fileId, $user) {
 
-		if ($fileId == -1) {
-			// if we ask for the mount point return -1 so that we can get the correct
-			// permissions by the path, with the root fileId we have no idea which share is meant
-			return -1;
-		}
-		$source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE,
-			null, true);
-
-		$permission = -1;
-
-		if ($source) {
-			$permission = $this->updatePermissions($source['permissions']);
-		}
+		$permissions = $this->storage->getPermissions();
 
-		return $permission;
+		return $this->updatePermissions($permissions);
 	}
 
 	/**
@@ -53,16 +41,7 @@ class Shared_Permissions extends Permissions {
 	 * @param string $user
 	 */
 	private function getFile($fileId, $user) {
-		if ($fileId == -1) {
-			return \OCP\PERMISSION_READ;
-		}
-		$source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE,
-			null, false);
-		if ($source) {
-			return $this->updatePermissions($source['permissions']);
-		} else {
-			return -1;
-		}
+		return $this->get($fileId, $user);
 	}
 
 	/**
@@ -84,11 +63,9 @@ class Shared_Permissions extends Permissions {
 	 * @return int[]
 	 */
 	public function getMultiple($fileIds, $user) {
-		if (count($fileIds) === 0) {
-			return array();
-		}
+		$filePermissions = array();
 		foreach ($fileIds as $fileId) {
-			$filePermissions[$fileId] = self::get($fileId, $user);
+			$filePermissions[$fileId] = $this->get($fileId, $user);
 		}
 		return $filePermissions;
 	}
@@ -101,16 +78,19 @@ class Shared_Permissions extends Permissions {
 	 * @return int[]
 	 */
 	public function getDirectoryPermissions($parentId, $user) {
-		// Root of the Shared folder
-		if ($parentId === -1) {
-			return \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_PERMISSIONS);
+
+		if ($parentId === -1 && $this->storage->instanceOfStorage('\OC\Files\Storage\Shared')) {
+			$fileCacheId =  $this->storage->getSourceId();
+		} else {
+			$fileCacheId = $parentId;
 		}
-		$permissions = $this->getFile($parentId, $user);
+
 		$query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `parent` = ?');
-		$result = $query->execute(array($parentId));
+		$result = $query->execute(array($fileCacheId));
+		$permissions = $this->get($parentId, $user);
 		$filePermissions = array();
 		while ($row = $result->fetchRow()) {
-			$filePermissions[$row['fileid']] = $this->updatePermissions($permissions);
+			$filePermissions[$row['fileid']] = $permissions;
 		}
 		return $filePermissions;
 	}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index a7dd2b3afa1df6c78a03c484b0d9130a7d0db60c..6d661dfd8af284a038cff5cf0e32d0887e146dbc 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -102,7 +102,7 @@ class Shared extends \OC\Files\Storage\Common {
 	 * @param string $target Shared target file path
 	 * @return int CRUDS permissions granted
 	 */
-	public function getPermissions($target) {
+	public function getPermissions($target = '') {
 		$permissions = $this->share['permissions'];
 		// part file are always have delete permissions
 		if (pathinfo($target, PATHINFO_EXTENSION) === 'part') {
diff --git a/lib/private/files/cache/permissions.php b/lib/private/files/cache/permissions.php
index eba18af386318119cdee5cab63e12c33e56e1e3d..a2a614ca0b1268cbc0051281d2799e8706bfe552 100644
--- a/lib/private/files/cache/permissions.php
+++ b/lib/private/files/cache/permissions.php
@@ -14,15 +14,29 @@ class Permissions {
 	 */
 	private $storageId;
 
+	/**
+	 * @var \OC\Files\Storage\Storage $storage
+	 */
+	protected $storage;
+
 	/**
 	 * @param \OC\Files\Storage\Storage|string $storage
 	 */
 	public function __construct($storage) {
 		if ($storage instanceof \OC\Files\Storage\Storage) {
 			$this->storageId = $storage->getId();
+			$this->storage = $storage;
 		} else {
 			$this->storageId = $storage;
+			$mountManager = \OC\Files\Filesystem::getMountManager();
+			$mount = $mountManager->findByStorageId($this->storageId);
+			$firstMountPoint = reset($mount);
+			if ($firstMountPoint instanceof \OC\Files\Storage\Storage) {
+				$storage = $firstMountPoint->getStorage();
+				$this->storage = $storage;
+			}
 		}
+
 	}
 
 	/**