diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index 10f2182655fbf7aa40512f0ab456282a24df1bd6..01db29d72e2888652101ac158ec7d7d2eab45269 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -357,9 +357,10 @@ class Shared_Cache extends Cache {
 	 * get the size of a folder and set it in the cache
 	 *
 	 * @param string $path
+	 * @param array $entry (optional) meta data of the folder
 	 * @return int
 	 */
-	public function calculateFolderSize($path) {
+	public function calculateFolderSize($path, $entry = null) {
 		if ($cache = $this->getSourceCache($path)) {
 			return $cache->calculateFolderSize($this->files[$path]);
 		}
diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php
index 9b18257088c2544c30285232b710450edebcb295..abc11e76470f0a6c7498c62dac717d72eec38568 100644
--- a/lib/private/files/cache/cache.php
+++ b/lib/private/files/cache/cache.php
@@ -498,9 +498,10 @@ class Cache {
 	 * update the folder size and the size of all parent folders
 	 *
 	 * @param string|boolean $path
+	 * @param array $data (optional) meta data of the folder
 	 */
-	public function correctFolderSize($path) {
-		$this->calculateFolderSize($path);
+	public function correctFolderSize($path, $data = null) {
+		$this->calculateFolderSize($path, $data);
 		if ($path !== '') {
 			$parent = dirname($path);
 			if ($parent === '.' or $parent === '/') {
@@ -514,11 +515,14 @@ class Cache {
 	 * get the size of a folder and set it in the cache
 	 *
 	 * @param string $path
+	 * @param array $entry (optional) meta data of the folder
 	 * @return int
 	 */
-	public function calculateFolderSize($path) {
+	public function calculateFolderSize($path, $entry = null) {
 		$totalSize = 0;
-		$entry = $this->get($path);
+		if (is_null($entry) or !isset($entry['fileid'])) {
+			$entry = $this->get($path);
+		}
 		if ($entry && $entry['mimetype'] === 'httpd/unix-directory') {
 			$id = $entry['fileid'];
 			$sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2, ' .
@@ -540,7 +544,7 @@ class Cache {
 				if ($entry['size'] !== $totalSize) {
 					$update['size'] = $totalSize;
 				}
-				if ($entry['unencrypted_size'] !== $unencryptedSum) {
+				if (!isset($entry['unencrypted_size']) or $entry['unencrypted_size'] !== $unencryptedSum) {
 					$update['unencrypted_size'] = $unencryptedSum;
 				}
 				if (count($update) > 0) {
diff --git a/lib/private/files/cache/homecache.php b/lib/private/files/cache/homecache.php
index 82f31d0867d52a5d35fe3be133c0a059b7f3fa4e..2326c46e8d0213cbb7eca13172006c080746435a 100644
--- a/lib/private/files/cache/homecache.php
+++ b/lib/private/files/cache/homecache.php
@@ -13,15 +13,21 @@ class HomeCache extends Cache {
 	 * get the size of a folder and set it in the cache
 	 *
 	 * @param string $path
+	 * @param array $entry (optional) meta data of the folder
 	 * @return int
 	 */
-	public function calculateFolderSize($path) {
+	public function calculateFolderSize($path, $entry = null) {
 		if ($path !== '/' and $path !== '' and $path !== 'files' and $path !== 'files_trashbin') {
-			return parent::calculateFolderSize($path);
+			return parent::calculateFolderSize($path, $entry);
+		} elseif ($path === '' or $path === '/') {
+			// since the size of / isn't used (the size of /files is used instead) there is no use in calculating it
+			return 0;
 		}
 
 		$totalSize = 0;
-		$entry = $this->get($path);
+		if (is_null($entry)) {
+			$entry = $this->get($path);
+		}
 		if ($entry && $entry['mimetype'] === 'httpd/unix-directory') {
 			$id = $entry['fileid'];
 			$sql = 'SELECT SUM(`size`) AS f1, ' .
@@ -45,6 +51,7 @@ class HomeCache extends Cache {
 
 	/**
 	 * @param string $path
+	 * @return array
 	 */
 	public function get($path) {
 		$data = parent::get($path);
diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php
index 92a4c01841b90324378e37b45f88412a15fc62d5..79159724d167fbc7080eefe76a3a4048a78a9028 100644
--- a/lib/private/files/cache/scanner.php
+++ b/lib/private/files/cache/scanner.php
@@ -155,7 +155,7 @@ class Scanner extends BasicEmitter {
 					}
 				}
 				if (!empty($newData)) {
-					$this->cache->put($file, $newData);
+					$data['fileid'] = $this->cache->put($file, $newData);
 					$this->emit('\OC\Files\Cache\Scanner', 'postScanFile', array($file, $this->storageId));
 					\OC_Hook::emit('\OC\Files\Cache\Scanner', 'post_scan_file', array('path' => $file, 'storage' => $this->storageId));
 				}
@@ -173,14 +173,16 @@ class Scanner extends BasicEmitter {
 	 * @param string $path
 	 * @param bool $recursive
 	 * @param int $reuse
-	 * @return int the size of the scanned folder or -1 if the size is unknown at this stage
+	 * @return array with the meta data of the scanned file or folder
 	 */
 	public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1) {
 		if ($reuse === -1) {
 			$reuse = ($recursive === self::SCAN_SHALLOW) ? self::REUSE_ETAG | self::REUSE_SIZE : 0;
 		}
-		$this->scanFile($path, $reuse);
-		return $this->scanChildren($path, $recursive, $reuse);
+		$data = $this->scanFile($path, $reuse);
+		$size = $this->scanChildren($path, $recursive, $reuse);
+		$data['size'] = $size;
+		return $data;
 	}
 
 	/**
diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php
index 7a45b9e9e96cb9e1c1dd7036a9e8b1a6a9cd4c95..666d5dd7fe55405d2a20b6ce24a4b0d49ea0a4ef 100644
--- a/lib/private/files/cache/updater.php
+++ b/lib/private/files/cache/updater.php
@@ -38,8 +38,8 @@ class Updater {
 		if ($storage) {
 			$cache = $storage->getCache($internalPath);
 			$scanner = $storage->getScanner($internalPath);
-			$scanner->scan($internalPath, Scanner::SCAN_SHALLOW);
-			$cache->correctFolderSize($internalPath);
+			$data = $scanner->scan($internalPath, Scanner::SCAN_SHALLOW);
+			$cache->correctFolderSize($internalPath, $data);
 			self::correctFolder($path, $storage->filemtime($internalPath));
 			self::correctParentStorageMtime($storage, $internalPath);
 		}
diff --git a/tests/lib/files/cache/homecache.php b/tests/lib/files/cache/homecache.php
index dbcf6e9caa080a9bd4c977ebdbb0e0e69ad8154a..80dc54c9d19596beb23f16d4a3fcd82e0618faf1 100644
--- a/tests/lib/files/cache/homecache.php
+++ b/tests/lib/files/cache/homecache.php
@@ -90,7 +90,6 @@ class HomeCache extends \PHPUnit_Framework_TestCase {
 
 		// check that files and root size ignored the unknown sizes
 		$this->assertEquals(1000, $this->cache->calculateFolderSize('files'));
-		$this->assertEquals(1000, $this->cache->calculateFolderSize(''));
 
 		// clean up
 		$this->cache->remove('');