diff --git a/core/src/main/java/net/kuujo/copycat/internal/cluster/RemoteNode.java b/core/src/main/java/net/kuujo/copycat/internal/cluster/RemoteNode.java
index <HASH>..<HASH> 100644
--- a/core/src/main/java/net/kuujo/copycat/internal/cluster/RemoteNode.java
+++ b/core/src/main/java/net/kuujo/copycat/internal/cluster/RemoteNode.java
@@ -70,13 +70,13 @@ public class RemoteNode<M extends Member> extends Node<M> {
     }
 
     @Override
-    public CompletableFuture<Void> connect() {
+    public synchronized CompletableFuture<Void> connect() {
       if (connected) {
         return CompletableFuture.completedFuture(null);
       }
       if (connectFuture == null) {
         connectFuture = new CompletableFuture<>();
-        client.connect().whenComplete((result, error) -> {
+        client.connect().whenCompleteAsync((result, error) -> {
           CompletableFuture<Void> future = connectFuture;
           connectFuture = null;
           if (future != null) {
Ensure synchronous client connect() behavior does not create conflicting internal state in RemoteNode implementation.