diff --git a/cumulus/client/consensus/aura/src/lib.rs b/cumulus/client/consensus/aura/src/lib.rs
index 8e4bc658e44bfdc173f3fdb66518da883edcb05b..ed6f5bdd4d6984350c5f59a3753618c3a038f323 100644
--- a/cumulus/client/consensus/aura/src/lib.rs
+++ b/cumulus/client/consensus/aura/src/lib.rs
@@ -54,7 +54,10 @@ use std::{
 mod import_queue;
 
 pub use import_queue::{build_verifier, import_queue, BuildVerifierParams, ImportQueueParams};
-pub use sc_consensus_aura::{slot_duration, AuraVerifier, BuildAuraWorkerParams, SlotProportion};
+pub use sc_consensus_aura::{
+	slot_duration, standalone::slot_duration_at, AuraVerifier, BuildAuraWorkerParams,
+	SlotProportion,
+};
 pub use sc_consensus_slots::InherentDataProviderExt;
 
 pub mod collator;
diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs
index 4e06cd38f1d7fc7f4c7bf861162a1c8cf5390ec2..386551102e43617defd674c99831b99464c12bcc 100644
--- a/cumulus/polkadot-parachain/src/service.rs
+++ b/cumulus/polkadot-parachain/src/service.rs
@@ -1251,28 +1251,33 @@ where
 	<<AuraId as AppCrypto>::Pair as Pair>::Signature:
 		TryFrom<Vec<u8>> + std::hash::Hash + sp_runtime::traits::Member + Codec,
 {
-	let client2 = client.clone();
+	let verifier_client = client.clone();
 
 	let aura_verifier = move || {
-		let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client2).unwrap();
-
 		Box::new(cumulus_client_consensus_aura::build_verifier::<
 			<AuraId as AppCrypto>::Pair,
 			_,
 			_,
 			_,
 		>(cumulus_client_consensus_aura::BuildVerifierParams {
-			client: client2.clone(),
-			create_inherent_data_providers: move |_, _| async move {
-				let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
-
-				let slot =
-							sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(
-								*timestamp,
-								slot_duration,
-							);
-
-				Ok((slot, timestamp))
+			client: verifier_client.clone(),
+			create_inherent_data_providers: move |parent_hash, _| {
+				let cidp_client = verifier_client.clone();
+				async move {
+					let slot_duration = cumulus_client_consensus_aura::slot_duration_at(
+						&*cidp_client,
+						parent_hash,
+					)?;
+					let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
+
+					let slot =
+								sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(
+									*timestamp,
+									slot_duration,
+								);
+
+					Ok((slot, timestamp))
+				}
 			},
 			telemetry: telemetry_handle,
 		})) as Box<_>
diff --git a/prdoc/pr_3510.prdoc b/prdoc/pr_3510.prdoc
new file mode 100644
index 0000000000000000000000000000000000000000..6ee2f9a81f750ef0c64a2b8d8197e1e44d7e9f0c
--- /dev/null
+++ b/prdoc/pr_3510.prdoc
@@ -0,0 +1,13 @@
+title: "Fix multi-collator parachain transition to async backing"
+
+doc:
+  - audience: Node Operator
+    description: |
+      The dynamic Aura slot duration, introduced in PR#3211, didn't take the block import pipeline
+      into account. The result was the parachain backed by multiple collators not being able to
+      keep producing blocks after its runtime was upgraded to support async backing, requiring to
+      restart all the collator nodes. This change fixes the issue, introducing the dynamic Aura
+      slot duration into the block import pipeline.
+
+crates:
+  - name: "polkadot-parachain-bin"
diff --git a/substrate/bin/node-template/node/src/service.rs b/substrate/bin/node-template/node/src/service.rs
index 25cd651178411c6338a2b0d1e7836804a3a5b676..125cca1392799aff0a18eef63ca83b1e7418a0d1 100644
--- a/substrate/bin/node-template/node/src/service.rs
+++ b/substrate/bin/node-template/node/src/service.rs
@@ -80,23 +80,29 @@ pub fn new_partial(config: &Configuration) -> Result<Service, ServiceError> {
 		telemetry.as_ref().map(|x| x.handle()),
 	)?;
 
-	let slot_duration = sc_consensus_aura::slot_duration(&*client)?;
-
+	let cidp_client = client.clone();
 	let import_queue =
 		sc_consensus_aura::import_queue::<AuraPair, _, _, _, _, _>(ImportQueueParams {
 			block_import: grandpa_block_import.clone(),
 			justification_import: Some(Box::new(grandpa_block_import.clone())),
 			client: client.clone(),
-			create_inherent_data_providers: move |_, ()| async move {
-				let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
+			create_inherent_data_providers: move |parent_hash, _| {
+				let cidp_client = cidp_client.clone();
+				async move {
+					let slot_duration = sc_consensus_aura::standalone::slot_duration_at(
+						&*cidp_client,
+						parent_hash,
+					)?;
+					let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
 
-				let slot =
-					sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(
-						*timestamp,
-						slot_duration,
-					);
+					let slot =
+						sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration(
+							*timestamp,
+							slot_duration,
+						);
 
-				Ok((slot, timestamp))
+					Ok((slot, timestamp))
+				}
 			},
 			spawner: &task_manager.spawn_essential_handle(),
 			registry: config.prometheus_registry(),