diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockContext.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockContext.java
new file mode 100644
index 0000000..96158c0
--- /dev/null
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockContext.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.server.io;
+
+import javax.jcr.Session;
+
+/**
+ * The context associated with a LOCK operation
+ */
+public interface LockContext {
+
+    /**
+     * @return the jcr session associated with this context.
+     */
+    public Session getSession();
+
+}
diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockContextImpl.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockContextImpl.java
new file mode 100644
index 0000000..8e3a59a
--- /dev/null
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockContextImpl.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.server.io;
+
+import javax.jcr.Session;
+
+/**
+ * Implements a simple lock context
+ */
+public class LockContextImpl implements  LockContext {
+
+    private final Session session;
+
+    public LockContextImpl(Session session) {
+        this.session = session;
+    }
+
+    /**
+     * @see org.apache.jackrabbit.server.io.LockContext#getSession()
+     */
+    public Session getSession() {
+        return this.session;
+    }
+}
diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandler.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandler.java
new file mode 100644
index 0000000..43275c4
--- /dev/null
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandler.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.server.io;
+
+import org.apache.jackrabbit.webdav.DavResource;
+import org.apache.jackrabbit.webdav.lock.LockManager;
+
+/**
+ * The LockHandler is invoked when a webdav LOCK/UNLOCK request is received. Implementers of this interface should plugin
+ * their LOCK related checks here and ensure that an appropriate LockManager is returned only if the checks succeed.
+ */
+public interface LockHandler {
+
+    /**
+     * Validates if this handler can execute a lock operation on the given resource.
+     *
+     * @param lockContext The context of the lock
+     * @param resource The resource to be locked
+     * @return {@code true} if this instance is permitted to execute lock operation on the given resource;
+     *         {@code false} otherwise.
+     */
+    public boolean canLock(LockContext lockContext, DavResource resource);
+
+    /**
+     * Returns a LockManager. Implementers must take care that a lockmanager is returned only if this handler is
+     * permitted to lock the resource.
+     *
+     * @param resource which is to be locked
+     * @return lockmanger for performing lock related webdav operations on specified resource
+     */
+    public LockManager getLockManager(DavResource resource);
+
+}
diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandlerManager.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandlerManager.java
new file mode 100644
index 0000000..9f0432b
--- /dev/null
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandlerManager.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.server.io;
+
+import org.apache.jackrabbit.webdav.DavResource;
+import org.apache.jackrabbit.webdav.lock.LockManager;
+
+/**
+ * The LockHandlerManager provides a way to register {@link LockHandler} within it. It alos provides a way to get an
+ * appropriate LockManager for performing webdav lock operations on a resource.
+ */
+public interface LockHandlerManager {
+
+    /**
+     * Registers a lock handler
+     *
+     * @param lockHandler Registers a lock handler with this lock manager
+     */
+    public void addLockHandler(LockHandler lockHandler);
+
+    /**
+     * Returns the registered lock handlers
+     *
+     * @return An array of all the registered lock handlers.
+     */
+    public LockHandler[] getLockHandlers();
+
+    /**
+     * Returns a lockmanager for performing webdav lock operations on the specified resource. Implementers of this
+     * interface must query up the registered LockHandlers here and find one which is permitted to lock the
+     * specified resource. Once such a lockhandler is found, its LockManager should be returned.
+     *
+     * @param lockContext The LockContext for performing webdav lock operations on the specified resource
+     * @param resource The resource for which the lockmanager is needed
+     * @return The lockmanager for performing webdav lock operations on the specified resource
+     */
+    public LockManager getLockManager(LockContext lockContext, DavResource resource);
+}
diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandlerManagerImpl.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandlerManagerImpl.java
new file mode 100644
index 0000000..cd58d58
--- /dev/null
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/LockHandlerManagerImpl.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.server.io;
+
+import org.apache.jackrabbit.webdav.DavResource;
+import org.apache.jackrabbit.webdav.lock.LockManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @see org.apache.jackrabbit.server.io.LockHandlerManager
+ */
+public class LockHandlerManagerImpl implements LockHandlerManager {
+
+    private final List<LockHandler> lockHandlers = new ArrayList<LockHandler>();
+
+    /**
+     * @see LockHandlerManager#addLockHandler(org.apache.jackrabbit.server.io.LockHandler)
+     */
+    public void addLockHandler(LockHandler lockHandler) {
+        if (lockHandler == null) {
+            throw new IllegalArgumentException("'null' is not a valid LockHandler.");
+        }
+        lockHandlers.add(lockHandler);
+
+    }
+
+    /**
+     * @see LockHandlerManager#getLockHandlers()
+     */
+    public LockHandler[] getLockHandlers() {
+        return lockHandlers.toArray(new LockHandler[lockHandlers.size()]);
+    }
+
+    /**
+     * @see org.apache.jackrabbit.server.io.LockHandler#getLockManager(org.apache.jackrabbit.webdav.DavResource)
+     */
+    @Override
+    public LockManager getLockManager(LockContext lockContext, DavResource resource) {
+        LockHandler[] lockHandlers = getLockHandlers();
+        for (int i = 0; i < lockHandlers.length; i++) {
+            LockHandler lh = lockHandlers[i];
+            if (lh.canLock(lockContext, resource)) {
+                return lh.getLockManager(resource);
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java
index 1292b12..a4dc7df 100644
--- a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java
@@ -16,21 +16,6 @@
  */
 package org.apache.jackrabbit.webdav.simple;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.xml.parsers.ParserConfigurationException;
-
 import org.apache.jackrabbit.server.io.CopyMoveHandler;
 import org.apache.jackrabbit.server.io.CopyMoveManager;
 import org.apache.jackrabbit.server.io.CopyMoveManagerImpl;
@@ -39,6 +24,7 @@ import org.apache.jackrabbit.server.io.DeleteManager;
 import org.apache.jackrabbit.server.io.DeleteManagerImpl;
 import org.apache.jackrabbit.server.io.IOHandler;
 import org.apache.jackrabbit.server.io.IOManager;
+import org.apache.jackrabbit.server.io.LockHandlerManager;
 import org.apache.jackrabbit.server.io.PropertyHandler;
 import org.apache.jackrabbit.server.io.PropertyManager;
 import org.apache.jackrabbit.server.io.PropertyManagerImpl;
@@ -51,6 +37,20 @@ import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 import org.xml.sax.SAXException;
 
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * <code>ResourceConfig</code>...
  */
@@ -83,6 +83,7 @@ public class ResourceConfig {
     private CopyMoveManager cmManager;
     private PropertyManager propManager;
     private DeleteManager deleteManager;
+    private LockHandlerManager lockHandlerManager;
     private String[] nodetypeNames = new String[0];
     private boolean collectionNames = false;
 
@@ -488,6 +489,14 @@ public class ResourceConfig {
     }
 
     /**
+     * Returns the lock handler manager contained by this ResourceConfig.
+     * @return the lock handler manager
+     */
+    public LockHandlerManager getLockHandlerManager() {
+        return lockHandlerManager;
+    }
+
+    /**
      * Returns true, if the given item represents a {@link Node node} that is
      * either any of the nodetypes specified to represent a collection or
      * none of the nodetypes specified to represent a non-collection, respectively.
diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
index 32f5ecd..bb9e7a1 100644
--- a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.webdav.simple;
 
+import org.apache.jackrabbit.server.io.LockContextImpl;
+import org.apache.jackrabbit.server.io.LockHandlerManager;
 import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.webdav.DavMethods;
 import org.apache.jackrabbit.webdav.DavResource;
@@ -75,22 +77,41 @@ public class ResourceFactoryImpl implements DavResourceFactory {
     public DavResource createResource(DavResourceLocator locator, DavServletRequest request,
                                       DavServletResponse response) throws DavException {
         try {
-            Node node = getNode(request.getDavSession(), locator);
+            DavSession davSession = request.getDavSession();
+            Node node = getNode(davSession, locator);
             DavResource resource;
             if (node == null) {
                 log.debug("Creating resource for non-existing repository node.");
                 boolean isCollection = DavMethods.isCreateCollectionRequest(request);
-                resource = createNullResource(locator, request.getDavSession(), isCollection);
+                resource = createNullResource(locator, davSession, isCollection);
             } else {
-                resource = createResource(node, locator, request.getDavSession());
+                resource = createResource(node, locator, davSession);
             }
-            resource.addLockManager(lockMgr);
+            addLockManger(resource, davSession);
             return resource;
         } catch (RepositoryException e) {
             throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e);
         }
     }
 
+    private void addLockManger(DavResource resource, DavSession davSession) throws DavException {
+        JcrDavSession.checkImplementation(davSession);
+        JcrDavSession jcrDavSession = (JcrDavSession)davSession;
+        Session jcrSession = jcrDavSession.getRepositorySession();
+        LockHandlerManager lockHandlerManager = resourceConfig.getLockHandlerManager();
+        LockManager resourceLockMgr = null;
+
+        if(lockHandlerManager != null) {
+            resourceLockMgr = lockHandlerManager.getLockManager(new LockContextImpl(jcrSession), resource);
+        }
+
+        if(resourceLockMgr != null) {
+            resource.addLockManager(resourceLockMgr);
+        } else {
+            resource.addLockManager(lockMgr);
+        }
+    }
+
     /**
      * Create a new <code>DavResource</code> from the given locator and webdav
      * session.
@@ -105,7 +126,7 @@ public class ResourceFactoryImpl implements DavResourceFactory {
         try {
             Node node = getNode(session, locator);
             DavResource resource = createResource(node, locator, session);
-            resource.addLockManager(lockMgr);
+            addLockManger(resource, session);
             return resource;
         } catch (RepositoryException e) {
             throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e);
