Added LockService interface.
diff --git a/core/api/src/main/java/org/onlab/onos/store/service/Lock.java b/core/api/src/main/java/org/onlab/onos/store/service/Lock.java
new file mode 100644
index 0000000..c1eb0ff
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/store/service/Lock.java
@@ -0,0 +1,78 @@
+package org.onlab.onos.store.service;
+
+/**
+ * A lock is a tool for controlling access to a shared resource by multiple processes.
+ * Commonly, a lock provides exclusive access to a resource such as a network device
+ * or exclusive permission to a controller to perform a particular role such as serve
+ * as the master controller for a device.
+ * At any given time one and only process can acquire the lock.
+ */
+public interface Lock {
+
+    /**
+     * Acquires the lock.
+     * If the lock is not available then the caller thread becomes
+     * disabled for thread scheduling purposes and lies dormant until
+     * the lock has been acquired.
+     * <p>
+     * Locks are reentrant. A thread invoking this method multiple times
+     * without an intervening unlock or lease expiration must invoke unlock()
+     * the same number of times before the lock is released (unless the lease expires).
+     * When this method is invoked for a lock that is already acquired,
+     * the lease time will be set to the maximum of the remaining lease time
+     * from the previous invocation, or leaseDurationMillis.
+     * @param leaseDurationMillis the number of milliseconds to hold the
+     * lock after granting it, before automatically releasing it if it hasn't
+     * already been released by invoking unlock(). Must be in the range
+     * (0, MAX_LEASE_MILLIS]
+     */
+    void lock(long leaseDurationMillis);
+
+    /**
+     * Acquires the lock only if it is free at the time of invocation.
+     * @param leaseDurationMillis the number of milliseconds the must be
+     * locked after it is granted, before automatically releasing it if it hasn't
+     * already been released by an invocation of unlock(). Must be in the range
+     * (0, MAX_LEASE_MILLIS]
+     * @return true if the lock was acquired and false otherwise
+     */
+    boolean tryLock(long leaseDurationMillis);
+
+    /**
+     * Acquires the lock if it is free within the given waiting
+     * time and the current thread has not been interrupted.
+     * @param waitTimeMillis the maximum time (in milliseconds) to wait for the lock
+     * @param leaseDurationMillis the number of milliseconds to hold the
+     * lock after granting it, before automatically releasing it if it hasn't
+     * already been released by invoking unlock(Object). Must be in the range
+     * (0, MAX_LEASE_MILLIS]
+     * @return true if the lock was acquired and false if the waiting time
+     * elapsed before the lock was acquired
+     */
+    boolean tryLock(long waitTimeMillis, long leaseDurationMillis);
+
+    /**
+     * Returns true if this Lock instance currently holds the lock.
+     * @return true if this instance is the owner of the lock.
+     */
+    boolean isLocked();
+
+    /**
+     * Releases the lock.
+     */
+    void unlock();
+
+    /**
+     * Extends the lease for this lock.
+     * @param extensionDurationMillis is the amount of additional
+     * time to add to the end of the current expiration time. For example,
+     * if the lock is currently set to expire at time T, a successful call to
+     * extendLease with an argument of 5000 will cause the lock to
+     * now expire at 5 seconds past T.
+     * @return true if the extension is successful, false otherwise. Note
+     * that a failure to extend the lease does not result in unlocking. The lock
+     * will be released either by an explicit call to unlock or when previously
+     * acquired lease runs out.
+     */
+    boolean extendLease(long extensionDurationMillis);
+}
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onlab/onos/store/service/LockEventListener.java b/core/api/src/main/java/org/onlab/onos/store/service/LockEventListener.java
new file mode 100644
index 0000000..73f78fe
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/store/service/LockEventListener.java
@@ -0,0 +1,13 @@
+package org.onlab.onos.store.service;
+
+/**
+ * Listener for lock events.
+ */
+public interface LockEventListener {
+
+    /**
+     * Notifies the listener of a lock's lease expiration event.
+     * @param lock lock whose lease has expired.
+     */
+    void leaseExpired(Lock lock);
+}
diff --git a/core/api/src/main/java/org/onlab/onos/store/service/LockService.java b/core/api/src/main/java/org/onlab/onos/store/service/LockService.java
new file mode 100644
index 0000000..7b742b1
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/store/service/LockService.java
@@ -0,0 +1,25 @@
+package org.onlab.onos.store.service;
+
+public interface LockService {
+
+    /**
+     * Create a new lock instance.
+     * A successful return from this method does not mean the resource guarded by the path is locked.
+     * The caller is expect to call Lock.lock() to acquire the lock.
+     * @param path unique lock name.
+     * @return
+     */
+    Lock create(String path);
+
+    /**
+     * Adds a listener to be notified of lock events.
+     * @param listener listener to be added.
+     */
+    void addListener(LockEventListener listener);
+
+    /**
+     * Removes a listener that was previously added.
+     * @param listener listener to be removed.
+     */
+    void removeListener(LockEventListener listener);
+}
\ No newline at end of file