diff --git a/apps/files/ajax/upgrade.php b/apps/files/ajax/upgrade.php
index 965c0073b8a8cf2700728ffb6aae9163c84e5af9..7237b02c0b06af48a65d074c0d07145dd3d4f318 100644
--- a/apps/files/ajax/upgrade.php
+++ b/apps/files/ajax/upgrade.php
@@ -10,10 +10,12 @@ $legacy = new \OC\Files\Cache\Legacy($user);
 if ($legacy->hasItems()) {
 	OC_Hook::connect('\OC\Files\Cache\Upgrade', 'migrate_path', $listener, 'upgradePath');
 
+	OC_DB::beginTransaction();
 	$upgrade = new \OC\Files\Cache\Upgrade($legacy);
 	$count = $legacy->getCount();
 	$eventSource->send('total', $count);
 	$upgrade->upgradePath('/' . $user . '/files');
+	OC_DB::commit();
 }
 \OC\Files\Cache\Upgrade::upgradeDone($user);
 $eventSource->send('done', true);
diff --git a/lib/files/cache/legacy.php b/lib/files/cache/legacy.php
index ee10a1c1350a78e1f92949d6b6de8e7f2dbc9d32..33d4b8e7c9f037a717d8e64f61e4b7dcabab1fb2 100644
--- a/lib/files/cache/legacy.php
+++ b/lib/files/cache/legacy.php
@@ -14,6 +14,8 @@ namespace OC\Files\Cache;
 class Legacy {
 	private $user;
 
+	private $cacheHasItems = null;
+
 	public function __construct($user) {
 		$this->user = $user;
 	}
@@ -34,17 +36,23 @@ class Legacy {
 	 * @return bool
 	 */
 	function hasItems() {
+		if (!is_null($this->cacheHasItems)) {
+			return $this->cacheHasItems;
+		}
 		try {
 			$query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*fscache` WHERE `user` = ? LIMIT 1');
 		} catch (\Exception $e) {
+			$this->cacheHasItems = false;
 			return false;
 		}
 		try {
 			$result = $query->execute(array($this->user));
 		} catch (\Exception $e) {
+			$this->cacheHasItems = false;
 			return false;
 		}
-		return (bool)$result->fetchRow();
+		$this->cacheHasItems = (bool)$result->fetchRow();
+		return $this->cacheHasItems;
 	}
 
 	/**
diff --git a/lib/files/cache/upgrade.php b/lib/files/cache/upgrade.php
index 1032e0a844c2f83044cfd4e99e7b7a30a8992832..cd9a9e91a8cc2e56032f8d7768ff313a35d8926f 100644
--- a/lib/files/cache/upgrade.php
+++ b/lib/files/cache/upgrade.php
@@ -43,15 +43,21 @@ class Upgrade {
 			$data = $this->getNewData($row);
 			$this->insert($data);
 
-			$children = $this->legacy->getChildren($data['id']);
-			foreach ($children as $child) {
-				if ($mode == Scanner::SCAN_SHALLOW) {
-					$childData = $this->getNewData($child);
-					\OC_Hook::emit('\OC\Files\Cache\Upgrade', 'migrate_path', $child['path']);
-					$this->insert($childData);
-				} else {
-					$this->upgradePath($child['path']);
-				}
+			$this->upgradeChilds($data['id'], $mode);
+		}
+	}
+
+	/**
+	 * @param int $id
+	 */
+	function upgradeChilds($id, $mode = Scanner::SCAN_RECURSIVE) {
+		$children = $this->legacy->getChildren($id);
+		foreach ($children as $child) {
+			$childData = $this->getNewData($child);
+			\OC_Hook::emit('\OC\Files\Cache\Upgrade', 'migrate_path', $child['path']);
+			$this->insert($childData);
+			if ($mode == Scanner::SCAN_RECURSIVE) {
+				$this->upgradeChilds($child['id']);
 			}
 		}
 	}