diff --git a/polkadot/node/overseer/overseer-gen/proc-macro/src/impl_builder.rs b/polkadot/node/overseer/overseer-gen/proc-macro/src/impl_builder.rs
index f669519e8a6b890f7b749bc2b4fb0219b155c603..a1c9450c41785c6249d0f109883094abdc5595bf 100644
--- a/polkadot/node/overseer/overseer-gen/proc-macro/src/impl_builder.rs
+++ b/polkadot/node/overseer/overseer-gen/proc-macro/src/impl_builder.rs
@@ -594,7 +594,7 @@ pub(crate) fn impl_task_kind(info: &OverseerInfo) -> proc_macro2::TokenStream {
 		struct Blocking;
 		impl TaskKind for Blocking {
 			fn launch_task<S: SpawnNamed>(spawner: &mut S, task_name: &'static str, subsystem_name: &'static str, future: BoxFuture<'static, ()>) {
-				spawner.spawn(task_name, Some(subsystem_name), future)
+				spawner.spawn_blocking(task_name, Some(subsystem_name), future)
 			}
 		}
 
diff --git a/polkadot/node/overseer/src/lib.rs b/polkadot/node/overseer/src/lib.rs
index dc44abc799f39f04fea332e1d3a427a6a4e5f4f6..dec173747f926c02ad5fe37003ecf9aef7c82eba 100644
--- a/polkadot/node/overseer/src/lib.rs
+++ b/polkadot/node/overseer/src/lib.rs
@@ -462,19 +462,19 @@ pub struct Overseer<SupportsParachains> {
 	#[subsystem(ApprovalDistributionMessage)]
 	approval_distribution: ApprovalDistribution,
 
-	#[subsystem(no_dispatch, ApprovalVotingMessage)]
+	#[subsystem(no_dispatch, blocking, ApprovalVotingMessage)]
 	approval_voting: ApprovalVoting,
 
 	#[subsystem(GossipSupportMessage)]
 	gossip_support: GossipSupport,
 
-	#[subsystem(no_dispatch, DisputeCoordinatorMessage)]
+	#[subsystem(no_dispatch, blocking, DisputeCoordinatorMessage)]
 	dispute_coordinator: DisputeCoordinator,
 
 	#[subsystem(no_dispatch, DisputeDistributionMessage)]
 	dispute_distribution: DisputeDistribution,
 
-	#[subsystem(no_dispatch, ChainSelectionMessage)]
+	#[subsystem(no_dispatch, blocking, ChainSelectionMessage)]
 	chain_selection: ChainSelection,
 
 	/// External listeners waiting for a hash to be in the active-leave set.