diff --git a/gossip-base/src/main/java/org/apache/gossip/GossipSettings.java b/gossip-base/src/main/java/org/apache/gossip/GossipSettings.java
index 2ba9110..2fe8a0c 100644
--- a/gossip-base/src/main/java/org/apache/gossip/GossipSettings.java
+++ b/gossip-base/src/main/java/org/apache/gossip/GossipSettings.java
@@ -17,6 +17,8 @@
  */
 package org.apache.gossip;
 
+import org.apache.gossip.lock.LockManagerSettings;
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -62,11 +64,14 @@
   
   private boolean signMessages = false;
 
+  // Settings related to lock manager
+  private LockManagerSettings lockManagerSettings = LockManagerSettings
+          .getLockManagerDefaultSettings();
+  
   private boolean bulkTransfer = false;
 
   private int bulkTransferSize = StartupSettings.DEFAULT_BULK_TRANSFER_SIZE;
   
-  
   /**
    * Construct GossipSettings with default settings.
    */
@@ -247,6 +252,18 @@
     this.protocolManagerClass = protocolManagerClass;
   }
 
+  public LockManagerSettings getLockManagerSettings() {
+    return lockManagerSettings;
+  }
+
+  /**
+   * Set the lock settings use by the lock manager
+   * @param lockManagerSettings lock settings. This object cannot be null.
+   */
+  public void setLockManagerSettings(LockManagerSettings lockManagerSettings) {
+    this.lockManagerSettings = lockManagerSettings;
+  }
+
   public boolean isBulkTransfer() {
     return bulkTransfer;
   }
diff --git a/gossip-base/src/main/java/org/apache/gossip/crdt/CrdtModule.java b/gossip-base/src/main/java/org/apache/gossip/crdt/CrdtModule.java
index 396ec03..83d573d 100644
--- a/gossip-base/src/main/java/org/apache/gossip/crdt/CrdtModule.java
+++ b/gossip-base/src/main/java/org/apache/gossip/crdt/CrdtModule.java
@@ -24,6 +24,9 @@
 import com.fasterxml.jackson.core.Version;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 import org.apache.gossip.LocalMember;
+import org.apache.gossip.lock.vote.MajorityVote;
+import org.apache.gossip.lock.vote.Vote;
+import org.apache.gossip.lock.vote.VoteCandidate;
 import org.apache.gossip.replication.BlackListReplicable;
 import org.apache.gossip.replication.Replicable;
 import org.apache.gossip.replication.WhiteListReplicable;
@@ -107,6 +110,31 @@
   @JsonProperty("blackListMembers") abstract List<LocalMember> getBlackListMembers();
 }
 
+abstract class VoteCandidateMixin {
+  @JsonCreator
+  VoteCandidateMixin(
+          @JsonProperty("candidateNodeId") String candidateNodeId,
+          @JsonProperty("votingKey") String votingKey,
+          @JsonProperty("votes") Map<String, Vote> votes
+  ) { }
+}
+
+abstract class VoteMixin {
+  @JsonCreator
+  VoteMixin(
+          @JsonProperty("votingNode") String votingNode,
+          @JsonProperty("voteValue") Boolean voteValue,
+          @JsonProperty("voteExchange") Boolean voteExchange,
+          @JsonProperty("liveMembers") List<String> liveMembers,
+          @JsonProperty("deadMembers") List<String> deadMembers
+  ) { }
+}
+
+abstract class MajorityVoteMixin<E>{
+  @JsonCreator
+  MajorityVoteMixin(@JsonProperty("voteCandidates") Map<String, VoteCandidate> voteCandidateMap){ }
+}
+
 //If anyone wants to take a stab at this. please have at it
 //https://github.com/FasterXML/jackson-datatype-guava/blob/master/src/main/java/com/fasterxml/jackson/datatype/guava/ser/MultimapSerializer.java
 public class CrdtModule extends SimpleModule {
@@ -130,6 +158,9 @@
     context.setMixInAnnotations(Replicable.class, ReplicableMixin.class);
     context.setMixInAnnotations(WhiteListReplicable.class, WhiteListReplicableMixin.class);
     context.setMixInAnnotations(BlackListReplicable.class, BlackListReplicableMixin.class);
+    context.setMixInAnnotations(MajorityVote.class, MajorityVoteMixin.class);
+    context.setMixInAnnotations(VoteCandidate.class, VoteCandidateMixin.class);
+    context.setMixInAnnotations(Vote.class, VoteMixin.class);
   }
 
 }
diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/LockManager.java b/gossip-base/src/main/java/org/apache/gossip/lock/LockManager.java
new file mode 100644
index 0000000..9f4636a
--- /dev/null
+++ b/gossip-base/src/main/java/org/apache/gossip/lock/LockManager.java
@@ -0,0 +1,318 @@
+/*
+ * 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.gossip.lock;
+
+import com.codahale.metrics.Gauge;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.Timer;
+import org.apache.gossip.Member;
+import org.apache.gossip.lock.exceptions.VoteFailedException;
+import org.apache.gossip.lock.vote.MajorityVote;
+import org.apache.gossip.lock.vote.Vote;
+import org.apache.gossip.lock.vote.VoteCandidate;
+import org.apache.gossip.manager.GossipManager;
+import org.apache.gossip.model.SharedDataMessage;
+import org.apache.log4j.Logger;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+public class LockManager {
+
+  public static final Logger LOGGER = Logger.getLogger(LockManager.class);
+
+  private final GossipManager gossipManager;
+  private final LockManagerSettings lockSettings;
+  private final ScheduledExecutorService voteService;
+  private final AtomicInteger numberOfNodes;
+  private final Set<String> lockKeys;
+  // For MetricRegistry
+  public static final String LOCK_KEY_SET_SIZE = "gossip.lock.key_set_size";
+  public static final String LOCK_TIME = "gossip.lock.time";
+  private final Timer lockTimeMetric;
+
+  public LockManager(GossipManager gossipManager, final LockManagerSettings lockManagerSettings,
+          MetricRegistry metrics) {
+    this.gossipManager = gossipManager;
+    this.lockSettings = lockManagerSettings;
+    this.numberOfNodes = new AtomicInteger(lockSettings.getNumberOfNodes());
+    this.lockKeys = new CopyOnWriteArraySet<>();
+    metrics.register(LOCK_KEY_SET_SIZE, (Gauge<Integer>) lockKeys::size);
+    lockTimeMetric = metrics.timer(LOCK_TIME);
+    // Register listener for lock keys
+    gossipManager.registerSharedDataSubscriber((key, oldValue, newValue) -> {
+      if (key.contains("lock/")) {
+        lockKeys.add(key);
+      }
+    });
+    voteService = Executors.newScheduledThreadPool(2);
+    voteService.scheduleAtFixedRate(this::updateVotes, 0, lockSettings.getVoteUpdateInterval(),
+            TimeUnit.MILLISECONDS);
+  }
+
+  public void acquireSharedDataLock(String key) throws VoteFailedException {
+    final Timer.Context context = lockTimeMetric.time();
+    gossipManager.merge(generateLockMessage(key));
+    int deadlockDetectCount = 0;
+    while (true) {
+      SharedDataMessage message = gossipManager.findSharedGossipData(generateLockKey(key));
+      if (message == null || !(message.getPayload() instanceof MajorityVote)) {
+        continue;
+      }
+      MajorityVote majorityVoteResult = (MajorityVote) message.getPayload();
+      final Map<String, VoteCandidate> voteCandidatesMap = majorityVoteResult.value();
+      final Map<String, Boolean> voteResultMap = new HashMap<>();
+      // Store the vote result for each vote candidate nodes
+      voteCandidatesMap.forEach((candidateId, voteCandidate) -> voteResultMap
+              .put(candidateId, isVoteSuccess(voteCandidate)));
+
+      long passedCandidates = voteResultMap.values().stream().filter(aBoolean -> aBoolean).count();
+      String myNodeId = gossipManager.getMyself().getId();
+      if (LOGGER.isDebugEnabled()) {
+        LOGGER.debug("NodeId=" + myNodeId + ", VoteMap=" + voteResultMap + ", WinnerCount="
+                + passedCandidates);
+      }
+      // Check for possible dead lock when no candidates were won
+      if (passedCandidates == 0) {
+        if (isDeadLock(voteCandidatesMap)) {
+          deadlockDetectCount++;
+          // Testing for deadlock is not always correct, therefore test for continues deadlocks
+          if (deadlockDetectCount >= lockSettings.getDeadlockDetectionThreshold()) {
+            if (LOGGER.isDebugEnabled()) {
+              LOGGER.debug("Deadlock detected from node " + myNodeId + ". VoteCandidatesMap="
+                      + voteCandidatesMap);
+            }
+            preventDeadLock(voteCandidatesMap);
+          }
+        } else {
+          deadlockDetectCount = 0;
+        }
+      } else if (passedCandidates == 1 && voteResultMap.containsKey(myNodeId)) {
+        context.stop();
+        if (voteResultMap.get(myNodeId)) {
+          // There is one winner and that is my node, therefore break the while loop and continue
+          break;
+        } else {
+          throw new VoteFailedException("Node " + myNodeId + " failed to lock on key: " + key);
+        }
+      } else if (passedCandidates > 1) {
+        // Multiple winners are not possible
+        context.stop();
+        throw new IllegalStateException("Multiple nodes get voted.");
+      }
+
+      try {
+        Thread.sleep(lockSettings.getResultCalculationDelay());
+      } catch (InterruptedException e) {
+        throw new VoteFailedException("Node " + myNodeId + " failed to lock on key: " + key, e);
+      }
+    }
+  }
+
+  // Generate Crdt lock message for voting
+  private SharedDataMessage generateLockMessage(String key) {
+    VoteCandidate voteCandidate = new VoteCandidate(gossipManager.getMyself().getId(), key,
+            new ConcurrentHashMap<>());
+    voteCandidate.addVote(new Vote(gossipManager.getMyself().getId(), true, false,
+            gossipManager.getLiveMembers().stream().map(Member::getId).collect(Collectors.toList()),
+            gossipManager.getDeadMembers().stream().map(Member::getId)
+                    .collect(Collectors.toList())));
+    Map<String, VoteCandidate> voteCandidateMap = new ConcurrentHashMap<>();
+    voteCandidateMap.put(voteCandidate.getCandidateNodeId(), voteCandidate);
+    MajorityVote majorityVote = new MajorityVote(voteCandidateMap);
+    SharedDataMessage lockMessage = new SharedDataMessage();
+    lockMessage.setKey(generateLockKey(key));
+    lockMessage.setPayload(majorityVote);
+    lockMessage.setExpireAt(Long.MAX_VALUE);
+    lockMessage.setTimestamp(System.currentTimeMillis());
+    return lockMessage;
+  }
+
+  // This method will run periodically to vote the other nodes
+  private void updateVotes() {
+    for (String lockKey : lockKeys) {
+      SharedDataMessage message = gossipManager.findSharedGossipData(lockKey);
+      if (message == null || !(message.getPayload() instanceof MajorityVote)) {
+        continue;
+      }
+      MajorityVote majorityVote = (MajorityVote) message.getPayload();
+      Map<String, VoteCandidate> voteCandidateMap = majorityVote.value();
+      String myNodeId = gossipManager.getMyself().getId();
+      // No need to vote if my node is already voted to every node for the key
+      if (isVotedToAll(myNodeId, voteCandidateMap)) {
+        continue;
+      }
+      String myVoteCandidate = getVotedCandidateNodeId(myNodeId, voteCandidateMap);
+
+      if (myVoteCandidate == null) {
+        myVoteCandidate = lockSettings.getVoteSelector().getVoteCandidateId(voteCandidateMap.keySet());
+      }
+      for (VoteCandidate voteCandidate : voteCandidateMap.values()) {
+        if (voteCandidate.getCandidateNodeId().equals(myNodeId)) {
+          continue;
+        }
+        // Vote for selected candidate
+        boolean voteResult = voteCandidate.getCandidateNodeId().equals(myVoteCandidate);
+        voteCandidate.addVote(new Vote(gossipManager.getMyself().getId(), voteResult, false,
+                gossipManager.getLiveMembers().stream().map(Member::getId)
+                        .collect(Collectors.toList()),
+                gossipManager.getDeadMembers().stream().map(Member::getId)
+                        .collect(Collectors.toList())));
+      }
+    }
+  }
+
+  // Return true if every node has a vote from given node id.
+  private boolean isVotedToAll(String nodeId, final Map<String, VoteCandidate> voteCandidates) {
+    int voteCount = 0;
+    for (VoteCandidate voteCandidate : voteCandidates.values()) {
+      if (voteCandidate.getVotes().containsKey(nodeId)) {
+        voteCount++;
+      }
+    }
+    return voteCount == voteCandidates.size();
+  }
+
+  // Returns true if there is a deadlock for given vote candidates
+  private boolean isDeadLock(final Map<String, VoteCandidate> voteCandidates) {
+    boolean result = true;
+    int numberOfLiveNodes;
+    if (numberOfNodes.get() > 0) {
+      numberOfLiveNodes = numberOfNodes.get();
+    } else {
+      // numberOfNodes is not set by the user, therefore calculate it.
+      Set<String> liveNodes = voteCandidates.values().stream()
+              .map(voteCandidate -> voteCandidate.getVotes().values()).flatMap(Collection::stream)
+              .map(Vote::getLiveMembers).flatMap(List::stream).collect(Collectors.toSet());
+      numberOfLiveNodes = liveNodes.size();
+    }
+    for (VoteCandidate voteCandidate : voteCandidates.values()) {
+      result = result && voteCandidate.getVotes().size() == numberOfLiveNodes;
+    }
+    return result;
+  }
+
+  // Prevent the deadlock by giving up the votes
+  private void preventDeadLock(Map<String, VoteCandidate> voteCandidates) {
+    String myNodeId = gossipManager.getMyself().getId();
+    VoteCandidate myResults = voteCandidates.get(myNodeId);
+    if (myResults == null) {
+      return;
+    }
+    // Set of nodes that is going to receive this nodes votes
+    List<String> donateCandidateIds = voteCandidates.keySet().stream()
+            .filter(s -> s.compareTo(myNodeId) < 0).collect(Collectors.toList());
+    if (donateCandidateIds.size() == 0) {
+      return;
+    }
+    // Select a random node to donate
+    Random randomizer = new Random();
+    String selectedCandidateId = donateCandidateIds
+            .get(randomizer.nextInt(donateCandidateIds.size()));
+    VoteCandidate selectedCandidate = voteCandidates.get(selectedCandidateId);
+
+    Set<Vote> myVotes = new HashSet<>(myResults.getVotes().values());
+    Set<Vote> selectedCandidateVotes = new HashSet<>(selectedCandidate.getVotes().values());
+    // Exchange the votes
+    for (Vote myVote : myVotes) {
+      for (Vote candidateVote : selectedCandidateVotes) {
+        if (myVote.getVoteValue() && myVote.getVotingNode().equals(candidateVote.getVotingNode())) {
+          myVote.setVoteExchange(true);
+          candidateVote.setVoteExchange(true);
+          selectedCandidate.getVotes().put(myVote.getVotingNode(), myVote);
+          myResults.getVotes().put(candidateVote.getVotingNode(), candidateVote);
+        }
+      }
+    }
+    if (LOGGER.isDebugEnabled()) {
+      LOGGER.debug("Node " + myNodeId + " give up votes to node " + selectedCandidateId);
+    }
+  }
+
+  private String getVotedCandidateNodeId(String nodeId,
+          final Map<String, VoteCandidate> voteCandidates) {
+    for (VoteCandidate voteCandidate : voteCandidates.values()) {
+      Vote vote = voteCandidate.getVotes().get(nodeId);
+      if (vote != null && vote.getVoteValue()) {
+        return voteCandidate.getCandidateNodeId();
+      }
+    }
+    return null;
+  }
+
+  // Return true if the given candidate has passed the vote
+  private boolean isVoteSuccess(VoteCandidate voteCandidate) {
+    Set<String> liveNodes = new HashSet<>();
+    int voteCount = 0;
+    for (Vote vote : voteCandidate.getVotes().values()) {
+      liveNodes.addAll(vote.getLiveMembers());
+      if (vote.getVoteValue()) {
+        voteCount++;
+      }
+    }
+    int numberOfLiveNodes;
+    if (numberOfNodes.get() > 0) {
+      numberOfLiveNodes = numberOfNodes.get();
+    } else {
+      numberOfLiveNodes = liveNodes.size();
+    }
+    return numberOfLiveNodes > 0 && voteCount >= (numberOfLiveNodes / 2 + 1);
+  }
+
+  private String generateLockKey(String key){
+    return "lock/" + key;
+  }
+
+  public void shutdown(){
+    voteService.shutdown();
+  }
+  /**
+   * Get the voted node id from this node for a given key
+   * @param key key of the data object
+   * @return Voted node id
+   */
+  public String getVotedCandidateNodeId(String key) {
+    SharedDataMessage message = gossipManager.findSharedGossipData(generateLockKey(key));
+    if (message == null || !(message.getPayload() instanceof MajorityVote)) {
+      return null;
+    }
+    MajorityVote majorityVote = (MajorityVote) message.getPayload();
+    return getVotedCandidateNodeId(gossipManager.getMyself().getId(), majorityVote.value());
+  }
+
+  /**
+   * Set the number of live nodes. If this value is negative, live nodes will be calculated
+   * @param numberOfNodes live node count or negative to calculate.
+   */
+  public void setNumberOfNodes(int numberOfNodes) {
+    this.numberOfNodes.set(numberOfNodes);
+  }
+
+}
diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/LockManagerSettings.java b/gossip-base/src/main/java/org/apache/gossip/lock/LockManagerSettings.java
new file mode 100644
index 0000000..4af47a2
--- /dev/null
+++ b/gossip-base/src/main/java/org/apache/gossip/lock/LockManagerSettings.java
@@ -0,0 +1,83 @@
+/*
+ * 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.gossip.lock;
+
+import org.apache.gossip.lock.vote.RandomVoteSelector;
+import org.apache.gossip.lock.vote.VoteSelector;
+
+/**
+ * Stores the lock manager related settings.
+ */
+public class LockManagerSettings {
+  // Time between vote updates in ms. Default is 1 second.
+  private final int voteUpdateInterval;
+  // Vote selection algorithm. Default is random voting
+  private final VoteSelector voteSelector;
+  // Number of nodes available for voting. Default is -1 (Auto calculate)
+  private final int numberOfNodes;
+  // Number of times to test for deadlock before preventing. Default is 3
+  private final int deadlockDetectionThreshold;
+  // Wait time between vote result calculation. Default is 1000
+  private final int resultCalculationDelay;
+
+  /**
+   * Construct LockManagerSettings with default settings.
+   */
+  public static LockManagerSettings getLockManagerDefaultSettings() {
+    return new LockManagerSettings(1000, new RandomVoteSelector(), -1, 3, 1000);
+  }
+
+  /**
+   * Construct a custom LockManagerSettings
+   *
+   * @param voteUpdateInterval         Time between vote updates in milliseconds.
+   * @param voteSelector               Vote selection algorithm. Cannot be null
+   * @param numberOfNodes              Number of nodes available for voting. Set to negative value for auto calculate
+   * @param deadlockDetectionThreshold Number of times to test for deadlock before preventing
+   * @param resultCalculationDelay     Wait time between vote result calculation
+   */
+  public LockManagerSettings(int voteUpdateInterval, VoteSelector voteSelector, int numberOfNodes,
+          int deadlockDetectionThreshold, int resultCalculationDelay) {
+    this.voteUpdateInterval = voteUpdateInterval;
+    this.voteSelector = voteSelector;
+    this.numberOfNodes = numberOfNodes;
+    this.deadlockDetectionThreshold = deadlockDetectionThreshold;
+    this.resultCalculationDelay = resultCalculationDelay;
+
+  }
+
+  public int getVoteUpdateInterval() {
+    return voteUpdateInterval;
+  }
+
+  public VoteSelector getVoteSelector() {
+    return voteSelector;
+  }
+
+  public int getNumberOfNodes() {
+    return numberOfNodes;
+  }
+
+  public int getDeadlockDetectionThreshold() {
+    return deadlockDetectionThreshold;
+  }
+
+  public int getResultCalculationDelay() {
+    return resultCalculationDelay;
+  }
+}
diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/exceptions/VoteFailedException.java b/gossip-base/src/main/java/org/apache/gossip/lock/exceptions/VoteFailedException.java
new file mode 100644
index 0000000..bd0a606
--- /dev/null
+++ b/gossip-base/src/main/java/org/apache/gossip/lock/exceptions/VoteFailedException.java
@@ -0,0 +1,43 @@
+/*
+ * 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.gossip.lock.exceptions;
+
+/**
+ * This exception is thrown when the lock based voting is failed.
+ */
+public class VoteFailedException extends Exception {
+  /**
+   * Constructs a new VoteFailedException with the specified detail message.
+   *
+   * @param message the detail message.
+   */
+  public VoteFailedException(String message) {
+    super(message);
+  }
+
+  /**
+   * Constructs a new VoteFailedException with the specified detail message and
+   * cause.
+   *
+   * @param message the detail message
+   * @param cause   the cause for this exception
+   */
+  public VoteFailedException(String message, Throwable cause) {
+    super(message, cause);
+  }
+}
diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/vote/MajorityVote.java b/gossip-base/src/main/java/org/apache/gossip/lock/vote/MajorityVote.java
new file mode 100644
index 0000000..a18f3c9
--- /dev/null
+++ b/gossip-base/src/main/java/org/apache/gossip/lock/vote/MajorityVote.java
@@ -0,0 +1,169 @@
+/*
+ * 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.gossip.lock.vote;
+
+import org.apache.gossip.crdt.Crdt;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * CRDT which used for distribute a votes for a given key.
+ */
+public class MajorityVote implements Crdt<Map<String, VoteCandidate>, MajorityVote> {
+
+  private final Map<String, VoteCandidate> voteCandidates = new ConcurrentHashMap<>();
+
+  public MajorityVote(Map<String, VoteCandidate> voteCandidateMap) {
+    voteCandidates.putAll(voteCandidateMap);
+  }
+
+  @Override
+  public MajorityVote merge(MajorityVote other) {
+    Map<String, VoteCandidate> mergedCandidates = new ConcurrentHashMap<>();
+    Set<String> firstKeySet = this.voteCandidates.keySet();
+    Set<String> secondKeySet = other.voteCandidates.keySet();
+    Set<String> sameCandidatesSet = getIntersection(firstKeySet, secondKeySet);
+    Set<String> differentCandidatesSet = getIntersectionCompliment(firstKeySet, secondKeySet);
+    // Merge different vote candidates by combining votes
+    for (String differentCandidateId : differentCandidatesSet) {
+      if (this.voteCandidates.containsKey(differentCandidateId)) {
+        mergedCandidates.put(differentCandidateId, this.voteCandidates.get(differentCandidateId));
+      } else if (other.voteCandidates.containsKey(differentCandidateId)) {
+        mergedCandidates.put(differentCandidateId, other.voteCandidates.get(differentCandidateId));
+      }
+    }
+    // Merge votes for the same candidate
+    for (String sameCandidateId : sameCandidatesSet) {
+      if (this.voteCandidates.containsKey(sameCandidateId) && other.voteCandidates
+              .containsKey(sameCandidateId)) {
+        mergedCandidates.put(sameCandidateId,
+                mergeCandidate(this.voteCandidates.get(sameCandidateId),
+                        other.voteCandidates.get(sameCandidateId)));
+      }
+    }
+
+    return new MajorityVote(mergedCandidates);
+  }
+
+  // Merge different votes for same candidate
+  private VoteCandidate mergeCandidate(VoteCandidate firstCandidate,
+          VoteCandidate secondCandidate) {
+    VoteCandidate mergeResult = new VoteCandidate(firstCandidate.getCandidateNodeId(),
+            firstCandidate.getVotingKey(), new ConcurrentHashMap<>());
+    Set<String> firstKeySet = firstCandidate.getVotes().keySet();
+    Set<String> secondKeySet = secondCandidate.getVotes().keySet();
+    Set<String> sameVoteNodeSet = getIntersection(firstKeySet, secondKeySet);
+    Set<String> differentVoteNodeSet = getIntersectionCompliment(firstKeySet, secondKeySet);
+    // Merge different voters by combining their votes
+    for (String differentCandidateId : differentVoteNodeSet) {
+      if (firstCandidate.getVotes().containsKey(differentCandidateId)) {
+        mergeResult.getVotes()
+                .put(differentCandidateId, firstCandidate.getVotes().get(differentCandidateId));
+      } else if (secondCandidate.getVotes().containsKey(differentCandidateId)) {
+        mergeResult.getVotes()
+                .put(differentCandidateId, secondCandidate.getVotes().get(differentCandidateId));
+      }
+    }
+    // Merge vote for same voter
+    for (String sameVoteNodeId : sameVoteNodeSet) {
+      if (firstCandidate.getVotes().containsKey(sameVoteNodeId) && secondCandidate.getVotes()
+              .containsKey(sameVoteNodeId)) {
+        mergeResult.getVotes().put(sameVoteNodeId,
+                mergeVote(firstCandidate.getVotes().get(sameVoteNodeId),
+                        secondCandidate.getVotes().get(sameVoteNodeId)));
+      }
+    }
+
+    return mergeResult;
+  }
+
+  // Merge two votes from same voter
+  private Vote mergeVote(Vote firstVote, Vote secondVote) {
+    if (firstVote.getVoteValue().booleanValue() != secondVote.getVoteValue().booleanValue()) {
+      if (firstVote.getVoteExchange()) {
+        return firstVote;
+      } else if (secondVote.getVoteExchange()) {
+        return secondVote;
+      } else {
+        return secondVote;
+      }
+    } else {
+      return secondVote;
+    }
+  }
+
+  private Set<String> getIntersection(Set<String> first, Set<String> second) {
+    Set<String> intersection = new HashSet<>(first);
+    intersection.retainAll(second);
+    return intersection;
+  }
+
+  private Set<String> getIntersectionCompliment(Set<String> first, Set<String> second) {
+    Set<String> union = new HashSet<>();
+    union.addAll(first);
+    union.addAll(second);
+    Set<String> intersectionCompliment = new HashSet<>(union);
+    intersectionCompliment.removeAll(getIntersection(first, second));
+    return intersectionCompliment;
+  }
+
+  @Override
+  public Map<String, VoteCandidate> value() {
+    Map<String, VoteCandidate> copy = new ConcurrentHashMap<>();
+    copy.putAll(voteCandidates);
+    return Collections.unmodifiableMap(copy);
+
+  }
+
+  @Override
+  public int hashCode() {
+    return voteCandidates.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj == null)
+      return false;
+    if (obj == this)
+      return true;
+    if (!(obj instanceof MajorityVote))
+      return false;
+    MajorityVote other = (MajorityVote) obj;
+    return Objects.equals(voteCandidates, other.voteCandidates);
+  }
+
+  @Override
+  public String toString() {
+    return voteCandidates.toString();
+  }
+
+  @Override
+  public MajorityVote optimize() {
+    return new MajorityVote(voteCandidates);
+  }
+
+  public Map<String, VoteCandidate> getVoteCandidates() {
+    return new ConcurrentHashMap<>(voteCandidates);
+  }
+
+}
diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/vote/RandomVoteSelector.java b/gossip-base/src/main/java/org/apache/gossip/lock/vote/RandomVoteSelector.java
new file mode 100644
index 0000000..d07f190
--- /dev/null
+++ b/gossip-base/src/main/java/org/apache/gossip/lock/vote/RandomVoteSelector.java
@@ -0,0 +1,35 @@
+/*
+ * 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.gossip.lock.vote;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+/**
+ * VoteSelector implementation which randomly select a voting node.
+ */
+public class RandomVoteSelector implements VoteSelector {
+
+  @Override
+  public String getVoteCandidateId(Set<String> voteCandidateIds) {
+    List<String> voteCandidatesIds = new ArrayList<>(voteCandidateIds);
+    return voteCandidatesIds.get(new Random().nextInt(voteCandidatesIds.size()));
+  }
+}
diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/vote/Vote.java b/gossip-base/src/main/java/org/apache/gossip/lock/vote/Vote.java
new file mode 100644
index 0000000..e68401c
--- /dev/null
+++ b/gossip-base/src/main/java/org/apache/gossip/lock/vote/Vote.java
@@ -0,0 +1,70 @@
+/*
+ * 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.gossip.lock.vote;
+
+import java.util.List;
+
+/**
+ * Store a voter details.
+ */
+public class Vote {
+  private final String votingNode;
+  private final Boolean voteValue; // TODO: 7/16/17  weight?
+  private Boolean voteExchange;
+  private final List<String> liveMembers;
+  private final List<String> deadMembers;
+
+  public Vote(String votingNode, Boolean voteValue, Boolean voteExchange, List<String> liveMembers,
+          List<String> deadMembers) {
+    this.votingNode = votingNode;
+    this.voteValue = voteValue;
+    this.voteExchange = voteExchange;
+    this.liveMembers = liveMembers;
+    this.deadMembers = deadMembers;
+  }
+
+  public String getVotingNode() {
+    return votingNode;
+  }
+
+  public Boolean getVoteValue() {
+    return voteValue;
+  }
+
+  public Boolean getVoteExchange() {
+    return voteExchange;
+  }
+
+  public void setVoteExchange(Boolean voteExchange) {
+    this.voteExchange = voteExchange;
+  }
+
+  public List<String> getLiveMembers() {
+    return liveMembers;
+  }
+
+  public List<String> getDeadMembers() {
+    return deadMembers;
+  }
+
+  @Override
+  public String toString() {
+    return "votingNode=" + votingNode + ", voteValue=" + voteValue + ", liveMembers=" + liveMembers
+            + ", deadMembers= " + deadMembers;
+  }
+}
diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/vote/VoteCandidate.java b/gossip-base/src/main/java/org/apache/gossip/lock/vote/VoteCandidate.java
new file mode 100644
index 0000000..b81b0b9
--- /dev/null
+++ b/gossip-base/src/main/java/org/apache/gossip/lock/vote/VoteCandidate.java
@@ -0,0 +1,75 @@
+/*
+ * 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.gossip.lock.vote;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Stores the vote candidate details and its votes.
+ */
+public class VoteCandidate {
+
+  private final String candidateNodeId;
+  private final String votingKey;
+  private final Map<String, Vote> votes;
+
+  public VoteCandidate(String candidateNodeId, String votingKey, Map<String, Vote> votes) {
+
+    this.candidateNodeId = candidateNodeId;
+    this.votingKey = votingKey;
+    this.votes = votes;
+  }
+
+  public String getCandidateNodeId() {
+    return candidateNodeId;
+  }
+
+  public String getVotingKey() {
+    return votingKey;
+  }
+
+  public Map<String, Vote> getVotes() {
+    return votes;
+  }
+
+  public void addVote(Vote vote) {
+    votes.put(vote.getVotingNode(), vote);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(candidateNodeId, votingKey);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (!(obj instanceof VoteCandidate))
+      return false;
+    if (obj == this)
+      return true;
+    VoteCandidate other = (VoteCandidate) obj;
+    return this.candidateNodeId.equals(other.candidateNodeId) && this.votingKey
+            .equals(other.votingKey);
+  }
+
+  @Override
+  public String toString() {
+    return "candidateNodeId=" + candidateNodeId + ", votingKey=" + votingKey + ", votes= " + votes;
+  }
+}
diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/vote/VoteSelector.java b/gossip-base/src/main/java/org/apache/gossip/lock/vote/VoteSelector.java
new file mode 100644
index 0000000..91c22b3
--- /dev/null
+++ b/gossip-base/src/main/java/org/apache/gossip/lock/vote/VoteSelector.java
@@ -0,0 +1,33 @@
+/*
+ * 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.gossip.lock.vote;
+
+import java.util.Set;
+
+/**
+ * This interface defines vote selection algorithm for the vote based locking.
+ */
+public interface VoteSelector {
+  /**
+   * This method get call by the lock manager of a node to decide which candidate need to be choose for voting.
+   *
+   * @param voteCandidateIds node id set for the vote candidates
+   * @return selected node id to vote from the given vote candidate set.
+   */
+  String getVoteCandidateId(Set<String> voteCandidateIds);
+}
diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/GossipManager.java b/gossip-base/src/main/java/org/apache/gossip/manager/GossipManager.java
index db442c6..2e45843 100644
--- a/gossip-base/src/main/java/org/apache/gossip/manager/GossipManager.java
+++ b/gossip-base/src/main/java/org/apache/gossip/manager/GossipManager.java
@@ -28,6 +28,8 @@
 import org.apache.gossip.event.GossipState;
 import org.apache.gossip.event.data.UpdateNodeDataEventHandler;
 import org.apache.gossip.event.data.UpdateSharedDataEventHandler;
+import org.apache.gossip.lock.LockManager;
+import org.apache.gossip.lock.exceptions.VoteFailedException;
 import org.apache.gossip.manager.handlers.MessageHandler;
 import org.apache.gossip.model.PerNodeDataMessage;
 import org.apache.gossip.model.SharedDataMessage;
@@ -43,7 +45,11 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
-import java.util.concurrent.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
@@ -77,7 +83,8 @@
   private final GossipMemberStateRefresher memberStateRefresher;
   
   private final MessageHandler messageHandler;
-  
+  private final LockManager lockManager;
+
   public GossipManager(String cluster,
                        URI uri, String id, Map<String, String> properties, GossipSettings settings,
                        List<Member> gossipMembers, GossipListener listener, MetricRegistry registry,
@@ -89,6 +96,7 @@
     me = new LocalMember(cluster, uri, id, clock.nanoTime(), properties,
             settings.getWindowSize(), settings.getMinimumSamples(), settings.getDistribution());
     gossipCore = new GossipCore(this, registry);
+    this.lockManager = new LockManager(this, settings.getLockManagerSettings(), registry);
     dataReaper = new DataReaper(gossipCore, clock);
     members = new ConcurrentSkipListMap<>();
     for (Member startupMember : gossipMembers) {
@@ -221,6 +229,7 @@
    */
   public void shutdown() {
     gossipServiceRunning.set(false);
+    lockManager.shutdown();
     gossipCore.shutdown();
     transportManager.shutdown();
     dataReaper.close();
@@ -371,4 +380,21 @@
   public void registerGossipListener(GossipListener listener) {
     memberStateRefresher.register(listener);
   }
+
+  /**
+   * Get the lock manager specified with this GossipManager.
+   * @return lock manager object.
+   */
+  public LockManager getLockManager() {
+    return lockManager;
+  }
+
+  /**
+   * Try to acquire a lock on given shared data key.
+   * @param key key of tha share data object.
+   * @throws VoteFailedException if the locking is failed.
+   */
+  public void acquireSharedDataLock(String key) throws VoteFailedException{
+    lockManager.acquireSharedDataLock(key);
+  }
 }
diff --git a/gossip-base/src/test/java/org/apache/gossip/lock/vote/MajorityVoteTest.java b/gossip-base/src/test/java/org/apache/gossip/lock/vote/MajorityVoteTest.java
new file mode 100644
index 0000000..c558444
--- /dev/null
+++ b/gossip-base/src/test/java/org/apache/gossip/lock/vote/MajorityVoteTest.java
@@ -0,0 +1,101 @@
+/*
+ * 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.gossip.lock.vote;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+@RunWith(JUnitPlatform.class)
+public class MajorityVoteTest {
+
+  @Test
+  public void differentCandidateMergeTest() {
+    Map<String, VoteCandidate> voteCandidateMap1 = new HashMap<>();
+    VoteCandidate candidateA = new VoteCandidate("1", "key1", generateVotes(1, 2, true, true));
+    voteCandidateMap1.put("1", candidateA);
+    MajorityVote first = new MajorityVote(voteCandidateMap1);
+
+    Map<String, VoteCandidate> voteCandidateMap2 = new HashMap<>();
+    VoteCandidate candidateB = new VoteCandidate("3", "key1", generateVotes(3, 4, true, false));
+    voteCandidateMap2.put("3", candidateB);
+    MajorityVote second = new MajorityVote(voteCandidateMap2);
+
+    MajorityVote result = first.merge(second);
+
+    Assert.assertTrue(result.value().get("1").getVotes().get("2").getVoteValue());
+    Assert.assertTrue(!result.value().get("3").getVotes().get("4").getVoteValue());
+
+  }
+
+  @Test
+  public void sameCandidateMergeTest() {
+    Map<String, VoteCandidate> voteCandidateMap1 = new HashMap<>();
+    VoteCandidate candidateA = new VoteCandidate("1", "key1", generateVotes(1, 2, true, true));
+    voteCandidateMap1.put("1", candidateA);
+    MajorityVote first = new MajorityVote(voteCandidateMap1);
+
+    Map<String, VoteCandidate> voteCandidateMap2 = new HashMap<>();
+    VoteCandidate candidateB = new VoteCandidate("1", "key1", generateVotes(3, 4, true, false));
+    voteCandidateMap2.put("1", candidateB);
+    MajorityVote second = new MajorityVote(voteCandidateMap2);
+
+    MajorityVote result = first.merge(second);
+
+    Assert.assertTrue(result.value().get("1").getVotes().get("2").getVoteValue());
+    Assert.assertTrue(!result.value().get("1").getVotes().get("4").getVoteValue());
+
+  }
+
+  @Test
+  public void sameVoteMergeTest() {
+    Map<String, VoteCandidate> voteCandidateMap1 = new HashMap<>();
+    VoteCandidate candidateA = new VoteCandidate("1", "key1", generateVotes(1, 2, true, true));
+    voteCandidateMap1.put("1", candidateA);
+    MajorityVote first = new MajorityVote(voteCandidateMap1);
+
+    Map<String, VoteCandidate> voteCandidateMap2 = new HashMap<>();
+    VoteCandidate candidateB = new VoteCandidate("1", "key1",
+            generateVotes(2, 4, true, false, true));
+    voteCandidateMap2.put("1", candidateB);
+    MajorityVote second = new MajorityVote(voteCandidateMap2);
+
+    MajorityVote result = first.merge(second);
+
+    Assert.assertTrue(result.value().get("1").getVotes().get("2").getVoteValue());
+  }
+
+  public Map<String, Vote> generateVotes(int startingNodeId, int endNodeId, boolean... votes) {
+    Map<String, Vote> voteMap = new HashMap<>();
+    if ((endNodeId - startingNodeId + 1) > votes.length) {
+      return voteMap;
+    }
+    for (int i = startingNodeId; i <= endNodeId; i++) {
+      String nodeId = i + "";
+      voteMap.put(nodeId, new Vote(nodeId, votes[i - startingNodeId], false, new ArrayList<>(),
+              new ArrayList<>()));
+    }
+    return voteMap;
+  }
+
+}
diff --git a/gossip-itest/src/test/java/org/apache/gossip/SharedDataLockTest.java b/gossip-itest/src/test/java/org/apache/gossip/SharedDataLockTest.java
new file mode 100644
index 0000000..01dbac0
--- /dev/null
+++ b/gossip-itest/src/test/java/org/apache/gossip/SharedDataLockTest.java
@@ -0,0 +1,125 @@
+/*
+ * 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.gossip;
+
+import org.apache.gossip.lock.exceptions.VoteFailedException;
+import org.apache.gossip.manager.GossipManager;
+import org.apache.gossip.manager.GossipManagerBuilder;
+import org.apache.gossip.model.SharedDataMessage;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.runner.RunWith;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@RunWith(JUnitPlatform.class)
+public class SharedDataLockTest extends AbstractIntegrationBase {
+
+  @Test
+  public void sharedDataLockRandomVoteTest()
+          throws InterruptedException, UnknownHostException, URISyntaxException {
+    GossipSettings settings = new GossipSettings();
+    settings.setPersistRingState(false);
+    settings.setPersistDataState(false);
+    String cluster = UUID.randomUUID().toString();
+    int seedNodes = 1;
+    List<Member> startupMembers = new ArrayList<>();
+    for (int i = 1; i < seedNodes + 1; ++i) {
+      URI uri = new URI("udp://" + "127.0.0.1" + ":" + (50000 + i));
+      startupMembers.add(new RemoteMember(cluster, uri, i + ""));
+    }
+    final List<GossipManager> clients = new ArrayList<>();
+    final int clusterMembers = 10;
+    for (int i = 1; i < clusterMembers + 1; ++i) {
+      URI uri = new URI("udp://" + "127.0.0.1" + ":" + (50000 + i));
+      GossipManager gossipService = GossipManagerBuilder.newBuilder().cluster(cluster).uri(uri)
+              .id(i + "").gossipMembers(startupMembers).gossipSettings(settings).build();
+      clients.add(gossipService);
+      gossipService.getLockManager().setNumberOfNodes(clusterMembers);
+      gossipService.init();
+      register(gossipService);
+    }
+
+    // Adding new data to Node 1
+    clients.get(0).gossipSharedData(sharedNodeData("category", "distributed"));
+
+    final AtomicInteger lockSuccessCount = new AtomicInteger(0);
+    final AtomicInteger lockFailedCount = new AtomicInteger(0);
+
+    // Node 1 try to lock on key category
+    Thread Node1LockingThread = new Thread(() -> {
+      try {
+        clients.get(0).acquireSharedDataLock("category");
+        lockSuccessCount.incrementAndGet();
+      } catch (VoteFailedException ignore) {
+        lockFailedCount.incrementAndGet();
+      }
+    });
+
+    // Node 3 try to lock on key category
+    Thread Node3LockingThread = new Thread(() -> {
+      try {
+        clients.get(2).acquireSharedDataLock("category");
+        lockSuccessCount.incrementAndGet();
+      } catch (VoteFailedException ignore) {
+        lockFailedCount.incrementAndGet();
+      }
+    });
+
+    // Node 6 try to lock on key category
+    Thread Node5LockingThread = new Thread(() -> {
+      try {
+        clients.get(5).acquireSharedDataLock("category");
+        lockSuccessCount.incrementAndGet();
+      } catch (VoteFailedException ignore) {
+        lockFailedCount.incrementAndGet();
+      }
+    });
+
+    Node1LockingThread.start();
+    Node3LockingThread.start();
+    Node5LockingThread.start();
+
+    Node1LockingThread.join();
+    Node3LockingThread.join();
+    Node5LockingThread.join();
+
+    // Only one node should acquire the lock
+    Assert.assertEquals(1, lockSuccessCount.get());
+    // Other nodes should fail
+    Assert.assertEquals(2, lockFailedCount.get());
+
+  }
+
+  private SharedDataMessage sharedNodeData(String key, String value) {
+    SharedDataMessage g = new SharedDataMessage();
+    g.setExpireAt(Long.MAX_VALUE);
+    g.setKey(key);
+    g.setPayload(value);
+    g.setTimestamp(System.currentTimeMillis());
+    return g;
+  }
+
+}
