diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php
index da5a2ce6f26f25b3c2d4aaafe84e4a8e550bcb00..f8977c2971e6aafac36ce7661c58fb8c4a1ae97e 100644
--- a/apps/files/ajax/scan.php
+++ b/apps/files/ajax/scan.php
@@ -20,7 +20,7 @@ $listener = new ScanListener($eventSource);
 
 foreach ($users as $user) {
 	$eventSource->send('user', $user);
-	$scanner = new \OC\Files\Utils\Scanner($user);
+	$scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection());
 	$scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', array($listener, 'file'));
 	$scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', array($listener, 'folder'));
 	if ($force) {
diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php
index 3412cf80dea2ff6cf6024b0feed1da66b139c3f9..e4d719a8b4be93623cd3081a43566b9a0e53f782 100644
--- a/apps/files/command/scan.php
+++ b/apps/files/command/scan.php
@@ -46,7 +46,7 @@ class Scan extends Command {
 	}
 
 	protected function scanFiles($user, OutputInterface $output) {
-		$scanner = new \OC\Files\Utils\Scanner($user);
+		$scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection());
 		$scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) {
 			$output->writeln("Scanning <info>$path</info>");
 		});
diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php
index 2d87871fd89b09cf2c09088f2f2b4f3b44f0fee6..dfba2d920a02cd3a5d6c1944432d7a18139ccc11 100644
--- a/lib/private/files/cache/scanner.php
+++ b/lib/private/files/cache/scanner.php
@@ -44,6 +44,11 @@ class Scanner extends BasicEmitter {
 	 */
 	protected $cacheActive;
 
+	/**
+	 * @var bool $useTransactions whether to use transactions
+	 */
+	protected $useTransactions = true;
+
 	const SCAN_RECURSIVE = true;
 	const SCAN_SHALLOW = false;
 
@@ -57,6 +62,16 @@ class Scanner extends BasicEmitter {
 		$this->cacheActive = !Config::getSystemValue('filesystem_cache_readonly', false);
 	}
 
+	/**
+	 * Whether to wrap the scanning of a folder in a database transaction
+	 * On default transactions are used
+	 *
+	 * @param bool $useTransactions
+	 */
+	public function setUseTransactions($useTransactions) {
+		$this->useTransactions = $useTransactions;
+	}
+
 	/**
 	 * get all the metadata of a file or folder
 	 * *
@@ -234,7 +249,9 @@ class Scanner extends BasicEmitter {
 		$newChildren = array();
 		if ($this->storage->is_dir($path) && ($dh = $this->storage->opendir($path))) {
 			$exceptionOccurred = false;
-			\OC_DB::beginTransaction();
+			if ($this->useTransactions) {
+				\OC_DB::beginTransaction();
+			}
 			if (is_resource($dh)) {
 				while (($file = readdir($dh)) !== false) {
 					$child = ($path) ? $path . '/' . $file : $file;
@@ -266,7 +283,9 @@ class Scanner extends BasicEmitter {
 				$child = ($path) ? $path . '/' . $childName : $childName;
 				$this->removeFromCache($child);
 			}
-			\OC_DB::commit();
+			if ($this->useTransactions) {
+				\OC_DB::commit();
+			}
 			if ($exceptionOccurred) {
 				// It might happen that the parallel scan process has already
 				// inserted mimetypes but those weren't available yet inside the transaction
diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php
index c2fabf519464b23ee91cb62afb4f8a53323ec59f..c7da4505af5692683efca9e386fb5d4134887c80 100644
--- a/lib/private/files/utils/scanner.php
+++ b/lib/private/files/utils/scanner.php
@@ -34,12 +34,19 @@ class Scanner extends PublicEmitter {
 	 */
 	protected $propagator;
 
+	/**
+	 * @var \OCP\IDBConnection
+	 */
+	protected $db;
+
 	/**
 	 * @param string $user
+	 * @param \OCP\IDBConnection $db
 	 */
-	public function __construct($user) {
+	public function __construct($user, $db) {
 		$this->user = $user;
 		$this->propagator = new ChangePropagator(new View(''));
+		$this->db = $db;
 	}
 
 	/**
@@ -121,8 +128,11 @@ class Scanner extends PublicEmitter {
 				throw new ForbiddenException();
 			}
 			$scanner = $storage->getScanner();
+			$scanner->useTransactions(false);
 			$this->attachListener($mount);
+			$this->db->beginTransaction();
 			$scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG | \OC\Files\Cache\Scanner::REUSE_SIZE);
+			$this->db->commit();
 		}
 		$this->propagator->propagateChanges(time());
 	}
diff --git a/tests/lib/files/etagtest.php b/tests/lib/files/etagtest.php
index af9f66835f091ce3b6a296c658f6784d82911f27..b5dec107e795fe2e660c9dce50f898c439547e55 100644
--- a/tests/lib/files/etagtest.php
+++ b/tests/lib/files/etagtest.php
@@ -62,7 +62,7 @@ class EtagTest extends \PHPUnit_Framework_TestCase {
 		$files = array('/foo.txt', '/folder/bar.txt', '/folder/subfolder', '/folder/subfolder/qwerty.txt');
 		$originalEtags = $this->getEtags($files);
 
-		$scanner = new \OC\Files\Utils\Scanner($user1);
+		$scanner = new \OC\Files\Utils\Scanner($user1, \OC::$server->getDatabaseConnection());
 		$scanner->backgroundScan('/');
 
 		$newEtags = $this->getEtags($files);