diff --git a/core/src/main/java/net/kuujo/copycat/internal/cluster/coordinator/DefaultClusterCoordinator.java b/core/src/main/java/net/kuujo/copycat/internal/cluster/coordinator/DefaultClusterCoordinator.java
index <HASH>..<HASH> 100644
--- a/core/src/main/java/net/kuujo/copycat/internal/cluster/coordinator/DefaultClusterCoordinator.java
+++ b/core/src/main/java/net/kuujo/copycat/internal/cluster/coordinator/DefaultClusterCoordinator.java
@@ -201,7 +201,7 @@ public class DefaultClusterCoordinator implements ClusterCoordinator {
   private synchronized CompletableFuture<Void> closeResources() {
     List<CompletableFuture<Void>> futures = new ArrayList<>(resources.size());
     for (ResourceHolder resource : resources.values()) {
-      futures.add(resource.state.close().thenCompose(v -> resource.cluster.close()));
+      futures.add(resource.state.close().thenCompose(v -> resource.cluster.close()).thenRun(() -> resource.state.executor().shutdown()));
     }
     return CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
   }
Shut down resource executors when cluster is shut down.