diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php
index 5a9a119458e4c3822a669369a340a87bd5851c14..88f208547f6162c6c4a5e279c3ebc6288cd65cf6 100644
--- a/lib/files/cache/scanner.php
+++ b/lib/files/cache/scanner.php
@@ -58,9 +58,10 @@ class Scanner {
 	 * scan a single file and store it in the cache
 	 *
 	 * @param string $file
+	 * @param bool $checkExisting check existing folder sizes in the cache instead of always using -1 for folder size
 	 * @return array with metadata of the scanned file
 	 */
-	public function scanFile($file) {
+	public function scanFile($file, $checkExisting = false) {
 		\OC_Hook::emit('\OC\Files\Cache\Scanner', 'scan_file', array('path' => $file, 'storage' => $this->storageId));
 		$data = $this->getData($file);
 		if ($data) {
@@ -73,7 +74,15 @@ class Scanner {
 					$this->scanFile($parent);
 				}
 			}
-			$id = $this->cache->put($file, $data);
+			if ($checkExisting and $cacheData = $this->cache->get($file)) {
+				if ($data['size'] === -1) {
+					$data['size'] = $cacheData['size'];
+				}
+				if ($data['mtime'] === $cacheData['mtime']) {
+					$data['etag'] = $cacheData['etag'];
+				}
+			}
+			$this->cache->put($file, $data);
 		}
 		return $data;
 	}
@@ -99,20 +108,18 @@ class Scanner {
 			while ($file = readdir($dh)) {
 				if (!$this->isIgnoredFile($file)) {
 					$child = ($path) ? $path . '/' . $file : $file;
-					$data = $this->scanFile($child);
+					$data = $this->scanFile($child, $recursive === self::SCAN_SHALLOW);
 					if ($data) {
-						if ($data['mimetype'] === 'httpd/unix-directory') {
+						if ($data['size'] === -1) {
 							if ($recursive === self::SCAN_RECURSIVE) {
 								$childQueue[] = $child;
 								$data['size'] = 0;
 							} else {
-								$data['size'] = -1;
+								$size = -1;
 							}
-						} else {
 						}
-						if ($data['size'] === -1) {
-							$size = -1;
-						} elseif ($size !== -1) {
+
+						if ($size !== -1) {
 							$size += $data['size'];
 						}
 					}
@@ -133,7 +140,7 @@ class Scanner {
 		}
 		return $size;
 	}
-	
+
 	/**
 	 * @brief check if the file should be ignored when scanning
 	 * NOTE: files with a '.part' extension are ignored as well!
@@ -143,8 +150,8 @@ class Scanner {
 	 */
 	private function isIgnoredFile($file) {
 		if ($file === '.' || $file === '..'
-		 || pathinfo($file,PATHINFO_EXTENSION) === 'part')
-		{
+			|| pathinfo($file, PATHINFO_EXTENSION) === 'part'
+		) {
 			return true;
 		}
 		return false;
diff --git a/tests/lib/files/cache/watcher.php b/tests/lib/files/cache/watcher.php
index e8a1689cab0dbcee6bce27a24a325214ebd9e463..8ef6ab44d102f72349dc4d0c15092569933d8d15 100644
--- a/tests/lib/files/cache/watcher.php
+++ b/tests/lib/files/cache/watcher.php
@@ -76,7 +76,6 @@ class Watcher extends \PHPUnit_Framework_TestCase {
 		$updater->checkUpdate('');
 
 		$entry = $cache->get('foo.txt');
-		$this->assertEquals(-1, $entry['size']);
 		$this->assertEquals('httpd/unix-directory', $entry['mimetype']);
 		$this->assertFalse($cache->inCache('folder'));
 		$this->assertFalse($cache->inCache('folder/bar.txt'));