diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php
index 39e36684b7ba1a4bc878e6253cb61081fd2a7e30..e69733727af88bcf869bb51e3cdec7dbe3da4e3f 100644
--- a/lib/files/cache/cache.php
+++ b/lib/files/cache/cache.php
@@ -201,7 +201,6 @@ class Cache {
 			$data['path'] = $file;
 			$data['parent'] = $this->getParentId($file);
 			$data['name'] = \OC_Util::basename($file);
-			$data['encrypted'] = isset($data['encrypted']) ? ((int)$data['encrypted']) : 0;
 
 			list($queryParts, $params) = $this->buildParts($data);
 			$queryParts[] = '`storage`';
@@ -265,6 +264,9 @@ class Cache {
 						$params[] = $value;
 						$queryParts[] = '`mtime`';
 					}
+				} elseif ($name === 'encrypted') {
+					// Boolean to integer conversion
+					$value = $value ? 1 : 0;
 				}
 				$params[] = $value;
 				$queryParts[] = '`' . $name . '`';
diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php
index dcc5d8c55813b4b9a2ed04c4fd9e16612e7e6361..a986c1ca72523ec10cf1da3db1bb24e216dacb53 100644
--- a/lib/files/cache/scanner.php
+++ b/lib/files/cache/scanner.php
@@ -97,13 +97,34 @@ class Scanner extends BasicEmitter {
 				}
 				$newData = $data;
 				if ($reuseExisting and $cacheData = $this->cache->get($file)) {
+					// prevent empty etag
+					$etag = $cacheData['etag'];
+					$propagateETagChange = false;
+					if (empty($etag)) {
+						$etag = $data['etag'];
+						$propagateETagChange = true;
+					}
+
 					// only reuse data if the file hasn't explicitly changed
 					if (isset($data['mtime']) && isset($cacheData['mtime']) && $data['mtime'] === $cacheData['mtime']) {
 						if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) {
 							$data['size'] = $cacheData['size'];
 						}
 						if ($reuseExisting & self::REUSE_ETAG) {
-							$data['etag'] = $cacheData['etag'];
+							$data['etag'] = $etag;
+							if ($propagateETagChange) {
+								$parent = $file;
+								while ($parent !== '') {
+									$parent = dirname($parent);
+									if ($parent === '.') {
+										$parent = '';
+									}
+									$parentCacheData = $this->cache->get($parent);
+									$this->cache->update($parentCacheData['fileid'], array(
+										'etag' => $this->storage->getETag($parent),
+									));
+								}
+							}
 						}
 					}
 					// Only update metadata that has changed
diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php
index 4c90119814ab4af467cec149d00c6cd4cea29559..3f3a045377a8efba7351a4987f59dd749b748a99 100644
--- a/tests/lib/files/cache/scanner.php
+++ b/tests/lib/files/cache/scanner.php
@@ -24,6 +24,21 @@ class Scanner extends \PHPUnit_Framework_TestCase {
 	 */
 	private $cache;
 
+	function setUp() {
+		$this->storage = new \OC\Files\Storage\Temporary(array());
+		$this->scanner = new \OC\Files\Cache\Scanner($this->storage);
+		$this->cache = new \OC\Files\Cache\Cache($this->storage);
+	}
+
+	function tearDown() {
+		if ($this->cache) {
+			$ids = $this->cache->getAll();
+			$permissionsCache = $this->storage->getPermissionsCache();
+			$permissionsCache->removeMultiple($ids, \OC_User::getUser());
+			$this->cache->clear();
+		}
+	}
+
 	function testFile() {
 		$data = "dummy file data\n";
 		$this->storage->file_put_contents('foo.txt', $data);
@@ -194,18 +209,28 @@ class Scanner extends \PHPUnit_Framework_TestCase {
 		$this->assertFalse($this->cache->inCache('folder/bar.txt'));
 	}
 
-	function setUp() {
-		$this->storage = new \OC\Files\Storage\Temporary(array());
-		$this->scanner = new \OC\Files\Cache\Scanner($this->storage);
-		$this->cache = new \OC\Files\Cache\Cache($this->storage);
-	}
+	public function testETagRecreation() {
+		$this->fillTestFolders();
 
-	function tearDown() {
-		if ($this->cache) {
-			$ids = $this->cache->getAll();
-			$permissionsCache = $this->storage->getPermissionsCache();
-			$permissionsCache->removeMultiple($ids, \OC_User::getUser());
-			$this->cache->clear();
-		}
+		$this->scanner->scan('folder/bar.txt');
+
+		// manipulate etag to simulate an empty etag
+		$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
+		$data0 = $this->cache->get('folder/bar.txt');
+		$data1 = $this->cache->get('folder');
+		$data2 = $this->cache->get('');
+		$data0['etag'] = '';
+		$this->cache->put('folder/bar.txt', $data0);
+
+		// rescan
+		$this->scanner->scan('folder/bar.txt', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
+
+		// verify cache content
+		$newData0 = $this->cache->get('folder/bar.txt');
+		$newData1 = $this->cache->get('folder');
+		$newData2 = $this->cache->get('');
+		$this->assertNotEmpty($newData0['etag']);
+		$this->assertNotEquals($data1['etag'], $newData1['etag']);
+		$this->assertNotEquals($data2['etag'], $newData2['etag']);
 	}
 }