diff --git a/bridges/primitives/chain-kusama/Cargo.toml b/bridges/primitives/chain-kusama/Cargo.toml
index a676b565c33dce3918c7540bed48384e1f9d7e95..ef902fef824cf400190f1d0e9a221f54e6f21423 100644
--- a/bridges/primitives/chain-kusama/Cargo.toml
+++ b/bridges/primitives/chain-kusama/Cargo.toml
@@ -11,27 +11,17 @@ smallvec = "1.7"
 
 # Bridge Dependencies
 
-bp-messages = { path = "../messages", default-features = false }
 bp-polkadot-core = { path = "../polkadot-core", default-features = false }
 bp-runtime = { path = "../runtime", default-features = false }
 
 # Substrate Based Dependencies
 
-frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
-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 }
-sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 
 [features]
 default = ["std"]
 std = [
-	"bp-messages/std",
 	"bp-polkadot-core/std",
 	"bp-runtime/std",
-	"frame-support/std",
 	"sp-api/std",
-	"sp-runtime/std",
-	"sp-std/std",
-	"sp-version/std",
 ]
diff --git a/bridges/primitives/chain-kusama/src/lib.rs b/bridges/primitives/chain-kusama/src/lib.rs
index 0b218b22250fddae5cfcdddd613278d7deb0c4e0..7837afe690e4a578f10faad4e118f023a3e4ad2d 100644
--- a/bridges/primitives/chain-kusama/src/lib.rs
+++ b/bridges/primitives/chain-kusama/src/lib.rs
@@ -18,58 +18,12 @@
 // RuntimeApi generated functions
 #![allow(clippy::too_many_arguments)]
 
-use bp_messages::{
-	InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails,
-};
-use frame_support::weights::{
-	WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial,
-};
-use sp_runtime::FixedU128;
-use sp_std::prelude::*;
-use sp_version::RuntimeVersion;
-
 pub use bp_polkadot_core::*;
-use bp_runtime::decl_bridge_runtime_apis;
+use bp_runtime::decl_bridge_finality_runtime_apis;
 
 /// Kusama Chain
 pub type Kusama = PolkadotLike;
 
-// NOTE: This needs to be kept up to date with the Kusama runtime found in the Polkadot repo.
-pub const VERSION: RuntimeVersion = RuntimeVersion {
-	spec_name: sp_version::create_runtime_str!("kusama"),
-	impl_name: sp_version::create_runtime_str!("parity-kusama"),
-	authoring_version: 2,
-	spec_version: 9180,
-	impl_version: 0,
-	apis: sp_version::create_apis_vec![[]],
-	transaction_version: 11,
-	state_version: 0,
-};
-
-// NOTE: This needs to be kept up to date with the Kusama runtime found in the Polkadot repo.
-pub struct WeightToFee;
-impl WeightToFeePolynomial for WeightToFee {
-	type Balance = Balance;
-	fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {
-		const CENTS: Balance = 1_000_000_000_000 / 30_000;
-		// in Kusama, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT:
-		let p = CENTS;
-		let q = 10 * Balance::from(ExtrinsicBaseWeight::get());
-		smallvec::smallvec![WeightToFeeCoefficient {
-			degree: 1,
-			negative: false,
-			coeff_frac: Perbill::from_rational(p % q, q),
-			coeff_integer: p / q,
-		}]
-	}
-}
-
-/// Per-byte fee for Kusama transactions.
-pub const TRANSACTION_BYTE_FEE: Balance = 10 * 1_000_000_000_000 / 30_000 / 1_000;
-
-/// Existential deposit on Kusama.
-pub const EXISTENTIAL_DEPOSIT: Balance = 1_000_000_000_000 / 30_000;
-
 /// The target length of a session (how often authorities change) on Kusama measured in of number of
 /// blocks.
 ///
@@ -79,16 +33,5 @@ pub const SESSION_LENGTH: BlockNumber = time_units::HOURS;
 
 /// Name of the With-Kusama GRANDPA pallet instance that is deployed at bridged chains.
 pub const WITH_KUSAMA_GRANDPA_PALLET_NAME: &str = "BridgeKusamaGrandpa";
-/// Name of the With-Kusama messages pallet instance that is deployed at bridged chains.
-pub const WITH_KUSAMA_MESSAGES_PALLET_NAME: &str = "BridgeKusamaMessages";
-
-/// Name of the transaction payment pallet at the Kusama runtime.
-pub const TRANSACTION_PAYMENT_PALLET_NAME: &str = "TransactionPayment";
-
-/// Name of the DOT->KSM conversion rate stored in the Kusama runtime.
-pub const POLKADOT_TO_KUSAMA_CONVERSION_RATE_PARAMETER_NAME: &str =
-	"PolkadotToKusamaConversionRate";
-/// Name of the Polkadot fee multiplier parameter, stored in the Polkadot runtime.
-pub const POLKADOT_FEE_MULTIPLIER_PARAMETER_NAME: &str = "PolkadotFeeMultiplier";
 
-decl_bridge_runtime_apis!(kusama);
+decl_bridge_finality_runtime_apis!(kusama);
diff --git a/bridges/primitives/chain-polkadot/Cargo.toml b/bridges/primitives/chain-polkadot/Cargo.toml
index 738899b658cdf133be64a05b365c9b5923d171e3..8be9b25c77f5a3397bb7b0f1672400d44d1d2796 100644
--- a/bridges/primitives/chain-polkadot/Cargo.toml
+++ b/bridges/primitives/chain-polkadot/Cargo.toml
@@ -11,27 +11,17 @@ smallvec = "1.7"
 
 # Bridge Dependencies
 
-bp-messages = { path = "../messages", default-features = false }
 bp-polkadot-core = { path = "../polkadot-core", default-features = false }
 bp-runtime = { path = "../runtime", default-features = false }
 
 # Substrate Based Dependencies
 
-frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
-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 }
-sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 
 [features]
 default = ["std"]
 std = [
-	"bp-messages/std",
 	"bp-polkadot-core/std",
 	"bp-runtime/std",
-	"frame-support/std",
 	"sp-api/std",
-	"sp-runtime/std",
-	"sp-std/std",
-	"sp-version/std",
 ]
diff --git a/bridges/primitives/chain-polkadot/src/lib.rs b/bridges/primitives/chain-polkadot/src/lib.rs
index 6f584f5526a22b450e8ee3dfca7a7f69f825fa17..cfcbacb0d1a76021d32f32f2e6337dde4d8c92a3 100644
--- a/bridges/primitives/chain-polkadot/src/lib.rs
+++ b/bridges/primitives/chain-polkadot/src/lib.rs
@@ -18,58 +18,12 @@
 // RuntimeApi generated functions
 #![allow(clippy::too_many_arguments)]
 
-use bp_messages::{
-	InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails,
-};
-use frame_support::weights::{
-	WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial,
-};
-use sp_runtime::FixedU128;
-use sp_std::prelude::*;
-use sp_version::RuntimeVersion;
-
 pub use bp_polkadot_core::*;
-use bp_runtime::decl_bridge_runtime_apis;
+use bp_runtime::decl_bridge_finality_runtime_apis;
 
 /// Polkadot Chain
 pub type Polkadot = PolkadotLike;
 
-// NOTE: This needs to be kept up to date with the Polkadot runtime found in the Polkadot repo.
-pub const VERSION: RuntimeVersion = RuntimeVersion {
-	spec_name: sp_version::create_runtime_str!("polkadot"),
-	impl_name: sp_version::create_runtime_str!("parity-polkadot"),
-	authoring_version: 0,
-	spec_version: 9180,
-	impl_version: 0,
-	apis: sp_version::create_apis_vec![[]],
-	transaction_version: 12,
-	state_version: 0,
-};
-
-// NOTE: This needs to be kept up to date with the Polkadot runtime found in the Polkadot repo.
-pub struct WeightToFee;
-impl WeightToFeePolynomial for WeightToFee {
-	type Balance = Balance;
-	fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {
-		const CENTS: Balance = 10_000_000_000 / 100;
-		// in Polkadot, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT:
-		let p = CENTS;
-		let q = 10 * Balance::from(ExtrinsicBaseWeight::get());
-		smallvec::smallvec![WeightToFeeCoefficient {
-			degree: 1,
-			negative: false,
-			coeff_frac: Perbill::from_rational(p % q, q),
-			coeff_integer: p / q,
-		}]
-	}
-}
-
-/// Per-byte fee for Polkadot transactions.
-pub const TRANSACTION_BYTE_FEE: Balance = 10 * 10_000_000_000 / 100 / 1_000;
-
-/// Existential deposit on Polkadot.
-pub const EXISTENTIAL_DEPOSIT: Balance = 10_000_000_000;
-
 /// The target length of a session (how often authorities change) on Polkadot measured in of number
 /// of blocks.
 ///
@@ -79,16 +33,5 @@ pub const SESSION_LENGTH: BlockNumber = 4 * time_units::HOURS;
 
 /// Name of the With-Polkadot GRANDPA pallet instance that is deployed at bridged chains.
 pub const WITH_POLKADOT_GRANDPA_PALLET_NAME: &str = "BridgePolkadotGrandpa";
-/// Name of the With-Polkadot messages pallet instance that is deployed at bridged chains.
-pub const WITH_POLKADOT_MESSAGES_PALLET_NAME: &str = "BridgePolkadotMessages";
-
-/// Name of the transaction payment pallet at the Polkadot runtime.
-pub const TRANSACTION_PAYMENT_PALLET_NAME: &str = "TransactionPayment";
-
-/// Name of the KSM->DOT conversion rate parameter, stored in the Polkadot runtime.
-pub const KUSAMA_TO_POLKADOT_CONVERSION_RATE_PARAMETER_NAME: &str =
-	"KusamaToPolkadotConversionRate";
-/// Name of the Kusama fee multiplier parameter, stored in the Polkadot runtime.
-pub const KUSAMA_FEE_MULTIPLIER_PARAMETER_NAME: &str = "KusamaFeeMultiplier";
 
-decl_bridge_runtime_apis!(polkadot);
+decl_bridge_finality_runtime_apis!(polkadot);
diff --git a/bridges/primitives/chain-rococo/Cargo.toml b/bridges/primitives/chain-rococo/Cargo.toml
index fe6b07eeb766db888f5a23fc72c408ebfddf01fa..730fad599bb10d4a475de1a5521645a85a10159b 100644
--- a/bridges/primitives/chain-rococo/Cargo.toml
+++ b/bridges/primitives/chain-rococo/Cargo.toml
@@ -7,31 +7,19 @@ edition = "2021"
 license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
 
 [dependencies]
-codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] }
 smallvec = "1.7"
 
 # Bridge Dependencies
-bp-messages = { path = "../messages", default-features = false }
 bp-polkadot-core = { path = "../polkadot-core", default-features = false }
 bp-runtime = { path = "../runtime", default-features = false }
 
 # Substrate Based Dependencies
-frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
-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 }
-sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 
 [features]
 default = ["std"]
 std = [
-	"bp-messages/std",
 	"bp-polkadot-core/std",
 	"bp-runtime/std",
-	"frame-support/std",
-	"codec/std",
 	"sp-api/std",
-	"sp-runtime/std",
-	"sp-std/std",
-	"sp-version/std",
 ]
diff --git a/bridges/primitives/chain-rococo/src/lib.rs b/bridges/primitives/chain-rococo/src/lib.rs
index aa1d40ce92e25ea65863d7dd90adef230c9ed0a9..39188066dca4b44802d76609b42aee6308871ffa 100644
--- a/bridges/primitives/chain-rococo/src/lib.rs
+++ b/bridges/primitives/chain-rococo/src/lib.rs
@@ -18,18 +18,8 @@
 // RuntimeApi generated functions
 #![allow(clippy::too_many_arguments)]
 
-use bp_messages::{
-	InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails,
-};
-use frame_support::weights::{
-	Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial,
-};
-use sp_runtime::FixedU128;
-use sp_std::prelude::*;
-use sp_version::RuntimeVersion;
-
 pub use bp_polkadot_core::*;
-use bp_runtime::decl_bridge_runtime_apis;
+use bp_runtime::decl_bridge_finality_runtime_apis;
 
 /// Rococo Chain
 pub type Rococo = PolkadotLike;
@@ -41,50 +31,7 @@ pub type Rococo = PolkadotLike;
 /// conditions.
 pub const SESSION_LENGTH: BlockNumber = time_units::HOURS;
 
-// NOTE: This needs to be kept up to date with the Rococo runtime found in the Polkadot repo.
-pub const VERSION: RuntimeVersion = RuntimeVersion {
-	spec_name: sp_version::create_runtime_str!("rococo"),
-	impl_name: sp_version::create_runtime_str!("parity-rococo-v2.0"),
-	authoring_version: 0,
-	spec_version: 9200,
-	impl_version: 0,
-	apis: sp_version::create_apis_vec![[]],
-	transaction_version: 0,
-	state_version: 0,
-};
-
-// NOTE: This needs to be kept up to date with the Rococo runtime found in the Polkadot repo.
-pub struct WeightToFee;
-impl WeightToFeePolynomial for WeightToFee {
-	type Balance = Balance;
-	fn polynomial() -> WeightToFeeCoefficients<Balance> {
-		const CENTS: Balance = 1_000_000_000_000 / 100;
-		let p = CENTS;
-		let q = 10 * Balance::from(ExtrinsicBaseWeight::get());
-		smallvec::smallvec![WeightToFeeCoefficient {
-			degree: 1,
-			negative: false,
-			coeff_frac: Perbill::from_rational(p % q, q),
-			coeff_integer: p / q,
-		}]
-	}
-}
-
 /// Name of the With-Rococo GRANDPA pallet instance that is deployed at bridged chains.
 pub const WITH_ROCOCO_GRANDPA_PALLET_NAME: &str = "BridgeRococoGrandpa";
-/// Name of the With-Rococo messages pallet instance that is deployed at bridged chains.
-pub const WITH_ROCOCO_MESSAGES_PALLET_NAME: &str = "BridgeRococoMessages";
-
-/// Existential deposit on Rococo.
-pub const EXISTENTIAL_DEPOSIT: Balance = 1_000_000_000_000 / 100;
-
-/// Weight of pay-dispatch-fee operation for inbound messages at Rococo chain.
-///
-/// This value corresponds to the result of
-/// `pallet_bridge_messages::WeightInfoExt::pay_inbound_dispatch_fee_overhead()` call for your
-/// chain. Don't put too much reserve there, because it is used to **decrease**
-/// `DEFAULT_MESSAGE_DELIVERY_TX_WEIGHT` cost. So putting large reserve would make delivery
-/// transactions cheaper.
-pub const PAY_INBOUND_DISPATCH_FEE_WEIGHT: Weight = 600_000_000;
 
-decl_bridge_runtime_apis!(rococo);
+decl_bridge_finality_runtime_apis!(rococo);
diff --git a/bridges/primitives/chain-westend/Cargo.toml b/bridges/primitives/chain-westend/Cargo.toml
index f37aa3b0e397e2a83aae62b5b277d14c70275ba3..ca5840b9dea5f01c6c23ef802b761e705329f994 100644
--- a/bridges/primitives/chain-westend/Cargo.toml
+++ b/bridges/primitives/chain-westend/Cargo.toml
@@ -19,11 +19,8 @@ bp-runtime = { path = "../runtime", default-features = false }
 
 # Substrate Based Dependencies
 
-frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 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 }
-sp-version = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 
 [features]
 default = ["std"]
@@ -31,11 +28,8 @@ std = [
 	"bp-header-chain/std",
 	"bp-polkadot-core/std",
 	"bp-runtime/std",
-	"frame-support/std",
 	"codec/std",
 	"scale-info/std",
 	"sp-api/std",
 	"sp-runtime/std",
-	"sp-std/std",
-	"sp-version/std",
 ]
diff --git a/bridges/primitives/chain-westend/src/lib.rs b/bridges/primitives/chain-westend/src/lib.rs
index 1e023295a8a0fd004117177034942162c84598a4..08803b7a3dd392073b64f2055e7d197b21c22337 100644
--- a/bridges/primitives/chain-westend/src/lib.rs
+++ b/bridges/primitives/chain-westend/src/lib.rs
@@ -18,12 +18,7 @@
 // RuntimeApi generated functions
 #![allow(clippy::too_many_arguments)]
 
-use frame_support::weights::{
-	WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial,
-};
 use scale_info::TypeInfo;
-use sp_std::prelude::*;
-use sp_version::RuntimeVersion;
 
 pub use bp_polkadot_core::*;
 use bp_runtime::decl_bridge_finality_runtime_apis;
@@ -31,36 +26,6 @@ use bp_runtime::decl_bridge_finality_runtime_apis;
 /// Westend Chain
 pub type Westend = PolkadotLike;
 
-// NOTE: This needs to be kept up to date with the Westend runtime found in the Polkadot repo.
-pub struct WeightToFee;
-impl WeightToFeePolynomial for WeightToFee {
-	type Balance = Balance;
-	fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {
-		const CENTS: Balance = 1_000_000_000_000 / 1_000;
-		// in Westend, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT:
-		let p = CENTS;
-		let q = 10 * Balance::from(ExtrinsicBaseWeight::get());
-		smallvec::smallvec![WeightToFeeCoefficient {
-			degree: 1,
-			negative: false,
-			coeff_frac: Perbill::from_rational(p % q, q),
-			coeff_integer: p / q,
-		}]
-	}
-}
-
-// NOTE: This needs to be kept up to date with the Westend runtime found in the Polkadot repo.
-pub const VERSION: RuntimeVersion = RuntimeVersion {
-	spec_name: sp_version::create_runtime_str!("westend"),
-	impl_name: sp_version::create_runtime_str!("parity-westend"),
-	authoring_version: 2,
-	spec_version: 9140,
-	impl_version: 0,
-	apis: sp_version::create_apis_vec![[]],
-	transaction_version: 8,
-	state_version: 0,
-};
-
 /// Westend Runtime `Call` enum.
 ///
 /// We are not currently submitting any Westend transactions => it is empty.
diff --git a/bridges/primitives/chain-wococo/Cargo.toml b/bridges/primitives/chain-wococo/Cargo.toml
index 92e7c9e80e279e1f4390afd10baac978ad751bc8..27297fe98543ac3a826a6277ff74d81e0105e604 100644
--- a/bridges/primitives/chain-wococo/Cargo.toml
+++ b/bridges/primitives/chain-wococo/Cargo.toml
@@ -7,28 +7,20 @@ edition = "2021"
 license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
 
 [dependencies]
-codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] }
 
 # Bridge Dependencies
-bp-messages = { path = "../messages", default-features = false }
 bp-polkadot-core = { path = "../polkadot-core", default-features = false }
 bp-rococo = { path = "../chain-rococo", default-features = false }
 bp-runtime = { path = "../runtime", default-features = false }
 
 # Substrate Based Dependencies
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
-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 }
 
 [features]
 default = ["std"]
 std = [
-	"bp-messages/std",
 	"bp-polkadot-core/std",
 	"bp-runtime/std",
 	"bp-rococo/std",
-	"codec/std",
 	"sp-api/std",
-	"sp-runtime/std",
-	"sp-std/std",
 ]
diff --git a/bridges/primitives/chain-wococo/src/lib.rs b/bridges/primitives/chain-wococo/src/lib.rs
index c1626b0dc67d04c5c5a6aceb49f556ec038273d0..2a417479d3b2fe5e3f9114587f7083691e8dc4a6 100644
--- a/bridges/primitives/chain-wococo/src/lib.rs
+++ b/bridges/primitives/chain-wococo/src/lib.rs
@@ -18,16 +18,8 @@
 // RuntimeApi generated functions
 #![allow(clippy::too_many_arguments)]
 
-use bp_messages::{
-	InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails,
-};
-use sp_runtime::FixedU128;
-use sp_std::prelude::*;
-
 pub use bp_polkadot_core::*;
-// Rococo runtime = Wococo runtime
-pub use bp_rococo::{WeightToFee, EXISTENTIAL_DEPOSIT, PAY_INBOUND_DISPATCH_FEE_WEIGHT, VERSION};
-use bp_runtime::decl_bridge_runtime_apis;
+use bp_runtime::decl_bridge_finality_runtime_apis;
 
 /// Wococo Chain
 pub type Wococo = PolkadotLike;
@@ -41,7 +33,5 @@ pub const SESSION_LENGTH: BlockNumber = time_units::MINUTES;
 
 /// Name of the With-Wococo GRANDPA pallet instance that is deployed at bridged chains.
 pub const WITH_WOCOCO_GRANDPA_PALLET_NAME: &str = "BridgeWococoGrandpa";
-/// Name of the With-Wococo messages pallet instance that is deployed at bridged chains.
-pub const WITH_WOCOCO_MESSAGES_PALLET_NAME: &str = "BridgeWococoMessages";
 
-decl_bridge_runtime_apis!(wococo);
+decl_bridge_finality_runtime_apis!(wococo);
diff --git a/bridges/relays/bin-substrate/src/chains/millau.rs b/bridges/relays/bin-substrate/src/chains/millau.rs
index b71ecb288e9d011cc43197fd9f6c75ce0722a780..59d53edf997e076e0ce6effdd2be6892db6659e6 100644
--- a/bridges/relays/bin-substrate/src/chains/millau.rs
+++ b/bridges/relays/bin-substrate/src/chains/millau.rs
@@ -90,7 +90,7 @@ impl CliEncodeMessage for Millau {
 }
 
 impl CliChain for Millau {
-	const RUNTIME_VERSION: RuntimeVersion = millau_runtime::VERSION;
+	const RUNTIME_VERSION: Option<RuntimeVersion> = Some(millau_runtime::VERSION);
 
 	type KeyPair = sp_core::sr25519::Pair;
 	type MessagePayload = Vec<u8>;
diff --git a/bridges/relays/bin-substrate/src/chains/rialto.rs b/bridges/relays/bin-substrate/src/chains/rialto.rs
index 9dd86c9d953390f730f44b33087a2431e896e972..285476a331298feeff937c5cbc5a0b33bc0b325b 100644
--- a/bridges/relays/bin-substrate/src/chains/rialto.rs
+++ b/bridges/relays/bin-substrate/src/chains/rialto.rs
@@ -73,7 +73,7 @@ impl CliEncodeMessage for Rialto {
 }
 
 impl CliChain for Rialto {
-	const RUNTIME_VERSION: RuntimeVersion = rialto_runtime::VERSION;
+	const RUNTIME_VERSION: Option<RuntimeVersion> = Some(rialto_runtime::VERSION);
 
 	type KeyPair = sp_core::sr25519::Pair;
 	type MessagePayload = Vec<u8>;
diff --git a/bridges/relays/bin-substrate/src/chains/rialto_parachain.rs b/bridges/relays/bin-substrate/src/chains/rialto_parachain.rs
index 8cd7135c27a3c06f8984114b89694352780b4d81..c359c42087d4601f17b77e8ec7fee9a8ae817a73 100644
--- a/bridges/relays/bin-substrate/src/chains/rialto_parachain.rs
+++ b/bridges/relays/bin-substrate/src/chains/rialto_parachain.rs
@@ -74,7 +74,7 @@ impl CliEncodeMessage for RialtoParachain {
 }
 
 impl CliChain for RialtoParachain {
-	const RUNTIME_VERSION: RuntimeVersion = rialto_parachain_runtime::VERSION;
+	const RUNTIME_VERSION: Option<RuntimeVersion> = Some(rialto_parachain_runtime::VERSION);
 
 	type KeyPair = sp_core::sr25519::Pair;
 	type MessagePayload = Vec<u8>;
diff --git a/bridges/relays/bin-substrate/src/chains/westend.rs b/bridges/relays/bin-substrate/src/chains/westend.rs
index ae5294470748746e538d0c146fd738c158cdc925..8d43d6a5ab70908c3e1cd9e0dde990f4f3785246 100644
--- a/bridges/relays/bin-substrate/src/chains/westend.rs
+++ b/bridges/relays/bin-substrate/src/chains/westend.rs
@@ -21,7 +21,7 @@ use relay_westend_client::{Westend, Westmint};
 use sp_version::RuntimeVersion;
 
 impl CliChain for Westend {
-	const RUNTIME_VERSION: RuntimeVersion = bp_westend::VERSION;
+	const RUNTIME_VERSION: Option<RuntimeVersion> = None;
 
 	type KeyPair = sp_core::sr25519::Pair;
 	type MessagePayload = Vec<u8>;
@@ -35,7 +35,7 @@ impl CliChain for Westend {
 }
 
 impl CliChain for Westmint {
-	const RUNTIME_VERSION: RuntimeVersion = bp_westend::VERSION;
+	const RUNTIME_VERSION: Option<RuntimeVersion> = None;
 
 	type KeyPair = sp_core::sr25519::Pair;
 	type MessagePayload = Vec<u8>;
diff --git a/bridges/relays/bin-substrate/src/cli/chain_schema.rs b/bridges/relays/bin-substrate/src/cli/chain_schema.rs
index 0f108aed6de5294aed81d69c27cd6ac649b5ad7a..8023fd9b0f7f6db8e461c5b325cac7c67e9c0bdf 100644
--- a/bridges/relays/bin-substrate/src/cli/chain_schema.rs
+++ b/bridges/relays/bin-substrate/src/cli/chain_schema.rs
@@ -115,7 +115,7 @@ macro_rules! declare_chain_connection_params_cli_schema {
 				) -> anyhow::Result<relay_substrate_client::Client<Chain>> {
 					let chain_runtime_version = self
 						.[<$chain_prefix _runtime_version>]
-						.into_runtime_version(Some(Chain::RUNTIME_VERSION))?;
+						.into_runtime_version(Chain::RUNTIME_VERSION)?;
 					Ok(relay_substrate_client::Client::new(relay_substrate_client::ConnectionParams {
 						host: self.[<$chain_prefix _host>],
 						port: self.[<$chain_prefix _port>],
diff --git a/bridges/relays/bin-substrate/src/cli/mod.rs b/bridges/relays/bin-substrate/src/cli/mod.rs
index 44bfce9f384ec82edb59b1203118a6e60078152e..42a073bd4f65aac1655c2b826d264af336655f06 100644
--- a/bridges/relays/bin-substrate/src/cli/mod.rs
+++ b/bridges/relays/bin-substrate/src/cli/mod.rs
@@ -163,7 +163,9 @@ impl Balance {
 /// Used to abstract away CLI commands.
 pub trait CliChain: relay_substrate_client::Chain {
 	/// Current version of the chain runtime, known to relay.
-	const RUNTIME_VERSION: sp_version::RuntimeVersion;
+	///
+	/// can be `None` if relay is not going to submit transactions to that chain.
+	const RUNTIME_VERSION: Option<sp_version::RuntimeVersion>;
 
 	/// Crypto KeyPair type used to send messages.
 	///
diff --git a/bridges/relays/client-kusama/src/lib.rs b/bridges/relays/client-kusama/src/lib.rs
index b076da7ab750b20e97aa61bf0f9bad3c9144db4f..cdf7213df9bbbc7d398d72a1f8c9dfafa85091e6 100644
--- a/bridges/relays/client-kusama/src/lib.rs
+++ b/bridges/relays/client-kusama/src/lib.rs
@@ -58,7 +58,6 @@ impl Chain for Kusama {
 
 	type SignedBlock = bp_kusama::SignedBlock;
 	type Call = ();
-	type WeightToFee = bp_kusama::WeightToFee;
 }
 
 impl ChainWithGrandpa for Kusama {
diff --git a/bridges/relays/client-millau/src/lib.rs b/bridges/relays/client-millau/src/lib.rs
index 7bab3669c4d02f4bbda01ee27dc910e9b216ec0e..3c861214df4cfa192965e8e2b15373266eda006b 100644
--- a/bridges/relays/client-millau/src/lib.rs
+++ b/bridges/relays/client-millau/src/lib.rs
@@ -71,6 +71,7 @@ impl ChainWithMessages for Millau {
 		bp_millau::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX;
 	const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce =
 		bp_millau::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX;
+	type WeightToFee = bp_millau::WeightToFee;
 	type WeightInfo = ();
 }
 
@@ -85,7 +86,6 @@ impl Chain for Millau {
 
 	type SignedBlock = millau_runtime::SignedBlock;
 	type Call = millau_runtime::Call;
-	type WeightToFee = bp_millau::WeightToFee;
 }
 
 impl ChainWithBalances for Millau {
diff --git a/bridges/relays/client-polkadot/src/lib.rs b/bridges/relays/client-polkadot/src/lib.rs
index 9327c76c4ef394279ece19cc01c2974c8aa39a82..bb3867fda5318287919ea72d63c8361141c03ed7 100644
--- a/bridges/relays/client-polkadot/src/lib.rs
+++ b/bridges/relays/client-polkadot/src/lib.rs
@@ -58,7 +58,6 @@ impl Chain for Polkadot {
 
 	type SignedBlock = bp_polkadot::SignedBlock;
 	type Call = ();
-	type WeightToFee = bp_polkadot::WeightToFee;
 }
 
 impl ChainWithGrandpa for Polkadot {
diff --git a/bridges/relays/client-rialto-parachain/src/lib.rs b/bridges/relays/client-rialto-parachain/src/lib.rs
index c678a21420fd4f03f0eb3553bf1e0a100c66c6dd..489baa4be5aad96cc07815939762e201f24a3ac7 100644
--- a/bridges/relays/client-rialto-parachain/src/lib.rs
+++ b/bridges/relays/client-rialto-parachain/src/lib.rs
@@ -66,7 +66,6 @@ impl Chain for RialtoParachain {
 
 	type SignedBlock = rialto_parachain_runtime::SignedBlock;
 	type Call = rialto_parachain_runtime::Call;
-	type WeightToFee = bp_rialto_parachain::WeightToFee;
 }
 
 impl ChainWithBalances for RialtoParachain {
@@ -93,6 +92,7 @@ impl ChainWithMessages for RialtoParachain {
 		bp_rialto_parachain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX;
 	const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce =
 		bp_rialto_parachain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX;
+	type WeightToFee = bp_rialto_parachain::WeightToFee;
 	type WeightInfo = ();
 }
 
diff --git a/bridges/relays/client-rialto/src/lib.rs b/bridges/relays/client-rialto/src/lib.rs
index b2984336cd265f7c13df5b8ef42619c15e62fff1..816a21baf0c5e916cf08a9da161da1bd8ff2f1d1 100644
--- a/bridges/relays/client-rialto/src/lib.rs
+++ b/bridges/relays/client-rialto/src/lib.rs
@@ -66,7 +66,6 @@ impl Chain for Rialto {
 
 	type SignedBlock = rialto_runtime::SignedBlock;
 	type Call = rialto_runtime::Call;
-	type WeightToFee = bp_rialto::WeightToFee;
 }
 
 impl RelayChain for Rialto {
@@ -92,6 +91,7 @@ impl ChainWithMessages for Rialto {
 		bp_rialto::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX;
 	const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce =
 		bp_rialto::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX;
+	type WeightToFee = bp_rialto::WeightToFee;
 	type WeightInfo = ();
 }
 
diff --git a/bridges/relays/client-rococo/src/lib.rs b/bridges/relays/client-rococo/src/lib.rs
index c33af96aedf65358f95d1b7682d1c234bcec0285..f4905d52dc7ee68ea8254c68a2b9b29e3111863a 100644
--- a/bridges/relays/client-rococo/src/lib.rs
+++ b/bridges/relays/client-rococo/src/lib.rs
@@ -61,7 +61,6 @@ impl Chain for Rococo {
 
 	type SignedBlock = bp_rococo::SignedBlock;
 	type Call = ();
-	type WeightToFee = bp_rococo::WeightToFee;
 }
 
 impl ChainWithGrandpa for Rococo {
diff --git a/bridges/relays/client-substrate/src/chain.rs b/bridges/relays/client-substrate/src/chain.rs
index 9562d68d4611ba3297887035fb4474e2d5e9727a..3f483078cac793470d6649935d2cf4b455970b8f 100644
--- a/bridges/relays/client-substrate/src/chain.rs
+++ b/bridges/relays/client-substrate/src/chain.rs
@@ -59,9 +59,6 @@ pub trait Chain: ChainBase + Clone {
 	type SignedBlock: Member + Serialize + DeserializeOwned + BlockWithJustification<Self::Header>;
 	/// The aggregated `Call` type.
 	type Call: Clone + Codec + Dispatchable + Debug + Send;
-
-	/// Type that is used by the chain, to convert from weight to fee.
-	type WeightToFee: WeightToFee<Balance = Self::Balance>;
 }
 
 /// Substrate-based relay chain that supports parachains.
@@ -120,6 +117,8 @@ pub trait ChainWithMessages: Chain {
 	/// `ChainWithMessages`.
 	const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce;
 
+	/// Type that is used by the chain, to convert from weight to fee.
+	type WeightToFee: WeightToFee<Balance = Self::Balance>;
 	/// Weights of message pallet calls.
 	type WeightInfo: pallet_bridge_messages::WeightInfoExt;
 }
@@ -127,7 +126,7 @@ pub trait ChainWithMessages: Chain {
 /// Call type used by the chain.
 pub type CallOf<C> = <C as Chain>::Call;
 /// Weight-to-Fee type used by the chain.
-pub type WeightToFeeOf<C> = <C as Chain>::WeightToFee;
+pub type WeightToFeeOf<C> = <C as ChainWithMessages>::WeightToFee;
 /// Transaction status of the chain.
 pub type TransactionStatusOf<C> = TransactionStatus<HashOf<C>, HashOf<C>>;
 
diff --git a/bridges/relays/client-substrate/src/test_chain.rs b/bridges/relays/client-substrate/src/test_chain.rs
index f9a9e2455ed99ddd12d8f038853e79dd41897ed4..8e1832db08453dbf300633cba6b95d5c67a0d4da 100644
--- a/bridges/relays/client-substrate/src/test_chain.rs
+++ b/bridges/relays/client-substrate/src/test_chain.rs
@@ -22,7 +22,7 @@
 #![cfg(any(feature = "test-helpers", test))]
 
 use crate::{Chain, ChainWithBalances};
-use frame_support::weights::{IdentityFee, Weight};
+use frame_support::weights::Weight;
 use std::time::Duration;
 
 /// Chain that may be used in tests.
@@ -60,7 +60,6 @@ impl Chain for TestChain {
 		sp_runtime::generic::Block<Self::Header, sp_runtime::OpaqueExtrinsic>,
 	>;
 	type Call = ();
-	type WeightToFee = IdentityFee<u32>;
 }
 
 impl ChainWithBalances for TestChain {
diff --git a/bridges/relays/client-westend/src/lib.rs b/bridges/relays/client-westend/src/lib.rs
index 4b27bfeb82d8ac02e25fe6b092eab173e3811a1c..f6a4220c618a4c1bbe7a4f93d6c3bb81e0adc113 100644
--- a/bridges/relays/client-westend/src/lib.rs
+++ b/bridges/relays/client-westend/src/lib.rs
@@ -61,7 +61,6 @@ impl Chain for Westend {
 
 	type SignedBlock = bp_westend::SignedBlock;
 	type Call = bp_westend::Call;
-	type WeightToFee = bp_westend::WeightToFee;
 }
 
 impl RelayChain for Westend {
@@ -119,5 +118,4 @@ impl Chain for Westmint {
 
 	type SignedBlock = bp_westend::SignedBlock;
 	type Call = bp_westend::Call;
-	type WeightToFee = bp_westend::WeightToFee;
 }
diff --git a/bridges/relays/client-wococo/src/lib.rs b/bridges/relays/client-wococo/src/lib.rs
index 06a63e7d2b46ca84371c35f7d9e2527f93dc58e1..87da6fb83679ea6e5adb30090f449e69be3f8436 100644
--- a/bridges/relays/client-wococo/src/lib.rs
+++ b/bridges/relays/client-wococo/src/lib.rs
@@ -61,7 +61,6 @@ impl Chain for Wococo {
 
 	type SignedBlock = bp_wococo::SignedBlock;
 	type Call = ();
-	type WeightToFee = bp_wococo::WeightToFee;
 }
 
 impl ChainWithGrandpa for Wococo {
diff --git a/bridges/relays/lib-substrate-relay/src/messages_target.rs b/bridges/relays/lib-substrate-relay/src/messages_target.rs
index 4e5ba6ae087bcfae6bee268fc6faf31ea651b25f..21a43112f81ca730ac88f1ea1f2a73b78232952f 100644
--- a/bridges/relays/lib-substrate-relay/src/messages_target.rs
+++ b/bridges/relays/lib-substrate-relay/src/messages_target.rs
@@ -497,7 +497,7 @@ where
 /// **WARNING**: this functions will only be accurate if weight-to-fee conversion function
 /// is linear. For non-linear polynomials the error will grow with `weight_difference` growth.
 /// So better to use smaller differences.
-fn compute_fee_multiplier<C: Chain>(
+fn compute_fee_multiplier<C: ChainWithMessages>(
 	smaller_adjusted_weight_fee: BalanceOf<C>,
 	smaller_tx_weight: Weight,
 	larger_adjusted_weight_fee: BalanceOf<C>,
@@ -563,17 +563,17 @@ mod tests {
 
 	#[test]
 	fn compute_fee_multiplier_returns_sane_results() {
-		let multiplier: FixedU128 = bp_rococo::WeightToFee::weight_to_fee(&1).into();
+		let multiplier: FixedU128 = bp_rialto::WeightToFee::weight_to_fee(&1).into();
 
 		let smaller_weight = 1_000_000;
 		let smaller_adjusted_weight_fee =
-			multiplier.saturating_mul_int(WeightToFeeOf::<Rococo>::weight_to_fee(&smaller_weight));
+			multiplier.saturating_mul_int(WeightToFeeOf::<Rialto>::weight_to_fee(&smaller_weight));
 
 		let larger_weight = smaller_weight + 200_000;
 		let larger_adjusted_weight_fee =
-			multiplier.saturating_mul_int(WeightToFeeOf::<Rococo>::weight_to_fee(&larger_weight));
+			multiplier.saturating_mul_int(WeightToFeeOf::<Rialto>::weight_to_fee(&larger_weight));
 		assert_eq!(
-			compute_fee_multiplier::<Rococo>(
+			compute_fee_multiplier::<Rialto>(
 				smaller_adjusted_weight_fee,
 				smaller_weight,
 				larger_adjusted_weight_fee,