diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseClient.java b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseClient.java
index c2beb59..c749197 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseClient.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseClient.java
@@ -1,15 +1,12 @@
 package org.onlab.onos.store.service.impl;
 
-import java.util.Arrays;
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 
-import net.kuujo.copycat.protocol.Response.Status;
-import net.kuujo.copycat.protocol.SubmitRequest;
-import net.kuujo.copycat.protocol.SubmitResponse;
-import net.kuujo.copycat.spi.protocol.ProtocolClient;
+import net.kuujo.copycat.Copycat;
 
 import org.onlab.onos.store.service.DatabaseException;
 import org.onlab.onos.store.service.ReadRequest;
@@ -20,31 +17,17 @@
  */
 public class DatabaseClient {
 
-    private final ProtocolClient client;
+    private final Copycat copycat;
 
-    public DatabaseClient(ProtocolClient client) {
-        this.client = client;
-    }
-
-    private static String nextId() {
-        return UUID.randomUUID().toString();
+    public DatabaseClient(Copycat copycat) {
+        this.copycat = checkNotNull(copycat);
     }
 
     public boolean createTable(String tableName) {
 
-        SubmitRequest request =
-                new SubmitRequest(
-                        nextId(),
-                        "createTable",
-                        Arrays.asList(tableName));
-        CompletableFuture<SubmitResponse> future = client.submit(request);
+        CompletableFuture<Boolean> future = copycat.submit("createTable", tableName);
         try {
-            final SubmitResponse submitResponse = future.get();
-            if (submitResponse.status() == Status.OK) {
-                return (boolean) submitResponse.result();
-            } else {
-                throw new DatabaseException(submitResponse.error());
-            }
+            return future.get();
         } catch (InterruptedException | ExecutionException e) {
             throw new DatabaseException(e);
         }
@@ -52,17 +35,9 @@
 
     public void dropTable(String tableName) {
 
-        SubmitRequest request =
-                new SubmitRequest(
-                        nextId(),
-                        "dropTable",
-                        Arrays.asList(tableName));
-        CompletableFuture<SubmitResponse> future = client.submit(request);
+        CompletableFuture<Void> future = copycat.submit("dropTable", tableName);
         try {
-            if (future.get().status() != Status.OK) {
-                throw new DatabaseException(future.get().toString());
-            }
-
+            future.get();
         } catch (InterruptedException | ExecutionException e) {
             throw new DatabaseException(e);
         }
@@ -70,79 +45,39 @@
 
     public void dropAllTables() {
 
-        SubmitRequest request =
-                new SubmitRequest(
-                        nextId(),
-                        "dropAllTables",
-                        Arrays.asList());
-        CompletableFuture<SubmitResponse> future = client.submit(request);
+        CompletableFuture<Void> future = copycat.submit("dropAllTables");
         try {
-            if (future.get().status() != Status.OK) {
-                throw new DatabaseException(future.get().toString());
-            }
+            future.get();
         } catch (InterruptedException | ExecutionException e) {
             throw new DatabaseException(e);
         }
     }
 
-    @SuppressWarnings("unchecked")
     public List<String> listTables() {
 
-        SubmitRequest request =
-                new SubmitRequest(
-                        nextId(),
-                        "listTables",
-                        Arrays.asList());
-        CompletableFuture<SubmitResponse> future = client.submit(request);
+        CompletableFuture<List<String>> future = copycat.submit("listTables");
         try {
-            final SubmitResponse submitResponse = future.get();
-            if (submitResponse.status() == Status.OK) {
-                return (List<String>) submitResponse.result();
-            } else {
-                throw new DatabaseException(submitResponse.error());
-            }
+            return future.get();
         } catch (InterruptedException | ExecutionException e) {
             throw new DatabaseException(e);
         }
     }
 
-    @SuppressWarnings("unchecked")
     public List<InternalReadResult> batchRead(List<ReadRequest> requests) {
 
-        SubmitRequest request = new SubmitRequest(
-                        nextId(),
-                        "read",
-                        Arrays.asList(requests));
-
-        CompletableFuture<SubmitResponse> future = client.submit(request);
+        CompletableFuture<List<InternalReadResult>> future = copycat.submit("read", requests);
         try {
-            final SubmitResponse submitResponse = future.get();
-            if (submitResponse.status() == Status.OK) {
-                return (List<InternalReadResult>) submitResponse.result();
-            } else {
-                throw new DatabaseException(submitResponse.error());
-            }
+            return future.get();
         } catch (InterruptedException | ExecutionException e) {
             throw new DatabaseException(e);
         }
     }
 
-    @SuppressWarnings("unchecked")
     public List<InternalWriteResult> batchWrite(List<WriteRequest> requests) {
 
-        SubmitRequest request = new SubmitRequest(
-                        nextId(),
-                        "write",
-                        Arrays.asList(requests));
-
-        CompletableFuture<SubmitResponse> future = client.submit(request);
+        CompletableFuture<List<InternalWriteResult>> future = copycat.submit("write", requests);
         try {
-            final SubmitResponse submitResponse = future.get();
-            if (submitResponse.status() == Status.OK) {
-                return (List<InternalWriteResult>) submitResponse.result();
-            } else {
-                throw new DatabaseException(submitResponse.error());
-            }
+            return future.get();
         } catch (InterruptedException | ExecutionException e) {
             throw new DatabaseException(e);
         }
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseManager.java b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseManager.java
index f328842..0d06e08 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseManager.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseManager.java
@@ -25,7 +25,6 @@
 import net.kuujo.copycat.log.InMemoryLog;
 import net.kuujo.copycat.log.Log;
 
-import org.apache.commons.lang3.RandomUtils;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -53,7 +52,6 @@
 import org.slf4j.Logger;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 
 /**
  * Strongly consistent and durable state management service based on
@@ -125,30 +123,16 @@
         }
 
         final ControllerNode localNode = clusterService.getLocalNode();
-        TcpMember clientHandler = null;
         for (ControllerNode member : defaultMember) {
             final TcpMember tcpMember = new TcpMember(member.ip().toString(),
                                                       member.tcpPort());
             if (localNode.equals(member)) {
-                clientHandler = tcpMember;
                 clusterConfig.setLocalMember(tcpMember);
             } else {
                 clusterConfig.addRemoteMember(tcpMember);
             }
         }
 
-        // TODO should be removed after DatabaseClient refactoring
-        if (clientHandler == null) {
-            Set<TcpMember> members = clusterConfig.getMembers();
-            if (members.isEmpty()) {
-                log.error("No member found in [{}] tablet configuration.",
-                          DEFAULT_TABLET);
-                throw new IllegalStateException("No member found in tablet configuration");
-            }
-            int position = RandomUtils.nextInt(0, members.size());
-            clientHandler = Iterables.get(members, position);
-        }
-
         // note: from this point beyond, clusterConfig requires synchronization
         clusterEventLatch = new CountDownLatch(1);
         clusterEventListener = new InternalClusterEventListener();
@@ -182,8 +166,7 @@
         copycat = new Copycat(stateMachine, consensusLog, cluster, copycatMessagingProtocol);
         copycat.start();
 
-        // FIXME Redo DatabaseClient. Needs fall back mechanism etc.
-        client = new DatabaseClient(copycatMessagingProtocol.createClient(clientHandler));
+        client = new DatabaseClient(copycat);
 
         log.info("Started.");
     }
