diff --git a/bridges/primitives/test-utils/Cargo.toml b/bridges/primitives/test-utils/Cargo.toml
index 0a591334577af3d7fa91dacd4817450f5fedb460..2bc77e632e5f1ec8423c2ac1c3987e5f4c6add10 100644
--- a/bridges/primitives/test-utils/Cargo.toml
+++ b/bridges/primitives/test-utils/Cargo.toml
@@ -15,6 +15,9 @@ sp-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch
 sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 
+[dev-dependencies]
+xcm = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false }
+
 [features]
 default = ["std"]
 std = [
diff --git a/bridges/primitives/test-utils/src/lib.rs b/bridges/primitives/test-utils/src/lib.rs
index c1e95ec6fefdc769306d8891b6dfc96b0e62ec04..186d192014bb05dc3a0775ff9e2ee9bf9f470064 100644
--- a/bridges/primitives/test-utils/src/lib.rs
+++ b/bridges/primitives/test-utils/src/lib.rs
@@ -299,3 +299,47 @@ macro_rules! generate_owned_bridge_module_tests {
 		}
 	};
 }
+
+#[cfg(test)]
+mod tests {
+	use codec::Encode;
+	use sp_application_crypto::sp_core::{hexdisplay, hexdisplay::HexDisplay};
+	use xcm::VersionedXcm;
+
+	fn print_xcm<RuntimeCall>(xcm: &VersionedXcm<RuntimeCall>) {
+		println!("-----------------");
+		println!("xcm (plain): {:?}", xcm);
+		println!("xcm (bytes): {:?}", xcm.encode());
+		println!("xcm (hex): {:?}", hexdisplay::HexDisplay::from(&xcm.encode()));
+	}
+
+	fn as_hex<RuntimeCall>(xcm: &VersionedXcm<RuntimeCall>) -> String {
+		HexDisplay::from(&xcm.encode()).to_string()
+	}
+
+	pub type RuntimeCall = ();
+
+	#[test]
+	fn generate_versioned_xcm_message_hex_bytes() {
+		let xcm: xcm::v2::Xcm<RuntimeCall> = xcm::v2::Xcm(vec![xcm::v2::Instruction::Trap(43)]);
+		let xcm: VersionedXcm<RuntimeCall> = From::from(xcm);
+		print_xcm(&xcm);
+		assert_eq!("020419ac", format!("{}", as_hex(&xcm)));
+
+		let xcm: xcm::v3::Xcm<RuntimeCall> = vec![xcm::v3::Instruction::Trap(43)].into();
+		let xcm: VersionedXcm<RuntimeCall> = From::from(xcm);
+		print_xcm(&xcm);
+		assert_eq!("030419ac", format!("{}", as_hex(&xcm)));
+
+		let xcm: xcm::v3::Xcm<RuntimeCall> = vec![
+			xcm::v3::Instruction::ClearError,
+			xcm::v3::Instruction::ClearTopic,
+			xcm::v3::Instruction::ClearTransactStatus,
+			xcm::v3::Instruction::Trap(43),
+		]
+		.into();
+		let xcm: VersionedXcm<RuntimeCall> = From::from(xcm);
+		print_xcm(&xcm);
+		assert_eq!("0310172c2319ac", format!("{}", as_hex(&xcm)));
+	}
+}