diff --git a/source/java/org/alfresco/repo/webdav/LockInfo.java b/source/java/org/alfresco/repo/webdav/LockInfo.java
new file mode 100644
index 0000000000..a465036194
--- /dev/null
+++ b/source/java/org/alfresco/repo/webdav/LockInfo.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2005-2012 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+
+package org.alfresco.repo.webdav;
+
+import java.util.Date;
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * Interface to represent WebDAV lock info. This interface mainly exists to allow
+ * decoupling of the LockStore classes from the rest of the WebDAV code base
+ * therefore allowing the LockStore related classes to live in the repository
+ * project without creating a dependency on the remote-api project.
+ *
+ * @author Matt Ward
+ */
+public interface LockInfo
+{
+ /**
+ * Retrieves the {@link ReentrantReadWriteLock} associated with this LockInfo. This is
+ * to allow client code to protect against invalid concurrent access to the state of
+ * this class.
+ *
+ * Not to be confused with WebDAV locks.
+ *
+ * @return
+ */
+ ReentrantReadWriteLock getRWLock();
+
+ /**
+ * Returns true if node has shared or exclusive locks
+ *
+ * @return boolean
+ */
+ boolean isLocked();
+
+ /**
+ * Setter for exclusive lock token
+ *
+ * @param token Lock token
+ */
+ void setExclusiveLockToken(String token);
+
+ /**
+ * Getter for exclusive lock token.
+ *
+ * @return String
+ */
+ String getExclusiveLockToken();
+
+ /**
+ * Setter for lock scope.
+ *
+ * @param scope
+ */
+ void setScope(String scope);
+
+ /**
+ * Returns lock scope
+ *
+ * @return lock scope
+ */
+ String getScope();
+
+ /**
+ * Setter for lock depth
+ *
+ * @param depth lock depth
+ */
+ void setDepth(String depth);
+
+ /**
+ * Returns lock depth
+ *
+ * @return lock depth
+ */
+ String getDepth();
+
+ /**
+ * Getter for sharedLockTokens list.
+ *
+ * @return LinkedList
+ */
+ Set getSharedLockTokens();
+
+ /**
+ * Setter for sharedLockTokens list.
+ *
+ * @param sharedLockTokens
+ */
+ void setSharedLockTokens(Set sharedLockTokens);
+
+ /**
+ * Adds new shared lock token to sharedLockTokens list.
+ *
+ * @param token The token to add.
+ */
+ void addSharedLockToken(String token);
+
+ /**
+ * Is it a shared lock?
+ *
+ * @return true if shared.
+ */
+ boolean isShared();
+
+ /**
+ * Return the lock info as a string
+ *
+ * @return String
+ */
+ String toString();
+
+ /**
+ * Whether this lock has expired. If no expiry is set (i.e. expires is null)
+ * then false is always returned.
+ *
+ * @return true if expired.
+ */
+ boolean isExpired();
+
+ /**
+ * Is it an exclusive lock?
+ *
+ * @return true if exclusive.
+ */
+ boolean isExclusive();
+
+ /**
+ * Who owns the lock?
+ *
+ * @return the owner
+ */
+ String getOwner();
+
+ /**
+ * Set the username of who owns the lock.
+ *
+ * @param owner Owner's username
+ */
+ void setOwner(String owner);
+
+ /**
+ * Set the expiry date/time for this lock. Set to null for never expires.
+ *
+ * @param expires the expires to set
+ */
+ void setExpires(Date expires);
+
+ /**
+ * Retrieve the expiry date/time for this lock, or null if it never expires.
+ *
+ * @return the expires
+ */
+ Date getExpires();
+
+ /**
+ * Sets the expiry date/time to lockTimeout seconds into the future. Provide
+ * a lockTimeout of WebDAV.TIMEOUT_INFINITY for never expires.
+ *
+ * @param lockTimeout
+ */
+ void setTimeoutSeconds(int lockTimeout);
+}
\ No newline at end of file
diff --git a/source/java/org/alfresco/repo/webdav/LockStore.java b/source/java/org/alfresco/repo/webdav/LockStore.java
new file mode 100644
index 0000000000..2565c50ad1
--- /dev/null
+++ b/source/java/org/alfresco/repo/webdav/LockStore.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2005-2012 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.repo.webdav;
+
+import org.alfresco.service.cmr.repository.NodeRef;
+
+/**
+ * Provides storage for WebDAV {@link LockInfo lock information}.
+ *
+ * Note: the existence of LockInfo does NOT mean that a node is necessarily locked. It may have timed-out,
+ * been unlocked, or be left in an invalid state for some reason. The LockInfo is a record of a requested lock -
+ * the actual values should be examined as necessary.
+ *
+ * Implementations of this interface should be fast, ideally an in-memory map. Implementations should also be thread-
+ * and cluster-safe.
+ *
+ * @author Matt Ward
+ */
+public interface LockStore
+{
+ /**
+ * Provide LockInfo about a specific node to the LockStore.
+ *
+ * @param nodeToLock
+ * @param lockInfo
+ */
+ void put(NodeRef nodeToLock, LockInfo lockInfo);
+
+ /**
+ * Retrieves LockInfo for as given nodeRef. The LockInfo may specify that a node is
+ * NOT locked, so the LockInfo should always be checked for validity.
+ *
+ * The presence of LockInfo does not imply that a node is locked.
+ *
+ * @param nodeRef
+ * @return
+ */
+ LockInfo get(NodeRef nodeRef);
+
+
+ /**
+ * Remove LockInfo for the specified NodeRef. The LockInfo cannot be considered locked
+ * once removed from the LockStore.
+ *
+ * @param nodeRef
+ */
+ void remove(NodeRef nodeRef);
+}
diff --git a/source/java/org/alfresco/repo/webdav/LockStoreFactory.java b/source/java/org/alfresco/repo/webdav/LockStoreFactory.java
new file mode 100644
index 0000000000..207ede744e
--- /dev/null
+++ b/source/java/org/alfresco/repo/webdav/LockStoreFactory.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2005-2012 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.repo.webdav;
+
+
+/**
+ * Factory to create {@link LockStore} instances.
+ *
+ * @author Matt Ward
+ */
+public interface LockStoreFactory
+{
+ LockStore getLockStore();
+}
diff --git a/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java b/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java
new file mode 100644
index 0000000000..59521b07d1
--- /dev/null
+++ b/source/java/org/alfresco/repo/webdav/LockStoreFactoryImpl.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2005-2012 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.repo.webdav;
+
+import java.util.concurrent.ConcurrentMap;
+
+import org.alfresco.service.cmr.repository.NodeRef;
+
+import com.hazelcast.core.HazelcastInstance;
+
+
+/**
+ * Default implementation of the {@link LockStoreFactory} interface. Creates {@link LockStore}s
+ * backed by a Hazelcast distributed {@link java.util.Map Map}.
+ *
+ * @see LockStoreFactory
+ * @see LockStoreImpl
+ * @author Matt Ward
+ */
+public class LockStoreFactoryImpl implements LockStoreFactory
+{
+ private HazelcastInstance hazelcast;
+
+ @Override
+ public LockStore getLockStore()
+ {
+ ConcurrentMap map = hazelcast.getMap("webdav-locks");
+ return new LockStoreImpl(map);
+ }
+
+ /**
+ * @param hazelcast the hazelcast to set
+ */
+ public void setHazelcast(HazelcastInstance hazelcast)
+ {
+ this.hazelcast = hazelcast;
+ }
+}
diff --git a/source/java/org/alfresco/repo/webdav/LockStoreImpl.java b/source/java/org/alfresco/repo/webdav/LockStoreImpl.java
new file mode 100644
index 0000000000..f21ee18f6d
--- /dev/null
+++ b/source/java/org/alfresco/repo/webdav/LockStoreImpl.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2005-2012 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.repo.webdav;
+
+import java.util.concurrent.ConcurrentMap;
+
+import org.alfresco.service.cmr.repository.NodeRef;
+
+
+/**
+ * The default {@link LockStore} implementation. This is based upon a ConcurrentMap intended to be supplied by
+ * Hazelcast (or a similar, distributed data structure library).
+ *
+ * @see LockStore
+ * @author Matt Ward
+ */
+public class LockStoreImpl implements LockStore
+{
+ private final ConcurrentMap lockInfoMap;
+
+ public LockStoreImpl(ConcurrentMap lockInfoMap)
+ {
+ this.lockInfoMap = lockInfoMap;
+ }
+
+ @Override
+ public void put(NodeRef nodeToLock, LockInfo lockInfo)
+ {
+ lockInfoMap.put(nodeToLock, lockInfo);
+ }
+
+ @Override
+ public LockInfo get(NodeRef nodeRef)
+ {
+ return lockInfoMap.get(nodeRef);
+ }
+
+ @Override
+ public void remove(NodeRef nodeRef)
+ {
+ lockInfoMap.remove(nodeRef);
+ }
+}