diff --git a/lib/private/files.php b/lib/private/files.php
index 8ce632013cf6dc8aba00b9425ef9af6ca2334a82..24fca4a5df3ff7c7cd79b114e5b33381dabbad0e 100644
--- a/lib/private/files.php
+++ b/lib/private/files.php
@@ -131,7 +131,7 @@ class OC_Files {
 				}
 				if ($xsendfile) {
 					list($storage) = \OC\Files\Filesystem::resolvePath(\OC\Files\Filesystem::getView()->getAbsolutePath($filename));
-					if ($storage instanceof \OC\Files\Storage\Local) {
+					if ($storage->isLocal()) {
 						self::addSendfileHeader(\OC\Files\Filesystem::getLocalFile($filename));
 					}
 				}
diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php
index 678bf4190239c0e3dc5e96cea7fa40d67d1b0204..55b1471593ddf33695f889132cd3d7d966a3e2c4 100644
--- a/lib/private/files/storage/common.php
+++ b/lib/private/files/storage/common.php
@@ -370,4 +370,13 @@ abstract class Common implements \OC\Files\Storage\Storage {
 	public function free_space($path) {
 		return \OC\Files\SPACE_UNKNOWN;
 	}
+
+	/**
+	 * {@inheritdoc}
+	 */
+	public function isLocal() {
+		// the common implementation returns a temporary file by
+		// default, which is not local
+		return false;
+	}
 }
diff --git a/lib/private/files/storage/local.php b/lib/private/files/storage/local.php
index db3c6bfca3a7b843826aa4c08ef1bc58afad0b7b..fa0788f23771fd77d44deb2187da4ce59266beaf 100644
--- a/lib/private/files/storage/local.php
+++ b/lib/private/files/storage/local.php
@@ -298,5 +298,12 @@ if (\OC_Util::runningOnWindows()) {
 		public function hasUpdated($path, $time) {
 			return $this->filemtime($path) > $time;
 		}
+
+		/**
+		 * {@inheritdoc}
+		 */
+		public function isLocal() {
+			return true;
+		}
 	}
 }
diff --git a/lib/private/files/storage/wrapper/wrapper.php b/lib/private/files/storage/wrapper/wrapper.php
index f9adda803142657acccaebee1c30caf34c9f14a7..11ea9f71da75c5cc3cfcfa3750140b85c7a258b0 100644
--- a/lib/private/files/storage/wrapper/wrapper.php
+++ b/lib/private/files/storage/wrapper/wrapper.php
@@ -432,4 +432,12 @@ class Wrapper implements \OC\Files\Storage\Storage {
 	public function test() {
 		return $this->storage->test();
 	}
+
+	/**
+	 * Returns the wrapped storage's value for isLocal()
+	 * @return bool wrapped storage's isLocal() value
+	 */
+	public function isLocal() {
+		return $this->storage->isLocal();
+	}
 }
diff --git a/lib/public/files/storage.php b/lib/public/files/storage.php
index 194b42a6481c83b8d135f35529d5b5856442cfa1..fe30f8f50afbb9d1ad4c15da15c5351d9646f136 100644
--- a/lib/public/files/storage.php
+++ b/lib/public/files/storage.php
@@ -315,4 +315,15 @@ interface Storage {
 	 * @return string
 	 */
 	public function getETag($path);
+
+	/**
+	 * Returns whether the storage is local, which means that files
+	 * are stored on the local filesystem instead of remotely.
+	 * Calling getLocalFile() for local storages should always
+	 * return the local files, whereas for non-local storages
+	 * it might return a temporary file.
+	 *
+	 * @return bool true if the files are stored locally, false otherwise
+	 */
+	public function isLocal();
 }