diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php
index 5b8dc46b771ce72f4b16c976360d1bc7cef232a7..39e36684b7ba1a4bc878e6253cb61081fd2a7e30 100644
--- a/lib/files/cache/cache.php
+++ b/lib/files/cache/cache.php
@@ -485,28 +485,28 @@ class Cache {
 	 * @return int
 	 */
 	public function calculateFolderSize($path) {
-		$id = $this->getId($path);
-		if ($id === -1) {
-			return 0;
-		}
-		$sql = 'SELECT `size` FROM `*PREFIX*filecache` WHERE `parent` = ? AND `storage` = ?';
-		$result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId()));
 		$totalSize = 0;
-		$hasChilds = 0;
-		while ($row = $result->fetchRow()) {
-			$hasChilds = true;
-			$size = (int)$row['size'];
-			if ($size === -1) {
-				$totalSize = -1;
-				break;
-			} else {
-				$totalSize += $size;
+		$entry = $this->get($path);
+		if ($entry && $entry['mimetype'] === 'httpd/unix-directory') {
+			$id = $entry['fileid'];
+			$sql = 'SELECT SUM(`size`), MIN(`size`) FROM `*PREFIX*filecache` '.
+				'WHERE `parent` = ? AND `storage` = ?';
+			$result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId()));
+			if ($row = $result->fetchRow()) {
+				list($sum, $min) = array_values($row);
+				$sum = (int)$sum;
+				$min = (int)$min;
+				if ($min === -1) {
+					$totalSize = $min;
+				} else {
+					$totalSize = $sum;
+				}
+				if ($entry['size'] !== $totalSize) {
+					$this->update($id, array('size' => $totalSize));
+				}
+				
 			}
 		}
-
-		if ($hasChilds) {
-			$this->update($id, array('size' => $totalSize));
-		}
 		return $totalSize;
 	}
 
diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php
index 527c1d1b2a13c84092ab68175393dedb7b5f4698..247373a5cb9fd641b8e8e07a1f2f793650313bd7 100644
--- a/tests/lib/files/cache/cache.php
+++ b/tests/lib/files/cache/cache.php
@@ -127,6 +127,11 @@ class Cache extends \PHPUnit_Framework_TestCase {
 
 		$this->assertEquals(1025, $this->cache->calculateFolderSize($file1));
 
+		$this->cache->remove($file2);
+		$this->cache->remove($file3);
+		$this->cache->remove($file4);
+		$this->assertEquals(0, $this->cache->calculateFolderSize($file1));
+
 		$this->cache->remove('folder');
 		$this->assertFalse($this->cache->inCache('folder/foo'));
 		$this->assertFalse($this->cache->inCache('folder/bar'));