diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index e4fd85fd2a7251ab42482ba9350502ea00c16b96..270ed704bbd15c2e682c66cf670aaffe9d35d1da 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -145,26 +145,23 @@ class Shared_Cache extends Cache {
 	/**
 	 * get the metadata of all files stored in $folder
 	 *
-	 * @param string $folder
+	 * @param string $folderId
 	 * @return array
 	 */
-	public function getFolderContents($folder) {
-
-		if ($folder === false) {
-			$folder = '';
-		}
-
-		$dir = ($folder !== '') ? $folder . '/' : '';
-
-		$cache = $this->getSourceCache($folder);
+	public function getFolderContentsById($folderId) {
+		$cache = $this->getSourceCache('');
 		if ($cache) {
-			$parent = $this->storage->getFile($folder);
-			$sourceFolderContent = $cache->getFolderContents($this->files[$folder]);
-			foreach ($sourceFolderContent as $key => $c) {
-				$sourceFolderContent[$key]['path'] = $dir . $c['name'];
-				$sourceFolderContent[$key]['uid_owner'] = $parent['uid_owner'];
-				$sourceFolderContent[$key]['displayname_owner'] = \OC_User::getDisplayName($parent['uid_owner']);
-				$sourceFolderContent[$key]['permissions'] = $sourceFolderContent[$key]['permissions'] & $this->storage->getPermissions($dir . $c['name']);
+			$owner = $this->storage->getSharedFrom();
+			$parentPath = $this->getPathById($folderId);
+			if ($parentPath !== '') {
+				$parentPath .= '/';
+			}
+			$sourceFolderContent = $cache->getFolderContentsById($folderId);
+			foreach ($sourceFolderContent as &$c) {
+				$c['path'] = ltrim($parentPath . $c['name'], '/');
+				$c['uid_owner'] = $owner;
+				$c['displayname_owner'] = \OC_User::getDisplayName($owner);
+				$c['permissions'] = $c['permissions'] & $this->storage->getPermissions(false);
 			}
 
 			return $sourceFolderContent;
diff --git a/apps/files_sharing/lib/watcher.php b/apps/files_sharing/lib/watcher.php
index 11d3ce1cabd9c840dd4287ea6a3cd2a7c1450b2a..5357119ab6c2de61f5d0c51b7328a8f7482093b8 100644
--- a/apps/files_sharing/lib/watcher.php
+++ b/apps/files_sharing/lib/watcher.php
@@ -30,9 +30,11 @@ class Shared_Watcher extends Watcher {
 	 * check $path for updates
 	 *
 	 * @param string $path
+	 * @param array $cachedEntry
+	 * @return boolean true if path was updated
 	 */
-	public function checkUpdate($path) {
-		if (parent::checkUpdate($path) === true) {
+	public function checkUpdate($path, $cachedEntry = null) {
+		if (parent::checkUpdate($path, $cachedEntry) === true) {
 			// since checkUpdate() has already updated the size of the subdirs,
 			// only apply the update to the owner's parent dirs
 
diff --git a/lib/private/files/cache/watcher.php b/lib/private/files/cache/watcher.php
index 5a4f53fb73d539413af96ccc48c4cacdcc361a6d..f4572895b0996c01cc30597babd5f5c8f927d128 100644
--- a/lib/private/files/cache/watcher.php
+++ b/lib/private/files/cache/watcher.php
@@ -55,11 +55,14 @@ class Watcher {
 	 * check $path for updates
 	 *
 	 * @param string $path
-	 * @return boolean|array true if path was updated, otherwise the cached data is returned
+	 * @param array $cachedEntry
+	 * @return boolean true if path was updated
 	 */
-	public function checkUpdate($path) {
+	public function checkUpdate($path, $cachedEntry = null) {
 		if ($this->watchPolicy === self::CHECK_ALWAYS or ($this->watchPolicy === self::CHECK_ONCE and array_search($path, $this->checkedPaths) === false)) {
-			$cachedEntry = $this->cache->get($path);
+			if (is_null($cachedEntry)) {
+				$cachedEntry = $this->cache->get($path);
+			}
 			$this->checkedPaths[] = $path;
 			if ($this->storage->hasUpdated($path, $cachedEntry['storage_mtime'])) {
 				if ($this->storage->is_dir($path)) {
@@ -73,7 +76,7 @@ class Watcher {
 				$this->cache->correctFolderSize($path);
 				return true;
 			}
-			return $cachedEntry;
+			return false;
 		} else {
 			return false;
 		}
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 3d3406af94ed63868b46f3ba1837506e8c174611..5f5f29ded4f6d60c11d1458f0011a5c119d63ded 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -313,7 +313,7 @@ class View {
 		if (!$result) {
 			// If create file fails because of permissions on external storage like SMB folders,
 			// check file exists and return false if not.
-			if(!$this->file_exists($path)){
+			if (!$this->file_exists($path)) {
 				return false;
 			}
 			if (is_null($mtime)) {
@@ -891,22 +891,23 @@ class View {
 		if ($storage) {
 			$cache = $storage->getCache($internalPath);
 
-			if (!$cache->inCache($internalPath)) {
+			$data = $cache->get($internalPath);
+			$watcher = $storage->getWatcher($internalPath);
+
+			// if the file is not in the cache or needs to be updated, trigger the scanner and reload the data
+			if (!$data) {
 				if (!$storage->file_exists($internalPath)) {
 					return false;
 				}
 				$scanner = $storage->getScanner($internalPath);
 				$scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW);
-			} else {
-				$watcher = $storage->getWatcher($internalPath);
-				$data = $watcher->checkUpdate($internalPath);
-			}
-
-			if (!is_array($data)) {
+				$data = $cache->get($internalPath);
+			} else if ($watcher->checkUpdate($internalPath, $data)) {
 				$data = $cache->get($internalPath);
 			}
 
 			if ($data and isset($data['fileid'])) {
+				// upgrades from oc6 or lower might not have the permissions set in the file cache
 				if ($data['permissions'] === 0) {
 					$data['permissions'] = $storage->getPermissions($data['path']);
 					$cache->update($data['fileid'], array('permissions' => $data['permissions']));
@@ -956,26 +957,32 @@ class View {
 		if (!Filesystem::isValidPath($directory)) {
 			return $result;
 		}
-		$path = Filesystem::normalizePath($this->fakeRoot . '/' . $directory);
-		list($storage, $internalPath) = Filesystem::resolvePath($path);
+		$path = $this->getAbsolutePath($directory);
+		/** @var \OC\Files\Storage\Storage $storage */
+		list($storage, $internalPath) = $this->resolvePath($directory);
 		if ($storage) {
 			$cache = $storage->getCache($internalPath);
 			$user = \OC_User::getUser();
 
-			if ($cache->getStatus($internalPath) < Cache\Cache::COMPLETE) {
+			$data = $cache->get($internalPath);
+			$watcher = $storage->getWatcher($internalPath);
+			if (!$data or $data['size'] === -1) {
+				if (!$storage->file_exists($internalPath)) {
+					return array();
+				}
 				$scanner = $storage->getScanner($internalPath);
 				$scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW);
-			} else {
-				$watcher = $storage->getWatcher($internalPath);
-				$watcher->checkUpdate($internalPath);
+				$data = $cache->get($internalPath);
+			} else if ($watcher->checkUpdate($internalPath, $data)) {
+				$data = $cache->get($internalPath);
 			}
 
-			$folderId = $cache->getId($internalPath);
+			$folderId = $data['fileid'];
 			/**
 			 * @var \OC\Files\FileInfo[] $files
 			 */
 			$files = array();
-			$contents = $cache->getFolderContents($internalPath, $folderId); //TODO: mimetype_filter
+			$contents = $cache->getFolderContentsById($folderId); //TODO: mimetype_filter
 			foreach ($contents as $content) {
 				if ($content['permissions'] === 0) {
 					$content['permissions'] = $storage->getPermissions($content['path']);
@@ -1032,7 +1039,7 @@ class View {
 									break;
 								}
 							}
-							$rootEntry['path'] = substr($path . '/' . $rootEntry['name'], strlen($user) + 2); // full path without /$user/
+							$rootEntry['path'] = substr(Filesystem::normalizePath($path . '/' . $rootEntry['name']), strlen($user) + 2); // full path without /$user/
 
 							// if sharing was disabled for the user we remove the share permissions
 							if (\OCP\Util::isSharingDisabledForUser()) {
@@ -1213,7 +1220,7 @@ class View {
 	 * @return string|null
 	 */
 	public function getPath($id) {
-		$id = (int) $id;
+		$id = (int)$id;
 		$manager = Filesystem::getMountManager();
 		$mounts = $manager->findIn($this->fakeRoot);
 		$mounts[] = $manager->find($this->fakeRoot);
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index 8d56ecd90032f409f49eac26eaba11c1d4a2da4b..5f030f29fa7520f1a0c080e7e32da243c89a05f5 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -177,8 +177,9 @@ class View extends \PHPUnit_Framework_TestCase {
 
 	function testCacheIncompleteFolder() {
 		$storage1 = $this->getTestStorage(false);
-		\OC\Files\Filesystem::mount($storage1, array(), '/');
-		$rootView = new \OC\Files\View('');
+		\OC\Files\Filesystem::clearMounts();
+		\OC\Files\Filesystem::mount($storage1, array(), '/incomplete');
+		$rootView = new \OC\Files\View('/incomplete');
 
 		$entries = $rootView->getDirectoryContent('/');
 		$this->assertEquals(3, count($entries));