diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php
index 286629b20f97e5979dc8bac60d9164217ab258fd..b88c5847ab5dfbc9da3a717c92943e35485a802d 100644
--- a/apps/dav/appinfo/v1/publicwebdav.php
+++ b/apps/dav/appinfo/v1/publicwebdav.php
@@ -50,7 +50,8 @@ $serverFactory = new OCA\DAV\Connector\Sabre\ServerFactory(
 	\OC::$server->getUserSession(),
 	\OC::$server->getMountManager(),
 	\OC::$server->getTagManager(),
-	\OC::$server->getRequest()
+	\OC::$server->getRequest(),
+	\OC::$server->getPreviewManager()
 );
 
 $requestUri = \OC::$server->getRequest()->getRequestUri();
diff --git a/apps/dav/appinfo/v1/webdav.php b/apps/dav/appinfo/v1/webdav.php
index 59d4f05bdc58c4fbd2688ec2c7e309387d767f72..f04bf40633459d58ca604decfa1f845d31925a1f 100644
--- a/apps/dav/appinfo/v1/webdav.php
+++ b/apps/dav/appinfo/v1/webdav.php
@@ -36,7 +36,8 @@ $serverFactory = new \OCA\DAV\Connector\Sabre\ServerFactory(
 	\OC::$server->getUserSession(),
 	\OC::$server->getMountManager(),
 	\OC::$server->getTagManager(),
-	\OC::$server->getRequest()
+	\OC::$server->getRequest(),
+	\OC::$server->getPreviewManager()
 );
 
 // Backends
diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php
index 203c0a4683f347365eaa04bac303e23e3b5935e8..c472f75b6bfe14cbf5e712bf60a3ff0f526c01ec 100644
--- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php
@@ -33,6 +33,7 @@ namespace OCA\DAV\Connector\Sabre;
 use OC\Files\View;
 use OCA\DAV\Upload\FutureFile;
 use OCP\Files\ForbiddenException;
+use OCP\IPreview;
 use Sabre\DAV\Exception\Forbidden;
 use Sabre\DAV\Exception\NotFound;
 use Sabre\DAV\IFile;
@@ -50,6 +51,7 @@ class FilesPlugin extends ServerPlugin {
 
 	// namespace
 	const NS_OWNCLOUD = 'http://owncloud.org/ns';
+	const NS_NEXTCLOUD = 'http://nextcloud.org/ns';
 	const FILEID_PROPERTYNAME = '{http://owncloud.org/ns}id';
 	const INTERNAL_FILEID_PROPERTYNAME = '{http://owncloud.org/ns}fileid';
 	const PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}permissions';
@@ -62,6 +64,7 @@ class FilesPlugin extends ServerPlugin {
 	const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
 	const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums';
 	const DATA_FINGERPRINT_PROPERTYNAME = '{http://owncloud.org/ns}data-fingerprint';
+	const HAS_PREVIEW_PROPERTYNAME = '{http://nextcloud.org/ns}has-preview';
 
 	/**
 	 * Reference to main server object
@@ -103,11 +106,17 @@ class FilesPlugin extends ServerPlugin {
 	 */
 	private $request;
 
+	/**
+	 * @var IPreview
+	 */
+	private $previewManager;
+
 	/**
 	 * @param Tree $tree
 	 * @param View $view
 	 * @param IConfig $config
 	 * @param IRequest $request
+	 * @param IPreview $previewManager
 	 * @param bool $isPublic
 	 * @param bool $downloadAttachment
 	 */
@@ -115,6 +124,7 @@ class FilesPlugin extends ServerPlugin {
 								View $view,
 								IConfig $config,
 								IRequest $request,
+								IPreview $previewManager,
 								$isPublic = false,
 								$downloadAttachment = true) {
 		$this->tree = $tree;
@@ -123,6 +133,7 @@ class FilesPlugin extends ServerPlugin {
 		$this->request = $request;
 		$this->isPublic = $isPublic;
 		$this->downloadAttachment = $downloadAttachment;
+		$this->previewManager = $previewManager;
 	}
 
 	/**
@@ -139,6 +150,7 @@ class FilesPlugin extends ServerPlugin {
 	public function initialize(\Sabre\DAV\Server $server) {
 
 		$server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
+		$server->xml->namespaceMap[self::NS_NEXTCLOUD] = 'nc';
 		$server->protectedProperties[] = self::FILEID_PROPERTYNAME;
 		$server->protectedProperties[] = self::INTERNAL_FILEID_PROPERTYNAME;
 		$server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME;
@@ -149,6 +161,7 @@ class FilesPlugin extends ServerPlugin {
 		$server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME;
 		$server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME;
 		$server->protectedProperties[] = self::DATA_FINGERPRINT_PROPERTYNAME;
+		$server->protectedProperties[] = self::HAS_PREVIEW_PROPERTYNAME;
 
 		// normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH
 		$allowedProperties = ['{DAV:}getetag'];
@@ -316,6 +329,10 @@ class FilesPlugin extends ServerPlugin {
 					return $this->config->getSystemValue('data-fingerprint', '');
 				}
 			});
+
+			$propFind->handle(self::HAS_PREVIEW_PROPERTYNAME, function () use ($node) {
+				return json_encode($this->previewManager->isAvailable($node->getFileInfo()));
+			});
 		}
 
 		if ($node instanceof \OCA\DAV\Files\FilesHome) {
diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php
index 9f142b996eeeb2a0a4785f13e9ea328fc72485f1..55b967619d6a07fa25fee97173db45377a849cce 100644
--- a/apps/dav/lib/Connector/Sabre/ServerFactory.php
+++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php
@@ -34,6 +34,7 @@ use OCP\Files\Mount\IMountManager;
 use OCP\IConfig;
 use OCP\IDBConnection;
 use OCP\ILogger;
+use OCP\IPreview;
 use OCP\IRequest;
 use OCP\ITagManager;
 use OCP\IUserSession;
@@ -54,6 +55,8 @@ class ServerFactory {
 	private $tagManager;
 	/** @var IRequest */
 	private $request;
+	/** @var IPreview  */
+	private $previewManager;
 
 	/**
 	 * @param IConfig $config
@@ -63,6 +66,7 @@ class ServerFactory {
 	 * @param IMountManager $mountManager
 	 * @param ITagManager $tagManager
 	 * @param IRequest $request
+	 * @param IPreview $previewManager
 	 */
 	public function __construct(
 		IConfig $config,
@@ -71,7 +75,8 @@ class ServerFactory {
 		IUserSession $userSession,
 		IMountManager $mountManager,
 		ITagManager $tagManager,
-		IRequest $request
+		IRequest $request,
+		IPreview $previewManager
 	) {
 		$this->config = $config;
 		$this->logger = $logger;
@@ -80,6 +85,7 @@ class ServerFactory {
 		$this->mountManager = $mountManager;
 		$this->tagManager = $tagManager;
 		$this->request = $request;
+		$this->previewManager = $previewManager;
 	}
 
 	/**
@@ -145,6 +151,7 @@ class ServerFactory {
 					$view,
 					$this->config,
 					$this->request,
+					$this->previewManager,
 					false,
 					!$this->config->getSystemValue('debug', false)
 				)
diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php
index c488feeb8003d7431f63daaf74426b3d63f850f1..e80f9ae125ab2e9744f456c4c032d0a73ea98676 100644
--- a/apps/dav/lib/Server.php
+++ b/apps/dav/lib/Server.php
@@ -158,6 +158,7 @@ class Server {
 						$view,
 						\OC::$server->getConfig(),
 						$this->request,
+						\OC::$server->getPreviewManager(),
 						false,
 						!\OC::$server->getConfig()->getSystemValue('debug', false)
 					)
diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
index 74f1d844b24405ba56bf9ca7ab1c944ba2866fab..6630c02754124501ce805995176e31396b375415 100644
--- a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
@@ -48,6 +48,7 @@ class FilesPluginTest extends TestCase {
 	const OWNER_ID_PROPERTYNAME = FilesPlugin::OWNER_ID_PROPERTYNAME;
 	const OWNER_DISPLAY_NAME_PROPERTYNAME = FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME;
 	const DATA_FINGERPRINT_PROPERTYNAME = FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME;
+	const HAS_PREVIEW_PROPERTYNAME = FilesPlugin::HAS_PREVIEW_PROPERTYNAME;
 
 	/**
 	 * @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject
@@ -79,6 +80,11 @@ class FilesPluginTest extends TestCase {
 	 */
 	private $request;
 
+	/**
+	 * @var \OCP\IPreview | \PHPUnit_Framework_MockObject_MockObject
+	 */
+	private $previewManager;
+
 	public function setUp() {
 		parent::setUp();
 		$this->server = $this->getMockBuilder('\Sabre\DAV\Server')
@@ -99,12 +105,16 @@ class FilesPluginTest extends TestCase {
 		$this->request = $this->getMockBuilder('\OCP\IRequest')
 			->disableOriginalConstructor()
 			->getMock();
+		$this->previewManager = $this->getMockBuilder('\OCP\IPreview')
+			->disableOriginalConstructor()
+			->getMock();
 
 		$this->plugin = new FilesPlugin(
 			$this->tree,
 			$this->view,
 			$this->config,
-			$this->request
+			$this->request,
+			$this->previewManager
 		);
 		$this->plugin->initialize($this->server);
 	}
@@ -139,6 +149,13 @@ class FilesPluginTest extends TestCase {
 		$node->expects($this->any())
 			->method('getDavPermissions')
 			->will($this->returnValue('DWCKMSR'));
+		$node->expects($this->any())
+			->method('getFileInfo')
+			->will($this->returnValue(
+				$this->getMockBuilder('\OCP\Files\FileInfo')
+				->disableOriginalConstructor()
+				->getMock()
+			));
 
 		return $node;
 	}
@@ -283,6 +300,7 @@ class FilesPluginTest extends TestCase {
 			$this->getMockBuilder('\OCP\IRequest')
 				->disableOriginalConstructor()
 				->getMock(),
+			$this->previewManager,
 			true);
 		$this->plugin->initialize($this->server);
 
@@ -555,4 +573,28 @@ class FilesPluginTest extends TestCase {
 
 		$this->plugin->httpGet($request, $response);
 	}
+
+	public function testHasPreview() {
+		/** @var \OCA\DAV\Connector\Sabre\Directory | \PHPUnit_Framework_MockObject_MockObject $node */
+		$node = $this->createTestNode('\OCA\DAV\Connector\Sabre\Directory');
+
+		$propFind = new PropFind(
+			'/dummyPath',
+			array(
+				self::HAS_PREVIEW_PROPERTYNAME
+			),
+			0
+		);
+
+		$this->previewManager->expects($this->once())
+			->method('isAvailable')
+			->will($this->returnValue(false));
+
+		$this->plugin->handleGetProperties(
+			$propFind,
+			$node
+		);
+
+		$this->assertEquals("false", $propFind->get(self::HAS_PREVIEW_PROPERTYNAME));
+	}
 }
diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
index 3302c23c3c6a6b5ef43aa5fa39a497e7908231c3..336a33058bf26a570bfb277aecc85790b5e4d6b2 100644
--- a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
@@ -25,6 +25,7 @@
 namespace OCA\DAV\Tests\unit\Connector\Sabre;
 
 use OCA\DAV\Connector\Sabre\FilesReportPlugin as FilesReportPluginImplementation;
+use OCP\IPreview;
 use Sabre\DAV\Exception\NotFound;
 use OCP\SystemTag\ISystemTagObjectMapper;
 use OC\Files\View;
@@ -60,6 +61,9 @@ class FilesReportPluginTest extends \Test\TestCase {
 	/** @var Folder|\PHPUnit_Framework_MockObject_MockObject **/
 	private $userFolder;
 
+	/** @var IPreview|\PHPUnit_Framework_MockObject_MockObject * */
+	private $previewManager;
+
 	public function setUp() {
 		parent::setUp();
 		$this->tree = $this->getMockBuilder('\Sabre\DAV\Tree')
@@ -93,6 +97,10 @@ class FilesReportPluginTest extends \Test\TestCase {
 			->disableOriginalConstructor()
 			->getMock();
 
+		$this->previewManager = $this->getMockBuilder('\OCP\IPreview')
+			->disableOriginalConstructor()
+			->getMock();
+
 		$user = $this->getMockBuilder('\OCP\IUser')
 			->disableOriginalConstructor()
 			->getMock();
@@ -365,7 +373,8 @@ class FilesReportPluginTest extends \Test\TestCase {
 				$config,
 				$this->getMockBuilder('\OCP\IRequest')
 					->disableOriginalConstructor()
-					->getMock()
+					->getMock(),
+				$this->previewManager
 			)
 		);
 		$this->plugin->initialize($this->server);
diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/RequestTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/RequestTest.php
index a254aca77235d847e352dd54813f0f689381e5a2..8b06678407ba543b62c0c34fdc210f5b871d92f1 100644
--- a/apps/dav/tests/unit/Connector/Sabre/RequestTest/RequestTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/RequestTest/RequestTest.php
@@ -66,7 +66,8 @@ abstract class RequestTest extends TestCase {
 			\OC::$server->getTagManager(),
 			$this->getMockBuilder('\OCP\IRequest')
 				->disableOriginalConstructor()
-				->getMock()
+				->getMock(),
+			\OC::$server->getPreviewManager()
 		);
 	}
 
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 24cccb3a5c8f34b04aef2def4510d0410776528d..f50322953d291463edda022d9c5ab2ea270e1f29 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -857,7 +857,8 @@
 				type: $el.attr('data-type'),
 				size: parseInt($el.attr('data-size'), 10),
 				etag: $el.attr('data-etag'),
-				permissions: parseInt($el.attr('data-permissions'), 10)
+				permissions: parseInt($el.attr('data-permissions'), 10),
+				hasPreview: $el.attr('data-has-preview') === 'true'
 			};
 			var icon = $el.attr('data-icon');
 			if (icon) {
@@ -1073,7 +1074,8 @@
 				"data-mime": mime,
 				"data-mtime": mtime,
 				"data-etag": fileData.etag,
-				"data-permissions": fileData.permissions || this.getDirectoryPermissions()
+				"data-permissions": fileData.permissions || this.getDirectoryPermissions(),
+				"data-has-preview": fileData.hasPreview !== false
 			});
 
 			if (dataIcon) {
@@ -1335,7 +1337,7 @@
 			// display actions
 			this.fileActions.display(filenameTd, !options.silent, this);
 
-			if (mime !== 'httpd/unix-directory') {
+			if (mime !== 'httpd/unix-directory' && fileData.hasPreview !== false) {
 				var iconDiv = filenameTd.find('.thumbnail');
 				// lazy load / newly inserted td ?
 				// the typeof check ensures that the default value of animate is true
diff --git a/apps/files/js/sidebarpreviewmanager.js b/apps/files/js/sidebarpreviewmanager.js
index cfd1fffae130fcc2b959ab4fe95447e0e01f510a..3d5401191899a92aadf3da741e80e34c7e5e6b0e 100644
--- a/apps/files/js/sidebarpreviewmanager.js
+++ b/apps/files/js/sidebarpreviewmanager.js
@@ -32,9 +32,18 @@
 		},
 
 		loadPreview: function (model, $thumbnailDiv, $thumbnailContainer) {
-			var handler = this.getPreviewHandler(model.get('mimetype'));
-			var fallback = this.fallbackPreview.bind(this, model, $thumbnailDiv, $thumbnailContainer);
-			handler(model, $thumbnailDiv, $thumbnailContainer, fallback);
+			if (model.get('hasPreview') === false) {
+				var mimeIcon = OC.MimeType.getIconUrl(model.get('mimetype'));
+				$thumbnailDiv.removeClass('icon-loading icon-32');
+				$thumbnailContainer.removeClass('image'); //fall back to regular view
+				$thumbnailDiv.css({
+					'background-image': 'url("' + mimeIcon + '")'
+				});
+			} else {
+				var handler = this.getPreviewHandler(model.get('mimetype'));
+				var fallback = this.fallbackPreview.bind(this, model, $thumbnailDiv, $thumbnailContainer);
+				handler(model, $thumbnailDiv, $thumbnailContainer, fallback);
+			}
 		},
 
 		// previews for images and mimetype icons
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 98511fd3d64de0695f1ffce4ffea75a89b488453..97fa9804a22072c4fe67855ee2ea3579ae88c38d 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -1792,7 +1792,8 @@ describe('OCA.Files.FileList tests', function() {
 					type: 'file',
 					size: 12,
 					etag: 'abc',
-					permissions: OC.PERMISSION_ALL
+					permissions: OC.PERMISSION_ALL,
+					hasPreview: true
 				});
 				expect(files[1]).toEqual({
 					id: 3,
@@ -1802,7 +1803,8 @@ describe('OCA.Files.FileList tests', function() {
 					mtime: 234560000,
 					size: 58009,
 					etag: '123',
-					permissions: OC.PERMISSION_ALL
+					permissions: OC.PERMISSION_ALL,
+					hasPreview: true
 				});
 				expect(files[2]).toEqual({
 					id: 4,
@@ -1812,7 +1814,8 @@ describe('OCA.Files.FileList tests', function() {
 					mtime: 134560000,
 					size: 250,
 					etag: '456',
-					permissions: OC.PERMISSION_ALL
+					permissions: OC.PERMISSION_ALL,
+					hasPreview: true
 				});
 				expect(files[0].id).toEqual(1);
 				expect(files[0].name).toEqual('One.txt');
@@ -1833,7 +1836,8 @@ describe('OCA.Files.FileList tests', function() {
 					type: 'file',
 					size: 12,
 					etag: 'abc',
-					permissions: OC.PERMISSION_ALL
+					permissions: OC.PERMISSION_ALL,
+					hasPreview: true
 				});
 				expect(files[1]).toEqual({
 					id: 4,
@@ -1843,7 +1847,8 @@ describe('OCA.Files.FileList tests', function() {
 					mtime: 134560000,
 					size: 250,
 					etag: '456',
-					permissions: OC.PERMISSION_ALL
+					permissions: OC.PERMISSION_ALL,
+					hasPreview: true
 				});
 			});
 			describe('Download', function() {
diff --git a/core/js/files/client.js b/core/js/files/client.js
index 0bf5a69e19c99016c3358f60c71a80d095a423fb..a195258afbba46d7ce620a1cb02d9bfacddfae6c 100644
--- a/core/js/files/client.js
+++ b/core/js/files/client.js
@@ -47,7 +47,8 @@
 			baseUrl: this._baseUrl,
 			xmlNamespaces: {
 				'DAV:': 'd',
-				'http://owncloud.org/ns': 'oc'
+				'http://owncloud.org/ns': 'oc',
+				'http://nextcloud.org/ns': 'nc'
 			}
 		};
 		if (options.userName) {
@@ -61,6 +62,7 @@
 	};
 
 	Client.NS_OWNCLOUD = 'http://owncloud.org/ns';
+	Client.NS_NEXTCLOUD = 'http://nextcloud.org/ns';
 	Client.NS_DAV = 'DAV:';
 	Client._PROPFIND_PROPERTIES = [
 		/**
@@ -95,7 +97,11 @@
 		/**
 		 * File sizes
 		 */
-		[Client.NS_DAV, 'getcontentlength']
+		[Client.NS_DAV, 'getcontentlength'],
+		/**
+		 * Preview availability
+		 */
+		[Client.NS_NEXTCLOUD, 'has-preview']
 	];
 
 	/**
@@ -274,6 +280,13 @@
 				data.size = parseInt(sizeProp, 10);
 			}
 
+			var hasPreviewProp = props['{' + Client.NS_NEXTCLOUD + '}has-preview'];
+			if (!_.isUndefined(hasPreviewProp)) {
+				data.hasPreview = hasPreviewProp === 'true';
+			} else {
+				data.hasPreview = true;
+			}
+
 			var contentType = props['{' + Client.NS_DAV + '}getcontenttype'];
 			if (!_.isUndefined(contentType)) {
 				data.mimetype = contentType;
diff --git a/core/js/files/fileinfo.js b/core/js/files/fileinfo.js
index 3bf68d88b15c2cdbae1a8e19cc6b4bc08dce9a67..1fc239da47aec566136ddf925e5b5fec2185bdb4 100644
--- a/core/js/files/fileinfo.js
+++ b/core/js/files/fileinfo.js
@@ -127,7 +127,12 @@
 		 *
 		 * @type string
 		 */
-		mountType: null
+		mountType: null,
+
+		/**
+		 * @type boolean
+		 */
+		hasPreview: true
 	};
 
 	if (!OC.Files) {