diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/ClusterMessagingProtocolServer.java b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/ClusterMessagingProtocolServer.java
index 373bc97..d5532d5 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/ClusterMessagingProtocolServer.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/ClusterMessagingProtocolServer.java
@@ -1,19 +1,20 @@
 package org.onlab.onos.store.service.impl;
 
+import static java.util.concurrent.Executors.newCachedThreadPool;
+import static org.onlab.util.Tools.namedThreads;
 import static org.slf4j.LoggerFactory.getLogger;
+import static org.onlab.onos.store.service.impl.ClusterMessagingProtocol.*;
+import static org.onlab.onos.store.service.impl.ClusterMessagingProtocol.DB_SERIALIZER;
 
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
 import java.util.function.BiConsumer;
 
 import net.kuujo.copycat.protocol.PingRequest;
-import net.kuujo.copycat.protocol.PingResponse;
 import net.kuujo.copycat.protocol.PollRequest;
-import net.kuujo.copycat.protocol.PollResponse;
 import net.kuujo.copycat.protocol.RequestHandler;
 import net.kuujo.copycat.protocol.SubmitRequest;
-import net.kuujo.copycat.protocol.SubmitResponse;
 import net.kuujo.copycat.protocol.SyncRequest;
-import net.kuujo.copycat.protocol.SyncResponse;
 import net.kuujo.copycat.spi.protocol.ProtocolServer;
 
 import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService;
@@ -27,12 +28,15 @@
 public class ClusterMessagingProtocolServer implements ProtocolServer {
 
     private final Logger log = getLogger(getClass());
+
+    private final ClusterCommunicationService clusterCommunicator;
+
     private volatile RequestHandler handler;
-    private ClusterCommunicationService clusterCommunicator;
+
+    private ExecutorService pool;
 
     public ClusterMessagingProtocolServer(ClusterCommunicationService clusterCommunicator) {
         this.clusterCommunicator = clusterCommunicator;
-
     }
 
     @Override
@@ -42,67 +46,128 @@
 
     @Override
     public CompletableFuture<Void> listen() {
-        clusterCommunicator.addSubscriber(ClusterMessagingProtocol.COPYCAT_PING,
-                                          new CopycatMessageHandler<PingRequest>());
-        clusterCommunicator.addSubscriber(ClusterMessagingProtocol.COPYCAT_SYNC,
-                                          new CopycatMessageHandler<SyncRequest>());
-        clusterCommunicator.addSubscriber(ClusterMessagingProtocol.COPYCAT_POLL,
-                                          new CopycatMessageHandler<PollRequest>());
-        clusterCommunicator.addSubscriber(ClusterMessagingProtocol.COPYCAT_SUBMIT,
-                                          new CopycatMessageHandler<SubmitRequest>());
+        if (pool == null || pool.isShutdown()) {
+            pool = newCachedThreadPool(namedThreads("copycat-netty-messaging-server-%d"));
+        }
+
+        clusterCommunicator.addSubscriber(COPYCAT_PING, new PingHandler());
+        clusterCommunicator.addSubscriber(COPYCAT_SYNC, new SyncHandler());
+        clusterCommunicator.addSubscriber(COPYCAT_POLL, new PollHandler());
+        clusterCommunicator.addSubscriber(COPYCAT_SUBMIT, new SubmitHandler());
         return CompletableFuture.completedFuture(null);
     }
 
     @Override
     public CompletableFuture<Void> close() {
-        clusterCommunicator.removeSubscriber(ClusterMessagingProtocol.COPYCAT_PING);
-        clusterCommunicator.removeSubscriber(ClusterMessagingProtocol.COPYCAT_SYNC);
-        clusterCommunicator.removeSubscriber(ClusterMessagingProtocol.COPYCAT_POLL);
-        clusterCommunicator.removeSubscriber(ClusterMessagingProtocol.COPYCAT_SUBMIT);
+        clusterCommunicator.removeSubscriber(COPYCAT_PING);
+        clusterCommunicator.removeSubscriber(COPYCAT_SYNC);
+        clusterCommunicator.removeSubscriber(COPYCAT_POLL);
+        clusterCommunicator.removeSubscriber(COPYCAT_SUBMIT);
+        if (pool != null) {
+            pool.shutdownNow();
+            pool = null;
+        }
         return CompletableFuture.completedFuture(null);
     }
 
-    private class CopycatMessageHandler<T> implements ClusterMessageHandler {
+    private final class PingHandler extends CopycatMessageHandler<PingRequest> {
+
+        @Override
+        public void raftHandle(PingRequest request, ClusterMessage message) {
+            pool.submit(new Runnable() {
+
+                @Override
+                public void run() {
+                    currentHandler().ping(request)
+                        .whenComplete(new PostExecutionTask<>(message));
+                }
+            });
+        }
+    }
+
+    private final class SyncHandler extends CopycatMessageHandler<SyncRequest> {
+
+        @Override
+        public void raftHandle(SyncRequest request, ClusterMessage message) {
+            pool.submit(new Runnable() {
+
+                @Override
+                public void run() {
+                    currentHandler().sync(request)
+                        .whenComplete(new PostExecutionTask<>(message));
+                }
+            });
+        }
+    }
+
+    private final class PollHandler extends CopycatMessageHandler<PollRequest> {
+
+        @Override
+        public void raftHandle(PollRequest request, ClusterMessage message) {
+            pool.submit(new Runnable() {
+
+                @Override
+                public void run() {
+                    currentHandler().poll(request)
+                    .whenComplete(new PostExecutionTask<>(message));
+                }
+            });
+        }
+    }
+
+    private final class SubmitHandler extends CopycatMessageHandler<SubmitRequest> {
+
+        @Override
+        public void raftHandle(SubmitRequest request, ClusterMessage message) {
+            pool.submit(new Runnable() {
+
+                @Override
+                public void run() {
+                    currentHandler().submit(request)
+                    .whenComplete(new PostExecutionTask<>(message));
+                }
+            });
+        }
+    }
+
+    private abstract class CopycatMessageHandler<T> implements ClusterMessageHandler {
+
+        public abstract void raftHandle(T request, ClusterMessage message);
 
         @Override
         public void handle(ClusterMessage message) {
-            T request = ClusterMessagingProtocol.DB_SERIALIZER.decode(message.payload());
-            if (handler == null) {
+            T request = DB_SERIALIZER.decode(message.payload());
+            raftHandle(request, message);
+        }
+
+        RequestHandler currentHandler() {
+            RequestHandler currentHandler = handler;
+            if (currentHandler == null) {
                 // there is a slight window of time during state transition,
                 // where handler becomes null
+                long sleepMs = 1;
                 for (int i = 0; i < 10; ++i) {
-                    if (handler != null) {
+                    currentHandler = handler;
+                    if (currentHandler != null) {
                         break;
                     }
                     try {
-                        Thread.sleep(1);
+                        sleepMs <<= 1;
+                        Thread.sleep(sleepMs);
                     } catch (InterruptedException e) {
-                        log.trace("Exception", e);
+                        log.error("Interrupted", e);
+                        return handler;
                     }
                 }
-                if (handler == null) {
+                if (currentHandler == null) {
                     log.error("There was no handler registered!");
-                    return;
+                    return handler;
                 }
             }
-            if (request.getClass().equals(PingRequest.class)) {
-                handler.ping((PingRequest) request)
-                    .whenComplete(new PostExecutionTask<PingResponse>(message));
-            } else if (request.getClass().equals(PollRequest.class)) {
-                handler.poll((PollRequest) request)
-                    .whenComplete(new PostExecutionTask<PollResponse>(message));
-            } else if (request.getClass().equals(SyncRequest.class)) {
-                handler.sync((SyncRequest) request)
-                    .whenComplete(new PostExecutionTask<SyncResponse>(message));
-            } else if (request.getClass().equals(SubmitRequest.class)) {
-                handler.submit((SubmitRequest) request)
-                    .whenComplete(new PostExecutionTask<SubmitResponse>(message));
-            } else {
-                throw new IllegalStateException("Unknown request type: " + request.getClass().getName());
-            }
+            return currentHandler;
         }
 
-        private class PostExecutionTask<R> implements BiConsumer<R, Throwable> {
+        final class PostExecutionTask<R> implements BiConsumer<R, Throwable> {
 
             private final ClusterMessage message;
 
@@ -111,15 +176,15 @@
             }
 
             @Override
-            public void accept(R response, Throwable t) {
-                if (t != null) {
-                    log.error("Processing for " + message.subject() + " failed.", t);
+            public void accept(R response, Throwable error) {
+                if (error != null) {
+                    log.error("Processing {} failed.", message.subject(),  error);
                 } else {
                     try {
                         log.trace("responding to {}", message.subject());
-                        message.respond(ClusterMessagingProtocol.DB_SERIALIZER.encode(response));
+                        message.respond(DB_SERIALIZER.encode(response));
                     } catch (Exception e) {
-                        log.error("Failed to respond to " + response.getClass().getName(), e);
+                        log.error("Failed responding with {}", response.getClass().getName(), e);
                     }
                 }
             }
