diff --git a/pallets/authority-members/src/lib.rs b/pallets/authority-members/src/lib.rs
index 6510b29265347a521438c8c84a9f47b4c87c13fd..fd9f76a8f7e0b0f5e2f8da20c6d6391ed5a58bc6 100644
--- a/pallets/authority-members/src/lib.rs
+++ b/pallets/authority-members/src/lib.rs
@@ -62,6 +62,7 @@ pub mod pallet {
         frame_system::Config + pallet_session::Config + pallet_session::historical::Config
     {
         type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
+        type KeysWrapper: Parameter + Into<Self::Keys>;
         type IsMember: IsMember<Self::MemberId>;
         type OnRemovedMember: OnRemovedMember<Self::MemberId>;
         type OwnerKeyOf: Convert<Self::MemberId, Option<Self::AccountId>>;
@@ -256,7 +257,7 @@ pub mod pallet {
         pub fn set_session_keys(
             origin: OriginFor<T>,
             member_id: T::MemberId,
-            keys: T::Keys,
+            keys: T::KeysWrapper,
         ) -> DispatchResultWithPostInfo {
             let who = ensure_signed(origin.clone())?;
             Self::verify_ownership_and_membership(&who, member_id)?;
@@ -265,7 +266,7 @@ pub mod pallet {
                 .ok_or(pallet_session::Error::<T>::NoAssociatedValidatorId)?;
 
             let _post_info = pallet_session::Call::<T>::set_keys {
-                keys,
+                keys: keys.into(),
                 proof: vec![],
             }
             .dispatch_bypass_filter(origin)?;
diff --git a/pallets/authority-members/src/mock.rs b/pallets/authority-members/src/mock.rs
index a2e8f036a886b1ea191d5eb7ae4872067be38fc4..5da294071911a5eca2cbf750710ed7c6319b75c9 100644
--- a/pallets/authority-members/src/mock.rs
+++ b/pallets/authority-members/src/mock.rs
@@ -149,6 +149,7 @@ impl IsMember<u64> for TestIsSmithMember {
 
 impl pallet_authority_members::Config for Test {
     type Event = Event;
+	type KeysWrapper = MockSessionKeys;
     type IsMember = TestIsSmithMember;
     type MaxOfflineSessions = ConstU32<2>;
     type MemberId = u64;
diff --git a/runtime/common/src/entities.rs b/runtime/common/src/entities.rs
index 7f676a3b0eb27cf9dba90c63edee3a79ccec8414..9300b95cdc74edfc9b013974251a7f25bb190854 100644
--- a/runtime/common/src/entities.rs
+++ b/runtime/common/src/entities.rs
@@ -23,9 +23,9 @@ use serde::{Deserialize, Serialize};
 
 #[cfg_attr(feature = "std", derive(Deserialize, Serialize))]
 #[derive(Clone, Encode, Decode, Default, Eq, PartialEq, RuntimeDebug, TypeInfo)]
-pub struct SmithsMembershipMetaData<SessionKeys> {
+pub struct SmithsMembershipMetaData<SessionKeysWrapper> {
     pub peer_id: [u8; 32],
-    pub session_keys: SessionKeys,
+    pub session_keys: SessionKeysWrapper,
 }
 
 #[cfg_attr(feature = "std", derive(Deserialize, Serialize))]
diff --git a/runtime/common/src/handlers.rs b/runtime/common/src/handlers.rs
index 37afe7192df9a31472ea8179946688c783a3b9d7..e7729ed692d5b540ccd1430fa9fd6aec1bd99d2f 100644
--- a/runtime/common/src/handlers.rs
+++ b/runtime/common/src/handlers.rs
@@ -62,17 +62,22 @@ pub struct OnSmithMembershipEventHandler<Inner, Runtime>(
 
 impl<
         IdtyIndex: Copy + Parameter,
-        SessionKeys: Clone,
-        Inner: sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeys>>,
+        SessionKeysWrapper: Clone,
+        Inner: sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeysWrapper>>,
         Runtime: pallet_identity::Config<IdtyIndex = IdtyIndex>
-            + pallet_authority_members::Config<MemberId = IdtyIndex>
-            + pallet_membership::Config<Instance2, MetaData = SmithsMembershipMetaData<SessionKeys>>
-            + pallet_session::Config<Keys = SessionKeys>,
-    > sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeys>>
+            + pallet_authority_members::Config<KeysWrapper = SessionKeysWrapper, MemberId = IdtyIndex>
+            + pallet_membership::Config<
+                Instance2,
+                MetaData = SmithsMembershipMetaData<SessionKeysWrapper>,
+            >,
+    > sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeysWrapper>>
     for OnSmithMembershipEventHandler<Inner, Runtime>
 {
     fn on_event(
-        membership_event: &sp_membership::Event<IdtyIndex, SmithsMembershipMetaData<SessionKeys>>,
+        membership_event: &sp_membership::Event<
+            IdtyIndex,
+            SmithsMembershipMetaData<SessionKeysWrapper>,
+        >,
     ) -> Weight {
         (match membership_event {
             sp_membership::Event::MembershipAcquired(
diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs
index 88b16d498eddc453784d458938e1a0c3735bb060..3e23d5f5ad96bc02fa62fb5a5df12bfed61e8949 100644
--- a/runtime/common/src/lib.rs
+++ b/runtime/common/src/lib.rs
@@ -88,3 +88,38 @@ impl<
             .map(|idty_value| idty_value.owner_key)
     }
 }
+
+#[macro_export]
+macro_rules! declare_session_keys {
+	{} => {
+		pub mod opaque {
+			use super::*;
+
+			impl_opaque_keys! {
+				pub struct SessionKeys {
+					pub grandpa: Grandpa,
+					pub babe: Babe,
+					pub im_online: ImOnline,
+					pub authority_discovery: AuthorityDiscovery,
+				}
+			}
+
+			#[derive(Clone, codec::Decode, Debug, codec::Encode, Eq, PartialEq)]
+			pub struct SessionKeysWrapper(pub SessionKeys);
+
+			impl Into<SessionKeys> for SessionKeysWrapper {
+				fn into(self) -> SessionKeys {
+					self.0
+				}
+			}
+
+			impl scale_info::TypeInfo for SessionKeysWrapper {
+				type Identity = [u8; 128];
+
+				fn type_info() -> scale_info::Type {
+					Self::Identity::type_info()
+				}
+			}
+		}
+	}
+}
diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs
index 95a72d14e8d14dea0ab7ff9090a0462d2471e5ce..b5fff7fab9c8cc2b61dad7a32c861238fb2abf18 100644
--- a/runtime/common/src/pallets_config.rs
+++ b/runtime/common/src/pallets_config.rs
@@ -239,6 +239,7 @@ macro_rules! pallets_config {
 
 		impl pallet_authority_members::Config for Runtime {
 			type Event = Event;
+			type KeysWrapper = opaque::SessionKeysWrapper;
 			type IsMember = SmithsMembership;
 			type OnRemovedMember = OnRemovedAUthorityMemberHandler<Runtime>;
 			type OwnerKeyOf = OwnerKeyOfImpl<Runtime>;
@@ -350,7 +351,7 @@ macro_rules! pallets_config {
 			type IdtyId = IdtyIndex;
 			type MembershipExternalStorage = sp_membership::traits::NoExternalStorage;
 			type MembershipPeriod = SmithMembershipPeriod;
-			type MetaData = SmithsMembershipMetaData<opaque::SessionKeys>;
+			type MetaData = SmithsMembershipMetaData<opaque::SessionKeysWrapper>;
 			type OnEvent = OnSmithMembershipEventHandler<SmithsSubWot, Runtime>;
 			type PendingMembershipPeriod = SmithPendingMembershipPeriod;
 			type RenewablePeriod = SmithRenewablePeriod;
diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs
index 3881473fb57fed0fa480e7198797e9cb4ac7263e..c16c4cd488e2ab1e6ef56070002b5bbd4ab576da 100644
--- a/runtime/g1/src/lib.rs
+++ b/runtime/g1/src/lib.rs
@@ -68,17 +68,7 @@ pub use frame_support::{
     StorageValue,
 };
 
-pub mod opaque {
-    use super::*;
-    impl_opaque_keys! {
-        pub struct SessionKeys {
-            pub grandpa: Grandpa,
-            pub babe: Babe,
-            pub im_online: ImOnline,
-            pub authority_discovery: AuthorityDiscovery,
-        }
-    }
-}
+common_runtime::declare_session_keys! {}
 
 // To learn more about runtime versioning and what each of the following value means:
 //   https://substrate.dev/docs/en/knowledgebase/runtime/upgrades#runtime-versioning
diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs
index 7e4b1d26b935b9eea7110a66b4ff7d8872d1f38c..786bd192a8ed5d50ec4dd4d4515e78a3d58a70e4 100644
--- a/runtime/gdev/src/lib.rs
+++ b/runtime/gdev/src/lib.rs
@@ -69,18 +69,7 @@ pub use frame_support::{
     StorageValue,
 };
 
-pub mod opaque {
-    use super::*;
-
-    impl_opaque_keys! {
-        pub struct SessionKeys {
-            pub grandpa: Grandpa,
-            pub babe: Babe,
-            pub im_online: ImOnline,
-            pub authority_discovery: AuthorityDiscovery,
-        }
-    }
-}
+common_runtime::declare_session_keys! {}
 
 // To learn more about runtime versioning and what each of the following value means:
 //   https://substrate.dev/docs/en/knowledgebase/runtime/upgrades#runtime-versioning
diff --git a/runtime/gtest/src/lib.rs b/runtime/gtest/src/lib.rs
index 3048fd5075f86cae2000b9984a4822066b8c9286..6b30529c57570c24f44e96bc4d8021d97c905ce3 100644
--- a/runtime/gtest/src/lib.rs
+++ b/runtime/gtest/src/lib.rs
@@ -68,17 +68,7 @@ pub use frame_support::{
     StorageValue,
 };
 
-pub mod opaque {
-    use super::*;
-    impl_opaque_keys! {
-        pub struct SessionKeys {
-            pub grandpa: Grandpa,
-            pub babe: Babe,
-            pub im_online: ImOnline,
-            pub authority_discovery: AuthorityDiscovery,
-        }
-    }
-}
+common_runtime::declare_session_keys! {}
 
 // To learn more about runtime versioning and what each of the following value means:
 //   https://substrate.dev/docs/en/knowledgebase/runtime/upgrades#runtime-versioning
@@ -146,10 +136,10 @@ impl frame_support::traits::Contains<Call> for BaseCallFilter {
 }
 
 common_runtime::pallets_config! {
-impl pallet_sudo::Config for Runtime {
-    type Event = Event;
-    type Call = Call;
-}
+    impl pallet_sudo::Config for Runtime {
+        type Event = Event;
+        type Call = Call;
+    }
 }
 
 // Create the runtime by composing the FRAME pallets that were previously configured.