From d16af0b8bea196167d540d74cb8a3cbc19ab6b75 Mon Sep 17 00:00:00 2001
From: Joseph Zhao
 <65984904+programskillforverification@users.noreply.github.com>
Date: Fri, 19 Jul 2024 23:04:03 +0800
Subject: [PATCH] Backport claim assets tests from polkadot-fellows repo
 (#4930)

# Issue
[Backport integration tests for claim assets to the polkadot-sdk from
polkadot-fellows repo
#4892](https://github.com/paritytech/polkadot-sdk/issues/4892)
# Description
For the first time to contribute this project, I just finished part and
make sure everything is ok.
- [x] backport [claim_assets test
case](https://github.com/polkadot-fellows/runtimes/blob/main/integration-tests/emulated/tests/assets/asset-hub-kusama/src/tests/claim_assets.rs)
to the polkadot-sdk testnet integration tests
- [x] backport macro
[test_chain_can_claim_assets](https://github.com/polkadot-fellows/runtimes/blob/main/integration-tests/emulated/helpers/src/lib.rs#L218)
from fellows repo
- [ ] when merged to polkadot-sdk and released, make sure that it is
propagated to the fellows repo:
https://github.com/polkadot-fellows/runtimes/issues/363
- [x] backport and align other macros/test-cases from
https://github.com/polkadot-fellows/runtimes/blob/8ec28f96eeb30fbba30d29006d75e1a3fa1cea1c/integration-tests/emulated/helpers/src/lib.rs#L31-L33

---------

Co-authored-by: Zihan Zhao <josephzhao@Zihans-MacBook-Pro-3.local>
Co-authored-by: command-bot <>
Co-authored-by: Adrian Catangiu <adrian@parity.io>
Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com>
---
 Cargo.lock                                    |  62 ++++
 Cargo.toml                                    |   6 +
 .../bridges/bridge-hub-rococo/src/lib.rs      |   1 +
 .../bridges/bridge-hub-westend/src/lib.rs     |   5 +-
 .../coretime/coretime-rococo/Cargo.toml       |  24 ++
 .../coretime/coretime-rococo/src/genesis.rs   |  66 +++++
 .../coretime/coretime-rococo/src/lib.rs       |  53 ++++
 .../coretime/coretime-westend/Cargo.toml      |  24 ++
 .../coretime/coretime-westend/src/genesis.rs  |  66 +++++
 .../coretime/coretime-westend/src/lib.rs      |  53 ++++
 .../emulated/common/src/macros.rs             | 278 +++++++++++++++++-
 .../networks/rococo-system/Cargo.toml         |   1 +
 .../networks/rococo-system/src/lib.rs         |   4 +
 .../networks/westend-system/Cargo.toml        |   1 +
 .../networks/westend-system/src/lib.rs        |   4 +
 .../tests/assets/asset-hub-rococo/src/lib.rs  |   1 +
 .../src/tests/claim_assets.rs                 |  29 ++
 .../assets/asset-hub-rococo/src/tests/mod.rs  |   1 +
 .../tests/assets/asset-hub-westend/src/lib.rs |   1 +
 .../src/tests/claim_assets.rs                 |  29 ++
 .../assets/asset-hub-westend/src/tests/mod.rs |   1 +
 .../bridges/bridge-hub-rococo/src/lib.rs      |   2 +-
 .../src/tests/claim_assets.rs                 |  29 ++
 .../bridge-hub-rococo/src/tests/mod.rs        |   1 +
 .../bridges/bridge-hub-westend/src/lib.rs     |   2 +-
 .../src/tests/claim_assets.rs                 |  29 ++
 .../bridge-hub-westend/src/tests/mod.rs       |   1 +
 .../collectives-westend/src/lib.rs            |  32 +-
 .../src/tests/fellowship_treasury.rs          |   1 -
 .../collectives-westend/src/tests/mod.rs      |   1 +
 .../collectives-westend/src/tests/teleport.rs |  66 +++++
 .../tests/coretime/coretime-rococo/Cargo.toml |  27 ++
 .../tests/coretime/coretime-rococo/src/lib.rs |  40 +++
 .../coretime-rococo/src/tests/claim_assets.rs |  29 ++
 .../coretime/coretime-rococo/src/tests/mod.rs |  16 +
 .../coretime/coretime-westend/Cargo.toml      |  27 ++
 .../coretime/coretime-westend/src/lib.rs      |  41 +++
 .../src/tests/claim_assets.rs                 |  29 ++
 .../coretime-westend/src/tests/mod.rs         |  16 +
 .../tests/people/people-rococo/src/lib.rs     |   5 +-
 .../people-rococo/src/tests/claim_assets.rs   |  29 ++
 .../people/people-rococo/src/tests/mod.rs     |   1 +
 .../tests/people/people-westend/src/lib.rs    |   5 +-
 .../people-westend/src/tests/claim_assets.rs  |  29 ++
 .../people/people-westend/src/tests/mod.rs    |   1 +
 prdoc/pr_4930.prdoc                           |  15 +
 46 files changed, 1170 insertions(+), 14 deletions(-)
 create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/Cargo.toml
 create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/lib.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/Cargo.toml
 create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/lib.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/claim_assets.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/claim_assets.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/claim_assets.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/claim_assets.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/teleport.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/Cargo.toml
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/lib.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/claim_assets.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/mod.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/Cargo.toml
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/lib.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/claim_assets.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/mod.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/claim_assets.rs
 create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/claim_assets.rs
 create mode 100644 prdoc/pr_4930.prdoc

diff --git a/Cargo.lock b/Cargo.lock
index a424738685e..6c837a051ce 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3258,6 +3258,36 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "coretime-rococo-emulated-chain"
+version = "0.0.0"
+dependencies = [
+ "coretime-rococo-runtime",
+ "cumulus-primitives-core",
+ "emulated-integration-tests-common",
+ "frame-support",
+ "parachains-common",
+ "sp-core",
+ "testnet-parachains-constants",
+]
+
+[[package]]
+name = "coretime-rococo-integration-tests"
+version = "0.1.0"
+dependencies = [
+ "emulated-integration-tests-common",
+ "frame-support",
+ "pallet-balances",
+ "pallet-identity",
+ "pallet-message-queue",
+ "polkadot-runtime-common",
+ "rococo-runtime-constants",
+ "rococo-system-emulated-network",
+ "sp-runtime",
+ "staging-xcm",
+ "staging-xcm-executor",
+]
+
 [[package]]
 name = "coretime-rococo-runtime"
 version = "0.1.0"
@@ -3324,6 +3354,36 @@ dependencies = [
  "xcm-runtime-apis",
 ]
 
+[[package]]
+name = "coretime-westend-emulated-chain"
+version = "0.0.0"
+dependencies = [
+ "coretime-westend-runtime",
+ "cumulus-primitives-core",
+ "emulated-integration-tests-common",
+ "frame-support",
+ "parachains-common",
+ "sp-core",
+ "testnet-parachains-constants",
+]
+
+[[package]]
+name = "coretime-westend-integration-tests"
+version = "0.1.0"
+dependencies = [
+ "emulated-integration-tests-common",
+ "frame-support",
+ "pallet-balances",
+ "pallet-identity",
+ "pallet-message-queue",
+ "polkadot-runtime-common",
+ "sp-runtime",
+ "staging-xcm",
+ "staging-xcm-executor",
+ "westend-runtime-constants",
+ "westend-system-emulated-network",
+]
+
 [[package]]
 name = "coretime-westend-runtime"
 version = "0.1.0"
@@ -16460,6 +16520,7 @@ version = "0.0.0"
 dependencies = [
  "asset-hub-rococo-emulated-chain",
  "bridge-hub-rococo-emulated-chain",
+ "coretime-rococo-emulated-chain",
  "emulated-integration-tests-common",
  "penpal-emulated-chain",
  "people-rococo-emulated-chain",
@@ -23527,6 +23588,7 @@ dependencies = [
  "asset-hub-westend-emulated-chain",
  "bridge-hub-westend-emulated-chain",
  "collectives-westend-emulated-chain",
+ "coretime-westend-emulated-chain",
  "emulated-integration-tests-common",
  "penpal-emulated-chain",
  "people-westend-emulated-chain",
diff --git a/Cargo.toml b/Cargo.toml
index 759780ce4a4..ed32ba0a24f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -90,6 +90,8 @@ members = [
 	"cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo",
 	"cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend",
 	"cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend",
+	"cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo",
+	"cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend",
 	"cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo",
 	"cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend",
 	"cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal",
@@ -104,6 +106,8 @@ members = [
 	"cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo",
 	"cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend",
 	"cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend",
+	"cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo",
+	"cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend",
 	"cumulus/parachains/integration-tests/emulated/tests/people/people-rococo",
 	"cumulus/parachains/integration-tests/emulated/tests/people/people-westend",
 	"cumulus/parachains/pallets/collective-content",
@@ -667,7 +671,9 @@ colored = { version = "2.0.4" }
 comfy-table = { version = "7.1.0", default-features = false }
 console = { version = "0.15.8" }
 contracts-rococo-runtime = { path = "cumulus/parachains/runtimes/contracts/contracts-rococo" }
+coretime-rococo-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo" }
 coretime-rococo-runtime = { path = "cumulus/parachains/runtimes/coretime/coretime-rococo" }
+coretime-westend-emulated-chain = { path = "cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend" }
 coretime-westend-runtime = { path = "cumulus/parachains/runtimes/coretime/coretime-westend" }
 cpu-time = { version = "1.0.0" }
 criterion = { version = "0.5.1", default-features = false }
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs
index d8b8edaf240..5ef0993f70a 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs
@@ -17,6 +17,7 @@ pub mod genesis;
 
 pub use bridge_hub_rococo_runtime::{
 	xcm_config::XcmConfig as BridgeHubRococoXcmConfig, EthereumBeaconClient, EthereumInboundQueue,
+	ExistentialDeposit as BridgeHubRococoExistentialDeposit,
 	RuntimeOrigin as BridgeHubRococoRuntimeOrigin,
 };
 
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs
index f701b309699..feb59c411c8 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs
@@ -15,7 +15,10 @@
 
 pub mod genesis;
 
-pub use bridge_hub_westend_runtime::xcm_config::XcmConfig as BridgeHubWestendXcmConfig;
+pub use bridge_hub_westend_runtime::{
+	xcm_config::XcmConfig as BridgeHubWestendXcmConfig,
+	ExistentialDeposit as BridgeHubWestendExistentialDeposit,
+};
 
 // Substrate
 use frame_support::traits::OnInitialize;
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/Cargo.toml
new file mode 100644
index 00000000000..6af3f270a90
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "coretime-rococo-emulated-chain"
+version = "0.0.0"
+authors.workspace = true
+edition.workspace = true
+license = "Apache-2.0"
+description = "Coretime Rococo emulated chain"
+publish = false
+
+[lints]
+workspace = true
+
+[dependencies]
+
+# Substrate
+sp-core = { workspace = true }
+frame-support = { workspace = true }
+
+# Cumulus
+parachains-common = { workspace = true, default-features = true }
+cumulus-primitives-core = { workspace = true }
+coretime-rococo-runtime = { workspace = true, default-features = true }
+emulated-integration-tests-common = { workspace = true }
+testnet-parachains-constants = { features = ["rococo"], workspace = true, default-features = true }
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs
new file mode 100644
index 00000000000..f72de52c493
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs
@@ -0,0 +1,66 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Substrate
+use sp_core::storage::Storage;
+
+// Cumulus
+use emulated_integration_tests_common::{
+	accounts, build_genesis_storage, collators, SAFE_XCM_VERSION,
+};
+use parachains_common::Balance;
+
+pub const PARA_ID: u32 = 1005;
+pub const ED: Balance = testnet_parachains_constants::rococo::currency::EXISTENTIAL_DEPOSIT;
+
+pub fn genesis() -> Storage {
+	let genesis_config = coretime_rococo_runtime::RuntimeGenesisConfig {
+		system: coretime_rococo_runtime::SystemConfig::default(),
+		balances: coretime_rococo_runtime::BalancesConfig {
+			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+		},
+		parachain_info: coretime_rococo_runtime::ParachainInfoConfig {
+			parachain_id: PARA_ID.into(),
+			..Default::default()
+		},
+		collator_selection: coretime_rococo_runtime::CollatorSelectionConfig {
+			invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(),
+			candidacy_bond: ED * 16,
+			..Default::default()
+		},
+		session: coretime_rococo_runtime::SessionConfig {
+			keys: collators::invulnerables()
+				.into_iter()
+				.map(|(acc, aura)| {
+					(
+						acc.clone(),                                   // account id
+						acc,                                           // validator id
+						coretime_rococo_runtime::SessionKeys { aura }, // session keys
+					)
+				})
+				.collect(),
+		},
+		polkadot_xcm: coretime_rococo_runtime::PolkadotXcmConfig {
+			safe_xcm_version: Some(SAFE_XCM_VERSION),
+			..Default::default()
+		},
+		..Default::default()
+	};
+
+	build_genesis_storage(
+		&genesis_config,
+		coretime_rococo_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"),
+	)
+}
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/lib.rs
new file mode 100644
index 00000000000..a15303a22e1
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/lib.rs
@@ -0,0 +1,53 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+pub use coretime_rococo_runtime;
+
+pub mod genesis;
+
+// Substrate
+use frame_support::traits::OnInitialize;
+
+// Cumulus
+use emulated_integration_tests_common::{
+	impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain,
+	impls::Parachain, xcm_emulator::decl_test_parachains,
+};
+
+// CoretimeRococo Parachain declaration
+decl_test_parachains! {
+	pub struct CoretimeRococo {
+		genesis = genesis::genesis(),
+		on_init = {
+			coretime_rococo_runtime::AuraExt::on_initialize(1);
+		},
+		runtime = coretime_rococo_runtime,
+		core = {
+			XcmpMessageHandler: coretime_rococo_runtime::XcmpQueue,
+			LocationToAccountId: coretime_rococo_runtime::xcm_config::LocationToAccountId,
+			ParachainInfo: coretime_rococo_runtime::ParachainInfo,
+			MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin,
+		},
+		pallets = {
+			PolkadotXcm: coretime_rococo_runtime::PolkadotXcm,
+			Balances: coretime_rococo_runtime::Balances,
+			Broker: coretime_rococo_runtime::Broker,
+		}
+	},
+}
+
+// CoretimeRococo implementation
+impl_accounts_helpers_for_parachain!(CoretimeRococo);
+impl_assert_events_helpers_for_parachain!(CoretimeRococo);
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/Cargo.toml
new file mode 100644
index 00000000000..895a984eccb
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "coretime-westend-emulated-chain"
+version = "0.0.0"
+authors.workspace = true
+edition.workspace = true
+license = "Apache-2.0"
+description = "Coretime Westend emulated chain"
+publish = false
+
+[lints]
+workspace = true
+
+[dependencies]
+
+# Substrate
+sp-core = { workspace = true }
+frame-support = { workspace = true }
+
+# Cumulus
+parachains-common = { workspace = true, default-features = true }
+cumulus-primitives-core = { workspace = true }
+coretime-westend-runtime = { workspace = true, default-features = true }
+emulated-integration-tests-common = { workspace = true }
+testnet-parachains-constants = { features = ["westend"], workspace = true, default-features = true }
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs
new file mode 100644
index 00000000000..222ffe7a63a
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs
@@ -0,0 +1,66 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Substrate
+use sp_core::storage::Storage;
+
+// Cumulus
+use emulated_integration_tests_common::{
+	accounts, build_genesis_storage, collators, SAFE_XCM_VERSION,
+};
+use parachains_common::Balance;
+
+pub const PARA_ID: u32 = 1005;
+pub const ED: Balance = testnet_parachains_constants::westend::currency::EXISTENTIAL_DEPOSIT;
+
+pub fn genesis() -> Storage {
+	let genesis_config = coretime_westend_runtime::RuntimeGenesisConfig {
+		system: coretime_westend_runtime::SystemConfig::default(),
+		balances: coretime_westend_runtime::BalancesConfig {
+			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+		},
+		parachain_info: coretime_westend_runtime::ParachainInfoConfig {
+			parachain_id: PARA_ID.into(),
+			..Default::default()
+		},
+		collator_selection: coretime_westend_runtime::CollatorSelectionConfig {
+			invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(),
+			candidacy_bond: ED * 16,
+			..Default::default()
+		},
+		session: coretime_westend_runtime::SessionConfig {
+			keys: collators::invulnerables()
+				.into_iter()
+				.map(|(acc, aura)| {
+					(
+						acc.clone(),                                    // account id
+						acc,                                            // validator id
+						coretime_westend_runtime::SessionKeys { aura }, // session keys
+					)
+				})
+				.collect(),
+		},
+		polkadot_xcm: coretime_westend_runtime::PolkadotXcmConfig {
+			safe_xcm_version: Some(SAFE_XCM_VERSION),
+			..Default::default()
+		},
+		..Default::default()
+	};
+
+	build_genesis_storage(
+		&genesis_config,
+		coretime_westend_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"),
+	)
+}
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/lib.rs
new file mode 100644
index 00000000000..41949843b02
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/lib.rs
@@ -0,0 +1,53 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+pub use coretime_westend_runtime;
+
+pub mod genesis;
+
+// Substrate
+use frame_support::traits::OnInitialize;
+
+// Cumulus
+use emulated_integration_tests_common::{
+	impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain,
+	impls::Parachain, xcm_emulator::decl_test_parachains,
+};
+
+// CoretimeWestend Parachain declaration
+decl_test_parachains! {
+	pub struct CoretimeWestend {
+		genesis = genesis::genesis(),
+		on_init = {
+			coretime_westend_runtime::AuraExt::on_initialize(1);
+		},
+		runtime = coretime_westend_runtime,
+		core = {
+			XcmpMessageHandler: coretime_westend_runtime::XcmpQueue,
+			LocationToAccountId: coretime_westend_runtime::xcm_config::LocationToAccountId,
+			ParachainInfo: coretime_westend_runtime::ParachainInfo,
+			MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin,
+		},
+		pallets = {
+			PolkadotXcm: coretime_westend_runtime::PolkadotXcm,
+			Balances: coretime_westend_runtime::Balances,
+			Broker: coretime_westend_runtime::Broker,
+		}
+	},
+}
+
+// CoretimeWestend implementation
+impl_accounts_helpers_for_parachain!(CoretimeWestend);
+impl_assert_events_helpers_for_parachain!(CoretimeWestend);
diff --git a/cumulus/parachains/integration-tests/emulated/common/src/macros.rs b/cumulus/parachains/integration-tests/emulated/common/src/macros.rs
index 6f6bbe41e01..b11adacbde5 100644
--- a/cumulus/parachains/integration-tests/emulated/common/src/macros.rs
+++ b/cumulus/parachains/integration-tests/emulated/common/src/macros.rs
@@ -27,7 +27,7 @@ pub use xcm::{
 	prelude::{
 		AccountId32, All, Asset, AssetId, BuyExecution, DepositAsset, ExpectTransactStatus,
 		Fungible, Here, Location, MaybeErrorCode, OriginKind, RefundSurplus, Transact, Unlimited,
-		VersionedXcm, WeightLimit, WithdrawAsset, Xcm,
+		VersionedAssets, VersionedXcm, WeightLimit, WithdrawAsset, Xcm,
 	},
 	v3::Location as V3Location,
 };
@@ -130,3 +130,279 @@ macro_rules! test_parachain_is_trusted_teleporter {
 		}
 	};
 }
+
+#[macro_export]
+macro_rules! test_relay_is_trusted_teleporter {
+	( $sender_relay:ty, $sender_xcm_config:ty, vec![$( $receiver_para:ty ),+], ($assets:expr, $amount:expr) ) => {
+		$crate::macros::paste::paste! {
+			// init Origin variables
+			let sender = [<$sender_relay Sender>]::get();
+			let mut relay_sender_balance_before =
+				<$sender_relay as $crate::macros::Chain>::account_data_of(sender.clone()).free;
+			let origin = <$sender_relay as $crate::macros::Chain>::RuntimeOrigin::signed(sender.clone());
+			let fee_asset_item = 0;
+			let weight_limit = $crate::macros::WeightLimit::Unlimited;
+
+			$(
+				{
+					// init Destination variables
+					let receiver = [<$receiver_para Receiver>]::get();
+					let para_receiver_balance_before =
+						<$receiver_para as $crate::macros::Chain>::account_data_of(receiver.clone()).free;
+					let para_destination =
+						<$sender_relay>::child_location_of(<$receiver_para>::para_id());
+					let beneficiary: Location =
+						$crate::macros::AccountId32 { network: None, id: receiver.clone().into() }.into();
+
+					// Send XCM message from Relay
+					<$sender_relay>::execute_with(|| {
+						assert_ok!(<$sender_relay as [<$sender_relay Pallet>]>::XcmPallet::limited_teleport_assets(
+							origin.clone(),
+							bx!(para_destination.clone().into()),
+							bx!(beneficiary.clone().into()),
+							bx!($assets.clone().into()),
+							fee_asset_item,
+							weight_limit.clone(),
+						));
+
+						type RuntimeEvent = <$sender_relay as $crate::macros::Chain>::RuntimeEvent;
+
+						assert_expected_events!(
+							$sender_relay,
+							vec![
+								RuntimeEvent::XcmPallet(
+									$crate::macros::pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }
+								) => {},
+								RuntimeEvent::Balances(
+									$crate::macros::pallet_balances::Event::Burned { who: sender, amount }
+								) => {},
+								RuntimeEvent::XcmPallet(
+									$crate::macros::pallet_xcm::Event::Sent { .. }
+								) => {},
+							]
+						);
+					});
+
+					// Receive XCM message in Destination Parachain
+					<$receiver_para>::execute_with(|| {
+						type RuntimeEvent = <$receiver_para as $crate::macros::Chain>::RuntimeEvent;
+
+						assert_expected_events!(
+							$receiver_para,
+							vec![
+								RuntimeEvent::Balances(
+									$crate::macros::pallet_balances::Event::Minted { who: receiver, .. }
+								) => {},
+								RuntimeEvent::MessageQueue(
+									$crate::macros::pallet_message_queue::Event::Processed { success: true, .. }
+								) => {},
+							]
+						);
+					});
+
+					// Check if balances are updated accordingly in Origin and Parachain
+					let relay_sender_balance_after =
+						<$sender_relay as $crate::macros::Chain>::account_data_of(sender.clone()).free;
+					let para_receiver_balance_after =
+						<$receiver_para as $crate::macros::Chain>::account_data_of(receiver.clone()).free;
+					let delivery_fees = <$sender_relay>::execute_with(|| {
+						$crate::macros::asset_test_utils::xcm_helpers::teleport_assets_delivery_fees::<
+							<$sender_xcm_config as xcm_executor::Config>::XcmSender,
+						>($assets.clone(), fee_asset_item, weight_limit.clone(), beneficiary, para_destination)
+					});
+
+					assert_eq!(relay_sender_balance_before - $amount - delivery_fees, relay_sender_balance_after);
+					assert!(para_receiver_balance_after > para_receiver_balance_before);
+
+					// Update sender balance
+					relay_sender_balance_before = <$sender_relay as $crate::macros::Chain>::account_data_of(sender.clone()).free;
+				}
+			)+
+		}
+	};
+}
+
+#[macro_export]
+macro_rules! test_parachain_is_trusted_teleporter_for_relay {
+	( $sender_para:ty, $sender_xcm_config:ty, $receiver_relay:ty, $amount:expr ) => {
+		$crate::macros::paste::paste! {
+			// init Origin variables
+			let sender = [<$sender_para Sender>]::get();
+			let mut para_sender_balance_before =
+				<$sender_para as $crate::macros::Chain>::account_data_of(sender.clone()).free;
+			let origin = <$sender_para as $crate::macros::Chain>::RuntimeOrigin::signed(sender.clone());
+			let assets: Assets = (Parent, $amount).into();
+			let fee_asset_item = 0;
+			let weight_limit = $crate::macros::WeightLimit::Unlimited;
+
+			// init Destination variables
+			let receiver = [<$receiver_relay Receiver>]::get();
+			let relay_receiver_balance_before =
+				<$receiver_relay as $crate::macros::Chain>::account_data_of(receiver.clone()).free;
+			let relay_destination: Location = Parent.into();
+			let beneficiary: Location =
+				$crate::macros::AccountId32 { network: None, id: receiver.clone().into() }.into();
+
+			// Send XCM message from Parachain
+			<$sender_para>::execute_with(|| {
+				assert_ok!(<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::limited_teleport_assets(
+					origin.clone(),
+					bx!(relay_destination.clone().into()),
+					bx!(beneficiary.clone().into()),
+					bx!(assets.clone().into()),
+					fee_asset_item,
+					weight_limit.clone(),
+				));
+
+				type RuntimeEvent = <$sender_para as $crate::macros::Chain>::RuntimeEvent;
+
+				assert_expected_events!(
+					$sender_para,
+					vec![
+						RuntimeEvent::PolkadotXcm(
+							$crate::macros::pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }
+						) => {},
+						RuntimeEvent::Balances(
+							$crate::macros::pallet_balances::Event::Burned { who: sender, amount }
+						) => {},
+						RuntimeEvent::PolkadotXcm(
+							$crate::macros::pallet_xcm::Event::Sent { .. }
+						) => {},
+					]
+				);
+			});
+
+			// Receive XCM message in Destination Parachain
+			<$receiver_relay>::execute_with(|| {
+				type RuntimeEvent = <$receiver_relay as $crate::macros::Chain>::RuntimeEvent;
+
+				assert_expected_events!(
+					$receiver_relay,
+					vec![
+						RuntimeEvent::Balances(
+							$crate::macros::pallet_balances::Event::Minted { who: receiver, .. }
+						) => {},
+						RuntimeEvent::MessageQueue(
+							$crate::macros::pallet_message_queue::Event::Processed { success: true, .. }
+						) => {},
+					]
+				);
+			});
+
+			// Check if balances are updated accordingly in Origin and Relay Chain
+			let para_sender_balance_after =
+				<$sender_para as $crate::macros::Chain>::account_data_of(sender.clone()).free;
+			let relay_receiver_balance_after =
+				<$receiver_relay as $crate::macros::Chain>::account_data_of(receiver.clone()).free;
+			let delivery_fees = <$sender_para>::execute_with(|| {
+				$crate::macros::asset_test_utils::xcm_helpers::teleport_assets_delivery_fees::<
+					<$sender_xcm_config as xcm_executor::Config>::XcmSender,
+				>(assets, fee_asset_item, weight_limit.clone(), beneficiary, relay_destination)
+			});
+
+			assert_eq!(para_sender_balance_before - $amount - delivery_fees, para_sender_balance_after);
+			assert!(relay_receiver_balance_after > relay_receiver_balance_before);
+
+			// Update sender balance
+			para_sender_balance_before = <$sender_para as $crate::macros::Chain>::account_data_of(sender.clone()).free;
+		}
+	};
+}
+
+#[macro_export]
+macro_rules! test_chain_can_claim_assets {
+	( $sender_para:ty, $runtime_call:ty, $network_id:expr, $assets:expr, $amount:expr ) => {
+		$crate::macros::paste::paste! {
+			let sender = [<$sender_para Sender>]::get();
+			let origin = <$sender_para as $crate::macros::Chain>::RuntimeOrigin::signed(sender.clone());
+			// Receiver is the same as sender
+			let beneficiary: Location =
+				$crate::macros::AccountId32 { network: Some($network_id), id: sender.clone().into() }.into();
+			let versioned_assets: $crate::macros::VersionedAssets = $assets.clone().into();
+
+			<$sender_para>::execute_with(|| {
+				// Assets are trapped for whatever reason.
+				// The possible reasons for this might differ from runtime to runtime, so here we just drop them directly.
+				<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::drop_assets(
+					&beneficiary,
+					$assets.clone().into(),
+					&XcmContext { origin: None, message_id: [0u8; 32], topic: None },
+				);
+
+				type RuntimeEvent = <$sender_para as $crate::macros::Chain>::RuntimeEvent;
+				assert_expected_events!(
+					$sender_para,
+					vec![
+						RuntimeEvent::PolkadotXcm(
+							$crate::macros::pallet_xcm::Event::AssetsTrapped { origin: beneficiary, assets: versioned_assets, .. }
+						) => {},
+					]
+				);
+
+				let balance_before = <$sender_para as [<$sender_para Pallet>]>::Balances::free_balance(&sender);
+
+				// Different origin or different assets won't work.
+				let other_origin = <$sender_para as $crate::macros::Chain>::RuntimeOrigin::signed([<$sender_para Receiver>]::get());
+				assert!(<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::claim_assets(
+					other_origin,
+					bx!(versioned_assets.clone().into()),
+					bx!(beneficiary.clone().into()),
+				).is_err());
+				let other_versioned_assets: $crate::macros::VersionedAssets = Assets::new().into();
+				assert!(<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::claim_assets(
+					origin.clone(),
+					bx!(other_versioned_assets.into()),
+					bx!(beneficiary.clone().into()),
+				).is_err());
+
+				// Assets will be claimed to `beneficiary`, which is the same as `sender`.
+				assert_ok!(<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::claim_assets(
+					origin.clone(),
+					bx!(versioned_assets.clone().into()),
+					bx!(beneficiary.clone().into()),
+				));
+
+				assert_expected_events!(
+					$sender_para,
+					vec![
+						RuntimeEvent::PolkadotXcm(
+							$crate::macros::pallet_xcm::Event::AssetsClaimed { origin: beneficiary, assets: versioned_assets, .. }
+						) => {},
+					]
+				);
+
+				// After claiming the assets, the balance has increased.
+				let balance_after = <$sender_para as [<$sender_para Pallet>]>::Balances::free_balance(&sender);
+				assert_eq!(balance_after, balance_before + $amount);
+
+				// Claiming the assets again doesn't work.
+				assert!(<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::claim_assets(
+					origin.clone(),
+					bx!(versioned_assets.clone().into()),
+					bx!(beneficiary.clone().into()),
+				).is_err());
+
+				let balance = <$sender_para as [<$sender_para Pallet>]>::Balances::free_balance(&sender);
+				assert_eq!(balance, balance_after);
+
+				// You can also claim assets and send them to a different account.
+				<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::drop_assets(
+					&beneficiary,
+					$assets.clone().into(),
+					&XcmContext { origin: None, message_id: [0u8; 32], topic: None },
+				);
+				let receiver = [<$sender_para Receiver>]::get();
+				let other_beneficiary: Location =
+					$crate::macros::AccountId32 { network: Some($network_id), id: receiver.clone().into() }.into();
+				let balance_before = <$sender_para as [<$sender_para Pallet>]>::Balances::free_balance(&receiver);
+				assert_ok!(<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::claim_assets(
+					origin.clone(),
+					bx!(versioned_assets.clone().into()),
+					bx!(other_beneficiary.clone().into()),
+				));
+				let balance_after = <$sender_para as [<$sender_para Pallet>]>::Balances::free_balance(&receiver);
+				assert_eq!(balance_after, balance_before + $amount);
+			});
+		}
+	};
+}
diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml
index 298be7362ec..864f3c6edd7 100644
--- a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml
+++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml
@@ -18,3 +18,4 @@ asset-hub-rococo-emulated-chain = { workspace = true }
 bridge-hub-rococo-emulated-chain = { workspace = true }
 people-rococo-emulated-chain = { workspace = true }
 penpal-emulated-chain = { workspace = true }
+coretime-rococo-emulated-chain = { workspace = true }
diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/src/lib.rs b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/src/lib.rs
index 70f23ef8260..53808bc5a80 100644
--- a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/src/lib.rs
@@ -15,12 +15,14 @@
 
 pub use asset_hub_rococo_emulated_chain;
 pub use bridge_hub_rococo_emulated_chain;
+pub use coretime_rococo_emulated_chain;
 pub use penpal_emulated_chain;
 pub use people_rococo_emulated_chain;
 pub use rococo_emulated_chain;
 
 use asset_hub_rococo_emulated_chain::AssetHubRococo;
 use bridge_hub_rococo_emulated_chain::BridgeHubRococo;
+use coretime_rococo_emulated_chain::CoretimeRococo;
 use penpal_emulated_chain::{PenpalA, PenpalB};
 use people_rococo_emulated_chain::PeopleRococo;
 use rococo_emulated_chain::Rococo;
@@ -37,6 +39,7 @@ decl_test_networks! {
 		parachains = vec![
 			AssetHubRococo,
 			BridgeHubRococo,
+			CoretimeRococo,
 			PenpalA,
 			PenpalB,
 			PeopleRococo,
@@ -49,6 +52,7 @@ decl_test_sender_receiver_accounts_parameter_types! {
 	RococoRelay { sender: ALICE, receiver: BOB },
 	AssetHubRococoPara { sender: ALICE, receiver: BOB },
 	BridgeHubRococoPara { sender: ALICE, receiver: BOB },
+	CoretimeRococoPara { sender: ALICE, receiver: BOB },
 	PenpalAPara { sender: ALICE, receiver: BOB },
 	PenpalBPara { sender: ALICE, receiver: BOB },
 	PeopleRococoPara { sender: ALICE, receiver: BOB }
diff --git a/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml
index 37c14aa3035..cec2e3733b2 100644
--- a/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml
+++ b/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml
@@ -19,3 +19,4 @@ bridge-hub-westend-emulated-chain = { workspace = true }
 collectives-westend-emulated-chain = { workspace = true }
 penpal-emulated-chain = { workspace = true }
 people-westend-emulated-chain = { workspace = true }
+coretime-westend-emulated-chain = { workspace = true }
diff --git a/cumulus/parachains/integration-tests/emulated/networks/westend-system/src/lib.rs b/cumulus/parachains/integration-tests/emulated/networks/westend-system/src/lib.rs
index 9fbc773bc50..6949a985629 100644
--- a/cumulus/parachains/integration-tests/emulated/networks/westend-system/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/networks/westend-system/src/lib.rs
@@ -16,6 +16,7 @@
 pub use asset_hub_westend_emulated_chain;
 pub use bridge_hub_westend_emulated_chain;
 pub use collectives_westend_emulated_chain;
+pub use coretime_westend_emulated_chain;
 pub use penpal_emulated_chain;
 pub use people_westend_emulated_chain;
 pub use westend_emulated_chain;
@@ -23,6 +24,7 @@ pub use westend_emulated_chain;
 use asset_hub_westend_emulated_chain::AssetHubWestend;
 use bridge_hub_westend_emulated_chain::BridgeHubWestend;
 use collectives_westend_emulated_chain::CollectivesWestend;
+use coretime_westend_emulated_chain::CoretimeWestend;
 use penpal_emulated_chain::{PenpalA, PenpalB};
 use people_westend_emulated_chain::PeopleWestend;
 use westend_emulated_chain::Westend;
@@ -40,6 +42,7 @@ decl_test_networks! {
 			AssetHubWestend,
 			BridgeHubWestend,
 			CollectivesWestend,
+			CoretimeWestend,
 			PeopleWestend,
 			PenpalA,
 			PenpalB,
@@ -53,6 +56,7 @@ decl_test_sender_receiver_accounts_parameter_types! {
 	AssetHubWestendPara { sender: ALICE, receiver: BOB },
 	BridgeHubWestendPara { sender: ALICE, receiver: BOB },
 	CollectivesWestendPara { sender: ALICE, receiver: BOB },
+	CoretimeWestendPara { sender: ALICE, receiver: BOB },
 	PeopleWestendPara { sender: ALICE, receiver: BOB },
 	PenpalAPara { sender: ALICE, receiver: BOB },
 	PenpalBPara { sender: ALICE, receiver: BOB }
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs
index f0094592696..eca35831705 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs
@@ -52,6 +52,7 @@ mod imports {
 					XcmConfig as AssetHubRococoXcmConfig,
 				},
 				AssetConversionOrigin as AssetHubRococoAssetConversionOrigin,
+				ExistentialDeposit as AssetHubRococoExistentialDeposit,
 			},
 			genesis::{AssetHubRococoAssetOwner, ED as ASSET_HUB_ROCOCO_ED},
 			AssetHubRococoParaPallet as AssetHubRococoPallet,
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/claim_assets.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/claim_assets.rs
new file mode 100644
index 00000000000..99b31aba4be
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/claim_assets.rs
@@ -0,0 +1,29 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Tests related to claiming assets trapped during XCM execution.
+
+use crate::imports::*;
+
+use emulated_integration_tests_common::test_chain_can_claim_assets;
+use xcm_executor::traits::DropAssets;
+
+#[test]
+fn assets_can_be_claimed() {
+	let amount = AssetHubRococoExistentialDeposit::get();
+	let assets: Assets = (Parent, amount).into();
+
+	test_chain_can_claim_assets!(AssetHubRococo, RuntimeCall, NetworkId::Rococo, assets, amount);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/mod.rs
index 138ce419757..8fffec23d73 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/mod.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/mod.rs
@@ -13,6 +13,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+mod claim_assets;
 mod hybrid_transfers;
 mod reserve_transfer;
 mod send;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs
index db8ada3f4ea..9401621c5ba 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs
@@ -52,6 +52,7 @@ mod imports {
 					XcmConfig as AssetHubWestendXcmConfig,
 				},
 				AssetConversionOrigin as AssetHubWestendAssetConversionOrigin,
+				ExistentialDeposit as AssetHubWestendExistentialDeposit,
 			},
 			genesis::{AssetHubWestendAssetOwner, ED as ASSET_HUB_WESTEND_ED},
 			AssetHubWestendParaPallet as AssetHubWestendPallet,
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/claim_assets.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/claim_assets.rs
new file mode 100644
index 00000000000..de58839634f
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/claim_assets.rs
@@ -0,0 +1,29 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Tests related to claiming assets trapped during XCM execution.
+
+use crate::imports::*;
+
+use emulated_integration_tests_common::test_chain_can_claim_assets;
+use xcm_executor::traits::DropAssets;
+
+#[test]
+fn assets_can_be_claimed() {
+	let amount = AssetHubWestendExistentialDeposit::get();
+	let assets: Assets = (Parent, amount).into();
+
+	test_chain_can_claim_assets!(AssetHubWestend, RuntimeCall, NetworkId::Westend, assets, amount);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs
index 61eb70524fc..73b73b239a1 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs
@@ -13,6 +13,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+mod claim_assets;
 mod fellowship_treasury;
 mod hybrid_transfers;
 mod reserve_transfer;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs
index 04466a611c7..3ee509389c6 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs
@@ -48,7 +48,7 @@ mod imports {
 			genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet,
 		},
 		bridge_hub_rococo_emulated_chain::{
-			genesis::ED as BRIDGE_HUB_ROCOCO_ED,
+			genesis::ED as BRIDGE_HUB_ROCOCO_ED, BridgeHubRococoExistentialDeposit,
 			BridgeHubRococoParaPallet as BridgeHubRococoPallet, BridgeHubRococoRuntimeOrigin,
 			BridgeHubRococoXcmConfig, EthereumBeaconClient, EthereumInboundQueue,
 		},
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/claim_assets.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/claim_assets.rs
new file mode 100644
index 00000000000..e61dc35bdf8
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/claim_assets.rs
@@ -0,0 +1,29 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Tests related to claiming assets trapped during XCM execution.
+
+use crate::imports::*;
+
+use emulated_integration_tests_common::test_chain_can_claim_assets;
+use xcm_executor::traits::DropAssets;
+
+#[test]
+fn assets_can_be_claimed() {
+	let amount = BridgeHubRococoExistentialDeposit::get();
+	let assets: Assets = (Parent, amount).into();
+
+	test_chain_can_claim_assets!(AssetHubRococo, RuntimeCall, NetworkId::Rococo, assets, amount);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs
index 58c52e1328c..ceccf98a024 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs
@@ -16,6 +16,7 @@
 use crate::imports::*;
 
 mod asset_transfers;
+mod claim_assets;
 mod send_xcm;
 mod snowbridge;
 mod teleport;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs
index 3b0fcea57a2..782b83bac47 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs
@@ -48,7 +48,7 @@ mod imports {
 			genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet,
 		},
 		bridge_hub_westend_emulated_chain::{
-			genesis::ED as BRIDGE_HUB_WESTEND_ED,
+			genesis::ED as BRIDGE_HUB_WESTEND_ED, BridgeHubWestendExistentialDeposit,
 			BridgeHubWestendParaPallet as BridgeHubWestendPallet, BridgeHubWestendXcmConfig,
 		},
 		penpal_emulated_chain::{
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/claim_assets.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/claim_assets.rs
new file mode 100644
index 00000000000..e62ce684325
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/claim_assets.rs
@@ -0,0 +1,29 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Tests related to claiming assets trapped during XCM execution.
+
+use crate::imports::*;
+
+use emulated_integration_tests_common::test_chain_can_claim_assets;
+use xcm_executor::traits::DropAssets;
+
+#[test]
+fn assets_can_be_claimed() {
+	let amount = BridgeHubWestendExistentialDeposit::get();
+	let assets: Assets = (Parent, amount).into();
+
+	test_chain_can_claim_assets!(AssetHubWestend, RuntimeCall, NetworkId::Westend, assets, amount);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs
index 92e864229a9..768b647a13f 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs
@@ -16,6 +16,7 @@
 use crate::imports::*;
 
 mod asset_transfers;
+mod claim_assets;
 mod send_xcm;
 mod teleport;
 
diff --git a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/lib.rs
index 8af93a62f4a..e2048b62c31 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/lib.rs
@@ -15,24 +15,42 @@
 
 pub use xcm::{prelude::*, v3};
 
-pub use emulated_integration_tests_common::xcm_emulator::{
-	assert_expected_events, bx, Chain, RelayChain as Relay, TestExt,
+pub use emulated_integration_tests_common::{
+	accounts::ALICE,
+	test_parachain_is_trusted_teleporter,
+	xcm_emulator::{assert_expected_events, bx, Chain, Parachain, RelayChain as Relay, TestExt},
 };
 pub use westend_system_emulated_network::{
 	asset_hub_westend_emulated_chain::{
-		asset_hub_westend_runtime::xcm_config::LocationToAccountId as AssetHubLocationToAccountId,
+		asset_hub_westend_runtime::xcm_config::{
+			LocationToAccountId as AssetHubLocationToAccountId,
+			XcmConfig as AssetHubWestendXcmConfig,
+		},
+		genesis::ED as ASSET_HUB_WESTEND_ED,
 		AssetHubWestendParaPallet as AssetHubWestendPallet,
 	},
 	collectives_westend_emulated_chain::{
-		collectives_westend_runtime::fellowship as collectives_fellowship,
+		collectives_westend_runtime::{
+			fellowship as collectives_fellowship,
+			xcm_config::XcmConfig as CollectivesWestendXcmConfig,
+		},
+		genesis::ED as COLLECTIVES_WESTEND_ED,
 		CollectivesWestendParaPallet as CollectivesWestendPallet,
 	},
 	westend_emulated_chain::{
-		westend_runtime::{governance as westend_governance, OriginCaller as WestendOriginCaller},
+		genesis::ED as WESTEND_ED,
+		westend_runtime::{
+			governance as westend_governance, xcm_config::XcmConfig as WestendXcmConfig,
+			OriginCaller as WestendOriginCaller,
+		},
 		WestendRelayPallet as WestendPallet,
 	},
-	AssetHubWestendPara as AssetHubWestend, CollectivesWestendPara as CollectivesWestend,
-	WestendRelay as Westend,
+	AssetHubWestendPara as AssetHubWestend, AssetHubWestendParaReceiver as AssetHubWestendReceiver,
+	AssetHubWestendParaSender as AssetHubWestendSender,
+	CollectivesWestendPara as CollectivesWestend,
+	CollectivesWestendParaReceiver as CollectivesWestendReceiver,
+	CollectivesWestendParaSender as CollectivesWestendSender, WestendRelay as Westend,
+	WestendRelayReceiver as WestendReceiver, WestendRelaySender as WestendSender,
 };
 
 #[cfg(test)]
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 abd9a982c8e..943f8965540 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
@@ -14,7 +14,6 @@
 // limitations under the License.
 
 use crate::*;
-use emulated_integration_tests_common::accounts::ALICE;
 use frame_support::{
 	assert_ok, dispatch::RawOrigin, instances::Instance1, sp_runtime::traits::Dispatchable,
 	traits::fungible::Inspect,
diff --git a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/mod.rs
index a9f65df34b6..40e98a8b686 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/mod.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/mod.rs
@@ -14,3 +14,4 @@
 // limitations under the License.
 
 mod fellowship_treasury;
+mod teleport;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/teleport.rs
new file mode 100644
index 00000000000..32f543406d7
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/collectives/collectives-westend/src/tests/teleport.rs
@@ -0,0 +1,66 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use crate::*;
+use emulated_integration_tests_common::{
+	test_parachain_is_trusted_teleporter_for_relay, test_relay_is_trusted_teleporter,
+};
+use frame_support::assert_ok;
+
+#[test]
+fn teleport_from_and_to_relay() {
+	let amount = WESTEND_ED * 10;
+	let native_asset: Assets = (Here, amount).into();
+
+	test_relay_is_trusted_teleporter!(
+		Westend,                  // Origin
+		WestendXcmConfig,         // XCM Configuration
+		vec![CollectivesWestend], // Destinations
+		(native_asset, amount)
+	);
+
+	test_parachain_is_trusted_teleporter_for_relay!(
+		CollectivesWestend,          // Origin
+		CollectivesWestendXcmConfig, // XCM Configuration
+		Westend,                     // Destination
+		amount
+	);
+}
+
+#[test]
+fn teleport_from_collectives_to_asset_hub() {
+	let amount = ASSET_HUB_WESTEND_ED * 100;
+	let native_asset: Assets = (Parent, amount).into();
+
+	test_parachain_is_trusted_teleporter!(
+		CollectivesWestend,          // Origin
+		CollectivesWestendXcmConfig, // XCM Configuration
+		vec![AssetHubWestend],       // Destinations
+		(native_asset, amount)
+	);
+}
+
+#[test]
+fn teleport_from_asset_hub_to_collectives() {
+	let amount = COLLECTIVES_WESTEND_ED * 100;
+	let native_asset: Assets = (Parent, amount).into();
+
+	test_parachain_is_trusted_teleporter!(
+		AssetHubWestend,          // Origin
+		AssetHubWestendXcmConfig, // XCM Configuration
+		vec![CollectivesWestend], // Destinations
+		(native_asset, amount)
+	);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/Cargo.toml
new file mode 100644
index 00000000000..259be790c3e
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/Cargo.toml
@@ -0,0 +1,27 @@
+[package]
+name = "coretime-rococo-integration-tests"
+version = "0.1.0"
+authors.workspace = true
+edition.workspace = true
+license = "Apache-2.0"
+description = "Coretime Rococo runtime integration tests with xcm-emulator"
+publish = false
+
+[dependencies]
+
+# Substrate
+frame-support = { workspace = true }
+pallet-balances = { workspace = true }
+pallet-message-queue = { workspace = true }
+pallet-identity = { workspace = true }
+sp-runtime = { workspace = true }
+
+# Polkadot
+polkadot-runtime-common = { workspace = true, default-features = true }
+rococo-runtime-constants = { workspace = true, default-features = true }
+xcm = { workspace = true }
+xcm-executor = { workspace = true }
+
+# Cumulus
+emulated-integration-tests-common = { workspace = true }
+rococo-system-emulated-network = { workspace = true }
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/lib.rs
new file mode 100644
index 00000000000..ad3c4fd58da
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/lib.rs
@@ -0,0 +1,40 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#[cfg(test)]
+mod imports {
+
+	// Substrate
+	pub use frame_support::assert_ok;
+
+	// Polkadot
+	pub use xcm::prelude::*;
+
+	// Cumulus
+	pub use emulated_integration_tests_common::xcm_emulator::{
+		assert_expected_events, bx, TestExt,
+	};
+	pub use rococo_system_emulated_network::{
+		coretime_rococo_emulated_chain::{
+			coretime_rococo_runtime::ExistentialDeposit as CoretimeRococoExistentialDeposit,
+			CoretimeRococoParaPallet as CoretimeRococoPallet,
+		},
+		CoretimeRococoPara as CoretimeRococo, CoretimeRococoParaReceiver as CoretimeRococoReceiver,
+		CoretimeRococoParaSender as CoretimeRococoSender,
+	};
+}
+
+#[cfg(test)]
+mod tests;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/claim_assets.rs b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/claim_assets.rs
new file mode 100644
index 00000000000..e37b915174d
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/claim_assets.rs
@@ -0,0 +1,29 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Tests related to claiming assets trapped during XCM execution.
+
+use crate::imports::*;
+
+use emulated_integration_tests_common::test_chain_can_claim_assets;
+use xcm_executor::traits::DropAssets;
+
+#[test]
+fn assets_can_be_claimed() {
+	let amount = CoretimeRococoExistentialDeposit::get();
+	let assets: Assets = (Parent, amount).into();
+
+	test_chain_can_claim_assets!(CoretimeRococo, RuntimeCall, NetworkId::Rococo, assets, amount);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/mod.rs
new file mode 100644
index 00000000000..0e78351bce0
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-rococo/src/tests/mod.rs
@@ -0,0 +1,16 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+mod claim_assets;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/Cargo.toml
new file mode 100644
index 00000000000..a8fa905d2e5
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/Cargo.toml
@@ -0,0 +1,27 @@
+[package]
+name = "coretime-westend-integration-tests"
+version = "0.1.0"
+authors.workspace = true
+edition.workspace = true
+license = "Apache-2.0"
+description = "Coretime Westend runtime integration tests with xcm-emulator"
+publish = false
+
+[dependencies]
+
+# Substrate
+frame-support = { workspace = true }
+pallet-balances = { workspace = true }
+pallet-message-queue = { workspace = true }
+pallet-identity = { workspace = true }
+sp-runtime = { workspace = true }
+
+# Polkadot
+polkadot-runtime-common = { workspace = true, default-features = true }
+westend-runtime-constants = { workspace = true, default-features = true }
+xcm = { workspace = true }
+xcm-executor = { workspace = true }
+
+# Cumulus
+emulated-integration-tests-common = { workspace = true }
+westend-system-emulated-network = { workspace = true }
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/lib.rs
new file mode 100644
index 00000000000..838ca6eeafb
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/lib.rs
@@ -0,0 +1,41 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#[cfg(test)]
+mod imports {
+
+	// Substrate
+	pub use frame_support::assert_ok;
+
+	// Polkadot
+	pub use xcm::prelude::*;
+
+	// Cumulus
+	pub use emulated_integration_tests_common::xcm_emulator::{
+		assert_expected_events, bx, TestExt,
+	};
+	pub use westend_system_emulated_network::{
+		coretime_westend_emulated_chain::{
+			coretime_westend_runtime::ExistentialDeposit as CoretimeWestendExistentialDeposit,
+			CoretimeWestendParaPallet as CoretimeWestendPallet,
+		},
+		CoretimeWestendPara as CoretimeWestend,
+		CoretimeWestendParaReceiver as CoretimeWestendReceiver,
+		CoretimeWestendParaSender as CoretimeWestendSender,
+	};
+}
+
+#[cfg(test)]
+mod tests;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/claim_assets.rs b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/claim_assets.rs
new file mode 100644
index 00000000000..c8d85369844
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/claim_assets.rs
@@ -0,0 +1,29 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Tests related to claiming assets trapped during XCM execution.
+
+use crate::imports::*;
+
+use emulated_integration_tests_common::test_chain_can_claim_assets;
+use xcm_executor::traits::DropAssets;
+
+#[test]
+fn assets_can_be_claimed() {
+	let amount = CoretimeWestendExistentialDeposit::get();
+	let assets: Assets = (Parent, amount).into();
+
+	test_chain_can_claim_assets!(CoretimeWestend, RuntimeCall, NetworkId::Westend, assets, amount);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/mod.rs
new file mode 100644
index 00000000000..0e78351bce0
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/coretime/coretime-westend/src/tests/mod.rs
@@ -0,0 +1,16 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+mod claim_assets;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs
index 6c23c2f1f29..43cd5bb85d3 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs
@@ -38,7 +38,10 @@ mod imports {
 	pub use rococo_system_emulated_network::{
 		people_rococo_emulated_chain::{
 			genesis::ED as PEOPLE_ROCOCO_ED,
-			people_rococo_runtime::{people, xcm_config::XcmConfig as PeopleRococoXcmConfig},
+			people_rococo_runtime::{
+				people, xcm_config::XcmConfig as PeopleRococoXcmConfig,
+				ExistentialDeposit as PeopleRococoExistentialDeposit,
+			},
 			PeopleRococoParaPallet as PeopleRococoPallet,
 		},
 		rococo_emulated_chain::{
diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/claim_assets.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/claim_assets.rs
new file mode 100644
index 00000000000..793200e1d06
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/claim_assets.rs
@@ -0,0 +1,29 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Tests related to claiming assets trapped during XCM execution.
+
+use crate::imports::*;
+
+use emulated_integration_tests_common::test_chain_can_claim_assets;
+use xcm_executor::traits::DropAssets;
+
+#[test]
+fn assets_can_be_claimed() {
+	let amount = PeopleRococoExistentialDeposit::get();
+	let assets: Assets = (Parent, amount).into();
+
+	test_chain_can_claim_assets!(PeopleRococo, RuntimeCall, NetworkId::Rococo, assets, amount);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/mod.rs
index 80c00021ca5..3f18621224a 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/mod.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/mod.rs
@@ -13,5 +13,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+mod claim_assets;
 mod reap_identity;
 mod teleport;
diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs
index ce1ed9751a2..92f5d291ac8 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs
@@ -38,7 +38,10 @@ mod imports {
 		self,
 		people_westend_emulated_chain::{
 			genesis::ED as PEOPLE_WESTEND_ED,
-			people_westend_runtime::{people, xcm_config::XcmConfig as PeopleWestendXcmConfig},
+			people_westend_runtime::{
+				people, xcm_config::XcmConfig as PeopleWestendXcmConfig,
+				ExistentialDeposit as PeopleWestendExistentialDeposit,
+			},
 			PeopleWestendParaPallet as PeopleWestendPallet,
 		},
 		westend_emulated_chain::{
diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/claim_assets.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/claim_assets.rs
new file mode 100644
index 00000000000..42ccc459286
--- /dev/null
+++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/claim_assets.rs
@@ -0,0 +1,29 @@
+// Copyright (C) Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Tests related to claiming assets trapped during XCM execution.
+
+use crate::imports::*;
+
+use emulated_integration_tests_common::test_chain_can_claim_assets;
+use xcm_executor::traits::DropAssets;
+
+#[test]
+fn assets_can_be_claimed() {
+	let amount = PeopleWestendExistentialDeposit::get();
+	let assets: Assets = (Parent, amount).into();
+
+	test_chain_can_claim_assets!(PeopleWestend, RuntimeCall, NetworkId::Westend, assets, amount);
+}
diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/mod.rs
index 80c00021ca5..3f18621224a 100644
--- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/mod.rs
+++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/mod.rs
@@ -13,5 +13,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+mod claim_assets;
 mod reap_identity;
 mod teleport;
diff --git a/prdoc/pr_4930.prdoc b/prdoc/pr_4930.prdoc
new file mode 100644
index 00000000000..a7c9a302b11
--- /dev/null
+++ b/prdoc/pr_4930.prdoc
@@ -0,0 +1,15 @@
+# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
+# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
+
+title: Add test macro to emulated chains
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      This PR adds a portable test macro that can be used to test trapped assets can be
+      claimed in an emulated chain.
+
+
+crates:
+- name: emulated-integration-tests-common
+  bump: minor
-- 
GitLab