diff --git a/core/js/oc-backbone-webdav.js b/core/js/oc-backbone-webdav.js
index 1c1b5c71d81a02fca6c254f870eb5b3b158ecdfb..4e3f11ce09111b239e72152f89c25e7fd9478bfb 100644
--- a/core/js/oc-backbone-webdav.js
+++ b/core/js/oc-backbone-webdav.js
@@ -120,7 +120,15 @@
 		}
 
 		var parts = url.split('/');
-		return parts[parts.length - 1];
+		var result;
+		do {
+			result = parts[parts.length - 1];
+			parts.pop();
+			// note: first result can be empty when there is a trailing slash,
+			// so we take the part before that
+		} while (!result && parts.length > 0);
+
+		return result;
 	}
 
 	function isSuccessStatus(status) {
@@ -190,6 +198,25 @@
 
 	}
 
+	function callMkCol(client, options, model, headers) {
+		// call MKCOL without data, followed by PROPPATCH
+		return client.request(
+			options.type,
+			options.url,
+			headers,
+			null
+		).then(function(result) {
+			if (!isSuccessStatus(result.status)) {
+				if (_.isFunction(options.error)) {
+					options.error(result);
+				}
+				return;
+			}
+
+			callPropPatch(client, options, model, headers);
+		});
+	}
+
 	function callMethod(client, options, model, headers) {
 		headers['Content-Type'] = 'application/json';
 		return client.request(
@@ -206,7 +233,7 @@
 			}
 
 			if (_.isFunction(options.success)) {
-				if (options.type === 'PUT' || options.type === 'POST') {
+				if (options.type === 'PUT' || options.type === 'POST' || options.type === 'MKCOL') {
 					// pass the object's own values because the server
 					// does not return anything
 					var responseJson = result.body || model.toJSON();
@@ -247,6 +274,8 @@
 			return callPropFind(client, options, model, headers);
 		} else if (options.type === 'PROPPATCH') {
 			return callPropPatch(client, options, model, headers);
+		} else if (options.type === 'MKCOL') {
+			return callMkCol(client, options, model, headers);
 		} else {
 			return callMethod(client, options, model, headers);
 		}
@@ -259,9 +288,16 @@
 		var params = {type: methodMap[method] || method};
 		var isCollection = (model instanceof Backbone.Collection);
 
-		if (method === 'update' && (model.usePUT || (model.collection && model.collection.usePUT))) {
-			// use PUT instead of PROPPATCH
-			params.type = 'PUT';
+		if (method === 'update') {
+			// if a model has an inner collection, it must define an
+			// attribute "hasInnerCollection" that evaluates to true
+			if (model.hasInnerCollection) {
+				// if the model itself is a Webdav collection, use MKCOL
+				params.type = 'MKCOL';
+			} else if (model.usePUT || (model.collection && model.collection.usePUT)) {
+				// use PUT instead of PROPPATCH
+				params.type = 'PUT';
+			}
 		}
 
 		// Ensure that we have a URL.