diff --git a/bridges/bin/millau/runtime/Cargo.toml b/bridges/bin/millau/runtime/Cargo.toml
index 57586fb961f7a92ecc4b7a83d4225d868d9b18b1..861a40120dbc35d6896807a38b194f3e8cc4fcf0 100644
--- a/bridges/bin/millau/runtime/Cargo.toml
+++ b/bridges/bin/millau/runtime/Cargo.toml
@@ -41,11 +41,13 @@ frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "
 frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-aura = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
+pallet-authorship = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-beefy = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-beefy-mmr = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-mmr = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
+pallet-offences = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, features = ["historical"]}
 pallet-sudo = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-timestamp = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
@@ -100,6 +102,7 @@ std = [
 	"frame-system-rpc-runtime-api/std",
 	"frame-system/std",
 	"pallet-aura/std",
+	"pallet-authorship/std",
 	"pallet-balances/std",
 	"pallet-beefy/std",
 	"pallet-beefy-mmr/std",
@@ -109,6 +112,7 @@ std = [
 	"pallet-bridge-relayers/std",
 	"pallet-grandpa/std",
 	"pallet-mmr/std",
+	"pallet-offences/std",
 	"pallet-session/std",
 	"pallet-shift-session-manager/std",
 	"pallet-sudo/std",
diff --git a/bridges/bin/millau/runtime/src/lib.rs b/bridges/bin/millau/runtime/src/lib.rs
index 9abe5ce69c096636c0e61ae69a848799f563d20c..cf2b887d1ab44cbed961dfc52ab5d5eac15420a6 100644
--- a/bridges/bin/millau/runtime/src/lib.rs
+++ b/bridges/bin/millau/runtime/src/lib.rs
@@ -49,7 +49,7 @@ use sp_runtime::{
 	create_runtime_str, generic, impl_opaque_keys,
 	traits::{Block as BlockT, IdentityLookup, Keccak256, NumberFor, OpaqueKeys},
 	transaction_validity::{TransactionSource, TransactionValidity},
-	ApplyExtrinsicResult, FixedPointNumber, Perquintill,
+	ApplyExtrinsicResult, FixedPointNumber, KeyTypeId, Perquintill,
 };
 use sp_std::prelude::*;
 #[cfg(feature = "std")]
@@ -249,8 +249,9 @@ impl pallet_grandpa::Config for Runtime {
 	type WeightInfo = ();
 	type MaxAuthorities = ConstU32<10>;
 	type MaxSetIdSessionEntries = ConstU64<0>;
-	type KeyOwnerProof = sp_core::Void;
-	type EquivocationReportSystem = ();
+	type KeyOwnerProof = <Historical as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof;
+	type EquivocationReportSystem =
+		pallet_grandpa::EquivocationReportSystem<Self, Offences, Historical, ReportLongevity>;
 	type MaxNominators = ConstU32<256>;
 }
 
@@ -377,6 +378,7 @@ parameter_types! {
 	pub const Period: BlockNumber = bp_millau::SESSION_LENGTH;
 	pub const Offset: BlockNumber = 0;
 	pub const RelayerStakeReserveId: [u8; 8] = *b"brdgrlrs";
+	pub ReportLongevity: u64 = Period::get() * 10;
 }
 
 impl pallet_session::Config for Runtime {
@@ -392,6 +394,37 @@ impl pallet_session::Config for Runtime {
 	type WeightInfo = ();
 }
 
+impl<C> frame_system::offchain::SendTransactionTypes<C> for Runtime
+where
+	RuntimeCall: From<C>,
+{
+	type Extrinsic = UncheckedExtrinsic;
+	type OverarchingCall = RuntimeCall;
+}
+
+impl pallet_authorship::Config for Runtime {
+	type FindAuthor = pallet_session::FindAccountFromAuthorIndex<Self, Aura>;
+	type EventHandler = ();
+}
+
+pub struct FullIdentificationOf;
+impl sp_runtime::traits::Convert<AccountId, Option<()>> for FullIdentificationOf {
+	fn convert(_: AccountId) -> Option<()> {
+		Some(())
+	}
+}
+
+impl pallet_session::historical::Config for Runtime {
+	type FullIdentification = ();
+	type FullIdentificationOf = FullIdentificationOf;
+}
+
+impl pallet_offences::Config for Runtime {
+	type RuntimeEvent = RuntimeEvent;
+	type IdentificationTuple = pallet_session::historical::IdentificationTuple<Self>;
+	type OnOffenceHandler = ();
+}
+
 impl pallet_bridge_relayers::Config for Runtime {
 	type RuntimeEvent = RuntimeEvent;
 	type Reward = Balance;
@@ -582,6 +615,10 @@ construct_runtime!(
 		TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event<T>},
 
 		// Consensus support.
+		Authorship: pallet_authorship::{Pallet, Storage},
+		Offences: pallet_offences::{Pallet, Storage, Event},
+		Historical: pallet_session::historical::{Pallet},
+
 		Session: pallet_session::{Pallet, Call, Storage, Event, Config<T>},
 		Grandpa: pallet_grandpa::{Pallet, Call, Storage, Config<T>, Event},
 		ShiftSessionManager: pallet_shift_session_manager::{Pallet},
diff --git a/bridges/bin/rialto/runtime/Cargo.toml b/bridges/bin/rialto/runtime/Cargo.toml
index d8b402d3109794f1212d4d7a6daec03648d570fc..7bd89803cafac836c152a6897fedcdf61a704cc7 100644
--- a/bridges/bin/rialto/runtime/Cargo.toml
+++ b/bridges/bin/rialto/runtime/Cargo.toml
@@ -34,6 +34,7 @@ frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "
 frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-authority-discovery = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
+pallet-authorship = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-babe = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-beefy = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
@@ -41,6 +42,7 @@ pallet-beefy-mmr = { git = "https://github.com/paritytech/polkadot-sdk", branch
 pallet-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-message-queue = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-mmr = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
+pallet-offences = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, features = ["historical"]}
 pallet-sudo = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
 pallet-timestamp = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false }
@@ -94,6 +96,7 @@ std = [
 	"frame-system-rpc-runtime-api/std",
 	"frame-system/std",
 	"pallet-authority-discovery/std",
+	"pallet-authorship/std",
 	"pallet-babe/std",
 	"pallet-balances/std",
 	"pallet-beefy/std",
@@ -105,6 +108,7 @@ std = [
 	"pallet-grandpa/std",
 	"pallet-message-queue/std",
 	"pallet-mmr/std",
+	"pallet-offences/std",
 	"pallet-xcm/std",
 	"pallet-session/std",
 	"pallet-shift-session-manager/std",
diff --git a/bridges/bin/rialto/runtime/src/lib.rs b/bridges/bin/rialto/runtime/src/lib.rs
index d149421864f6f5c9cdd8cc11f96ae3e8b98adb80..c00e32e9f317e278ec9bc177267869837f4e7f1f 100644
--- a/bridges/bin/rialto/runtime/src/lib.rs
+++ b/bridges/bin/rialto/runtime/src/lib.rs
@@ -45,7 +45,7 @@ use sp_runtime::{
 	create_runtime_str, generic, impl_opaque_keys,
 	traits::{AccountIdLookup, Block as BlockT, Keccak256, NumberFor, OpaqueKeys},
 	transaction_validity::{TransactionSource, TransactionValidity},
-	ApplyExtrinsicResult, FixedPointNumber, Perquintill,
+	ApplyExtrinsicResult, FixedPointNumber, KeyTypeId, Perquintill,
 };
 use sp_std::{collections::btree_map::BTreeMap, prelude::*};
 #[cfg(feature = "std")]
@@ -219,6 +219,7 @@ pub const BABE_GENESIS_EPOCH_CONFIG: sp_consensus_babe::BabeEpochConfiguration =
 parameter_types! {
 	pub const EpochDuration: u64 = bp_rialto::EPOCH_DURATION_IN_SLOTS as u64;
 	pub const ExpectedBlockTime: bp_rialto::Moment = bp_rialto::time_units::MILLISECS_PER_BLOCK;
+	pub ReportLongevity: u64 = EpochDuration::get() * 10;
 }
 
 impl pallet_babe::Config for Runtime {
@@ -257,8 +258,9 @@ impl pallet_grandpa::Config for Runtime {
 	type WeightInfo = ();
 	type MaxAuthorities = ConstU32<10>;
 	type MaxSetIdSessionEntries = ConstU64<0>;
-	type KeyOwnerProof = sp_core::Void;
-	type EquivocationReportSystem = ();
+	type KeyOwnerProof = <Historical as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof;
+	type EquivocationReportSystem =
+		pallet_grandpa::EquivocationReportSystem<Self, Offences, Historical, ReportLongevity>;
 	type MaxNominators = ConstU32<256>;
 }
 
@@ -383,6 +385,29 @@ impl pallet_session::Config for Runtime {
 	type WeightInfo = ();
 }
 
+impl pallet_authorship::Config for Runtime {
+	type FindAuthor = pallet_session::FindAccountFromAuthorIndex<Self, Babe>;
+	type EventHandler = ();
+}
+
+pub struct FullIdentificationOf;
+impl sp_runtime::traits::Convert<AccountId, Option<()>> for FullIdentificationOf {
+	fn convert(_: AccountId) -> Option<()> {
+		Some(())
+	}
+}
+
+impl pallet_session::historical::Config for Runtime {
+	type FullIdentification = ();
+	type FullIdentificationOf = FullIdentificationOf;
+}
+
+impl pallet_offences::Config for Runtime {
+	type RuntimeEvent = RuntimeEvent;
+	type IdentificationTuple = pallet_session::historical::IdentificationTuple<Self>;
+	type OnOffenceHandler = ();
+}
+
 impl pallet_authority_discovery::Config for Runtime {
 	type MaxAuthorities = ConstU32<10>;
 }
@@ -469,6 +494,12 @@ construct_runtime!(
 		TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event<T>},
 
 		// Consensus support.
+		// Authorship must be before session in order to note author in the correct session and era
+		// for im-online.
+		Authorship: pallet_authorship::{Pallet, Storage},
+		Offences: pallet_offences::{Pallet, Storage, Event},
+		Historical: pallet_session::historical::{Pallet},
+
 		AuthorityDiscovery: pallet_authority_discovery::{Pallet, Config<T>},
 		Session: pallet_session::{Pallet, Call, Storage, Event, Config<T>},
 		Grandpa: pallet_grandpa::{Pallet, Call, Storage, Config<T>, Event},
diff --git a/bridges/relays/client-millau/src/lib.rs b/bridges/relays/client-millau/src/lib.rs
index ffd4a3f1cb8edc22cdfa12ea6e2ca54b59ddc724..b3101c980c557af457652ee288ba103161bcb5a1 100644
--- a/bridges/relays/client-millau/src/lib.rs
+++ b/bridges/relays/client-millau/src/lib.rs
@@ -25,8 +25,9 @@ use relay_substrate_client::{
 	ChainWithTransactions, ChainWithUtilityPallet, Error as SubstrateError,
 	FullRuntimeUtilityPallet, NonceOf, SignParam, UnderlyingChainProvider, UnsignedTransaction,
 };
-use sp_core::{storage::StorageKey, Pair, Void};
+use sp_core::{storage::StorageKey, Pair};
 use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount};
+use sp_session::MembershipProof;
 use std::time::Duration;
 
 /// Millau header id.
@@ -70,7 +71,7 @@ impl ChainWithGrandpa for Millau {
 	const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str =
 		MILLAU_SYNCED_HEADERS_GRANDPA_INFO_METHOD;
 
-	type KeyOwnerProof = Void;
+	type KeyOwnerProof = MembershipProof;
 }
 
 impl ChainWithBalances for Millau {
diff --git a/bridges/relays/client-rialto/src/lib.rs b/bridges/relays/client-rialto/src/lib.rs
index 94d8c24d9510583dc6a0aaf91e06124cb0aebbca..cc5371612c34625fd95e8b9055582444c6aa4801 100644
--- a/bridges/relays/client-rialto/src/lib.rs
+++ b/bridges/relays/client-rialto/src/lib.rs
@@ -25,8 +25,9 @@ use relay_substrate_client::{
 	ChainWithTransactions, Error as SubstrateError, NonceOf, RelayChain, SignParam,
 	UnderlyingChainProvider, UnsignedTransaction,
 };
-use sp_core::{storage::StorageKey, Pair, Void};
+use sp_core::{storage::StorageKey, Pair};
 use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount};
+use sp_session::MembershipProof;
 use std::time::Duration;
 
 /// Rialto header id.
@@ -55,7 +56,7 @@ impl ChainWithGrandpa for Rialto {
 	const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str =
 		RIALTO_SYNCED_HEADERS_GRANDPA_INFO_METHOD;
 
-	type KeyOwnerProof = Void;
+	type KeyOwnerProof = MembershipProof;
 }
 
 impl RelayChain for Rialto {