diff --git a/apps/files_sharing/lib/external/scanner.php b/apps/files_sharing/lib/external/scanner.php
index 8921dd1a4c0b5fb8d7439698aa14a30b8a278b76..4dc5d4be9d866c24defa6a6b9a067fd3284462f3 100644
--- a/apps/files_sharing/lib/external/scanner.php
+++ b/apps/files_sharing/lib/external/scanner.php
@@ -19,23 +19,7 @@ class Scanner extends \OC\Files\Cache\Scanner {
 	}
 
 	public function scanAll() {
-		$remote = $this->storage->getRemote();
-		$token = $this->storage->getToken();
-		$password = $this->storage->getPassword();
-		$url = $remote . '/index.php/apps/files_sharing/shareinfo?t=' . $token;
-
-		$ch = curl_init();
-
-		curl_setopt($ch, CURLOPT_URL, $url);
-		curl_setopt($ch, CURLOPT_POST, 1);
-		curl_setopt($ch, CURLOPT_POSTFIELDS,
-			http_build_query(array('password' => $password)));
-		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-
-		$result = curl_exec($ch);
-		curl_close($ch);
-
-		$data = json_decode($result, true);
+		$data = $this->storage->getShareInfo();
 		if ($data['status'] === 'success') {
 			$this->addResult($data['data'], '');
 		} else {
diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php
index 454196f15ae0d046faa1a2d6bc83628f6b57d5e6..be3f367c3830484e5e96e145c8a3dcb6c72bf1b7 100644
--- a/apps/files_sharing/lib/external/storage.php
+++ b/apps/files_sharing/lib/external/storage.php
@@ -10,7 +10,11 @@ namespace OCA\Files_Sharing\External;
 
 use OC\Files\Filesystem;
 use OC\Files\Storage\DAV;
+use OC\ForbiddenException;
 use OCA\Files_Sharing\ISharedStorage;
+use OCP\Files\NotFoundException;
+use OCP\Files\StorageInvalidException;
+use OCP\Files\StorageNotAvailableException;
 
 class Storage extends DAV implements ISharedStorage {
 	/**
@@ -108,6 +112,8 @@ class Storage extends DAV implements ISharedStorage {
 	 *
 	 * @param string $path
 	 * @param int $time
+	 * @throws \OCP\Files\StorageNotAvailableException
+	 * @throws \OCP\Files\StorageInvalidException
 	 * @return bool
 	 */
 	public function hasUpdated($path, $time) {
@@ -117,6 +123,75 @@ class Storage extends DAV implements ISharedStorage {
 			return false;
 		}
 		$this->updateChecked = true;
-		return parent::hasUpdated('', $time);
+		try {
+			return parent::hasUpdated('', $time);
+		} catch (StorageNotAvailableException $e) {
+			// see if we can find out why the share is unavailable\
+			try {
+				$this->getShareInfo();
+			} catch (NotFoundException $shareException) {
+				// a 404 can either mean that the share no longer exists or there is no ownCloud on the remote
+				if ($this->testRemote()) {
+					// valid ownCloud instance means that the public share no longer exists
+					// since this is permanent (re-sharing the file will create a new token)
+					// we mark the storage as invalid
+					throw new StorageInvalidException();
+				} else {
+					// ownCloud instance is gone, likely to be a temporary server configuration error
+					throw $e;
+				}
+			} catch(\Exception $shareException) {
+				// todo, maybe handle 403 better and ask the user for a new password
+				throw $e;
+			}
+			throw $e;
+		}
+	}
+
+	/**
+	 * check if the configured remote is a valid ownCloud instance
+	 *
+	 * @return bool
+	 */
+	protected function testRemote() {
+		try {
+			$result = file_get_contents($this->remote . '/status.php');
+			$data = json_decode($result);
+			return is_object($data) and !empty($data->version);
+		} catch (\Exception $e) {
+			return false;
+		}
+	}
+
+	public function getShareInfo() {
+		$remote = $this->getRemote();
+		$token = $this->getToken();
+		$password = $this->getPassword();
+		$url = $remote . '/index.php/apps/files_sharing/shareinfo?t=' . $token;
+
+		$ch = curl_init();
+
+		curl_setopt($ch, CURLOPT_URL, $url);
+		curl_setopt($ch, CURLOPT_POST, 1);
+		curl_setopt($ch, CURLOPT_POSTFIELDS,
+			http_build_query(array('password' => $password)));
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+
+		$result = curl_exec($ch);
+
+		$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+		curl_close($ch);
+
+		switch ($status) {
+			case 401:
+			case 403:
+				throw new ForbiddenException();
+			case 404:
+				throw new NotFoundException();
+			case 500:
+				throw new \Exception();
+		}
+
+		return json_decode($result, true);
 	}
 }
diff --git a/lib/public/files/storageinvalidexception.php b/lib/public/files/storageinvalidexception.php
new file mode 100644
index 0000000000000000000000000000000000000000..7419ccc1d119d092a9c4bb8824c9f940dae37ddb
--- /dev/null
+++ b/lib/public/files/storageinvalidexception.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * Public interface of ownCloud for apps to use.
+ * Files/AlreadyExistsException class
+ */
+
+// use OCP namespace for all classes that are considered public.
+// This means that they should be used by apps instead of the internal ownCloud classes
+namespace OCP\Files;
+
+/**
+ * Storage has invalid configuration
+ */
+class StorageInvalidException extends \Exception {
+}
diff --git a/lib/public/files/storagenotavailableexception.php b/lib/public/files/storagenotavailableexception.php
index fcc0c9cacfe52ab82f2445afd6904454678417ad..b526cb4ea0f884151e973ef33e5c9902203485a2 100644
--- a/lib/public/files/storagenotavailableexception.php
+++ b/lib/public/files/storagenotavailableexception.php
@@ -15,5 +15,8 @@
 // This means that they should be used by apps instead of the internal ownCloud classes
 namespace OCP\Files;
 
+/**
+ * Storage is temporarily not available
+ */
 class StorageNotAvailableException extends \Exception {
 }