diff --git a/core/js/config.php b/core/js/config.php
index c975c6db2dc27365e2b43fe46b3d6d8aa122fad6..7216c50afa904723c06c8781827d2806fc9d6aea 100644
--- a/core/js/config.php
+++ b/core/js/config.php
@@ -166,6 +166,7 @@ $array = array(
 			'baseUrl' => $defaults->getBaseUrl(),
 			'syncClientUrl' => $defaults->getSyncClientUrl(),
 			'docBaseUrl' => $defaults->getDocBaseUrl(),
+			'docPlaceholderUrl' => $defaults->buildDocLinkToKey('PLACEHOLDER'),
 			'slogan' => $defaults->getSlogan(),
 			'logoClaim' => $defaults->getLogoClaim(),
 			'shortFooter' => $defaults->getShortFooter(),
diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js
index 8763ec1c71b401b3bf8d5669b16b6552d3221ffa..b1b8dd358d24ef438b129e74b8967a6ba9c3028a 100644
--- a/core/js/setupchecks.js
+++ b/core/js/setupchecks.js
@@ -46,6 +46,35 @@
 			return deferred.promise();
 		},
 
+		/**
+		 * Check whether the .well-known URLs works.
+		 *
+		 * @param url the URL to test
+		 * @param placeholderUrl the placeholder URL - can be found at oc_defaults.docPlaceholderUrl
+		 * @return $.Deferred object resolved with an array of error messages
+		 */
+		checkWellKnownUrl: function(url, placeholderUrl) {
+			var deferred = $.Deferred();
+			var afterCall = function(xhr) {
+				var messages = [];
+				if (xhr.status !== 207) {
+					var docUrl = placeholderUrl.replace('PLACEHOLDER', 'admin-setup-well-known-URL');
+					messages.push({
+						msg: t('core', 'Your web server is not set up properly to resolve "{url}". Further information can be found in our <a target="_blank" href="{docLink}">documentation</a>.', { docLink: docUrl, url: url }),
+						type: OC.SetupChecks.MESSAGE_TYPE_ERROR
+					});
+				}
+				deferred.resolve(messages);
+			};
+
+			$.ajax({
+				type: 'PROPFIND',
+				url: url,
+				complete: afterCall
+			});
+			return deferred.promise();
+		},
+
 		/**
 		 * Runs setup checks on the server side
 		 *
diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js
index c5f1aa5effedc31b7ad07f632b5bcae14aae22f6..18ba44ac61b38945a29b72eba0e9c73cffd8fdf5 100644
--- a/core/js/tests/specs/setupchecksSpec.js
+++ b/core/js/tests/specs/setupchecksSpec.js
@@ -60,6 +60,33 @@ describe('OC.SetupChecks tests', function() {
 		});
 	});
 
+	describe('checkWellKnownUrl', function() {
+		it('should fail with another response status code than 207', function(done) {
+			var async = OC.SetupChecks.checkWellKnownUrl('/.well-known/caldav/', 'http://example.org/PLACEHOLDER');
+
+			suite.server.requests[0].respond(200);
+
+			async.done(function( data, s, x ){
+				expect(data).toEqual([{
+					msg: 'Your web server is not set up properly to resolve "/.well-known/caldav/". Further information can be found in our <a target="_blank" href="http://example.org/admin-setup-well-known-URL">documentation</a>.',
+					type: OC.SetupChecks.MESSAGE_TYPE_ERROR
+				}]);
+				done();
+			});
+		});
+
+		it('should return no error with a response status code of 207', function(done) {
+			var async = OC.SetupChecks.checkWebDAV('/.well-known/caldav/', 'http://example.org/PLACEHOLDER');
+
+			suite.server.requests[0].respond(207);
+
+			async.done(function( data, s, x ){
+				expect(data).toEqual([]);
+				done();
+			});
+		});
+	});
+
 	describe('checkSetup', function() {
 		it('should return an error if server has no internet connection', function(done) {
 			var async = OC.SetupChecks.checkSetup();
diff --git a/settings/js/admin.js b/settings/js/admin.js
index eb3b756bf0fcae722aad0f899af7f9c132787619..644b773d7b1e04be5f6e581c198933b3f24a6a6b 100644
--- a/settings/js/admin.js
+++ b/settings/js/admin.js
@@ -168,6 +168,8 @@ $(document).ready(function(){
 	// run setup checks then gather error messages
 	$.when(
 		OC.SetupChecks.checkWebDAV(),
+		OC.SetupChecks.checkWellKnownUrl('/.well-known/caldav/', oc_defaults.docPlaceholderUrl),
+		OC.SetupChecks.checkWellKnownUrl('/.well-known/carddav/', oc_defaults.docPlaceholderUrl),
 		OC.SetupChecks.checkSetup(),
 		OC.SetupChecks.checkGeneric()
 	).then(function(check1, check2, check3) {