diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php
index dcb6e8fd39ac7fd8441027356a150772d294bb6c..d696f003c57c13f6943be85ae5841fb3907a7ee8 100644
--- a/lib/files/cache/cache.php
+++ b/lib/files/cache/cache.php
@@ -114,7 +114,7 @@ class Cache {
 			$params = array($file);
 		}
 		$query = \OC_DB::prepare(
-			'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `etag`
+			'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `storage_mtime`, `encrypted`, `etag`
 			 FROM `*PREFIX*filecache` ' . $where);
 		$result = $query->execute($params);
 		$data = $result->fetchRow();
@@ -133,6 +133,9 @@ class Cache {
 			$data['storage'] = $this->storageId;
 			$data['mimetype'] = $this->getMimetype($data['mimetype']);
 			$data['mimepart'] = $this->getMimetype($data['mimepart']);
+			if ($data['storage_mtime'] == 0) {
+				$data['storage_mtime'] = $data['mtime'];
+			}
 		}
 
 		return $data;
@@ -148,13 +151,16 @@ class Cache {
 		$fileId = $this->getId($folder);
 		if ($fileId > -1) {
 			$query = \OC_DB::prepare(
-				'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `etag`
+				'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `storage_mtime`, `encrypted`, `etag`
 			 	 FROM `*PREFIX*filecache` WHERE parent = ? ORDER BY `name` ASC');
 			$result = $query->execute(array($fileId));
 			$files = $result->fetchAll();
 			foreach ($files as &$file) {
 				$file['mimetype'] = $this->getMimetype($file['mimetype']);
 				$file['mimepart'] = $this->getMimetype($file['mimepart']);
+				if ($file['storage_mtime'] == 0) {
+					$file['storage_mtime'] = $file['mtime'];
+				}
 			}
 			return $files;
 		} else {
@@ -226,7 +232,7 @@ class Cache {
 	 * @return array
 	 */
 	function buildParts(array $data) {
-		$fields = array('path', 'parent', 'name', 'mimetype', 'size', 'mtime', 'encrypted', 'etag');
+		$fields = array('path', 'parent', 'name', 'mimetype', 'size', 'mtime', 'storage_mtime', 'encrypted', 'etag');
 		$params = array();
 		$queryParts = array();
 		foreach ($data as $name => $value) {
@@ -238,6 +244,11 @@ class Cache {
 					$params[] = $this->getMimetypeId(substr($value, 0, strpos($value, '/')));
 					$queryParts[] = '`mimepart`';
 					$value = $this->getMimetypeId($value);
+				} elseif ($name === 'storage_mtime') {
+					if (!isset($data['mtime'])) {
+						$params[] = $value;
+						$queryParts[] = '`mtime`';
+					}
 				}
 				$params[] = $value;
 				$queryParts[] = '`' . $name . '`';
diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php
index 9a5546dce3f59db5221755ac06eba3219352da67..2623a167e9f66bf831f03d44a8f9f2b8a235ab07 100644
--- a/lib/files/cache/scanner.php
+++ b/lib/files/cache/scanner.php
@@ -51,6 +51,7 @@ class Scanner {
 			$data['size'] = $this->storage->filesize($path);
 		}
 		$data['etag'] = $this->storage->getETag($path);
+		$data['storage_mtime'] = $data['mtime'];
 		return $data;
 	}
 
diff --git a/lib/files/cache/watcher.php b/lib/files/cache/watcher.php
index 31059ec7f56883cd9105291c775d4f1f1d77ff13..8bfd4602f3aae9f0ee8ca0233b09be0c5faf8464 100644
--- a/lib/files/cache/watcher.php
+++ b/lib/files/cache/watcher.php
@@ -43,7 +43,7 @@ class Watcher {
 	 */
 	public function checkUpdate($path) {
 		$cachedEntry = $this->cache->get($path);
-		if ($this->storage->hasUpdated($path, $cachedEntry['mtime'])) {
+		if ($this->storage->hasUpdated($path, $cachedEntry['storage_mtime'])) {
 			if ($this->storage->is_dir($path)) {
 				$this->scanner->scan($path, Scanner::SCAN_SHALLOW);
 			} else {
diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php
index c466fbb63e79bda189e37d05252ce1eaf53e5896..794664c8893d21df28e5c64d36a01c297b658cb5 100644
--- a/tests/lib/files/cache/cache.php
+++ b/tests/lib/files/cache/cache.php
@@ -204,6 +204,23 @@ class Cache extends \PHPUnit_Framework_TestCase {
 		$this->assertEquals(array($storageId, 'foo'), \OC\Files\Cache\Cache::getById($id));
 	}
 
+	function testStorageMTime() {
+		$data = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
+		$this->cache->put('foo', $data);
+		$cachedData = $this->cache->get('foo');
+		$this->assertEquals($data['mtime'], $cachedData['storage_mtime']);//if no storage_mtime is saved, mtime should be used
+
+		$this->cache->put('foo', array('storage_mtime' => 30));//when setting storage_mtime, mtime is also set
+		$cachedData = $this->cache->get('foo');
+		$this->assertEquals(30, $cachedData['storage_mtime']);
+		$this->assertEquals(30, $cachedData['mtime']);
+
+		$this->cache->put('foo', array('mtime' => 25));//setting mtime does not change storage_mtime
+		$cachedData = $this->cache->get('foo');
+		$this->assertEquals(30, $cachedData['storage_mtime']);
+		$this->assertEquals(25, $cachedData['mtime']);
+	}
+
 	public function tearDown() {
 		$this->cache->clear();
 	}
@@ -213,3 +230,4 @@ class Cache extends \PHPUnit_Framework_TestCase {
 		$this->cache = new \OC\Files\Cache\Cache($this->storage);
 	}
 }
+
diff --git a/tests/lib/files/cache/watcher.php b/tests/lib/files/cache/watcher.php
index e8a1689cab0dbcee6bce27a24a325214ebd9e463..1ea0c2eb47a8d3ee05cc76f884216c71f0d85b6c 100644
--- a/tests/lib/files/cache/watcher.php
+++ b/tests/lib/files/cache/watcher.php
@@ -35,7 +35,7 @@ class Watcher extends \PHPUnit_Framework_TestCase {
 		$updater = $storage->getWatcher();
 
 		//set the mtime to the past so it can detect an mtime change
-		$cache->put('', array('mtime' => 10));
+		$cache->put('', array('storage_mtime' => 10));
 
 		$this->assertTrue($cache->inCache('folder/bar.txt'));
 		$this->assertTrue($cache->inCache('folder/bar2.txt'));
@@ -47,14 +47,14 @@ class Watcher extends \PHPUnit_Framework_TestCase {
 		$cachedData = $cache->get('bar.test');
 		$this->assertEquals(3, $cachedData['size']);
 
-		$cache->put('bar.test', array('mtime' => 10));
+		$cache->put('bar.test', array('storage_mtime' => 10));
 		$storage->file_put_contents('bar.test', 'test data');
 
 		$updater->checkUpdate('bar.test');
 		$cachedData = $cache->get('bar.test');
 		$this->assertEquals(9, $cachedData['size']);
 
-		$cache->put('folder', array('mtime' => 10));
+		$cache->put('folder', array('storage_mtime' => 10));
 
 		$storage->unlink('folder/bar2.txt');
 		$updater->checkUpdate('folder');
@@ -69,7 +69,7 @@ class Watcher extends \PHPUnit_Framework_TestCase {
 		$updater = $storage->getWatcher();
 
 		//set the mtime to the past so it can detect an mtime change
-		$cache->put('', array('mtime' => 10));
+		$cache->put('', array('storage_mtime' => 10));
 
 		$storage->unlink('foo.txt');
 		$storage->rename('folder', 'foo.txt');
@@ -86,7 +86,7 @@ class Watcher extends \PHPUnit_Framework_TestCase {
 		$updater = $storage->getWatcher();
 
 		//set the mtime to the past so it can detect an mtime change
-		$cache->put('foo.txt', array('mtime' => 10));
+		$cache->put('foo.txt', array('storage_mtime' => 10));
 
 		$storage->unlink('foo.txt');
 		$storage->rename('folder', 'foo.txt');
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index a064e44f3efdaea1850014f0193c1cf3145aa96c..c9a8a0fb081f84192cc089abee97e5a12a0ceb11 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -220,7 +220,7 @@ class View extends \PHPUnit_Framework_TestCase {
 		$cachedData = $rootView->getFileInfo('foo.txt');
 		$this->assertEquals(16, $cachedData['size']);
 
-		$rootView->putFileInfo('foo.txt', array('mtime' => 10));
+		$rootView->putFileInfo('foo.txt', array('storage_mtime' => 10));
 		$storage1->file_put_contents('foo.txt', 'foo');
 		clearstatcache();