diff --git a/Cargo.lock b/Cargo.lock
index 9eb9d3736a60351cca67750c809c4c5ceb432122..f2379d4ee6de1d5446d3d7cdf55096eccc799cc9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4955,7 +4955,6 @@ dependencies = [
  "pallet-message-queue 31.0.0",
  "parity-scale-codec",
  "polkadot-parachain-primitives 6.0.0",
- "polkadot-runtime-common 7.0.0",
  "polkadot-runtime-parachains 7.0.0",
  "rand",
  "sc-client-api",
@@ -31882,10 +31881,13 @@ name = "xcm-executor-integration-tests"
 version = "1.0.0"
 dependencies = [
  "frame-support 28.0.0",
+ "frame-system 28.0.0",
  "futures",
+ "pallet-sudo 28.0.0",
  "pallet-transaction-payment 28.0.0",
  "pallet-xcm 7.0.0",
  "parity-scale-codec",
+ "polkadot-runtime-parachains 7.0.0",
  "polkadot-test-client",
  "polkadot-test-runtime",
  "polkadot-test-service",
diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml
index 37b56140c289e2a82d8e3e2d1566df420185bbde..49cd086fd3eb517155d291f62a9145dc73283b39 100644
--- a/bridges/bin/runtime-common/Cargo.toml
+++ b/bridges/bin/runtime-common/Cargo.toml
@@ -99,6 +99,7 @@ runtime-benchmarks = [
 	"pallet-utility/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"sp-trie",
+	"xcm/runtime-benchmarks",
 ]
 integrity-test = ["static_assertions"]
 test-helpers = ["bp-runtime/test-helpers", "sp-trie"]
diff --git a/bridges/modules/xcm-bridge-hub-router/Cargo.toml b/bridges/modules/xcm-bridge-hub-router/Cargo.toml
index 55824f6a7fe7bf89a872fbef503a574c02c7f9ae..b0286938f36dac1ddb8871510413ed6dccbcbb2e 100644
--- a/bridges/modules/xcm-bridge-hub-router/Cargo.toml
+++ b/bridges/modules/xcm-bridge-hub-router/Cargo.toml
@@ -56,6 +56,7 @@ runtime-benchmarks = [
 	"frame-system/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/bridges/modules/xcm-bridge-hub/Cargo.toml b/bridges/modules/xcm-bridge-hub/Cargo.toml
index 251dcfb45bcb6be91049208f830201fa7bca00ae..ef49b3396b5c8e7eaad9712d40ddbdcea4d9ef88 100644
--- a/bridges/modules/xcm-bridge-hub/Cargo.toml
+++ b/bridges/modules/xcm-bridge-hub/Cargo.toml
@@ -77,6 +77,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/bridges/snowbridge/pallets/inbound-queue/Cargo.toml b/bridges/snowbridge/pallets/inbound-queue/Cargo.toml
index 3ab633bfcd79678be5105c4a069b7d629437f11e..c0789940a9e816dd1fd32ca6465908c62c17e2cf 100644
--- a/bridges/snowbridge/pallets/inbound-queue/Cargo.toml
+++ b/bridges/snowbridge/pallets/inbound-queue/Cargo.toml
@@ -81,6 +81,7 @@ runtime-benchmarks = [
 	"snowbridge-router-primitives/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/bridges/snowbridge/pallets/system/Cargo.toml b/bridges/snowbridge/pallets/system/Cargo.toml
index f1e749afb9977c440ba7bbfa55c8a8acbc8c0cda..d8e124d73d14ed4ff521c95dade17c342f6b1d6a 100644
--- a/bridges/snowbridge/pallets/system/Cargo.toml
+++ b/bridges/snowbridge/pallets/system/Cargo.toml
@@ -71,6 +71,7 @@ runtime-benchmarks = [
 	"snowbridge-pallet-outbound-queue/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/bridges/snowbridge/primitives/core/Cargo.toml b/bridges/snowbridge/primitives/core/Cargo.toml
index fa37c795b2d1e0871109cb393d6ef546e282cc99..af002a5a965c944ae5622c63839d37281acc9d22 100644
--- a/bridges/snowbridge/primitives/core/Cargo.toml
+++ b/bridges/snowbridge/primitives/core/Cargo.toml
@@ -64,4 +64,5 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/bridges/snowbridge/primitives/router/Cargo.toml b/bridges/snowbridge/primitives/router/Cargo.toml
index ee8d481cec12ae07d107c0463b778345fcfcecee..1f7f489c6b18b6999bee0bafb3e1921a2e8d9d73 100644
--- a/bridges/snowbridge/primitives/router/Cargo.toml
+++ b/bridges/snowbridge/primitives/router/Cargo.toml
@@ -51,4 +51,5 @@ runtime-benchmarks = [
 	"snowbridge-core/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/bridges/snowbridge/runtime/runtime-common/Cargo.toml b/bridges/snowbridge/runtime/runtime-common/Cargo.toml
index d47cb3cb7101fb54d7bdde854ff73e628555e86b..514a4c186696c821b713bd1d10d30171a423516f 100644
--- a/bridges/snowbridge/runtime/runtime-common/Cargo.toml
+++ b/bridges/snowbridge/runtime/runtime-common/Cargo.toml
@@ -43,4 +43,5 @@ runtime-benchmarks = [
 	"snowbridge-core/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/bridges/snowbridge/runtime/test-common/Cargo.toml b/bridges/snowbridge/runtime/test-common/Cargo.toml
index 9f47f158ed4a3ef9cf47928fd02654c049de50b9..cc1ed1288ca0315cf4e8878ff59f5b28dea95198 100644
--- a/bridges/snowbridge/runtime/test-common/Cargo.toml
+++ b/bridges/snowbridge/runtime/test-common/Cargo.toml
@@ -92,5 +92,6 @@ runtime-benchmarks = [
 	"snowbridge-pallet-system/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 fast-runtime = []
diff --git a/cumulus/pallets/dmp-queue/Cargo.toml b/cumulus/pallets/dmp-queue/Cargo.toml
index 936526290d93ecd8935620c8f1f6045faadecb64..ae85a108fe720b108858d43590cfa58540332b67 100644
--- a/cumulus/pallets/dmp-queue/Cargo.toml
+++ b/cumulus/pallets/dmp-queue/Cargo.toml
@@ -56,6 +56,7 @@ runtime-benchmarks = [
 	"frame-support/runtime-benchmarks",
 	"frame-system/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/pallets/parachain-system/Cargo.toml b/cumulus/pallets/parachain-system/Cargo.toml
index 05498a474e424a40c10407f74e30e0b18a97f758..c911f8531da2dd7bb5f7114b0797b32902d96e1d 100644
--- a/cumulus/pallets/parachain-system/Cargo.toml
+++ b/cumulus/pallets/parachain-system/Cargo.toml
@@ -38,7 +38,6 @@ sp-version = { workspace = true }
 # Polkadot
 polkadot-parachain-primitives = { features = ["wasm-api"], workspace = true }
 polkadot-runtime-parachains = { workspace = true }
-polkadot-runtime-common = { optional = true, workspace = true }
 xcm = { workspace = true }
 xcm-builder = { workspace = true }
 
@@ -84,7 +83,6 @@ std = [
 	"log/std",
 	"pallet-message-queue/std",
 	"polkadot-parachain-primitives/std",
-	"polkadot-runtime-common/std",
 	"polkadot-runtime-parachains/std",
 	"scale-info/std",
 	"sp-core/std",
@@ -109,17 +107,16 @@ runtime-benchmarks = [
 	"frame-system/runtime-benchmarks",
 	"pallet-message-queue/runtime-benchmarks",
 	"polkadot-parachain-primitives/runtime-benchmarks",
-	"polkadot-runtime-common/runtime-benchmarks",
 	"polkadot-runtime-parachains/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
 	"frame-support/try-runtime",
 	"frame-system/try-runtime",
 	"pallet-message-queue/try-runtime",
-	"polkadot-runtime-common?/try-runtime",
 	"polkadot-runtime-parachains/try-runtime",
 	"sp-runtime/try-runtime",
 ]
diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs
index 39fc8321a072ea9380e728ce19a94a064921aa82..0fa759357f653dc98948f38d768ea4ddf749ab92 100644
--- a/cumulus/pallets/parachain-system/src/lib.rs
+++ b/cumulus/pallets/parachain-system/src/lib.rs
@@ -1636,7 +1636,7 @@ impl<T: Config> InspectMessageQueues for Pallet<T> {
 }
 
 #[cfg(feature = "runtime-benchmarks")]
-impl<T: Config> polkadot_runtime_common::xcm_sender::EnsureForParachain for Pallet<T> {
+impl<T: Config> polkadot_runtime_parachains::EnsureForParachain for Pallet<T> {
 	fn ensure(para_id: ParaId) {
 		if let ChannelStatus::Closed = Self::get_channel_status(para_id) {
 			Self::open_outbound_hrmp_channel_for_benchmarks_or_tests(para_id)
diff --git a/cumulus/pallets/xcmp-queue/Cargo.toml b/cumulus/pallets/xcmp-queue/Cargo.toml
index af70a3169d8e0331c2d24b8edf3d04c1de58b2cc..432be3027e05543df9b240337232a701d49b9d3c 100644
--- a/cumulus/pallets/xcmp-queue/Cargo.toml
+++ b/cumulus/pallets/xcmp-queue/Cargo.toml
@@ -87,6 +87,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"cumulus-pallet-parachain-system/try-runtime",
diff --git a/cumulus/parachains/common/Cargo.toml b/cumulus/parachains/common/Cargo.toml
index 641693a6a01b1379352c4f535519fad43ec997ad..ae4d7fc1d1156ac2ee8375f6ac0b6ea541ed53d5 100644
--- a/cumulus/parachains/common/Cargo.toml
+++ b/cumulus/parachains/common/Cargo.toml
@@ -92,4 +92,5 @@ runtime-benchmarks = [
 	"polkadot-primitives/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs
index c0d42cf2758e9431c87e4187eb42b9ab703f7f54..9dad323aa19c72a03d2ed5229b114fcb9d7c0d1b 100644
--- a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs
+++ b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs
@@ -370,6 +370,8 @@ macro_rules! impl_send_transact_helpers_for_relay_chain {
 						let destination:  $crate::impls::Location = <Self as RelayChain>::child_location_of(recipient);
 						let xcm = $crate::impls::xcm_transact_unpaid_execution(call, $crate::impls::OriginKind::Superuser);
 
+						$crate::impls::dmp::Pallet::<<Self as $crate::impls::Chain>::Runtime>::make_parachain_reachable(recipient);
+
 						// Send XCM `Transact`
 						$crate::impls::assert_ok!(<Self as [<$chain RelayPallet>]>::XcmPallet::send(
 							root_origin,
diff --git a/cumulus/parachains/integration-tests/emulated/common/src/macros.rs b/cumulus/parachains/integration-tests/emulated/common/src/macros.rs
index b776cafb2545e8e25b7e137fbf448ee35293a66a..cd2b41e5198f8de43b332b4bd404739206ff364b 100644
--- a/cumulus/parachains/integration-tests/emulated/common/src/macros.rs
+++ b/cumulus/parachains/integration-tests/emulated/common/src/macros.rs
@@ -23,6 +23,7 @@ pub use pallet_message_queue;
 pub use pallet_xcm;
 
 // Polkadot
+pub use polkadot_runtime_parachains::dmp::Pallet as Dmp;
 pub use xcm::{
 	prelude::{
 		AccountId32, All, Asset, AssetId, BuyExecution, DepositAsset, ExpectTransactStatus,
@@ -156,6 +157,8 @@ macro_rules! test_relay_is_trusted_teleporter {
 
 					// Send XCM message from Relay
 					<$sender_relay>::execute_with(|| {
+						$crate::macros::Dmp::<<$sender_relay as $crate::macros::Chain>::Runtime>::make_parachain_reachable(<$receiver_para>::para_id());
+
 						assert_ok!(<$sender_relay as [<$sender_relay Pallet>]>::XcmPallet::limited_teleport_assets(
 							origin.clone(),
 							bx!(para_destination.clone().into()),
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/hybrid_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/hybrid_transfers.rs
index baec7d20f4156657134ba8963adc61208c29266f..fb95c361f089188a5bb35e6f7daf9f49c868136b 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/hybrid_transfers.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/hybrid_transfers.rs
@@ -13,6 +13,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+use rococo_system_emulated_network::rococo_emulated_chain::rococo_runtime::Dmp;
+
 use super::reserve_transfer::*;
 use crate::{
 	imports::*,
@@ -777,6 +779,8 @@ fn transfer_native_asset_from_relay_to_para_through_asset_hub() {
 			xcm: xcm_on_final_dest,
 		}]);
 
+		Dmp::make_parachain_reachable(AssetHubRococo::para_id());
+
 		// First leg is a teleport, from there a local-reserve-transfer to final dest
 		<Rococo as RococoPallet>::XcmPallet::transfer_assets_using_type_and_then(
 			t.signed_origin,
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs
index d642e877f00243dab5d4a7ccc11a977a5c816062..407a581afeb97c0ff9b09666d75f793557d32035 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs
@@ -14,6 +14,7 @@
 // limitations under the License.
 
 use crate::imports::*;
+use rococo_system_emulated_network::rococo_emulated_chain::rococo_runtime::Dmp;
 use sp_core::{crypto::get_public_from_string_or_panic, sr25519};
 
 fn relay_to_para_sender_assertions(t: RelayToParaTest) {
@@ -487,6 +488,11 @@ pub fn para_to_para_through_hop_receiver_assertions<Hop: Clone>(t: Test<PenpalA,
 }
 
 fn relay_to_para_reserve_transfer_assets(t: RelayToParaTest) -> DispatchResult {
+	let Junction::Parachain(para_id) = *t.args.dest.chain_location().last().unwrap() else {
+		unimplemented!("Destination is not a parachain?")
+	};
+
+	Dmp::make_parachain_reachable(para_id);
 	<Rococo as RococoPallet>::XcmPallet::limited_reserve_transfer_assets(
 		t.signed_origin,
 		bx!(t.args.dest.into()),
@@ -546,6 +552,13 @@ fn para_to_system_para_reserve_transfer_assets(t: ParaToSystemParaTest) -> Dispa
 fn para_to_para_through_relay_limited_reserve_transfer_assets(
 	t: ParaToParaThroughRelayTest,
 ) -> DispatchResult {
+	let Junction::Parachain(para_id) = *t.args.dest.chain_location().last().unwrap() else {
+		unimplemented!("Destination is not a parachain?")
+	};
+
+	Rococo::ext_wrapper(|| {
+		Dmp::make_parachain_reachable(para_id);
+	});
 	<PenpalA as PenpalAPallet>::PolkadotXcm::limited_reserve_transfer_assets(
 		t.signed_origin,
 		bx!(t.args.dest.into()),
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs
index 69111d38bcac3b8d7278be81170d8158ba0bf4ea..8648c8ce9311d05430468b01510f8f88514d5e08 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/treasury.rs
@@ -29,6 +29,7 @@ use frame_support::{
 use parachains_common::AccountId;
 use polkadot_runtime_common::impls::VersionedLocatableAsset;
 use rococo_runtime_constants::currency::GRAND;
+use rococo_system_emulated_network::rococo_emulated_chain::rococo_runtime::Dmp;
 use xcm_executor::traits::ConvertLocation;
 
 // Fund Treasury account on Asset Hub from Treasury account on Relay Chain with ROCs.
@@ -64,6 +65,7 @@ fn spend_roc_on_asset_hub() {
 			treasury_balance * 2,
 		));
 
+		Dmp::make_parachain_reachable(1000);
 		let native_asset = Location::here();
 		let asset_hub_location: Location = [Parachain(1000)].into();
 		let treasury_location: Location = (Parent, PalletInstance(18)).into();
@@ -199,6 +201,8 @@ fn create_and_claim_treasury_spend_in_usdt() {
 		// create a conversion rate from `asset_kind` to the native currency.
 		assert_ok!(AssetRate::create(root.clone(), Box::new(asset_kind.clone()), 2.into()));
 
+		Dmp::make_parachain_reachable(1000);
+
 		// create and approve a treasury spend.
 		assert_ok!(Treasury::spend(
 			root,
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/hybrid_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/hybrid_transfers.rs
index 0686bd71d085438912e71215b3857fac7a7bda4c..91ebdda16828a6fa6039c73d64dc226da9be1521 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/hybrid_transfers.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/hybrid_transfers.rs
@@ -13,6 +13,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+use westend_system_emulated_network::westend_emulated_chain::westend_runtime::Dmp;
+
 use super::reserve_transfer::*;
 use crate::{
 	imports::*,
@@ -778,6 +780,8 @@ fn transfer_native_asset_from_relay_to_penpal_through_asset_hub() {
 			xcm: xcm_on_final_dest,
 		}]);
 
+		Dmp::make_parachain_reachable(AssetHubWestend::para_id());
+
 		// First leg is a teleport, from there a local-reserve-transfer to final dest
 		<Westend as WestendPallet>::XcmPallet::transfer_assets_using_type_and_then(
 			t.signed_origin,
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs
index 707e8adc8a566df1357c63500bbe230a8aaa9cf4..dc36fed42932c5ed219c87c4f20bc86e111443bd 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs
@@ -15,6 +15,7 @@
 
 use crate::{create_pool_with_wnd_on, foreign_balance_on, imports::*};
 use sp_core::{crypto::get_public_from_string_or_panic, sr25519};
+use westend_system_emulated_network::westend_emulated_chain::westend_runtime::Dmp;
 
 fn relay_to_para_sender_assertions(t: RelayToParaTest) {
 	type RuntimeEvent = <Westend as Chain>::RuntimeEvent;
@@ -487,6 +488,11 @@ pub fn para_to_para_through_hop_receiver_assertions<Hop: Clone>(t: Test<PenpalA,
 }
 
 fn relay_to_para_reserve_transfer_assets(t: RelayToParaTest) -> DispatchResult {
+	let Junction::Parachain(para_id) = *t.args.dest.chain_location().last().unwrap() else {
+		unimplemented!("Destination is not a parachain?")
+	};
+
+	Dmp::make_parachain_reachable(para_id);
 	<Westend as WestendPallet>::XcmPallet::limited_reserve_transfer_assets(
 		t.signed_origin,
 		bx!(t.args.dest.into()),
@@ -533,6 +539,13 @@ fn para_to_system_para_reserve_transfer_assets(t: ParaToSystemParaTest) -> Dispa
 fn para_to_para_through_relay_limited_reserve_transfer_assets(
 	t: ParaToParaThroughRelayTest,
 ) -> DispatchResult {
+	let Junction::Parachain(para_id) = *t.args.dest.chain_location().last().unwrap() else {
+		unimplemented!("Destination is not a parachain?")
+	};
+
+	Westend::ext_wrapper(|| {
+		Dmp::make_parachain_reachable(para_id);
+	});
 	<PenpalA as PenpalAPallet>::PolkadotXcm::limited_reserve_transfer_assets(
 		t.signed_origin,
 		bx!(t.args.dest.into()),
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs
index c303e6411d33b7a4485aa0132855d0237a26eb1b..3b53557fc05c614046c548e8b01a97b971dcd45b 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs
@@ -20,6 +20,7 @@ use emulated_integration_tests_common::{
 };
 use frame_support::traits::fungibles::{Inspect, Mutate};
 use polkadot_runtime_common::impls::VersionedLocatableAsset;
+use westend_system_emulated_network::westend_emulated_chain::westend_runtime::Dmp;
 use xcm_executor::traits::ConvertLocation;
 
 #[test]
@@ -58,6 +59,8 @@ fn create_and_claim_treasury_spend() {
 		// create a conversion rate from `asset_kind` to the native currency.
 		assert_ok!(AssetRate::create(root.clone(), Box::new(asset_kind.clone()), 2.into()));
 
+		Dmp::make_parachain_reachable(1000);
+
 		// create and approve a treasury spend.
 		assert_ok!(Treasury::spend(
 			root,
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs
index 116ec4dc0e55d0931c9288660b78ab019b3f9a27..cfcb581238e6d2415b3b3aedefd0719da8a7a7be 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs
@@ -13,6 +13,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+use rococo_system_emulated_network::rococo_emulated_chain::rococo_runtime::Dmp;
+
 use crate::tests::*;
 
 #[test]
@@ -38,6 +40,8 @@ fn send_xcm_from_rococo_relay_to_westend_asset_hub_should_fail_on_not_applicable
 	// Rococo Global Consensus
 	// Send XCM message from Relay Chain to Bridge Hub source Parachain
 	Rococo::execute_with(|| {
+		Dmp::make_parachain_reachable(BridgeHubRococo::para_id());
+
 		assert_ok!(<Rococo as RococoPallet>::XcmPallet::send(
 			sudo_origin,
 			bx!(destination),
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs
index acce60b4fa76d50962ab5c06362c6666a0bf9ec7..60f8af2242f96c504d1836dbb7c6996ca0cb40f2 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs
@@ -13,6 +13,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+use rococo_westend_system_emulated_network::westend_emulated_chain::westend_runtime::Dmp;
+
 use crate::tests::*;
 
 #[test]
@@ -38,6 +40,8 @@ fn send_xcm_from_westend_relay_to_rococo_asset_hub_should_fail_on_not_applicable
 	// Westend Global Consensus
 	// Send XCM message from Relay Chain to Bridge Hub source Parachain
 	Westend::execute_with(|| {
+		Dmp::make_parachain_reachable(BridgeHubWestend::para_id());
+
 		assert_ok!(<Westend as WestendPallet>::XcmPallet::send(
 			sudo_origin,
 			bx!(destination),
diff --git a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/fellowship_treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/fellowship_treasury.rs
index 8418e3da3bba0731a56c6b9dfbeb378d089adf28..ed7c9bafc607f0f39bad26ff6f939fb5c97ee243 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/fellowship_treasury.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/fellowship_treasury.rs
@@ -20,6 +20,7 @@ use frame_support::{
 };
 use polkadot_runtime_common::impls::VersionedLocatableAsset;
 use westend_runtime_constants::currency::UNITS;
+use westend_system_emulated_network::westend_emulated_chain::westend_runtime::Dmp;
 use xcm_executor::traits::ConvertLocation;
 
 // Fund Fellowship Treasury from Westend Treasury and spend from Fellowship Treasury.
@@ -57,6 +58,8 @@ fn fellowship_treasury_spend() {
 			treasury_balance * 2,
 		));
 
+		Dmp::make_parachain_reachable(1000);
+
 		let native_asset = Location::here();
 		let asset_hub_location: Location = [Parachain(1000)].into();
 		let treasury_location: Location = (Parent, PalletInstance(37)).into();
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/coretime_interface.rs b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/coretime_interface.rs
index 9915b1753ef6d2af0e5d4c49fa7b166ee68c959b..554025e1ecfed070a60bfc44c76b5a06ebc9818e 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/coretime_interface.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/coretime_interface.rs
@@ -17,6 +17,7 @@ use crate::imports::*;
 use frame_support::traits::OnInitialize;
 use pallet_broker::{ConfigRecord, Configuration, CoreAssignment, CoreMask, ScheduleItem};
 use rococo_runtime_constants::system_parachain::coretime::TIMESLICE_PERIOD;
+use rococo_system_emulated_network::rococo_emulated_chain::rococo_runtime::Dmp;
 use sp_runtime::Perbill;
 
 #[test]
@@ -34,6 +35,10 @@ fn transact_hardcoded_weights_are_sane() {
 	type CoretimeEvent = <CoretimeRococo as Chain>::RuntimeEvent;
 	type RelayEvent = <Rococo as Chain>::RuntimeEvent;
 
+	Rococo::execute_with(|| {
+		Dmp::make_parachain_reachable(CoretimeRococo::para_id());
+	});
+
 	// Reserve a workload, configure broker and start sales.
 	CoretimeRococo::execute_with(|| {
 		// Hooks don't run in emulated tests - workaround as we need `on_initialize` to tick things
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/coretime_interface.rs b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/coretime_interface.rs
index 00530f80b958d25f3af36ea17a63059d239831e7..900994b1afc1f62f40b55aad3f7a9c694c2219a9 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/coretime_interface.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/coretime_interface.rs
@@ -18,6 +18,7 @@ use frame_support::traits::OnInitialize;
 use pallet_broker::{ConfigRecord, Configuration, CoreAssignment, CoreMask, ScheduleItem};
 use sp_runtime::Perbill;
 use westend_runtime_constants::system_parachain::coretime::TIMESLICE_PERIOD;
+use westend_system_emulated_network::westend_emulated_chain::westend_runtime::Dmp;
 
 #[test]
 fn transact_hardcoded_weights_are_sane() {
@@ -34,6 +35,10 @@ fn transact_hardcoded_weights_are_sane() {
 	type CoretimeEvent = <CoretimeWestend as Chain>::RuntimeEvent;
 	type RelayEvent = <Westend as Chain>::RuntimeEvent;
 
+	Westend::execute_with(|| {
+		Dmp::make_parachain_reachable(CoretimeWestend::para_id());
+	});
+
 	// Reserve a workload, configure broker and start sales.
 	CoretimeWestend::execute_with(|| {
 		// Hooks don't run in emulated tests - workaround as we need `on_initialize` to tick things
diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/governance.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/governance.rs
index 1ba787aaec52893ab78f29b9db60fcaffd03f6b7..ea438f80552e283cc0f9c1501d2d204e8bb2e709 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/governance.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/governance.rs
@@ -20,7 +20,9 @@ use codec::Encode;
 use frame_support::sp_runtime::traits::Dispatchable;
 use parachains_common::AccountId;
 use people_westend_runtime::people::IdentityInfo;
-use westend_runtime::governance::pallet_custom_origins::Origin::GeneralAdmin as GeneralAdminOrigin;
+use westend_runtime::{
+	governance::pallet_custom_origins::Origin::GeneralAdmin as GeneralAdminOrigin, Dmp,
+};
 use westend_system_emulated_network::people_westend_emulated_chain::people_westend_runtime;
 
 use pallet_identity::Data;
@@ -39,6 +41,8 @@ fn relay_commands_add_registrar() {
 		type PeopleCall = <PeopleWestend as Chain>::RuntimeCall;
 		type PeopleRuntime = <PeopleWestend as Chain>::Runtime;
 
+		Dmp::make_parachain_reachable(1004);
+
 		let add_registrar_call =
 			PeopleCall::Identity(pallet_identity::Call::<PeopleRuntime>::add_registrar {
 				account: registrar.into(),
@@ -102,6 +106,8 @@ fn relay_commands_add_registrar_wrong_origin() {
 			type PeopleCall = <PeopleWestend as Chain>::RuntimeCall;
 			type PeopleRuntime = <PeopleWestend as Chain>::Runtime;
 
+			Dmp::make_parachain_reachable(1004);
+
 			let add_registrar_call =
 				PeopleCall::Identity(pallet_identity::Call::<PeopleRuntime>::add_registrar {
 					account: registrar.into(),
@@ -191,6 +197,8 @@ fn relay_commands_kill_identity() {
 		type RuntimeEvent = <Westend as Chain>::RuntimeEvent;
 		type PeopleRuntime = <PeopleWestend as Chain>::Runtime;
 
+		Dmp::make_parachain_reachable(1004);
+
 		let kill_identity_call =
 			PeopleCall::Identity(pallet_identity::Call::<PeopleRuntime>::kill_identity {
 				target: people_westend_runtime::MultiAddress::Id(PeopleWestend::account_id_of(
@@ -253,6 +261,8 @@ fn relay_commands_kill_identity_wrong_origin() {
 			type RuntimeEvent = <Westend as Chain>::RuntimeEvent;
 			type PeopleRuntime = <PeopleWestend as Chain>::Runtime;
 
+			Dmp::make_parachain_reachable(1004);
+
 			let kill_identity_call =
 				PeopleCall::Identity(pallet_identity::Call::<PeopleRuntime>::kill_identity {
 					target: people_westend_runtime::MultiAddress::Id(PeopleWestend::account_id_of(
@@ -303,6 +313,8 @@ fn relay_commands_add_remove_username_authority() {
 		type PeopleCall = <PeopleWestend as Chain>::RuntimeCall;
 		type PeopleRuntime = <PeopleWestend as Chain>::Runtime;
 
+		Dmp::make_parachain_reachable(1004);
+
 		let add_username_authority =
 			PeopleCall::Identity(pallet_identity::Call::<PeopleRuntime>::add_username_authority {
 				authority: people_westend_runtime::MultiAddress::Id(people_westend_alice.clone()),
@@ -392,6 +404,8 @@ fn relay_commands_add_remove_username_authority() {
 		type PeopleCall = <PeopleWestend as Chain>::RuntimeCall;
 		type PeopleRuntime = <PeopleWestend as Chain>::Runtime;
 
+		Dmp::make_parachain_reachable(1004);
+
 		let remove_username_authority = PeopleCall::Identity(pallet_identity::Call::<
 			PeopleRuntime,
 		>::remove_username_authority {
@@ -455,6 +469,8 @@ fn relay_commands_add_remove_username_authority_wrong_origin() {
 			type PeopleCall = <PeopleWestend as Chain>::RuntimeCall;
 			type PeopleRuntime = <PeopleWestend as Chain>::Runtime;
 
+			Dmp::make_parachain_reachable(1004);
+
 			let add_username_authority = PeopleCall::Identity(pallet_identity::Call::<
 				PeopleRuntime,
 			>::add_username_authority {
@@ -503,6 +519,8 @@ fn relay_commands_add_remove_username_authority_wrong_origin() {
 				suffix: b"suffix1".into(),
 			});
 
+			Dmp::make_parachain_reachable(1004);
+
 			let remove_authority_xcm_msg =
 				RuntimeCall::XcmPallet(pallet_xcm::Call::<Runtime>::send {
 					dest: bx!(VersionedLocation::from(Location::new(0, [Parachain(1004)]))),
diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml
index 949640dd4be6fd28ef6cd90d50993a2fcb67a878..81ebc7e09494018f220d5076ed3a493db3f0a211 100644
--- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml
+++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml
@@ -146,6 +146,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"cumulus-pallet-aura-ext/try-runtime",
diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml
index 8e47146a06c30c167c8ed9d61da415d04413e1c4..7dd2a4ab4b51fab380cd76a5966a80d782832915 100644
--- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml
+++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml
@@ -150,6 +150,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"cumulus-pallet-aura-ext/try-runtime",
diff --git a/cumulus/parachains/runtimes/assets/common/Cargo.toml b/cumulus/parachains/runtimes/assets/common/Cargo.toml
index fa9efbca7a3980bd4f746c1741a15d2be54482e2..552afa4daa68636cb5a3740d83b9c4bcc114ef08 100644
--- a/cumulus/parachains/runtimes/assets/common/Cargo.toml
+++ b/cumulus/parachains/runtimes/assets/common/Cargo.toml
@@ -66,4 +66,5 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml
index c0d6db5ad500782d2bd0b2867e496c52aa468456..ff50223ef575b8c4220c14cd4a8a7b704bcb737e 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml
@@ -266,6 +266,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml
index f429a28a2e52b6b778780feb023bcf05aedbd914..efdd0abbb8ee4f4ef8c19f4a67987d5309cee4f4 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml
+++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml
@@ -263,6 +263,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml
index 76a89bcb2e7285ffa1f3163d9e0ad85bbbb28d86..9eacb27639a3ba6b3734894eb830fbe0d44bd4d3 100644
--- a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml
+++ b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml
@@ -41,4 +41,5 @@ runtime-benchmarks = [
 	"pallet-message-queue/runtime-benchmarks",
 	"snowbridge-core/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml
index dc4b73db69e3012400ab679fb490b089e484d014..2e35fe761c0438d8c42dae77806cddff9ae0e8bb 100644
--- a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml
+++ b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml
@@ -138,6 +138,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"cumulus-pallet-aura-ext/try-runtime",
diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml
index 1aeff5eb2e48d9521676675cf79e92a4245092ca..260c748819ae35710810a4133dd72aa40d0a9f14 100644
--- a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml
+++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml
@@ -173,6 +173,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml
index ab621134b252906d03638fd0f2d9865b5e11a7ac..aa692c3c7e744da96f4e5c1a4262aadf94d16162 100644
--- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml
+++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml
@@ -180,6 +180,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml
index 44dfbf93c30e9c6aa40b80a6f87c3b8d6a4dce55..226e1c817bb8ef7058fb502b2bd35332966ee2f8 100644
--- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml
+++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml
@@ -177,6 +177,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml
index 9bbdb8d2ee089abb0adc4ea976614b45754781a2..f2922b710e246f3151637529ed142e72b724bfa2 100644
--- a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml
+++ b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml
@@ -77,6 +77,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 std = [
 	"codec/std",
diff --git a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml
index 893133bf3c1ad59e15736e3c1a0ff9629e8cc8dd..4984f6314f872d84dcb712aca278dbba0937ad78 100644
--- a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml
+++ b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml
@@ -176,6 +176,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml
index 66b324b51af4a6d453bc926dc5a876d328218277..7822df585a58356a160c693ea9abb1b171ebe70a 100644
--- a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml
+++ b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml
@@ -176,6 +176,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml
index 3a6b9d42f211bbca9895454c16483dff2d9042b8..3bd1e5c6f4367f12f6c854da59d039cb10254914 100644
--- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml
+++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml
@@ -175,6 +175,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 try-runtime = [
diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml
index 4713f4398eaa6286308fee921f4fc031c1604fe0..035d0ac94be6adf6715e8e872996967dc9d71536 100644
--- a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml
+++ b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml
@@ -136,6 +136,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 # A feature that should be enabled when the runtime should be built for on-chain
diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml
index f5ce040bb530eed036c67c00cc8956f3170915de..3bfb79610448e209f11773fd7c1641b8ace2a098 100644
--- a/cumulus/polkadot-parachain/Cargo.toml
+++ b/cumulus/polkadot-parachain/Cargo.toml
@@ -78,6 +78,7 @@ runtime-benchmarks = [
 	"people-rococo-runtime/runtime-benchmarks",
 	"people-westend-runtime/runtime-benchmarks",
 	"rococo-parachain-runtime/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"polkadot-omni-node-lib/try-runtime",
diff --git a/cumulus/primitives/core/Cargo.toml b/cumulus/primitives/core/Cargo.toml
index b5bfe4fbc889aa981ae539392b89def0a5246023..307860897aec124d7585d5f49ad1241a12cac2a2 100644
--- a/cumulus/primitives/core/Cargo.toml
+++ b/cumulus/primitives/core/Cargo.toml
@@ -43,4 +43,5 @@ runtime-benchmarks = [
 	"polkadot-parachain-primitives/runtime-benchmarks",
 	"polkadot-primitives/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/cumulus/primitives/utility/Cargo.toml b/cumulus/primitives/utility/Cargo.toml
index 1444571edbe0fce45656e7ee0abeb42132a27099..f26e34a2950963fabe2a102f8da34572cf73b8f6 100644
--- a/cumulus/primitives/utility/Cargo.toml
+++ b/cumulus/primitives/utility/Cargo.toml
@@ -52,4 +52,5 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml
index 7f58a56d5d16f5f15e70b6430330010bcf0106b4..c1e06dd830b5686ca7b5baf0a48845f9934346be 100644
--- a/polkadot/node/service/Cargo.toml
+++ b/polkadot/node/service/Cargo.toml
@@ -210,6 +210,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"westend-runtime?/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-system/try-runtime",
diff --git a/polkadot/parachain/src/primitives.rs b/polkadot/parachain/src/primitives.rs
index c5757928c3fc2f86fdd6ddb779856f0f39db70f7..1f2f9e2e9cdc7068a623db6469c935833dbedab0 100644
--- a/polkadot/parachain/src/primitives.rs
+++ b/polkadot/parachain/src/primitives.rs
@@ -57,6 +57,8 @@ impl HeadData {
 	}
 }
 
+impl codec::EncodeLike<HeadData> for alloc::vec::Vec<u8> {}
+
 /// Parachain validation code.
 #[derive(
 	PartialEq,
@@ -154,6 +156,9 @@ pub struct BlockData(#[cfg_attr(feature = "std", serde(with = "bytes"))] pub Vec
 #[cfg_attr(feature = "std", derive(derive_more::Display))]
 pub struct Id(u32);
 
+impl codec::EncodeLike<u32> for Id {}
+impl codec::EncodeLike<Id> for u32 {}
+
 impl TypeId for Id {
 	const TYPE_ID: [u8; 4] = *b"para";
 }
diff --git a/polkadot/runtime/common/Cargo.toml b/polkadot/runtime/common/Cargo.toml
index 1646db54455a5640b18eeff32b686ebc8ef69ead..4b307b56bcbe1a288b099b2f925e071f7c201fe0 100644
--- a/polkadot/runtime/common/Cargo.toml
+++ b/polkadot/runtime/common/Cargo.toml
@@ -142,6 +142,7 @@ runtime-benchmarks = [
 	"sp-staking/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-election-provider-support/try-runtime",
diff --git a/polkadot/runtime/common/src/identity_migrator.rs b/polkadot/runtime/common/src/identity_migrator.rs
index 126c886280e6ed713d81c93f5afedbb69b03a1b5..e3835b692526e5cac1a8a541f91a85675e4fa5f1 100644
--- a/polkadot/runtime/common/src/identity_migrator.rs
+++ b/polkadot/runtime/common/src/identity_migrator.rs
@@ -160,12 +160,22 @@ pub trait OnReapIdentity<AccountId> {
 	/// - `bytes`: The byte size of `IdentityInfo`.
 	/// - `subs`: The number of sub-accounts they had.
 	fn on_reap_identity(who: &AccountId, bytes: u32, subs: u32) -> DispatchResult;
+
+	/// Ensure that identity reaping will be succesful in benchmarking.
+	///
+	/// Should setup the state in a way that the same call ot `[Self::on_reap_identity]` will be
+	/// successful.
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_identity_reaping(who: &AccountId, bytes: u32, subs: u32);
 }
 
 impl<AccountId> OnReapIdentity<AccountId> for () {
 	fn on_reap_identity(_who: &AccountId, _bytes: u32, _subs: u32) -> DispatchResult {
 		Ok(())
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_identity_reaping(_: &AccountId, _: u32, _: u32) {}
 }
 
 #[cfg(feature = "runtime-benchmarks")]
@@ -219,6 +229,12 @@ mod benchmarks {
 		}
 		Identity::<T>::set_subs(target_origin.clone(), subs.clone())?;
 
+		T::ReapIdentityHandler::ensure_successful_identity_reaping(
+			&target,
+			info.encoded_size() as u32,
+			subs.len() as u32,
+		);
+
 		// add registrars and provide judgements
 		let registrar_origin = T::RegistrarOrigin::try_successful_origin()
 			.expect("RegistrarOrigin has no successful origin required for the benchmark");
diff --git a/polkadot/runtime/common/src/paras_sudo_wrapper.rs b/polkadot/runtime/common/src/paras_sudo_wrapper.rs
index a93c209e927995ea34f26c6f90ba0d2cd798ce40..bd5984b3b63eee0f5cdf1dc92ccc2cb06a00a658 100644
--- a/polkadot/runtime/common/src/paras_sudo_wrapper.rs
+++ b/polkadot/runtime/common/src/paras_sudo_wrapper.rs
@@ -48,6 +48,8 @@ pub mod pallet {
 		/// A DMP message couldn't be sent because it exceeds the maximum size allowed for a
 		/// downward message.
 		ExceedsMaxMessageSize,
+		/// A DMP message couldn't be sent because the destination is unreachable.
+		Unroutable,
 		/// Could not schedule para cleanup.
 		CouldntCleanup,
 		/// Not a parathread (on-demand parachain).
@@ -157,6 +159,7 @@ pub mod pallet {
 			{
 				dmp::QueueDownwardMessageError::ExceedsMaxMessageSize =>
 					Error::<T>::ExceedsMaxMessageSize.into(),
+				dmp::QueueDownwardMessageError::Unroutable => Error::<T>::Unroutable.into(),
 			})
 		}
 
diff --git a/polkadot/runtime/common/src/xcm_sender.rs b/polkadot/runtime/common/src/xcm_sender.rs
index 7ff7f69faf148e9dde971f62d33c7e7a74609bf7..32ea4fdd2f27090acc1ca7ccf890d5c6fdcb3624 100644
--- a/polkadot/runtime/common/src/xcm_sender.rs
+++ b/polkadot/runtime/common/src/xcm_sender.rs
@@ -138,6 +138,13 @@ where
 			.map(|()| hash)
 			.map_err(|_| SendError::Transport(&"Error placing into DMP queue"))
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(location: Option<Location>) {
+		if let Some((0, [Parachain(id)])) = location.as_ref().map(|l| l.unpack()) {
+			dmp::Pallet::<T>::make_parachain_reachable(*id);
+		}
+	}
 }
 
 impl<T: dmp::Config, W, P> InspectMessageQueues for ChildParachainRouter<T, W, P> {
@@ -190,7 +197,7 @@ impl<
 		ExistentialDeposit: Get<Option<Asset>>,
 		PriceForDelivery: PriceForMessageDelivery<Id = ParaId>,
 		Parachain: Get<ParaId>,
-		ToParachainHelper: EnsureForParachain,
+		ToParachainHelper: polkadot_runtime_parachains::EnsureForParachain,
 	> xcm_builder::EnsureDelivery
 	for ToParachainDeliveryHelper<
 		XcmConfig,
@@ -219,6 +226,9 @@ impl<
 			return (None, None)
 		}
 
+		// allow more initialization for target parachain
+		ToParachainHelper::ensure(Parachain::get());
+
 		let mut fees_mode = None;
 		if !XcmConfig::FeeManager::is_waived(Some(origin_ref), fee_reason) {
 			// if not waived, we need to set up accounts for paying and receiving fees
@@ -238,9 +248,6 @@ impl<
 				XcmConfig::AssetTransactor::deposit_asset(&fee, &origin_ref, None).unwrap();
 			}
 
-			// allow more initialization for target parachain
-			ToParachainHelper::ensure(Parachain::get());
-
 			// expected worst case - direct withdraw
 			fees_mode = Some(FeesMode { jit_withdraw: true });
 		}
@@ -248,18 +255,6 @@ impl<
 	}
 }
 
-/// Ensure more initialization for `ParaId`. (e.g. open HRMP channels, ...)
-#[cfg(feature = "runtime-benchmarks")]
-pub trait EnsureForParachain {
-	fn ensure(para_id: ParaId);
-}
-#[cfg(feature = "runtime-benchmarks")]
-impl EnsureForParachain for () {
-	fn ensure(_: ParaId) {
-		// doing nothing
-	}
-}
-
 #[cfg(test)]
 mod tests {
 	use super::*;
@@ -349,6 +344,8 @@ mod tests {
 				c.max_downward_message_size = u32::MAX;
 			});
 
+			dmp::Pallet::<crate::integration_tests::Test>::make_parachain_reachable(5555);
+
 			// Check that the good message is validated:
 			assert_ok!(<Router as SendXcm>::validate(
 				&mut Some(dest.into()),
diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml
index b01778eeb424051fd47344a6d97938057c5947e5..b583e9c6cc50e46876ce31b92d896aed3b716c2d 100644
--- a/polkadot/runtime/parachains/Cargo.toml
+++ b/polkadot/runtime/parachains/Cargo.toml
@@ -140,6 +140,7 @@ runtime-benchmarks = [
 	"sp-std",
 	"static_assertions",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support-test/try-runtime",
diff --git a/polkadot/runtime/parachains/src/coretime/benchmarking.rs b/polkadot/runtime/parachains/src/coretime/benchmarking.rs
index 6d593f1954ff1500fd59ae5d178e038dd38e01b5..49e3d8a88c0158f09aa3a4d8e98a969ca907be44 100644
--- a/polkadot/runtime/parachains/src/coretime/benchmarking.rs
+++ b/polkadot/runtime/parachains/src/coretime/benchmarking.rs
@@ -43,6 +43,8 @@ mod benchmarks {
 			.unwrap();
 		on_demand::Revenue::<T>::put(rev);
 
+		crate::paras::Heads::<T>::insert(ParaId::from(T::BrokerId::get()), vec![1, 2, 3]);
+
 		<T as on_demand::Config>::Currency::make_free_balance_be(
 			&<on_demand::Pallet<T>>::account_id(),
 			minimum_balance * (mhr * (mhr + 1)).into(),
diff --git a/polkadot/runtime/parachains/src/dmp.rs b/polkadot/runtime/parachains/src/dmp.rs
index 03580e11b8e9cbe7dce4c9e375741ec3677bd9fe..3c9cf8004186527bc999f1eccc71325b81bf5af1 100644
--- a/polkadot/runtime/parachains/src/dmp.rs
+++ b/polkadot/runtime/parachains/src/dmp.rs
@@ -44,7 +44,7 @@
 
 use crate::{
 	configuration::{self, HostConfiguration},
-	initializer, FeeTracker,
+	initializer, paras, FeeTracker,
 };
 use alloc::vec::Vec;
 use core::fmt;
@@ -72,12 +72,15 @@ const MESSAGE_SIZE_FEE_BASE: FixedU128 = FixedU128::from_rational(1, 1000); // 0
 pub enum QueueDownwardMessageError {
 	/// The message being sent exceeds the configured max message size.
 	ExceedsMaxMessageSize,
+	/// The destination is unknown.
+	Unroutable,
 }
 
 impl From<QueueDownwardMessageError> for SendError {
 	fn from(err: QueueDownwardMessageError) -> Self {
 		match err {
 			QueueDownwardMessageError::ExceedsMaxMessageSize => SendError::ExceedsMaxMessageSize,
+			QueueDownwardMessageError::Unroutable => SendError::Unroutable,
 		}
 	}
 }
@@ -116,7 +119,7 @@ pub mod pallet {
 	pub struct Pallet<T>(_);
 
 	#[pallet::config]
-	pub trait Config: frame_system::Config + configuration::Config {}
+	pub trait Config: frame_system::Config + configuration::Config + paras::Config {}
 
 	/// The downward messages addressed for a certain para.
 	#[pallet::storage]
@@ -200,6 +203,11 @@ impl<T: Config> Pallet<T> {
 			return Err(QueueDownwardMessageError::ExceedsMaxMessageSize)
 		}
 
+		// If the head exists, we assume the parachain is legit and exists.
+		if !paras::Heads::<T>::contains_key(para) {
+			return Err(QueueDownwardMessageError::Unroutable)
+		}
+
 		Ok(())
 	}
 
@@ -217,14 +225,7 @@ impl<T: Config> Pallet<T> {
 		msg: DownwardMessage,
 	) -> Result<(), QueueDownwardMessageError> {
 		let serialized_len = msg.len() as u32;
-		if serialized_len > config.max_downward_message_size {
-			return Err(QueueDownwardMessageError::ExceedsMaxMessageSize)
-		}
-
-		// Hard limit on Queue size
-		if Self::dmq_length(para) > Self::dmq_max_length(config.max_downward_message_size) {
-			return Err(QueueDownwardMessageError::ExceedsMaxMessageSize)
-		}
+		Self::can_queue_downward_message(config, &para, &msg)?;
 
 		let inbound =
 			InboundDownwardMessage { msg, sent_at: frame_system::Pallet::<T>::block_number() };
@@ -336,6 +337,15 @@ impl<T: Config> Pallet<T> {
 	) -> Vec<InboundDownwardMessage<BlockNumberFor<T>>> {
 		DownwardMessageQueues::<T>::get(&recipient)
 	}
+
+	/// Make the parachain reachable for downward messages.
+	///
+	/// Only useable in benchmarks or tests.
+	#[cfg(any(feature = "runtime-benchmarks", feature = "std"))]
+	pub fn make_parachain_reachable(para: impl Into<ParaId>) {
+		let para = para.into();
+		crate::paras::Heads::<T>::insert(para, para.encode());
+	}
 }
 
 impl<T: Config> FeeTracker for Pallet<T> {
@@ -359,3 +369,10 @@ impl<T: Config> FeeTracker for Pallet<T> {
 		})
 	}
 }
+
+#[cfg(feature = "runtime-benchmarks")]
+impl<T: Config> crate::EnsureForParachain for Pallet<T> {
+	fn ensure(para: ParaId) {
+		Self::make_parachain_reachable(para);
+	}
+}
diff --git a/polkadot/runtime/parachains/src/dmp/tests.rs b/polkadot/runtime/parachains/src/dmp/tests.rs
index de15159581252aa29775addda7797d84abc4d115..617c9488bd2a22c713f188ff89993253374848f4 100644
--- a/polkadot/runtime/parachains/src/dmp/tests.rs
+++ b/polkadot/runtime/parachains/src/dmp/tests.rs
@@ -61,6 +61,12 @@ fn queue_downward_message(
 	Dmp::queue_downward_message(&configuration::ActiveConfig::<Test>::get(), para_id, msg)
 }
 
+fn register_paras(paras: &[ParaId]) {
+	paras.iter().for_each(|p| {
+		Dmp::make_parachain_reachable(*p);
+	});
+}
+
 #[test]
 fn clean_dmp_works() {
 	let a = ParaId::from(1312);
@@ -68,6 +74,8 @@ fn clean_dmp_works() {
 	let c = ParaId::from(123);
 
 	new_test_ext(default_genesis_config()).execute_with(|| {
+		register_paras(&[a, b, c]);
+
 		// enqueue downward messages to A, B and C.
 		queue_downward_message(a, vec![1, 2, 3]).unwrap();
 		queue_downward_message(b, vec![4, 5, 6]).unwrap();
@@ -89,6 +97,8 @@ fn dmq_length_and_head_updated_properly() {
 	let b = ParaId::from(228);
 
 	new_test_ext(default_genesis_config()).execute_with(|| {
+		register_paras(&[a, b]);
+
 		assert_eq!(Dmp::dmq_length(a), 0);
 		assert_eq!(Dmp::dmq_length(b), 0);
 
@@ -101,11 +111,30 @@ fn dmq_length_and_head_updated_properly() {
 	});
 }
 
+#[test]
+fn dmq_fail_if_para_does_not_exist() {
+	let a = ParaId::from(1312);
+
+	new_test_ext(default_genesis_config()).execute_with(|| {
+		assert_eq!(Dmp::dmq_length(a), 0);
+
+		assert!(matches!(
+			queue_downward_message(a, vec![1, 2, 3]),
+			Err(QueueDownwardMessageError::Unroutable)
+		));
+
+		assert_eq!(Dmp::dmq_length(a), 0);
+		assert!(Dmp::dmq_mqc_head(a).is_zero());
+	});
+}
+
 #[test]
 fn dmp_mqc_head_fixture() {
 	let a = ParaId::from(2000);
 
 	new_test_ext(default_genesis_config()).execute_with(|| {
+		register_paras(&[a]);
+
 		run_to_block(2, None);
 		assert!(Dmp::dmq_mqc_head(a).is_zero());
 		queue_downward_message(a, vec![1, 2, 3]).unwrap();
@@ -125,6 +154,8 @@ fn check_processed_downward_messages() {
 	let a = ParaId::from(1312);
 
 	new_test_ext(default_genesis_config()).execute_with(|| {
+		register_paras(&[a]);
+
 		let block_number = System::block_number();
 
 		// processed_downward_messages=0 is allowed when the DMQ is empty.
@@ -150,6 +181,8 @@ fn check_processed_downward_messages_advancement_rule() {
 	let a = ParaId::from(1312);
 
 	new_test_ext(default_genesis_config()).execute_with(|| {
+		register_paras(&[a]);
+
 		let block_number = System::block_number();
 
 		run_to_block(block_number + 1, None);
@@ -170,6 +203,8 @@ fn dmq_pruning() {
 	let a = ParaId::from(1312);
 
 	new_test_ext(default_genesis_config()).execute_with(|| {
+		register_paras(&[a]);
+
 		assert_eq!(Dmp::dmq_length(a), 0);
 
 		queue_downward_message(a, vec![1, 2, 3]).unwrap();
@@ -194,6 +229,8 @@ fn queue_downward_message_critical() {
 	genesis.configuration.config.max_downward_message_size = 7;
 
 	new_test_ext(genesis).execute_with(|| {
+		register_paras(&[a]);
+
 		let smol = [0; 3].to_vec();
 		let big = [0; 8].to_vec();
 
@@ -215,6 +252,8 @@ fn verify_dmq_mqc_head_is_externally_accessible() {
 	let a = ParaId::from(2020);
 
 	new_test_ext(default_genesis_config()).execute_with(|| {
+		register_paras(&[a]);
+
 		let head = sp_io::storage::get(&well_known_keys::dmq_mqc_head(a));
 		assert_eq!(head, None);
 
@@ -235,9 +274,12 @@ fn verify_dmq_mqc_head_is_externally_accessible() {
 #[test]
 fn verify_fee_increase_and_decrease() {
 	let a = ParaId::from(123);
+
 	let mut genesis = default_genesis_config();
 	genesis.configuration.config.max_downward_message_size = 16777216;
 	new_test_ext(genesis).execute_with(|| {
+		register_paras(&[a]);
+
 		let initial = InitialFactor::get();
 		assert_eq!(DeliveryFeeFactor::<Test>::get(a), initial);
 
@@ -287,6 +329,8 @@ fn verify_fee_factor_reaches_high_value() {
 	let mut genesis = default_genesis_config();
 	genesis.configuration.config.max_downward_message_size = 51200;
 	new_test_ext(genesis).execute_with(|| {
+		register_paras(&[a]);
+
 		let max_messages =
 			Dmp::dmq_max_length(ActiveConfig::<Test>::get().max_downward_message_size);
 		let mut total_fee_factor = FixedU128::from_float(1.0);
diff --git a/polkadot/runtime/parachains/src/lib.rs b/polkadot/runtime/parachains/src/lib.rs
index 828c0b9bcef21410d15107191c1255d4439a1bc5..b1ff5419470e18c16546397fb2ebbc2d5440f309 100644
--- a/polkadot/runtime/parachains/src/lib.rs
+++ b/polkadot/runtime/parachains/src/lib.rs
@@ -114,3 +114,19 @@ pub fn schedule_code_upgrade<T: paras::Config>(
 pub fn set_current_head<T: paras::Config>(id: ParaId, new_head: HeadData) {
 	paras::Pallet::<T>::set_current_head(id, new_head)
 }
+
+/// Ensure more initialization for `ParaId` when benchmarking. (e.g. open HRMP channels, ...)
+#[cfg(feature = "runtime-benchmarks")]
+pub trait EnsureForParachain {
+	fn ensure(para_id: ParaId);
+}
+
+#[cfg(feature = "runtime-benchmarks")]
+#[impl_trait_for_tuples::impl_for_tuples(30)]
+impl EnsureForParachain for Tuple {
+	fn ensure(para: ParaId) {
+		for_tuples!( #(
+			Tuple::ensure(para);
+		)* );
+	}
+}
diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml
index 764c53abbfcb9802009a82fd35d113aa85230712..1fd32c5d0c3221410b7bcfd06d8d38ecf972c075 100644
--- a/polkadot/runtime/rococo/Cargo.toml
+++ b/polkadot/runtime/rococo/Cargo.toml
@@ -277,6 +277,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-executive/try-runtime",
diff --git a/polkadot/runtime/rococo/src/impls.rs b/polkadot/runtime/rococo/src/impls.rs
index 7d7e9fa9f06c5f0ee3df502ca8cf0c4feee90c28..a5cb2eddfa0d7d23c649cab899680d0d9fb15339 100644
--- a/polkadot/runtime/rococo/src/impls.rs
+++ b/polkadot/runtime/rococo/src/impls.rs
@@ -176,4 +176,9 @@ where
 		)?;
 		Ok(())
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_identity_reaping(_: &AccountId, _: u32, _: u32) {
+		crate::Dmp::make_parachain_reachable(1004);
+	}
 }
diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs
index c832ace91c078606f5c0017d42393fefb42e2260..3304f89fc0cc273a7f3c346d7e06009addb6f408 100644
--- a/polkadot/runtime/rococo/src/lib.rs
+++ b/polkadot/runtime/rococo/src/lib.rs
@@ -2471,14 +2471,14 @@ sp_api::impl_runtime_apis! {
 						ExistentialDepositAsset,
 						xcm_config::PriceForChildParachainDelivery,
 						AssetHubParaId,
-						(),
+						Dmp,
 					>,
 					polkadot_runtime_common::xcm_sender::ToParachainDeliveryHelper<
 						XcmConfig,
 						ExistentialDepositAsset,
 						xcm_config::PriceForChildParachainDelivery,
 						RandomParaId,
-						(),
+						Dmp,
 					>
 				);
 
@@ -2537,7 +2537,7 @@ sp_api::impl_runtime_apis! {
 					ExistentialDepositAsset,
 					xcm_config::PriceForChildParachainDelivery,
 					AssetHubParaId,
-					(),
+					Dmp,
 				>;
 				fn valid_destination() -> Result<Location, BenchmarkError> {
 					Ok(AssetHub::get())
diff --git a/polkadot/runtime/test-runtime/Cargo.toml b/polkadot/runtime/test-runtime/Cargo.toml
index 90a0285cd17bc82f6de361c1a5cf208219919fb1..8b33bf9cebc6893cf798d99c7788f9da36c85870 100644
--- a/polkadot/runtime/test-runtime/Cargo.toml
+++ b/polkadot/runtime/test-runtime/Cargo.toml
@@ -154,4 +154,5 @@ runtime-benchmarks = [
 	"sp-staking/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml
index 584f5855b7a4fa81e04f972211ab057639392b20..13e39b5aa3171527bf33908208d7f5403d6ba912 100644
--- a/polkadot/runtime/westend/Cargo.toml
+++ b/polkadot/runtime/westend/Cargo.toml
@@ -298,6 +298,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-election-provider-support/try-runtime",
diff --git a/polkadot/runtime/westend/src/impls.rs b/polkadot/runtime/westend/src/impls.rs
index 8cb597cbaa95e4cce65ff3fe8a16a84dff153384..0e0d345a0ed44a35f6490f1586ef6e6721df0aa6 100644
--- a/polkadot/runtime/westend/src/impls.rs
+++ b/polkadot/runtime/westend/src/impls.rs
@@ -176,4 +176,9 @@ where
 		)?;
 		Ok(())
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_identity_reaping(_: &AccountId, _: u32, _: u32) {
+		crate::Dmp::make_parachain_reachable(1004);
+	}
 }
diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs
index c540b3773286d54352fe81fed179746ad31360a4..f9ef74fee29cac872aeaac5d319d55c2aa5bda43 100644
--- a/polkadot/runtime/westend/src/lib.rs
+++ b/polkadot/runtime/westend/src/lib.rs
@@ -2639,14 +2639,14 @@ sp_api::impl_runtime_apis! {
 						ExistentialDepositAsset,
 						xcm_config::PriceForChildParachainDelivery,
 						AssetHubParaId,
-						(),
+						Dmp,
 					>,
 					polkadot_runtime_common::xcm_sender::ToParachainDeliveryHelper<
 						xcm_config::XcmConfig,
 						ExistentialDepositAsset,
 						xcm_config::PriceForChildParachainDelivery,
 						RandomParaId,
-						(),
+						Dmp,
 					>
 				);
 
@@ -2712,7 +2712,7 @@ sp_api::impl_runtime_apis! {
 					ExistentialDepositAsset,
 					xcm_config::PriceForChildParachainDelivery,
 					AssetHubParaId,
-					(),
+					Dmp,
 				>;
 				fn valid_destination() -> Result<Location, BenchmarkError> {
 					Ok(AssetHub::get())
diff --git a/polkadot/xcm/Cargo.toml b/polkadot/xcm/Cargo.toml
index 113e72c27ae16bf0733db08e405b15a48546007a..7ac12dc1e377caf278e80011a927083134c114cd 100644
--- a/polkadot/xcm/Cargo.toml
+++ b/polkadot/xcm/Cargo.toml
@@ -51,3 +51,7 @@ json-schema = [
 	"dep:schemars",
 	"sp-weights/json-schema",
 ]
+runtime-benchmarks = [
+	"frame-support/runtime-benchmarks",
+	"sp-runtime/runtime-benchmarks",
+]
diff --git a/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml b/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml
index fe2b781632238fb1c31d74dbdaeb2ab35e24837a..d4131cc53ee66cb0f69475bf03078f0aa4ed631b 100644
--- a/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml
+++ b/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml
@@ -64,4 +64,5 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs
index 303ff9493f71b6a6411427146d93774209850e5c..4428076aa07715083bf62876d5c899d07228d249 100644
--- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs
+++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs
@@ -231,6 +231,13 @@ benchmarks_instance_pallet! {
 		let dest_account = T::AccountIdConverter::convert_location(&dest_location).unwrap();
 		assert!(T::TransactAsset::balance(&dest_account).is_zero());
 
+		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
+		let (_, _) = T::DeliveryHelper::ensure_successful_delivery(
+			&Default::default(),
+			&dest_location,
+			FeeReason::ChargeFees,
+		);
+
 		let mut executor = new_executor::<T>(Default::default());
 		executor.set_holding(holding.into());
 		let instruction = Instruction::<XcmCallOf<T>>::DepositAsset {
@@ -257,6 +264,13 @@ benchmarks_instance_pallet! {
 		let dest_account = T::AccountIdConverter::convert_location(&dest_location).unwrap();
 		assert!(T::TransactAsset::balance(&dest_account).is_zero());
 
+		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
+		let (_, _) = T::DeliveryHelper::ensure_successful_delivery(
+			&Default::default(),
+			&dest_location,
+			FeeReason::ChargeFees,
+		);
+
 		let mut executor = new_executor::<T>(Default::default());
 		executor.set_holding(holding.into());
 		let instruction = Instruction::<XcmCallOf<T>>::DepositReserveAsset {
@@ -281,12 +295,20 @@ benchmarks_instance_pallet! {
 
 		// Checked account starts at zero
 		assert!(T::CheckedAccount::get().map_or(true, |(c, _)| T::TransactAsset::balance(&c).is_zero()));
+		let dest_location =  T::valid_destination()?;
+
+		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
+		let (_, _) = T::DeliveryHelper::ensure_successful_delivery(
+			&Default::default(),
+			&dest_location,
+			FeeReason::ChargeFees,
+		);
 
 		let mut executor = new_executor::<T>(Default::default());
 		executor.set_holding(holding.into());
 		let instruction = Instruction::<XcmCallOf<T>>::InitiateTeleport {
 			assets: asset.into(),
-			dest: T::valid_destination()?,
+			dest: dest_location,
 			xcm: Xcm::new(),
 		};
 		let xcm = Xcm(vec![instruction]);
@@ -303,6 +325,15 @@ benchmarks_instance_pallet! {
 		let (sender_account, sender_location) = account_and_location::<T>(1);
 		let asset = T::get_asset();
 		let mut holding = T::worst_case_holding(1);
+		let dest_location =  T::valid_destination()?;
+
+		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
+		let (_, _) = T::DeliveryHelper::ensure_successful_delivery(
+			&sender_location,
+			&dest_location,
+			FeeReason::ChargeFees,
+		);
+
 		let sender_account_balance_before = T::TransactAsset::balance(&sender_account);
 
 		// Add our asset to the holding.
@@ -311,7 +342,7 @@ benchmarks_instance_pallet! {
 		let mut executor = new_executor::<T>(sender_location);
 		executor.set_holding(holding.into());
 		let instruction = Instruction::<XcmCallOf<T>>::InitiateTransfer {
-			destination: T::valid_destination()?,
+			destination: dest_location,
 			// ReserveDeposit is the most expensive filter.
 			remote_fees: Some(AssetTransferFilter::ReserveDeposit(asset.clone().into())),
 			// It's more expensive if we reanchor the origin.
diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs
index 84d4cba1dbe11cba6c79364932a8ad5733f76987..1c62bb5886d80c4e2d0a59afe63a32cef87336d4 100644
--- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs
+++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs
@@ -407,6 +407,9 @@ mod benchmarks {
 		let mut executor = new_executor::<T>(origin.clone());
 		let instruction = Instruction::SubscribeVersion { query_id, max_response_weight };
 		let xcm = Xcm(vec![instruction]);
+
+		T::DeliveryHelper::ensure_successful_delivery(&origin, &origin, FeeReason::QueryPallet);
+
 		#[block]
 		{
 			executor.bench_process(xcm)?;
@@ -422,6 +425,9 @@ mod benchmarks {
 		use xcm_executor::traits::VersionChangeNotifier;
 		// First we need to subscribe to notifications.
 		let (origin, _) = T::transact_origin_and_runtime_call()?;
+
+		T::DeliveryHelper::ensure_successful_delivery(&origin, &origin, FeeReason::QueryPallet);
+
 		let query_id = Default::default();
 		let max_response_weight = Default::default();
 		<T::XcmConfig as xcm_executor::Config>::SubscriptionService::start(
diff --git a/polkadot/xcm/pallet-xcm/Cargo.toml b/polkadot/xcm/pallet-xcm/Cargo.toml
index e8cdd3b4931bd2d80c7264a3d04163d3f5c32b14..81fcea05cac20f3e7f5eb5e5d62bce5a2857e763 100644
--- a/polkadot/xcm/pallet-xcm/Cargo.toml
+++ b/polkadot/xcm/pallet-xcm/Cargo.toml
@@ -70,6 +70,7 @@ runtime-benchmarks = [
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
 	"xcm-runtime-apis/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/polkadot/xcm/pallet-xcm/src/benchmarking.rs b/polkadot/xcm/pallet-xcm/src/benchmarking.rs
index e493d4838f5ca4a7a6bca0c8a5def791046f84ef..dd3c58c5dc7728e6ee4e7d256a81b15778f57823 100644
--- a/polkadot/xcm/pallet-xcm/src/benchmarking.rs
+++ b/polkadot/xcm/pallet-xcm/src/benchmarking.rs
@@ -96,6 +96,13 @@ benchmarks! {
 		)?
 		.into();
 		let versioned_msg = VersionedXcm::from(msg);
+
+		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
+		T::DeliveryHelper::ensure_successful_delivery(
+			&Default::default(),
+			&versioned_dest.clone().try_into().unwrap(),
+			FeeReason::ChargeFees,
+		);
 	}: _<RuntimeOrigin<T>>(send_origin, Box::new(versioned_dest), Box::new(versioned_msg))
 
 	teleport_assets {
@@ -164,7 +171,7 @@ benchmarks! {
 		}
 
 		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
-		let (_, _) = T::DeliveryHelper::ensure_successful_delivery(
+		T::DeliveryHelper::ensure_successful_delivery(
 			&origin_location,
 			&destination,
 			FeeReason::ChargeFees,
@@ -227,6 +234,13 @@ benchmarks! {
 		let versioned_beneficiary: VersionedLocation =
 			AccountId32 { network: None, id: recipient.into() }.into();
 		let versioned_assets: VersionedAssets = assets.into();
+
+		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
+		T::DeliveryHelper::ensure_successful_delivery(
+			&Default::default(),
+			&versioned_dest.clone().try_into().unwrap(),
+			FeeReason::ChargeFees,
+		);
 	}: _<RuntimeOrigin<T>>(send_origin.into(), Box::new(versioned_dest), Box::new(versioned_beneficiary), Box::new(versioned_assets), 0, WeightLimit::Unlimited)
 	verify {
 		// run provided verification function
@@ -259,6 +273,14 @@ benchmarks! {
 			BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)),
 		)?
 		.into();
+
+		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
+		T::DeliveryHelper::ensure_successful_delivery(
+			&Default::default(),
+			&versioned_loc.clone().try_into().unwrap(),
+			FeeReason::ChargeFees,
+		);
+
 	}: _(RawOrigin::Root, Box::new(versioned_loc))
 
 	force_unsubscribe_version_notify {
@@ -266,6 +288,14 @@ benchmarks! {
 			BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)),
 		)?;
 		let versioned_loc: VersionedLocation = loc.clone().into();
+
+		// Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...)
+		T::DeliveryHelper::ensure_successful_delivery(
+			&Default::default(),
+			&versioned_loc.clone().try_into().unwrap(),
+			FeeReason::ChargeFees,
+		);
+
 		let _ = crate::Pallet::<T>::request_version_notify(loc);
 	}: _(RawOrigin::Root, Box::new(versioned_loc))
 
diff --git a/polkadot/xcm/src/v5/traits.rs b/polkadot/xcm/src/v5/traits.rs
index 71b67e97d5fecd0c67bd9f9c9f175ccd4b1f178f..79d3285614287fd98e7cbc8013dd2f45e209c4e5 100644
--- a/polkadot/xcm/src/v5/traits.rs
+++ b/polkadot/xcm/src/v5/traits.rs
@@ -460,6 +460,10 @@ pub trait SendXcm {
 
 	/// Actually carry out the delivery operation for a previously validated message sending.
 	fn deliver(ticket: Self::Ticket) -> result::Result<XcmHash, SendError>;
+
+	/// Ensure `[Self::delivery]` is successful for the given `location` when called in benchmarks.
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(_location: Option<Location>) {}
 }
 
 #[impl_trait_for_tuples::impl_for_tuples(30)]
@@ -500,6 +504,13 @@ impl SendXcm for Tuple {
 		)* );
 		Err(SendError::Unroutable)
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(location: Option<Location>) {
+		for_tuples!( #(
+			return Tuple::ensure_successful_delivery(location.clone());
+		)* );
+	}
 }
 
 /// Convenience function for using a `SendXcm` implementation. Just interprets the `dest` and wraps
diff --git a/polkadot/xcm/xcm-builder/Cargo.toml b/polkadot/xcm/xcm-builder/Cargo.toml
index 2819a0b0a555ecaf6a5a3395af441ef9a456603e..e64ab19281323cdabf97cf80a95ba6682ed39e17 100644
--- a/polkadot/xcm/xcm-builder/Cargo.toml
+++ b/polkadot/xcm/xcm-builder/Cargo.toml
@@ -59,6 +59,7 @@ runtime-benchmarks = [
 	"polkadot-test-runtime/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 std = [
 	"codec/std",
diff --git a/polkadot/xcm/xcm-builder/src/pay.rs b/polkadot/xcm/xcm-builder/src/pay.rs
index 978c6870cdaf1e65ffc74adb175fd2e80ba53031..0093051290b74bcda97721944361d2af562ed738 100644
--- a/polkadot/xcm/xcm-builder/src/pay.rs
+++ b/polkadot/xcm/xcm-builder/src/pay.rs
@@ -70,8 +70,8 @@ impl<
 		Router: SendXcm,
 		Querier: QueryHandler,
 		Timeout: Get<Querier::BlockNumber>,
-		Beneficiary: Clone,
-		AssetKind,
+		Beneficiary: Clone + core::fmt::Debug,
+		AssetKind: core::fmt::Debug,
 		AssetKindToLocatableAsset: TryConvert<AssetKind, LocatableAssetId>,
 		BeneficiaryRefToLocation: for<'a> TryConvert<&'a Beneficiary, Location>,
 	> Pay
@@ -144,10 +144,9 @@ impl<
 	}
 
 	#[cfg(feature = "runtime-benchmarks")]
-	fn ensure_successful(_: &Self::Beneficiary, _: Self::AssetKind, _: Self::Balance) {
-		// We cannot generally guarantee this will go through successfully since we don't have any
-		// control over the XCM transport layers. We just assume that the benchmark environment
-		// will be sending it somewhere sensible.
+	fn ensure_successful(_: &Self::Beneficiary, asset_kind: Self::AssetKind, _: Self::Balance) {
+		let locatable = AssetKindToLocatableAsset::try_convert(asset_kind).unwrap();
+		Router::ensure_successful_delivery(Some(locatable.location));
 	}
 
 	#[cfg(feature = "runtime-benchmarks")]
diff --git a/polkadot/xcm/xcm-builder/src/routing.rs b/polkadot/xcm/xcm-builder/src/routing.rs
index fc2de89d21285076fa2db281108ae9c98bacc7bb..5b0d0a5f983503b570ccc41259981a7bd1d549a2 100644
--- a/polkadot/xcm/xcm-builder/src/routing.rs
+++ b/polkadot/xcm/xcm-builder/src/routing.rs
@@ -60,6 +60,11 @@ impl<Inner: SendXcm> SendXcm for WithUniqueTopic<Inner> {
 		Inner::deliver(ticket)?;
 		Ok(unique_id)
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(location: Option<Location>) {
+		Inner::ensure_successful_delivery(location);
+	}
 }
 impl<Inner: InspectMessageQueues> InspectMessageQueues for WithUniqueTopic<Inner> {
 	fn clear_messages() {
@@ -114,6 +119,11 @@ impl<Inner: SendXcm, TopicSource: SourceTopic> SendXcm for WithTopicSource<Inner
 		Inner::deliver(ticket)?;
 		Ok(unique_id)
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(location: Option<Location>) {
+		Inner::ensure_successful_delivery(location);
+	}
 }
 
 /// Trait for a type which ensures all requirements for successful delivery with XCM transport
@@ -211,4 +221,9 @@ impl<Inner: SendXcm> SendXcm for EnsureDecodableXcm<Inner> {
 	fn deliver(ticket: Self::Ticket) -> Result<XcmHash, SendError> {
 		Inner::deliver(ticket)
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(location: Option<Location>) {
+		Inner::ensure_successful_delivery(location);
+	}
 }
diff --git a/polkadot/xcm/xcm-builder/src/tests/pay/pay.rs b/polkadot/xcm/xcm-builder/src/tests/pay/pay.rs
index 062faee2abd96a07afda49883adf86e9b2107e5a..b4718edc6c9889cf8c5b248a2a97dd19c3b5eac5 100644
--- a/polkadot/xcm/xcm-builder/src/tests/pay/pay.rs
+++ b/polkadot/xcm/xcm-builder/src/tests/pay/pay.rs
@@ -22,7 +22,7 @@ use frame_support::{assert_ok, traits::tokens::Pay};
 
 /// Type representing both a location and an asset that is held at that location.
 /// The id of the held asset is relative to the location where it is being held.
-#[derive(Encode, Decode, Clone, PartialEq, Eq)]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
 pub struct AssetKind {
 	destination: Location,
 	asset_id: AssetId,
diff --git a/polkadot/xcm/xcm-builder/src/universal_exports.rs b/polkadot/xcm/xcm-builder/src/universal_exports.rs
index aae8438c78d2e1685c323faf38d89b0a52578cad..6b3c3adf737dbb6e938d59383c5100041c493d52 100644
--- a/polkadot/xcm/xcm-builder/src/universal_exports.rs
+++ b/polkadot/xcm/xcm-builder/src/universal_exports.rs
@@ -95,6 +95,9 @@ impl<Exporter: ExportXcm, UniversalLocation: Get<InteriorLocation>> SendXcm
 	fn deliver(ticket: Exporter::Ticket) -> Result<XcmHash, SendError> {
 		Exporter::deliver(ticket)
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(_: Option<Location>) {}
 }
 
 pub trait ExporterFor {
@@ -261,6 +264,11 @@ impl<Bridges: ExporterFor, Router: SendXcm, UniversalLocation: Get<InteriorLocat
 	fn deliver(validation: Self::Ticket) -> Result<XcmHash, SendError> {
 		Router::deliver(validation)
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(location: Option<Location>) {
+		Router::ensure_successful_delivery(location);
+	}
 }
 
 /// Implementation of `SendXcm` which wraps the message inside an `ExportMessage` instruction
@@ -361,6 +369,11 @@ impl<Bridges: ExporterFor, Router: SendXcm, UniversalLocation: Get<InteriorLocat
 	fn deliver(ticket: Router::Ticket) -> Result<XcmHash, SendError> {
 		Router::deliver(ticket)
 	}
+
+	#[cfg(feature = "runtime-benchmarks")]
+	fn ensure_successful_delivery(location: Option<Location>) {
+		Router::ensure_successful_delivery(location);
+	}
 }
 
 impl<Bridges, Router, UniversalLocation> InspectMessageQueues
@@ -613,6 +626,9 @@ mod tests {
 		fn deliver(_ticket: Self::Ticket) -> Result<XcmHash, SendError> {
 			Ok([0; 32])
 		}
+
+		#[cfg(feature = "runtime-benchmarks")]
+		fn ensure_successful_delivery(_: Option<Location>) {}
 	}
 	impl<Filter: Contains<(NetworkId, InteriorLocation)>> ExportXcm for OkFor<Filter> {
 		type Ticket = ();
diff --git a/polkadot/xcm/xcm-executor/Cargo.toml b/polkadot/xcm/xcm-executor/Cargo.toml
index 20ca40de5faab3df8163766c3cb29de89a9c1774..eb558c0fcc191c6aaefc41fea99f6fc15475e290 100644
--- a/polkadot/xcm/xcm-executor/Cargo.toml
+++ b/polkadot/xcm/xcm-executor/Cargo.toml
@@ -32,6 +32,7 @@ runtime-benchmarks = [
 	"frame-benchmarking/runtime-benchmarks",
 	"frame-support/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 std = [
 	"codec/std",
diff --git a/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml b/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml
index 7e6bfe967b9049f729c91f49329b1e75940332ec..a89dd74a44faf6140f228d15748b3c3ca0c5510f 100644
--- a/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml
+++ b/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml
@@ -13,9 +13,12 @@ workspace = true
 [dependencies]
 codec = { workspace = true, default-features = true }
 frame-support = { workspace = true }
+frame-system = { workspace = true, default-features = true }
 futures = { workspace = true }
 pallet-transaction-payment = { workspace = true, default-features = true }
+pallet-sudo = { workspace = true, default-features = true }
 pallet-xcm = { workspace = true, default-features = true }
+polkadot-runtime-parachains = { workspace = true, default-features = true }
 polkadot-test-client = { workspace = true }
 polkadot-test-runtime = { workspace = true }
 polkadot-test-service = { workspace = true }
@@ -30,4 +33,4 @@ sp-core = { workspace = true, default-features = true }
 
 [features]
 default = ["std"]
-std = ["frame-support/std", "sp-runtime/std", "xcm/std"]
+std = ["frame-support/std", "frame-system/std", "pallet-sudo/std", "polkadot-runtime-parachains/std", "sp-runtime/std", "xcm/std"]
diff --git a/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs b/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs
index 699a081e4f2245de481957272ea31c1caabd3ffe..dfcc3fc4187fa751682c11f2c765ff305549135b 100644
--- a/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs
+++ b/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs
@@ -375,6 +375,26 @@ fn deposit_reserve_asset_works_for_any_xcm_sender() {
 
 	let mut block_builder = client.init_polkadot_block_builder();
 
+	// Make the para available, so that `DMP` doesn't reject the XCM because the para is unknown.
+	let make_para_available =
+		construct_extrinsic(
+			&client,
+			polkadot_test_runtime::RuntimeCall::Sudo(pallet_sudo::Call::sudo {
+				call: Box::new(polkadot_test_runtime::RuntimeCall::System(
+					frame_system::Call::set_storage {
+						items: vec![(
+							polkadot_runtime_parachains::paras::Heads::<
+								polkadot_test_runtime::Runtime,
+							>::hashed_key_for(2000u32),
+							vec![1, 2, 3],
+						)],
+					},
+				)),
+			}),
+			sp_keyring::Sr25519Keyring::Alice,
+			0,
+		);
+
 	// Simulate execution of an incoming XCM message at the reserve chain
 	let execute = construct_extrinsic(
 		&client,
@@ -383,9 +403,12 @@ fn deposit_reserve_asset_works_for_any_xcm_sender() {
 			max_weight: Weight::from_parts(1_000_000_000, 1024 * 1024),
 		}),
 		sp_keyring::Sr25519Keyring::Alice,
-		0,
+		1,
 	);
 
+	block_builder
+		.push_polkadot_extrinsic(make_para_available)
+		.expect("pushes extrinsic");
 	block_builder.push_polkadot_extrinsic(execute).expect("pushes extrinsic");
 
 	let block = block_builder.build().expect("Finalizes the block").block;
diff --git a/polkadot/xcm/xcm-runtime-apis/Cargo.toml b/polkadot/xcm/xcm-runtime-apis/Cargo.toml
index 9ccca76c321cc031e0fcaf0a0f6486ea238f0068..9ada69a1933ba2b8e8d54411b810c0a17986fe1b 100644
--- a/polkadot/xcm/xcm-runtime-apis/Cargo.toml
+++ b/polkadot/xcm/xcm-runtime-apis/Cargo.toml
@@ -60,4 +60,5 @@ runtime-benchmarks = [
 	"pallet-xcm/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/polkadot/xcm/xcm-simulator/example/Cargo.toml b/polkadot/xcm/xcm-simulator/example/Cargo.toml
index 6fbe9243944af0182a6198764f73f4512fe90c6f..43f36fc8991aea26a540cb55e6fd6ad792fc9d50 100644
--- a/polkadot/xcm/xcm-simulator/example/Cargo.toml
+++ b/polkadot/xcm/xcm-simulator/example/Cargo.toml
@@ -50,4 +50,5 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml b/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml
index 04f8ba115173465b14127cb277bcc74776ea1a5b..a2e36db95ba610dae491b608c2e2831a5268575d 100644
--- a/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml
+++ b/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml
@@ -59,6 +59,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 
 [[bin]]
diff --git a/prdoc/pr_6604.prdoc b/prdoc/pr_6604.prdoc
new file mode 100644
index 0000000000000000000000000000000000000000..dc198287ff679ac7b03d2239eae1f4dd80f71c9e
--- /dev/null
+++ b/prdoc/pr_6604.prdoc
@@ -0,0 +1,106 @@
+title: 'dmp: Check that the para exist before delivering a message'
+doc:
+- audience: Runtime Dev
+  description: |
+    Ensure that a para exists before trying to deliver a message to it. 
+    Besides that `ensure_successful_delivery` function is added to `SendXcm`. This function
+    should be used by benchmarks to ensure that the delivery of a Xcm will work in the benchmark.
+crates:
+- name: polkadot-runtime-parachains
+  bump: major
+- name: polkadot-runtime-common
+  bump: major
+- name: polkadot-parachain-primitives
+  bump: major
+- name: rococo-runtime
+  bump: major
+- name: westend-runtime
+  bump: major
+- name: pallet-xcm-benchmarks
+  bump: major
+- name: pallet-xcm
+  bump: major
+- name: cumulus-pallet-parachain-system
+  bump: major
+- name: staging-xcm
+  bump: major
+- name: staging-xcm-builder
+  bump: major
+- name: bridge-runtime-common
+  bump: major
+- name: pallet-xcm-bridge-hub-router
+  bump: major
+- name: pallet-xcm-bridge-hub
+  bump: major
+- name: snowbridge-pallet-inbound-queue
+  bump: major
+- name: snowbridge-pallet-system
+  bump: major
+- name: snowbridge-core
+  bump: major
+- name: snowbridge-router-primitives
+  bump: major
+- name: snowbridge-runtime-common
+  bump: major
+- name: snowbridge-runtime-test-common
+  bump: major
+- name: cumulus-pallet-dmp-queue
+  bump: major
+- name: cumulus-pallet-xcmp-queue
+  bump: major
+- name: parachains-common
+  bump: major
+- name: asset-hub-rococo-runtime
+  bump: major
+- name: asset-hub-westend-runtime
+  bump: major
+- name: assets-common
+  bump: major
+- name: bridge-hub-rococo-runtime
+  bump: major
+- name: bridge-hub-westend-runtime
+  bump: major
+- name: bridge-hub-common
+  bump: major
+- name: collectives-westend-runtime
+  bump: major
+- name: contracts-rococo-runtime
+  bump: major
+- name: coretime-rococo-runtime
+  bump: major
+- name: coretime-westend-runtime
+  bump: major
+- name: glutton-westend-runtime
+  bump: major
+- name: people-rococo-runtime
+  bump: major
+- name: people-westend-runtime
+  bump: major
+- name: penpal-runtime
+  bump: major
+- name: rococo-parachain-runtime
+  bump: major
+- name: polkadot-parachain-bin
+  bump: major
+- name: cumulus-primitives-core
+  bump: major
+- name: cumulus-primitives-utility
+  bump: major
+- name: polkadot-service
+  bump: major
+- name: staging-xcm-executor
+  bump: major
+- name: xcm-runtime-apis
+  bump: major
+- name: xcm-simulator-example
+  bump: major
+- name: pallet-contracts
+  bump: major
+- name: pallet-contracts-mock-network
+  bump: major
+- name: pallet-revive
+  bump: major
+- name: pallet-revive-mock-network
+  bump: major
+- name: polkadot-sdk
+  bump: major
diff --git a/substrate/frame/contracts/Cargo.toml b/substrate/frame/contracts/Cargo.toml
index 316ea68130483777c73e8a2e62af855fbbd8031b..96351752918a062e05e6b6bab13111bc18dd8258 100644
--- a/substrate/frame/contracts/Cargo.toml
+++ b/substrate/frame/contracts/Cargo.toml
@@ -119,6 +119,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"wasm-instrument",
 	"xcm-builder/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/substrate/frame/contracts/mock-network/Cargo.toml b/substrate/frame/contracts/mock-network/Cargo.toml
index d6e2d51ef452309cf30e884d7fcb7165e990b366..66137bc8a0c63f9bebc453ee7273a44e4eb8133e 100644
--- a/substrate/frame/contracts/mock-network/Cargo.toml
+++ b/substrate/frame/contracts/mock-network/Cargo.toml
@@ -87,4 +87,5 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
diff --git a/substrate/frame/revive/Cargo.toml b/substrate/frame/revive/Cargo.toml
index 2e069bacf7377a372f761ec3dd5b899664071287..e61554f5cfa039e073b9de6e442bc883835fd0b9 100644
--- a/substrate/frame/revive/Cargo.toml
+++ b/substrate/frame/revive/Cargo.toml
@@ -119,6 +119,7 @@ runtime-benchmarks = [
 	"pallet-utility/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/substrate/frame/revive/mock-network/Cargo.toml b/substrate/frame/revive/mock-network/Cargo.toml
index c5b18b3fa290ea325217e435e0fe92d560ab1e71..6208db45a91ecbcc955df4c741df8ff118175eff 100644
--- a/substrate/frame/revive/mock-network/Cargo.toml
+++ b/substrate/frame/revive/mock-network/Cargo.toml
@@ -85,6 +85,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 	"xcm-builder/runtime-benchmarks",
 	"xcm-executor/runtime-benchmarks",
+	"xcm/runtime-benchmarks",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/umbrella/Cargo.toml b/umbrella/Cargo.toml
index d5ef707d2b8f8b4d673153110b1d678a9b5c94e9..68d71b4a5d5ee685b1370480730da65eff6ba901 100644
--- a/umbrella/Cargo.toml
+++ b/umbrella/Cargo.toml
@@ -362,6 +362,7 @@ runtime-benchmarks = [
 	"staging-node-inspect?/runtime-benchmarks",
 	"staging-xcm-builder?/runtime-benchmarks",
 	"staging-xcm-executor?/runtime-benchmarks",
+	"staging-xcm?/runtime-benchmarks",
 	"xcm-runtime-apis?/runtime-benchmarks",
 ]
 try-runtime = [