diff --git a/files/webdav.php b/files/webdav.php
index 7d5855672acbaae1c2a285f9dec47621e5eb3261..7dce0b48197ba99a7d7573ca5ecb737f3ed2b33b 100644
--- a/files/webdav.php
+++ b/files/webdav.php
@@ -28,23 +28,29 @@ $RUNTIME_NOSETUPFS = true;
 
 require_once('../lib/base.php');
 require_once('Sabre/autoload.php');
-require_once('Sabre/DAV/Auth/Backend/Owncloud.php');
-require_once('Sabre/DAV/FS/OwncloudNode.php');
-require_once('Sabre/DAV/FS/OwncloudFile.php');
-require_once('Sabre/DAV/FS/OwncloudDirectory.php');
+require_once('Connector/Sabre/auth.php');
+require_once('Connector/Sabre/node.php');
+require_once('Connector/Sabre/file.php');
+require_once('Connector/Sabre/directory.php');
+require_once('Connector/Sabre/locks.php');
 
 // Create ownCloud Dir
-$publicDir = new OC_Sabre_DAV_FS_OwncloudDirectory('');
+$publicDir = new OC_Connector_Sabre_Directory('');
 $server = new Sabre_DAV_Server($publicDir);
 
 // Path to our script
 $server->setBaseUri($WEBROOT.'/files/webdav.php');
 
 // Auth backend
-$authBackend = new OC_Sabre_DAV_Auth_Backend_Owncloud();
+$authBackend = new OC_Connector_Sabre_Auth();
 $authPlugin = new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud');
 $server->addPlugin($authPlugin);
 
+// Also make sure there is a 'data' directory, writable by the server. This directory is used to store information about locks
+$lockBackend = new OC_Connector_Sabre_Locks();
+$lockPlugin = new Sabre_DAV_Locks_Plugin($lockBackend);
+$server->addPlugin($lockPlugin);
+
 // And off we go!
 $server->exec();
 
diff --git a/lib/Sabre/DAV/Auth/Backend/Owncloud.php b/lib/Connector/Sabre/auth.php
similarity index 91%
rename from lib/Sabre/DAV/Auth/Backend/Owncloud.php
rename to lib/Connector/Sabre/auth.php
index 8c8556f9f20f9a90be60c7af99af8c42b3c7222f..cfe7723e7614f3ec94cac49ddcac40f92faf6cc6 100644
--- a/lib/Sabre/DAV/Auth/Backend/Owncloud.php
+++ b/lib/Connector/Sabre/auth.php
@@ -14,7 +14,7 @@ require_once("lib/base.php");
  * @author Evert Pot (http://www.rooftopsolutions.nl/) 
  * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
  */
-class OC_Sabre_DAV_Auth_Backend_Owncloud extends Sabre_DAV_Auth_Backend_AbstractBasic {
+class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic {
 	/**
 	 * Validates a username and password
 	 *
diff --git a/lib/Sabre/DAV/FS/OwncloudDirectory.php b/lib/Connector/Sabre/directory.php
similarity index 91%
rename from lib/Sabre/DAV/FS/OwncloudDirectory.php
rename to lib/Connector/Sabre/directory.php
index 5a5e9fcabf6fbfc55cd1c70ce5c14413f88388d1..d0ff87f9b1ad90396a15f874577c29d0dbb90e50 100644
--- a/lib/Sabre/DAV/FS/OwncloudDirectory.php
+++ b/lib/Connector/Sabre/directory.php
@@ -11,7 +11,7 @@ require_once("lib/base.php");
  * @author Evert Pot (http://www.rooftopsolutions.nl/) 
  * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
  */
-class OC_Sabre_DAV_FS_OwncloudDirectory extends OC_Sabre_DAV_FS_OwncloudNode implements Sabre_DAV_ICollection, Sabre_DAV_IQuota {
+class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sabre_DAV_ICollection, Sabre_DAV_IQuota {
 
 	/**
 	 * Creates a new file in the directory
@@ -57,11 +57,11 @@ class OC_Sabre_DAV_FS_OwncloudDirectory extends OC_Sabre_DAV_FS_OwncloudNode imp
 
 		if (OC_FILESYSTEM::is_dir($path)) {
 
-			return new OC_Sabre_DAV_FS_OwncloudDirectory($path);
+			return new OC_Connector_Sabre_Directory($path);
 
 		} else {
 
-			return new OC_Sabre_DAV_FS_OwncloudFile($path);
+			return new OC_Connector_Sabre_File($path);
 
 		}
 
diff --git a/lib/Sabre/DAV/FS/OwncloudFile.php b/lib/Connector/Sabre/file.php
similarity index 93%
rename from lib/Sabre/DAV/FS/OwncloudFile.php
rename to lib/Connector/Sabre/file.php
index 8c390302a64501ff9089a1bbc10babcaa1085e8f..bb5ab738430aca64cba85e1c0456400e9f017431 100644
--- a/lib/Sabre/DAV/FS/OwncloudFile.php
+++ b/lib/Connector/Sabre/file.php
@@ -10,7 +10,7 @@ require_once("lib/base.php");
  * @author Evert Pot (http://www.rooftopsolutions.nl/) 
  * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
  */
-class OC_Sabre_DAV_FS_OwncloudFile extends OC_Sabre_DAV_FS_OwncloudNode implements Sabre_DAV_IFile {
+class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_DAV_IFile {
 
 	/**
 	 * Updates the data
diff --git a/lib/Connector/Sabre/locks.php b/lib/Connector/Sabre/locks.php
new file mode 100644
index 0000000000000000000000000000000000000000..58a0359899e48fae29d5b0a2ef568a623ce403a3
--- /dev/null
+++ b/lib/Connector/Sabre/locks.php
@@ -0,0 +1,138 @@
+<?php
+require_once("lib/base.php");
+
+/**
+ * The Lock manager allows you to handle all file-locks centrally.
+ *
+ * This Lock Manager stores all its data in a database. You must pass a PDO
+ * connection object in the constructor.
+ * 
+ * @package Sabre
+ * @subpackage DAV
+ * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/) 
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class OC_Connector_Sabre_Locks extends Sabre_DAV_Locks_Backend_Abstract {
+
+	/**
+	 * Returns a list of Sabre_DAV_Locks_LockInfo objects
+	 *
+	 * This method should return all the locks for a particular uri, including
+	 * locks that might be set on a parent uri.
+	 *
+	 * If returnChildLocks is set to true, this method should also look for
+	 * any locks in the subtree of the uri for locks.
+	 *
+	 * @param string $uri
+	 * @param bool $returnChildLocks
+	 * @return array
+	 */
+	public function getLocks($uri, $returnChildLocks) {
+
+		// NOTE: the following 10 lines or so could be easily replaced by
+		// pure sql. MySQL's non-standard string concatination prevents us
+		// from doing this though.
+		$query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM *PREFIX*locks WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)';
+		$params = array(time(),$uri);
+
+		// We need to check locks for every part in the uri.
+		$uriParts = explode('/',$uri);
+
+		// We already covered the last part of the uri
+		array_pop($uriParts);
+
+		$currentPath='';
+
+		foreach($uriParts as $part) {
+
+			if ($currentPath) $currentPath.='/';
+			$currentPath.=$part;
+
+			$query.=' OR (depth!=0 AND uri = ?)';
+			$params[] = $currentPath;
+
+		}
+
+		if ($returnChildLocks) {
+
+			$query.=' OR (uri LIKE ?)';
+			$params[] = $uri . '/%';
+
+		}
+		$query.=')';
+
+		$stmt = OC_DB::prepare($query);
+		$result = $stmt->execute($params);
+		
+		$lockList = array();
+		while( $row = $result->fetchRow()){
+
+			$lockInfo = new Sabre_DAV_Locks_LockInfo();
+			$lockInfo->owner = $row['owner'];
+			$lockInfo->token = $row['token'];
+			$lockInfo->timeout = $row['timeout'];
+			$lockInfo->created = $row['created'];
+			$lockInfo->scope = $row['scope'];
+			$lockInfo->depth = $row['depth'];
+			$lockInfo->uri   = $row['uri'];
+			$lockList[] = $lockInfo;
+
+		}
+
+		return $lockList;
+
+	}
+
+	/**
+	 * Locks a uri
+	 *
+	 * @param string $uri
+	 * @param Sabre_DAV_Locks_LockInfo $lockInfo
+	 * @return bool
+	 */
+	public function lock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) {
+
+		// We're making the lock timeout 5 minutes
+		$lockInfo->timeout = 300;
+		$lockInfo->created = time();
+		$lockInfo->uri = $uri;
+
+		$locks = $this->getLocks($uri,false);
+		$exists = false;
+		foreach($locks as $k=>$lock) {
+			if ($lock->token == $lockInfo->token) $exists = true;
+		}
+	
+		if ($exists) {
+			$query = OC_DB::prepare( 'UPDATE *PREFIX*locks SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?' );
+			$result = $query->execute( array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
+		} else {
+			$query = OC_DB::prepare( 'INSERT INTO *PREFIX*locks (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)' );
+			$result = $query->execute( array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
+		}
+
+		return true;
+
+	}
+
+
+
+	/**
+	 * Removes a lock from a uri
+	 *
+	 * @param string $uri
+	 * @param Sabre_DAV_Locks_LockInfo $lockInfo
+	 * @return bool
+	 */
+	public function unlock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) {
+
+		$query = OC_DB::prepare( 'DELETE FROM *PREFIX*locks WHERE path=? AND token=?' );
+		$result = $query->execute( array($uri,$lockInfo->token));
+
+		return $result->numRows() === 1;
+
+	}
+
+}
+
diff --git a/lib/Sabre/DAV/FS/OwncloudNode.php b/lib/Connector/Sabre/node.php
similarity index 95%
rename from lib/Sabre/DAV/FS/OwncloudNode.php
rename to lib/Connector/Sabre/node.php
index 7ccd410e627ef7bb5e496cc3ed446e04956a0e85..fb607a709e49407f3538620d8697a23ada5380e7 100644
--- a/lib/Sabre/DAV/FS/OwncloudNode.php
+++ b/lib/Connector/Sabre/node.php
@@ -13,7 +13,7 @@ require_once("lib/base.php");
  * @author Evert Pot (http://www.rooftopsolutions.nl/) 
  * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
  */
-abstract class OC_Sabre_DAV_FS_OwncloudNode implements Sabre_DAV_INode {
+abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode {
 
 	/**
 	 * The path to the current node