diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php
index 2771f974614a4502a923dd5187b19181cd406c33..454196f15ae0d046faa1a2d6bc83628f6b57d5e6 100644
--- a/apps/files_sharing/lib/external/storage.php
+++ b/apps/files_sharing/lib/external/storage.php
@@ -33,6 +33,8 @@ class Storage extends DAV implements ISharedStorage {
 	 */
 	private $token;
 
+	private $updateChecked = false;
+
 	public function __construct($options) {
 		$this->remote = $options['remote'];
 		$this->remoteUser = $options['owner'];
@@ -100,4 +102,21 @@ class Storage extends DAV implements ISharedStorage {
 		}
 		return $this->scanner;
 	}
+
+	/**
+	 * check if a file or folder has been updated since $time
+	 *
+	 * @param string $path
+	 * @param int $time
+	 * @return bool
+	 */
+	public function hasUpdated($path, $time) {
+		// since for owncloud webdav servers we can rely on etag propagation we only need to check the root of the storage
+		// because of that we only do one check for the entire storage per request
+		if ($this->updateChecked) {
+			return false;
+		}
+		$this->updateChecked = true;
+		return parent::hasUpdated('', $time);
+	}
 }
diff --git a/lib/private/files/storage/dav.php b/lib/private/files/storage/dav.php
index 8536c65ace9fbd38f23a44d9f4dc06de3d4c8931..8b97f7502048cf6af4b5127a791aeddb00b39074 100644
--- a/lib/private/files/storage/dav.php
+++ b/lib/private/files/storage/dav.php
@@ -426,21 +426,7 @@ class DAV extends \OC\Files\Storage\Common {
 		$this->init();
 		$response = $this->client->propfind($this->encodePath($path), array('{http://owncloud.org/ns}permissions'));
 		if (isset($response['{http://owncloud.org/ns}permissions'])) {
-			$permissions = \OCP\PERMISSION_READ;
-			$permissionsString = $response['{http://owncloud.org/ns}permissions'];
-			if (strpos($permissionsString, 'R') !== false) {
-				$permissions |= \OCP\PERMISSION_SHARE;
-			}
-			if (strpos($permissionsString, 'D') !== false) {
-				$permissions |= \OCP\PERMISSION_DELETE;
-			}
-			if (strpos($permissionsString, 'W') !== false) {
-				$permissions |= \OCP\PERMISSION_UPDATE;
-			}
-			if (strpos($permissionsString, 'C') !== false) {
-				$permissions |= \OCP\PERMISSION_CREATE;
-			}
-			return $permissions;
+			return $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
 		} else if ($this->is_dir($path)) {
 			return \OCP\PERMISSION_ALL;
 		} else if ($this->file_exists($path)) {
@@ -449,5 +435,58 @@ class DAV extends \OC\Files\Storage\Common {
 			return 0;
 		}
 	}
+
+	/**
+	 * @param string $permissionsString
+	 * @return int
+	 */
+	protected function parsePermissions($permissionsString) {
+		$permissions = \OCP\PERMISSION_READ;
+		if (strpos($permissionsString, 'R') !== false) {
+			$permissions |= \OCP\PERMISSION_SHARE;
+		}
+		if (strpos($permissionsString, 'D') !== false) {
+			$permissions |= \OCP\PERMISSION_DELETE;
+		}
+		if (strpos($permissionsString, 'W') !== false) {
+			$permissions |= \OCP\PERMISSION_UPDATE;
+		}
+		if (strpos($permissionsString, 'CK') !== false) {
+			$permissions |= \OCP\PERMISSION_CREATE;
+			$permissions |= \OCP\PERMISSION_UPDATE;
+		}
+		return $permissions;
+	}
+
+	/**
+	 * check if a file or folder has been updated since $time
+	 *
+	 * @param string $path
+	 * @param int $time
+	 * @return bool
+	 */
+	public function hasUpdated($path, $time) {
+		$this->init();
+		$response = $this->client->propfind($this->encodePath($path), array(
+			'{DAV:}getlastmodified',
+			'{DAV:}getetag',
+			'{http://owncloud.org/ns}permissions'
+		));
+		if (isset($response['{DAV:}getetag'])) {
+			$cachedData = $this->getCache()->get($path);
+			$etag = trim($response['{DAV:}getetag'], '"');
+			if ($cachedData['etag'] !== $etag) {
+				return true;
+			} else if (isset($response['{http://owncloud.org/ns}permissions'])) {
+				$permissions = $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
+				return $permissions !== $cachedData['permissions'];
+			} else {
+				return false;
+			}
+		} else {
+			$remoteMtime = strtotime($response['{DAV:}getlastmodified']);
+			return $remoteMtime > $time;
+		}
+	}
 }