From e48056f7b68efaa9e95dcba7e6553d83a0e287df Mon Sep 17 00:00:00 2001
From: librelois <c@elo.tf>
Date: Sun, 23 Jan 2022 20:06:25 +0100
Subject: [PATCH] ref(runtime): rework wot

---
 Cargo.lock                             |   1 +
 node/src/chain_spec/gdev.rs            |  26 ++-
 node/src/chain_spec/gtest.rs           |   2 -
 pallets/authority-members/src/lib.rs   | 131 ++++++------
 pallets/authority-members/src/mock.rs  |   5 +-
 pallets/authority-members/src/tests.rs |  11 -
 pallets/authority-members/src/types.rs |   8 +-
 pallets/duniter-wot/src/lib.rs         |  63 ++----
 pallets/duniter-wot/src/mock.rs        |  26 +--
 pallets/duniter-wot/src/tests.rs       |  56 ++----
 pallets/duniter-wot/src/types.rs       |  22 +-
 pallets/identity/Cargo.toml            |   3 +
 pallets/identity/src/lib.rs            | 235 +++++++++++-----------
 pallets/identity/src/mock.rs           |   2 -
 pallets/identity/src/tests.rs          |  87 ++------
 pallets/identity/src/traits.rs         |  25 +--
 pallets/identity/src/types.rs          |   9 +-
 pallets/membership/src/lib.rs          | 120 ++++++-----
 pallets/membership/src/mock.rs         |  20 +-
 pallets/membership/src/tests.rs        |  19 +-
 pallets/ud-accounts-storage/src/lib.rs |  66 +++---
 primitives/membership/src/lib.rs       |   7 -
 primitives/membership/src/traits.rs    |  30 +--
 runtime/common/src/entities.rs         |   9 +
 runtime/common/src/handlers.rs         |  82 ++++----
 runtime/common/src/lib.rs              |  13 --
 runtime/common/src/pallets_config.rs   | 267 ++++++++++++-------------
 runtime/g1/src/lib.rs                  |   2 +-
 runtime/gdev/src/lib.rs                |  86 ++++----
 runtime/gtest/src/lib.rs               |   2 +-
 30 files changed, 670 insertions(+), 765 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index c2ab5ccc8..3a730637b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4339,6 +4339,7 @@ dependencies = [
  "frame-benchmarking",
  "frame-support",
  "frame-system",
+ "maplit",
  "parity-scale-codec",
  "scale-info",
  "serde",
diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index f15ff6889..a94868dc4 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -256,13 +256,18 @@ fn gen_genesis_conf(
         identity: IdentityConfig {
             identities: initial_identities
                 .iter()
-                .map(|(name, account)| IdtyValue {
-                    data: Default::default(),
-                    owner_key: account.clone(),
-                    name: name.clone(),
-                    next_creatable_identity_on: Default::default(),
-                    removable_on: 0,
-                    status: gdev_runtime::IdtyStatus::Validated,
+                .map(|(name, owner_key)| {
+                    (
+                        owner_key.clone(),
+                        (
+                            name.clone(),
+                            IdtyValue {
+                                next_creatable_identity_on: Default::default(),
+                                removable_on: 0,
+                                status: gdev_runtime::IdtyStatus::Validated,
+                            },
+                        ),
+                    )
                 })
                 .collect(),
         },
@@ -301,7 +306,12 @@ fn gen_genesis_conf(
             certs_by_issuer: clique_wot(initial_smiths_len, smith_cert_validity_period),
         },
         ud_accounts_storage: UdAccountsStorageConfig {
-            ud_accounts: initial_identities.values().cloned().collect(),
+            ud_accounts: initial_identities
+                .values()
+                .cloned()
+                .enumerate()
+                .map(|(i, account)| (account, (i + 1) as u32))
+                .collect(),
         },
         universal_dividend: UniversalDividendConfig {
             first_ud: 1_000,
diff --git a/node/src/chain_spec/gtest.rs b/node/src/chain_spec/gtest.rs
index c3e03c358..895ae68b6 100644
--- a/node/src/chain_spec/gtest.rs
+++ b/node/src/chain_spec/gtest.rs
@@ -205,10 +205,8 @@ fn gen_genesis_conf(
             identities: initial_identities
                 .iter()
                 .map(|(name, account)| IdtyValue {
-                    data: Default::default(),
                     name: name.clone(),
                     next_creatable_identity_on: Default::default(),
-                    owner_key: account.clone(),
                     removable_on: 0,
                     status: gtest_runtime::IdtyStatus::Validated,
                 })
diff --git a/pallets/authority-members/src/lib.rs b/pallets/authority-members/src/lib.rs
index 018f817bb..d3f9c51b0 100644
--- a/pallets/authority-members/src/lib.rs
+++ b/pallets/authority-members/src/lib.rs
@@ -33,6 +33,7 @@ pub use pallet::*;
 pub use types::*;
 
 use frame_support::traits::Get;
+use sp_runtime::traits::Convert;
 use sp_staking::SessionIndex;
 use sp_std::prelude::*;
 
@@ -65,13 +66,12 @@ pub mod pallet {
         type KeysWrapper: Parameter + Into<Self::Keys>;
         type IsMember: IsMember<Self::MemberId>;
         type OnRemovedMember: OnRemovedMember<Self::MemberId>;
-        type OwnerKeyOf: Convert<Self::MemberId, Option<Self::AccountId>>;
         #[pallet::constant]
         type MaxKeysLife: Get<SessionIndex>;
         #[pallet::constant]
         type MaxOfflineSessions: Get<SessionIndex>;
-        type MemberId: Copy + MaybeSerializeDeserialize + Parameter + Ord;
-        type RefreshValidatorIdOrigin: EnsureOrigin<Self::Origin>;
+        type MemberId: Copy + Ord + MaybeSerializeDeserialize + Parameter;
+        type MemberIdOf: Convert<Self::AccountId, Option<Self::MemberId>>;
         type RemoveMemberOrigin: EnsureOrigin<Self::Origin>;
     }
 
@@ -79,7 +79,7 @@ pub mod pallet {
 
     #[pallet::genesis_config]
     pub struct GenesisConfig<T: Config> {
-        pub initial_authorities: BTreeMap<T::MemberId, (T::ValidatorId, bool)>,
+        pub initial_authorities: BTreeMap<T::MemberId, (T::AccountId, bool)>,
     }
 
     #[cfg(feature = "std")]
@@ -94,17 +94,15 @@ pub mod pallet {
     #[pallet::genesis_build]
     impl<T: Config> GenesisBuild<T> for GenesisConfig<T> {
         fn build(&self) {
-            for (member_id, (validator_id, _is_online)) in &self.initial_authorities {
-                Members::<T>::insert(
-                    member_id,
-                    MemberData::new_genesis(T::MaxKeysLife::get(), validator_id.clone()),
-                );
+            for (member_id, (account_id, _is_online)) in &self.initial_authorities {
+                AccountIdOf::<T>::insert(member_id, account_id);
+                Members::<T>::insert(member_id, MemberData::new_genesis(T::MaxKeysLife::get()));
             }
             let mut members_ids = self
                 .initial_authorities
                 .iter()
                 .filter_map(
-                    |(member_id, (_validator_id, is_online))| {
+                    |(member_id, (_account_id, is_online))| {
                         if *is_online {
                             Some(*member_id)
                         } else {
@@ -122,6 +120,11 @@ pub mod pallet {
 
     // STORAGE //
 
+    #[pallet::storage]
+    #[pallet::getter(fn account_id_of)]
+    pub type AccountIdOf<T: Config> =
+        StorageMap<_, Twox64Concat, T::MemberId, T::AccountId, OptionQuery>;
+
     #[pallet::storage]
     #[pallet::getter(fn incoming)]
     pub type IncomingAuthorities<T: Config> = StorageValue<_, Vec<T::MemberId>, ValueQuery>;
@@ -136,8 +139,7 @@ pub mod pallet {
 
     #[pallet::storage]
     #[pallet::getter(fn member)]
-    pub type Members<T: Config> =
-        StorageMap<_, Twox64Concat, T::MemberId, MemberData<T::ValidatorId>, OptionQuery>;
+    pub type Members<T: Config> = StorageMap<_, Twox64Concat, T::MemberId, MemberData, OptionQuery>;
 
     #[pallet::storage]
     #[pallet::getter(fn members_expire_on)]
@@ -185,7 +187,7 @@ pub mod pallet {
         /// Already outgoing
         AlreadyOutgoing,
         /// Not found owner key
-        OwnerKeyNotFound,
+        MemberIdNotFound,
         /// Member not found
         MemberNotFound,
         /// Neither online nor scheduled
@@ -211,9 +213,8 @@ pub mod pallet {
             let who = ensure_signed(origin)?;
             Self::verify_ownership_and_membership(&who, member_id)?;
 
-            let member_data = Members::<T>::get(member_id).ok_or(Error::<T>::MemberNotFound)?;
-            if !pallet_session::Pallet::<T>::is_registered(&member_data.validator_id) {
-                return Err(Error::<T>::SessionKeysNotProvided.into());
+            if !Members::<T>::contains_key(member_id) {
+                return Err(Error::<T>::MemberNotFound.into());
             }
             if Self::is_outgoing(member_id) {
                 return Err(Error::<T>::AlreadyOutgoing.into());
@@ -241,8 +242,12 @@ pub mod pallet {
             let who = ensure_signed(origin)?;
             Self::verify_ownership_and_membership(&who, member_id)?;
 
-            let member_data = Members::<T>::get(member_id).ok_or(Error::<T>::MemberNotFound)?;
-            if !pallet_session::Pallet::<T>::is_registered(&member_data.validator_id) {
+            if !Members::<T>::contains_key(member_id) {
+                return Err(Error::<T>::MemberNotFound.into());
+            }
+            let validator_id = T::ValidatorIdOf::convert(who.clone())
+                .ok_or(pallet_session::Error::<T>::NoAssociatedValidatorId)?;
+            if !pallet_session::Pallet::<T>::is_registered(&validator_id) {
                 return Err(Error::<T>::SessionKeysNotProvided.into());
             }
 
@@ -258,7 +263,7 @@ pub mod pallet {
             if is_outgoing {
                 Self::remove_out(member_id);
             } else {
-                Self::insert_in(member_id);
+                Self::insert_in(member_id, who);
             }
 
             Ok(().into())
@@ -273,9 +278,6 @@ pub mod pallet {
             let who = ensure_signed(origin.clone())?;
             Self::verify_ownership_and_membership(&who, member_id)?;
 
-            let validator_id = T::ValidatorIdOf::convert(who)
-                .ok_or(pallet_session::Error::<T>::NoAssociatedValidatorId)?;
-
             let _post_info = pallet_session::Call::<T>::set_keys {
                 keys: keys.into(),
                 proof: vec![],
@@ -292,38 +294,47 @@ pub mod pallet {
                 let mut member_data = member_data_opt.get_or_insert(MemberData {
                     expire_on_session,
                     must_rotate_keys_before,
-                    validator_id: validator_id.clone(),
                 });
                 member_data.must_rotate_keys_before = must_rotate_keys_before;
-                member_data.validator_id = validator_id;
             });
             MustRotateKeysBefore::<T>::append(must_rotate_keys_before, member_id);
 
             Ok(().into())
         }
         #[pallet::weight(0)]
-        pub fn refresh_validator_id(
+        pub fn prune_account_id_of(
             origin: OriginFor<T>,
-            member_id: T::MemberId,
+            members_ids: Vec<T::MemberId>,
         ) -> DispatchResultWithPostInfo {
-            T::RefreshValidatorIdOrigin::ensure_origin(origin)?;
-
-            let owner = T::OwnerKeyOf::convert(member_id).ok_or(Error::<T>::OwnerKeyNotFound)?;
-            let validator_id = T::ValidatorIdOf::convert(owner)
-                .ok_or(pallet_session::Error::<T>::NoAssociatedValidatorId)?;
+            ensure_root(origin)?;
 
-            if !T::IsMember::is_member(&member_id) {
-                return Err(Error::<T>::NotMember.into());
+            for member_id in members_ids {
+                if !Self::is_online(member_id) && !Self::is_incoming(member_id) {
+                    AccountIdOf::<T>::remove(member_id);
+                }
             }
 
-            Members::<T>::mutate(member_id, |member_data_opt| {
-                if let Some(member_data) = member_data_opt {
-                    member_data.validator_id = validator_id;
-                    Ok(().into())
-                } else {
-                    Err(Error::<T>::MemberNotFound.into())
+            Ok(().into())
+        }
+        #[pallet::weight(0)]
+        pub fn purge_old_session_keys(
+            origin: OriginFor<T>,
+            member_id: T::MemberId,
+            accounts_ids: Vec<T::AccountId>,
+        ) -> DispatchResultWithPostInfo {
+            let who = ensure_signed(origin)?;
+            Self::verify_ownership_and_membership(&who, member_id)?;
+
+            for account_id in accounts_ids {
+                if !T::IsMember::is_member(&member_id) {
+                    let _post_info = pallet_session::Call::<T>::purge_keys {}
+                        .dispatch_bypass_filter(
+                            frame_system::Origin::<T>::Signed(account_id).into(),
+                        )?;
                 }
-            })
+            }
+
+            Ok(().into())
         }
         #[pallet::weight(0)]
         pub fn remove_member(
@@ -336,11 +347,6 @@ pub mod pallet {
                 return Err(Error::<T>::NotMember.into());
             }
 
-            if let Some(owner) = T::OwnerKeyOf::convert(member_id) {
-                let _post_info = pallet_session::Call::<T>::purge_keys {}
-                    .dispatch_bypass_filter(frame_system::Origin::<T>::Signed(owner).into())?;
-            }
-
             Self::do_remove_member(member_id);
 
             Ok(().into())
@@ -382,7 +388,7 @@ pub mod pallet {
                 }
             }
         }
-        fn insert_in(member_id: T::MemberId) -> bool {
+        fn insert_in(member_id: T::MemberId, account_id: T::AccountId) -> bool {
             let not_already_inserted = IncomingAuthorities::<T>::mutate(|members_ids| {
                 if let Err(index) = members_ids.binary_search(&member_id) {
                     members_ids.insert(index, member_id);
@@ -392,6 +398,7 @@ pub mod pallet {
                 }
             });
             if not_already_inserted {
+                AccountIdOf::<T>::insert(member_id, account_id);
                 Self::deposit_event(Event::MemberGoOnline(member_id));
             }
             not_already_inserted
@@ -450,12 +457,12 @@ pub mod pallet {
             who: &T::AccountId,
             member_id: T::MemberId,
         ) -> Result<(), DispatchError> {
-            if let Some(owner) = T::OwnerKeyOf::convert(member_id) {
-                if who != &owner {
+            if let Some(expected_member_id) = T::MemberIdOf::convert(who.clone()) {
+                if expected_member_id != member_id {
                     return Err(Error::<T>::NotOwner.into());
                 }
             } else {
-                return Err(Error::<T>::OwnerKeyNotFound.into());
+                return Err(Error::<T>::MemberIdNotFound.into());
             }
 
             if !T::IsMember::is_member(&member_id) {
@@ -489,8 +496,8 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Pallet<T> {
             if members_ids_to_del.is_empty() {
                 return None;
             } else {
-                // Apply MaxOfflineSessions rule
                 for member_id in &members_ids_to_del {
+                    // Apply MaxOfflineSessions rule
                     let expire_on_session =
                         session_index.saturating_add(T::MaxOfflineSessions::get());
                     Members::<T>::mutate_exists(member_id, |member_data_opt| {
@@ -499,6 +506,8 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Pallet<T> {
                         }
                     });
                     MembersExpireOn::<T>::append(expire_on_session, member_id);
+                    // Prune AccountIdOf
+                    AccountIdOf::<T>::remove(member_id);
                 }
                 Self::deposit_event(Event::OutgoingAuthorities(members_ids_to_del.clone()));
             }
@@ -520,9 +529,14 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Pallet<T> {
                 }
                 members_ids.clone()
             })
-            .iter()
-            .filter_map(Members::<T>::get)
-            .map(|member_data| member_data.validator_id)
+            .into_iter()
+            .filter_map(|member_id| {
+                if let Some(account_id) = AccountIdOf::<T>::get(member_id) {
+                    T::ValidatorIdOf::convert(account_id)
+                } else {
+                    None
+                }
+            })
             .collect(),
         )
     }
@@ -530,9 +544,14 @@ impl<T: Config> pallet_session::SessionManager<T::ValidatorId> for Pallet<T> {
     fn new_session_genesis(_new_index: SessionIndex) -> Option<Vec<T::ValidatorId>> {
         Some(
             OnlineAuthorities::<T>::get()
-                .iter()
-                .filter_map(Members::<T>::get)
-                .map(|member_data| member_data.validator_id)
+                .into_iter()
+                .filter_map(|member_id| {
+                    if let Some(account_id) = AccountIdOf::<T>::get(member_id) {
+                        T::ValidatorIdOf::convert(account_id)
+                    } else {
+                        None
+                    }
+                })
                 .collect(),
         )
     }
diff --git a/pallets/authority-members/src/mock.rs b/pallets/authority-members/src/mock.rs
index 326b26066..6362d638a 100644
--- a/pallets/authority-members/src/mock.rs
+++ b/pallets/authority-members/src/mock.rs
@@ -120,7 +120,7 @@ impl ShouldEndSession<u64> for TestShouldEndSession {
 impl pallet_session::Config for Test {
     type Event = Event;
     type ValidatorId = u64;
-    type ValidatorIdOf = sp_runtime::traits::ConvertInto;
+    type ValidatorIdOf = ConvertInto;
     type ShouldEndSession = TestShouldEndSession;
     type NextSessionRotation = ();
     type SessionManager = AuthorityMembers;
@@ -154,9 +154,8 @@ impl pallet_authority_members::Config for Test {
     type MaxKeysLife = ConstU32<5>;
     type MaxOfflineSessions = ConstU32<2>;
     type MemberId = u64;
+    type MemberIdOf = ConvertInto;
     type OnRemovedMember = ();
-    type OwnerKeyOf = ConvertInto;
-    type RefreshValidatorIdOrigin = system::EnsureRoot<u64>;
     type RemoveMemberOrigin = system::EnsureRoot<u64>;
 }
 
diff --git a/pallets/authority-members/src/tests.rs b/pallets/authority-members/src/tests.rs
index 32d94f544..9ed210742 100644
--- a/pallets/authority-members/src/tests.rs
+++ b/pallets/authority-members/src/tests.rs
@@ -35,7 +35,6 @@ fn test_genesis_build() {
             Some(MemberData {
                 expire_on_session: 0,
                 must_rotate_keys_before: 5,
-                validator_id: 3,
             })
         );
         assert_eq!(
@@ -43,7 +42,6 @@ fn test_genesis_build() {
             Some(MemberData {
                 expire_on_session: 0,
                 must_rotate_keys_before: 5,
-                validator_id: 6,
             })
         );
         assert_eq!(
@@ -51,7 +49,6 @@ fn test_genesis_build() {
             Some(MemberData {
                 expire_on_session: 0,
                 must_rotate_keys_before: 5,
-                validator_id: 9,
             })
         );
 
@@ -97,7 +94,6 @@ fn test_max_keys_life_rule() {
             Some(MemberData {
                 expire_on_session: 0,
                 must_rotate_keys_before: 7,
-                validator_id: 3,
             })
         );
         assert_eq!(
@@ -105,7 +101,6 @@ fn test_max_keys_life_rule() {
             Some(MemberData {
                 expire_on_session: 0,
                 must_rotate_keys_before: 7,
-                validator_id: 6,
             })
         );
 
@@ -145,7 +140,6 @@ fn test_go_offline() {
             Some(MemberData {
                 expire_on_session: 0,
                 must_rotate_keys_before: 5,
-                validator_id: 9,
             })
         );
 
@@ -156,7 +150,6 @@ fn test_go_offline() {
             Some(MemberData {
                 expire_on_session: 4,
                 must_rotate_keys_before: 5,
-                validator_id: 9,
             })
         );
         assert_eq!(AuthorityMembers::members_expire_on(4), vec![9],);
@@ -196,7 +189,6 @@ fn test_go_online() {
             Some(MemberData {
                 expire_on_session: 2,
                 must_rotate_keys_before: 5,
-                validator_id: 12,
             })
         );
 
@@ -212,7 +204,6 @@ fn test_go_online() {
             Some(MemberData {
                 expire_on_session: 2,
                 must_rotate_keys_before: 5,
-                validator_id: 12,
             })
         );
 
@@ -261,7 +252,6 @@ fn test_go_online_then_go_offline_in_same_session() {
             Some(MemberData {
                 expire_on_session: 2,
                 must_rotate_keys_before: 5,
-                validator_id: 12,
             })
         );
     });
@@ -289,7 +279,6 @@ fn test_go_offline_then_go_online_in_same_session() {
             Some(MemberData {
                 expire_on_session: 0,
                 must_rotate_keys_before: 5,
-                validator_id: 9,
             })
         );
     });
diff --git a/pallets/authority-members/src/types.rs b/pallets/authority-members/src/types.rs
index 5e5fd7007..fb3c0746e 100644
--- a/pallets/authority-members/src/types.rs
+++ b/pallets/authority-members/src/types.rs
@@ -24,18 +24,16 @@ use sp_staking::SessionIndex;
 
 #[cfg_attr(feature = "std", derive(Debug, Deserialize, Serialize))]
 #[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo)]
-pub struct MemberData<ValidatorId: Decode + Encode + TypeInfo> {
+pub struct MemberData {
     pub expire_on_session: SessionIndex,
     pub must_rotate_keys_before: SessionIndex,
-    pub validator_id: ValidatorId,
 }
 
-impl<ValidatorId: Decode + Encode + TypeInfo> MemberData<ValidatorId> {
-    pub fn new_genesis(must_rotate_keys_before: SessionIndex, validator_id: ValidatorId) -> Self {
+impl MemberData {
+    pub fn new_genesis(must_rotate_keys_before: SessionIndex) -> Self {
         MemberData {
             expire_on_session: 0,
             must_rotate_keys_before,
-            validator_id,
         }
     }
 }
diff --git a/pallets/duniter-wot/src/lib.rs b/pallets/duniter-wot/src/lib.rs
index 66750e685..f74ff0d0b 100644
--- a/pallets/duniter-wot/src/lib.rs
+++ b/pallets/duniter-wot/src/lib.rs
@@ -124,9 +124,11 @@ pub mod pallet {
     }
 }
 
-impl<T: Config<I>, I: 'static> pallet_identity::traits::EnsureIdtyCallAllowed<T> for Pallet<T, I>
+impl<AccountId, T: Config<I>, I: 'static> pallet_identity::traits::EnsureIdtyCallAllowed<T>
+    for Pallet<T, I>
 where
-    T: pallet_membership::Config<I, MetaData = ()>,
+    T: frame_system::Config<AccountId = AccountId>
+        + pallet_membership::Config<I, MetaData = MembershipMetaData<AccountId>>,
 {
     fn can_create_identity(creator: IdtyIndex) -> bool {
         if let Some(cert_meta) = pallet_certification::Pallet::<T, I>::idty_cert_meta(creator) {
@@ -137,33 +139,20 @@ where
             false
         }
     }
-    fn can_confirm_identity(idty_index: IdtyIndex) -> bool {
+    fn can_confirm_identity(idty_index: IdtyIndex, owner_key: AccountId) -> bool {
         pallet_membership::Pallet::<T, I>::request_membership(
             RawOrigin::Root.into(),
             idty_index,
-            (),
+            MembershipMetaData(owner_key),
         )
         .is_ok()
     }
     fn can_validate_identity(idty_index: IdtyIndex) -> bool {
-        pallet_membership::Pallet::<T, I>::claim_membership(RawOrigin::Root.into(), idty_index)
-            .is_ok()
-    }
-}
-
-impl<T: Config<I>, I: 'static> sp_membership::traits::IsIdtyAllowedToClaimMembership<IdtyIndex>
-    for Pallet<T, I>
-{
-    fn is_idty_allowed_to_claim_membership(idty_index: &IdtyIndex) -> bool {
-        if T::IsSubWot::get() {
-            if let Some(idty_value) = pallet_identity::Pallet::<T>::identity(idty_index) {
-                idty_value.status == IdtyStatus::Validated
-            } else {
-                false
-            }
-        } else {
-            false
-        }
+        pallet_membership::Pallet::<T, I>::claim_membership(
+            RawOrigin::Root.into(),
+            Some(idty_index),
+        )
+        .is_ok()
     }
 }
 
@@ -195,31 +184,6 @@ impl<T: Config<I>, I: 'static> sp_membership::traits::IsIdtyAllowedToRequestMemb
     }
 }
 
-impl<T: Config<I>, I: 'static> sp_membership::traits::IsOriginAllowedToUseIdty<T::Origin, IdtyIndex>
-    for Pallet<T, I>
-{
-    fn is_origin_allowed_to_use_idty(
-        origin: &T::Origin,
-        idty_index: &IdtyIndex,
-    ) -> sp_membership::OriginPermission {
-        match origin.clone().into() {
-            Ok(RawOrigin::Root) => sp_membership::OriginPermission::Root,
-            Ok(RawOrigin::Signed(account_id)) => {
-                if let Some(idty_val) = pallet_identity::Pallet::<T>::identity(idty_index) {
-                    if account_id == idty_val.owner_key {
-                        sp_membership::OriginPermission::Allowed
-                    } else {
-                        sp_membership::OriginPermission::Forbidden
-                    }
-                } else {
-                    sp_membership::OriginPermission::Forbidden
-                }
-            }
-            _ => sp_membership::OriginPermission::Forbidden,
-        }
-    }
-}
-
 impl<T: Config<I>, I: 'static, MetaData> sp_membership::traits::OnEvent<IdtyIndex, MetaData>
     for Pallet<T, I>
 where
@@ -263,6 +227,7 @@ where
             sp_membership::Event::<IdtyIndex, MetaData>::PendingMembershipExpired(idty_index) => {
                 Self::dispath_idty_call(pallet_identity::Call::remove_identity {
                     idty_index: *idty_index,
+                    idty_name: None,
                 });
             }
         }
@@ -312,7 +277,7 @@ impl<T: Config<I>, I: 'static> pallet_certification::traits::OnNewcert<IdtyIndex
             if T::IsSubWot::get() {
                 if let Err(e) = pallet_membership::Pallet::<T, I>::claim_membership(
                     RawOrigin::Root.into(),
-                    receiver,
+                    Some(receiver),
                 ) {
                     sp_std::if_std! {
                         println!("{:?}", e)
@@ -352,7 +317,7 @@ impl<T: Config<I>, I: 'static> pallet_certification::traits::OnRemovedCert<IdtyI
             // Revoke receiver membership and disable his identity
             if let Err(e) = pallet_membership::Pallet::<T, I>::revoke_membership(
                 RawOrigin::Root.into(),
-                receiver,
+                Some(receiver),
             ) {
                 sp_std::if_std! {
                     println!("{:?}", e)
diff --git a/pallets/duniter-wot/src/mock.rs b/pallets/duniter-wot/src/mock.rs
index ed754dd40..c1080613d 100644
--- a/pallets/duniter-wot/src/mock.rs
+++ b/pallets/duniter-wot/src/mock.rs
@@ -112,8 +112,6 @@ impl pallet_identity::Config for Test {
     type Event = Event;
     type EnsureIdtyCallAllowed = DuniterWot;
     type IdtyCreationPeriod = IdtyCreationPeriod;
-    type IdtyData = ();
-    type IdtyDataProvider = ();
     type IdtyNameValidator = IdtyNameValidatorTestImpl;
     type IdtyIndex = IdtyIndex;
     type IdtyValidationOrigin = system::EnsureRoot<AccountId>;
@@ -132,16 +130,15 @@ parameter_types! {
 }
 
 impl pallet_membership::Config<Instance1> for Test {
-    type IsIdtyAllowedToClaimMembership = DuniterWot;
     type IsIdtyAllowedToRenewMembership = DuniterWot;
     type IsIdtyAllowedToRequestMembership = DuniterWot;
-    type IsOriginAllowedToUseIdty = DuniterWot;
     type Event = Event;
     type ExternalizeMembershipStorage = ExternalizeMembershipStorage;
     type IdtyId = IdtyIndex;
+    type IdtyIdOf = Identity;
     type MembershipExternalStorage = sp_membership::traits::NoExternalStorage;
     type MembershipPeriod = MembershipPeriod;
-    type MetaData = ();
+    type MetaData = crate::MembershipMetaData<u64>;
     type OnEvent = DuniterWot;
     type PendingMembershipPeriod = PendingMembershipPeriod;
     type RenewablePeriod = RenewablePeriod;
@@ -179,13 +176,18 @@ pub fn new_test_ext(initial_identities_len: usize) -> sp_io::TestExternalities {
         system: SystemConfig::default(),
         identity: IdentityConfig {
             identities: (1..=initial_identities_len)
-                .map(|i| pallet_identity::IdtyValue {
-                    data: (),
-                    owner_key: i as u64,
-                    name: pallet_identity::IdtyName::from(NAMES[i - 1]),
-                    next_creatable_identity_on: 0,
-                    removable_on: 0,
-                    status: pallet_identity::IdtyStatus::Validated,
+                .map(|i| {
+                    (
+                        i as u64,
+                        (
+                            pallet_identity::IdtyName::from(NAMES[i - 1]),
+                            pallet_identity::IdtyValue {
+                                next_creatable_identity_on: 0,
+                                removable_on: 0,
+                                status: pallet_identity::IdtyStatus::Validated,
+                            },
+                        ),
+                    )
                 })
                 .collect(),
         },
diff --git a/pallets/duniter-wot/src/tests.rs b/pallets/duniter-wot/src/tests.rs
index 7c001e96a..8176a1e17 100644
--- a/pallets/duniter-wot/src/tests.rs
+++ b/pallets/duniter-wot/src/tests.rs
@@ -48,7 +48,7 @@ fn test_creator_not_allowed_to_create_idty() {
         // Alice should not be able te create an identity before block #2
         // because Alice.next_issuable_on = 2
         assert_err!(
-            Identity::create_identity(Origin::signed(1), 1, IdtyName::from("Dave"), 4),
+            Identity::create_identity(Origin::signed(1), 4),
             pallet_identity::Error::<Test>::CreatorNotAllowedToCreateIdty
         );
     });
@@ -60,12 +60,7 @@ fn test_create_idty_ok() {
         run_to_block(2);
 
         // Alice should be able te create an identity at block #2
-        assert_ok!(Identity::create_identity(
-            Origin::signed(1),
-            1,
-            IdtyName::from("Ferdie"),
-            6
-        ));
+        assert_ok!(Identity::create_identity(Origin::signed(1), 6));
         // 2 events should have occurred: IdtyCreated and NewCert
         let events = System::events();
         assert_eq!(events.len(), 2);
@@ -73,10 +68,7 @@ fn test_create_idty_ok() {
             events[0],
             EventRecord {
                 phase: Phase::Initialization,
-                event: Event::Identity(pallet_identity::Event::IdtyCreated(
-                    IdtyName::from("Ferdie"),
-                    6
-                )),
+                event: Event::Identity(pallet_identity::Event::IdtyCreated(6, 6)),
                 topics: vec![],
             }
         );
@@ -104,19 +96,13 @@ fn test_new_idty_validation() {
     new_test_ext(5).execute_with(|| {
         // Alice create Ferdie identity
         run_to_block(2);
-        assert_ok!(Identity::create_identity(
-            Origin::signed(1),
-            1,
-            IdtyName::from("Ferdie"),
-            6
-        ));
+        assert_ok!(Identity::create_identity(Origin::signed(1), 6));
 
         // Ferdie confirm it's identity
         run_to_block(3);
         assert_ok!(Identity::confirm_identity(
             Origin::signed(6),
             IdtyName::from("Ferdie"),
-            6
         ));
 
         // Ferdie is not yet validated, so there should be no wot diff
@@ -154,9 +140,7 @@ fn test_new_idty_validation() {
             events[2],
             EventRecord {
                 phase: Phase::Initialization,
-                event: Event::Identity(pallet_identity::Event::IdtyValidated(IdtyName::from(
-                    "Ferdie"
-                ),)),
+                event: Event::Identity(pallet_identity::Event::IdtyValidated(6,)),
                 topics: vec![],
             }
         );
@@ -180,12 +164,7 @@ fn test_confirm_idty_ok() {
         run_to_block(2);
 
         // Alice create Ferdie identity
-        assert_ok!(Identity::create_identity(
-            Origin::signed(1),
-            1,
-            IdtyName::from("Ferdie"),
-            6
-        ));
+        assert_ok!(Identity::create_identity(Origin::signed(1), 6));
 
         run_to_block(3);
 
@@ -193,7 +172,6 @@ fn test_confirm_idty_ok() {
         assert_ok!(Identity::confirm_identity(
             Origin::signed(6),
             IdtyName::from("Ferdie"),
-            6
         ));
         let events = System::events();
         // 2 events should have occurred: MembershipRequested and IdtyConfirmed
@@ -211,9 +189,11 @@ fn test_confirm_idty_ok() {
             events[1],
             EventRecord {
                 phase: Phase::Initialization,
-                event: Event::Identity(pallet_identity::Event::IdtyConfirmed(IdtyName::from(
-                    "Ferdie"
-                ),)),
+                event: Event::Identity(pallet_identity::Event::IdtyConfirmed(
+                    6,
+                    6,
+                    IdtyName::from("Ferdie"),
+                )),
                 topics: vec![],
             }
         );
@@ -226,9 +206,9 @@ fn test_idty_membership_expire_them_requested() {
         run_to_block(4);
 
         // Alice renew her membership
-        assert_ok!(Membership::renew_membership(Origin::signed(1), 1));
+        assert_ok!(Membership::renew_membership(Origin::signed(1), None));
         // Bob renew his membership
-        assert_ok!(Membership::renew_membership(Origin::signed(2), 2));
+        assert_ok!(Membership::renew_membership(Origin::signed(2), None));
 
         // Charlie's membership should expire at block #5
         run_to_block(5);
@@ -253,7 +233,11 @@ fn test_idty_membership_expire_them_requested() {
 
         // Charlie should be able to request membership
         run_to_block(6);
-        assert_ok!(Membership::request_membership(Origin::signed(3), 3, ()));
+        assert_ok!(Membership::request_membership(
+            Origin::signed(3),
+            3,
+            crate::MembershipMetaData(3)
+        ));
 
         // Charlie should re-enter in the wot immediatly
         let events = System::events();
@@ -278,9 +262,7 @@ fn test_idty_membership_expire_them_requested() {
             events[2],
             EventRecord {
                 phase: Phase::Initialization,
-                event: Event::Identity(pallet_identity::Event::IdtyValidated(IdtyName::from(
-                    "Charlie"
-                ))),
+                event: Event::Identity(pallet_identity::Event::IdtyValidated(3)),
                 topics: vec![],
             }
         );
diff --git a/pallets/duniter-wot/src/types.rs b/pallets/duniter-wot/src/types.rs
index fc72ef21a..639eda216 100644
--- a/pallets/duniter-wot/src/types.rs
+++ b/pallets/duniter-wot/src/types.rs
@@ -32,8 +32,8 @@ impl<T: Config<I>, I: 'static> EnsureOrigin<(T::Origin, IdtyIndex, IdtyIndex)>
         match o.0.clone().into() {
             Ok(frame_system::RawOrigin::Root) => Ok(()),
             Ok(frame_system::RawOrigin::Signed(who)) => {
-                if let Some(issuer) = pallet_identity::Pallet::<T>::identity(o.1) {
-                    if who == issuer.owner_key {
+                if let Some(idty_index) = pallet_identity::Pallet::<T>::identity_index_of(who) {
+                    if o.1 == idty_index {
                         if let Some(receiver) = pallet_identity::Pallet::<T>::identity(o.2) {
                             match receiver.status {
                                 IdtyStatus::ConfirmedByOwner => Ok(()),
@@ -92,6 +92,24 @@ impl<T: Config<I>, I: 'static> EnsureOrigin<(T::Origin, IdtyIndex, IdtyIndex)>
     }
 }
 
+#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, TypeInfo)]
+pub struct MembershipMetaData<AccountId>(pub AccountId);
+impl<AccountId: Eq> sp_membership::traits::Validate<AccountId> for MembershipMetaData<AccountId> {
+    fn validate(&self, account_id: &AccountId) -> bool {
+        &self.0 == account_id
+    }
+}
+/*impl From<AccountId> for MembershipMetaData {
+    fn from(account_id: AccountId) -> Self {
+        Self(account_id)
+    }
+}*/
+/*impl Into<AccountId> for MembershipMetaData {
+    fn into(self) -> AccountId {
+        self.0
+    }
+}*/
+
 #[cfg_attr(feature = "std", derive(Debug))]
 #[derive(codec::Decode, codec::Encode, Eq, PartialEq, TypeInfo)]
 pub enum WotDiff {
diff --git a/pallets/identity/Cargo.toml b/pallets/identity/Cargo.toml
index 8537bccbc..8a206f695 100644
--- a/pallets/identity/Cargo.toml
+++ b/pallets/identity/Cargo.toml
@@ -80,6 +80,9 @@ version = '1.0.119'
 
 ### DEV ###
 
+[dev-dependencies.maplit]
+version = '1.0.2'
+
 [dev-dependencies.sp-io]
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-01'
diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs
index 7e8564c29..7f38b9bb1 100644
--- a/pallets/identity/src/lib.rs
+++ b/pallets/identity/src/lib.rs
@@ -67,10 +67,6 @@ pub mod pallet {
         type EnsureIdtyCallAllowed: EnsureIdtyCallAllowed<Self>;
         /// Minimum duration between the creation of 2 identities by the same creator
         type IdtyCreationPeriod: Get<Self::BlockNumber>;
-        ///  Identity custom data
-        type IdtyData: Parameter + Member + MaybeSerializeDeserialize + Debug + Default;
-        ///  Identity custom data provider
-        type IdtyDataProvider: ProvideIdtyData<Self>;
         /// A short identity index.
         type IdtyIndex: Parameter
             + Member
@@ -99,7 +95,10 @@ pub mod pallet {
 
     #[pallet::genesis_config]
     pub struct GenesisConfig<T: Config> {
-        pub identities: Vec<IdtyValue<T::AccountId, T::BlockNumber, T::IdtyData>>,
+        pub identities: sp_std::collections::btree_map::BTreeMap<
+            T::AccountId,
+            (IdtyName, IdtyValue<T::BlockNumber>),
+        >,
     }
 
     #[cfg(feature = "std")]
@@ -115,22 +114,18 @@ pub mod pallet {
     impl<T: Config> GenesisBuild<T> for GenesisConfig<T> {
         fn build(&self) {
             let mut names = sp_std::collections::btree_set::BTreeSet::new();
-            for idty_value in &self.identities {
+            for (idty_name, idty_value) in self.identities.values() {
                 assert!(
-                    !names.contains(&idty_value.name),
+                    !names.contains(&idty_name),
                     "Idty name {:?} is present twice",
-                    &idty_value.name
+                    &idty_name
                 );
                 assert!(idty_value.removable_on == T::BlockNumber::zero());
-                names.insert(idty_value.name.clone());
+                names.insert(idty_name);
             }
 
-            // We need to sort identities to ensure determinisctic result
-            let mut identities = self.identities.clone();
-            identities.sort_by(|idty_val_1, idty_val_2| idty_val_1.name.cmp(&idty_val_2.name));
-
             <IdentitiesCount<T>>::put(self.identities.len() as u64);
-            for idty_value in &identities {
+            for (owner_key, (idty_name, idty_value)) in &self.identities {
                 let idty_index = Pallet::<T>::get_next_idty_index();
                 if idty_value.removable_on > T::BlockNumber::zero() {
                     <IdentitiesRemovableOn<T>>::append(
@@ -139,27 +134,27 @@ pub mod pallet {
                     )
                 }
                 <Identities<T>>::insert(idty_index, idty_value);
+                IdentitiesNames::<T>::insert(idty_name, ());
+                IdentityIndexOf::<T>::insert(owner_key, idty_index);
             }
         }
     }
 
     // STORAGE //
 
-    /// Identities
     #[pallet::storage]
     #[pallet::getter(fn identity)]
-    pub type Identities<T: Config> = StorageMap<
-        _,
-        Twox64Concat,
-        T::IdtyIndex,
-        IdtyValue<T::AccountId, T::BlockNumber, T::IdtyData>,
-        OptionQuery,
-    >;
+    pub type Identities<T: Config> =
+        StorageMap<_, Twox64Concat, T::IdtyIndex, IdtyValue<T::BlockNumber>, OptionQuery>;
+
+    #[pallet::storage]
+    #[pallet::getter(fn identity_index_of)]
+    pub type IdentityIndexOf<T: Config> =
+        StorageMap<_, Blake2_128, T::AccountId, T::IdtyIndex, OptionQuery>;
 
     #[pallet::storage]
     #[pallet::getter(fn identity_by_did)]
-    pub type IdentitiesNames<T: Config> =
-        StorageMap<_, Blake2_128, IdtyName, T::IdtyIndex, ValueQuery>;
+    pub type IdentitiesNames<T: Config> = StorageMap<_, Blake2_128, IdtyName, (), OptionQuery>;
 
     #[pallet::storage]
     pub(super) type NextIdtyIndex<T: Config> = StorageValue<_, T::IdtyIndex, ValueQuery>;
@@ -195,14 +190,14 @@ pub mod pallet {
     #[pallet::generate_deposit(pub(super) fn deposit_event)]
     pub enum Event<T: Config> {
         /// A new identity has been created
-        /// [idty, owner_key]
-        IdtyCreated(IdtyName, T::AccountId),
+        /// [idty_index, owner_key]
+        IdtyCreated(T::IdtyIndex, T::AccountId),
         /// An identity has been confirmed by it's owner
-        /// [idty]
-        IdtyConfirmed(IdtyName),
+        /// [idty_index, owner_key, name]
+        IdtyConfirmed(T::IdtyIndex, T::AccountId, IdtyName),
         /// An identity has been validated
-        /// [idty]
-        IdtyValidated(IdtyName),
+        /// [idty_index]
+        IdtyValidated(T::IdtyIndex),
     }
 
     // CALLS //
@@ -215,19 +210,15 @@ pub mod pallet {
         #[pallet::weight(0)]
         pub fn create_identity(
             origin: OriginFor<T>,
-            creator: T::IdtyIndex,
-            idty_name: IdtyName,
             owner_key: T::AccountId,
         ) -> DispatchResultWithPostInfo {
             // Verification phase //
             let who = ensure_signed(origin)?;
 
+            let creator =
+                IdentityIndexOf::<T>::try_get(&who).map_err(|_| Error::<T>::IdtyIndexNotFound)?;
             let creator_idty_val =
-                Identities::<T>::try_get(&creator).map_err(|_| Error::<T>::CreatorNotExist)?;
-
-            if who != creator_idty_val.owner_key {
-                return Err(Error::<T>::RequireToBeOwner.into());
-            }
+                Identities::<T>::try_get(&creator).map_err(|_| Error::<T>::IdtyNotFound)?;
 
             if !T::EnsureIdtyCallAllowed::can_create_identity(creator) {
                 return Err(Error::<T>::CreatorNotAllowedToCreateIdty.into());
@@ -239,13 +230,6 @@ pub mod pallet {
                 return Err(Error::<T>::NotRespectIdtyCreationPeriod.into());
             }
 
-            if !T::IdtyNameValidator::validate(&idty_name) {
-                return Err(Error::<T>::IdtyNameInvalid.into());
-            }
-            if <IdentitiesNames<T>>::contains_key(&idty_name) {
-                return Err(Error::<T>::IdtyNameAlreadyExist.into());
-            }
-
             // Apply phase //
 
             <Identities<T>>::mutate_exists(creator, |idty_val_opt| {
@@ -255,27 +239,21 @@ pub mod pallet {
                 }
             });
 
-            let idty_data =
-                T::IdtyDataProvider::provide_identity_data(creator, &idty_name, &owner_key);
-
             let removable_on = block_number + T::ConfirmPeriod::get();
 
             let idty_index = Self::get_next_idty_index();
             <Identities<T>>::insert(
                 idty_index,
                 IdtyValue {
-                    name: idty_name.clone(),
                     next_creatable_identity_on: T::BlockNumber::zero(),
-                    owner_key: owner_key.clone(),
                     removable_on,
                     status: IdtyStatus::Created,
-                    data: idty_data,
                 },
             );
-            <IdentitiesNames<T>>::insert(idty_name.clone(), idty_index);
             IdentitiesRemovableOn::<T>::append(removable_on, (idty_index, IdtyStatus::Created));
+            IdentityIndexOf::<T>::insert(owner_key.clone(), idty_index);
             Self::inc_identities_counter();
-            Self::deposit_event(Event::IdtyCreated(idty_name, owner_key));
+            Self::deposit_event(Event::IdtyCreated(idty_index, owner_key));
             T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Created { creator });
             Ok(().into())
         }
@@ -283,64 +261,68 @@ pub mod pallet {
         pub fn confirm_identity(
             origin: OriginFor<T>,
             idty_name: IdtyName,
-            idty_index: T::IdtyIndex,
         ) -> DispatchResultWithPostInfo {
+            // Verification phase //
             let who = ensure_signed(origin)?;
 
-            if let Ok(mut idty_value) = <Identities<T>>::try_get(idty_index) {
-                if who == idty_value.owner_key {
-                    if idty_value.status != IdtyStatus::Created {
-                        return Err(Error::<T>::IdtyAlreadyConfirmed.into());
-                    }
-                    if idty_value.name != idty_name {
-                        return Err(Error::<T>::NotSameIdtyName.into());
-                    }
-                    if !T::EnsureIdtyCallAllowed::can_confirm_identity(idty_index) {
-                        return Err(Error::<T>::NotAllowedToConfirmIdty.into());
-                    }
+            let idty_index =
+                IdentityIndexOf::<T>::try_get(&who).map_err(|_| Error::<T>::IdtyIndexNotFound)?;
 
-                    idty_value.status = IdtyStatus::ConfirmedByOwner;
+            let mut idty_value =
+                Identities::<T>::try_get(idty_index).map_err(|_| Error::<T>::IdtyNotFound)?;
 
-                    <Identities<T>>::insert(idty_index, idty_value);
-                    Self::deposit_event(Event::IdtyConfirmed(idty_name));
-                    T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Confirmed);
-                    Ok(().into())
-                } else {
-                    Err(Error::<T>::RequireToBeOwner.into())
-                }
-            } else {
-                Err(Error::<T>::IdtyNotFound.into())
+            if idty_value.status != IdtyStatus::Created {
+                return Err(Error::<T>::IdtyAlreadyConfirmed.into());
+            }
+            if !T::IdtyNameValidator::validate(&idty_name) {
+                return Err(Error::<T>::IdtyNameInvalid.into());
+            }
+            if <IdentitiesNames<T>>::contains_key(&idty_name) {
+                return Err(Error::<T>::IdtyNameAlreadyExist.into());
+            }
+            if !T::EnsureIdtyCallAllowed::can_confirm_identity(idty_index, who.clone()) {
+                return Err(Error::<T>::NotAllowedToConfirmIdty.into());
             }
+
+            // Apply phase //
+            idty_value.status = IdtyStatus::ConfirmedByOwner;
+
+            <Identities<T>>::insert(idty_index, idty_value);
+            <IdentitiesNames<T>>::insert(idty_name.clone(), ());
+            Self::deposit_event(Event::IdtyConfirmed(idty_index, who, idty_name));
+            T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Confirmed);
+            Ok(().into())
         }
         #[pallet::weight(0)]
         pub fn validate_identity(
             origin: OriginFor<T>,
             idty_index: T::IdtyIndex,
         ) -> DispatchResultWithPostInfo {
+            // Verification phase //
             T::IdtyValidationOrigin::ensure_origin(origin)?;
 
-            if let Ok(mut idty_value) = <Identities<T>>::try_get(idty_index) {
-                match idty_value.status {
-                    IdtyStatus::Created => Err(Error::<T>::IdtyNotConfirmedByOwner.into()),
-                    IdtyStatus::ConfirmedByOwner | IdtyStatus::Disabled => {
-                        if !T::EnsureIdtyCallAllowed::can_validate_identity(idty_index) {
-                            return Err(Error::<T>::NotAllowedToValidateIdty.into());
-                        }
-
-                        idty_value.removable_on = T::BlockNumber::zero();
-                        idty_value.status = IdtyStatus::Validated;
-                        let name = idty_value.name.clone();
-
-                        <Identities<T>>::insert(idty_index, idty_value);
-                        Self::deposit_event(Event::IdtyValidated(name));
-                        T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Validated);
-                        Ok(().into())
+            let mut idty_value =
+                Identities::<T>::try_get(idty_index).map_err(|_| Error::<T>::IdtyNotFound)?;
+
+            match idty_value.status {
+                IdtyStatus::Created => return Err(Error::<T>::IdtyNotConfirmedByOwner.into()),
+                IdtyStatus::ConfirmedByOwner | IdtyStatus::Disabled => {
+                    if !T::EnsureIdtyCallAllowed::can_validate_identity(idty_index) {
+                        return Err(Error::<T>::NotAllowedToValidateIdty.into());
                     }
-                    IdtyStatus::Validated => Err(Error::<T>::IdtyAlreadyValidated.into()),
                 }
-            } else {
-                Err(Error::<T>::IdtyNotFound.into())
+                IdtyStatus::Validated => return Err(Error::<T>::IdtyAlreadyValidated.into()),
             }
+
+            // Apply phase //
+            idty_value.removable_on = T::BlockNumber::zero();
+            idty_value.status = IdtyStatus::Validated;
+
+            <Identities<T>>::insert(idty_index, idty_value);
+            Self::deposit_event(Event::IdtyValidated(idty_index));
+            T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Validated);
+
+            Ok(().into())
         }
         #[pallet::weight(0)]
         pub fn disable_identity(
@@ -371,10 +353,49 @@ pub mod pallet {
         pub fn remove_identity(
             origin: OriginFor<T>,
             idty_index: T::IdtyIndex,
+            idty_name: Option<IdtyName>,
         ) -> DispatchResultWithPostInfo {
             ensure_root(origin)?;
 
             Self::do_remove_identity(idty_index);
+            if let Some(idty_name) = idty_name {
+                <IdentitiesNames<T>>::remove(idty_name);
+            }
+
+            Ok(().into())
+        }
+
+        #[pallet::weight(0)]
+        pub fn prune_item_identities_names(
+            origin: OriginFor<T>,
+            names: Vec<IdtyName>,
+        ) -> DispatchResultWithPostInfo {
+            ensure_root(origin)?;
+
+            for name in names {
+                <IdentitiesNames<T>>::remove(name);
+            }
+
+            Ok(().into())
+        }
+
+        #[pallet::weight(0)]
+        pub fn prune_item_identity_index_of(
+            origin: OriginFor<T>,
+            accounts_ids: Vec<T::AccountId>,
+        ) -> DispatchResultWithPostInfo {
+            ensure_root(origin)?;
+
+            accounts_ids
+                .into_iter()
+                .filter(|account_id| {
+                    if let Ok(idty_index) = IdentityIndexOf::<T>::try_get(&account_id) {
+                        !Identities::<T>::contains_key(&idty_index)
+                    } else {
+                        false
+                    }
+                })
+                .for_each(IdentityIndexOf::<T>::remove);
 
             Ok(().into())
         }
@@ -384,8 +405,6 @@ pub mod pallet {
 
     #[pallet::error]
     pub enum Error<T> {
-        /// Creator not exist
-        CreatorNotExist,
         /// Creator not allowed to create identities
         CreatorNotAllowedToCreateIdty,
         /// Identity already confirmed
@@ -394,6 +413,8 @@ pub mod pallet {
         IdtyAlreadyValidated,
         /// You are not allowed to create a new identity now
         IdtyCreationNotAllowed,
+        /// Identity index not found
+        IdtyIndexNotFound,
         /// Identity name already exist
         IdtyNameAlreadyExist,
         /// Idty name invalid
@@ -414,8 +435,6 @@ pub mod pallet {
         NotAllowedToValidateIdty,
         /// Not same identity name
         NotSameIdtyName,
-        /// This operation requires to be the owner of the identity
-        RequireToBeOwner,
         /// Right already added
         RightAlreadyAdded,
         /// Right not exist
@@ -424,18 +443,6 @@ pub mod pallet {
         NotRespectIdtyCreationPeriod,
     }
 
-    // PUBLIC FUNCTIONS //
-
-    impl<T: Config> Pallet<T> {
-        pub fn set_idty_data(idty_index: T::IdtyIndex, idty_data: T::IdtyData) {
-            Identities::<T>::mutate_exists(idty_index, |idty_val_opt| {
-                if let Some(ref mut idty_val) = idty_val_opt {
-                    idty_val.data = idty_data;
-                }
-            });
-        }
-    }
-
     // INTERNAL FUNCTIONS //
 
     impl<T: Config> Pallet<T> {
@@ -447,9 +454,7 @@ pub mod pallet {
             }
         }
         pub(super) fn do_remove_identity(idty_index: T::IdtyIndex) -> Weight {
-            if let Some(idty_val) = <Identities<T>>::take(idty_index) {
-                <IdentitiesNames<T>>::remove(idty_val.name);
-            }
+            <Identities<T>>::remove(idty_index);
             Self::dec_identities_counter();
             T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Removed);
 
@@ -486,3 +491,9 @@ pub mod pallet {
         }
     }
 }
+
+impl<T: Config> sp_runtime::traits::Convert<T::AccountId, Option<T::IdtyIndex>> for Pallet<T> {
+    fn convert(account_id: T::AccountId) -> Option<T::IdtyIndex> {
+        Self::identity_index_of(account_id)
+    }
+}
diff --git a/pallets/identity/src/mock.rs b/pallets/identity/src/mock.rs
index 57b7bbc2d..1cea91aa9 100644
--- a/pallets/identity/src/mock.rs
+++ b/pallets/identity/src/mock.rs
@@ -104,8 +104,6 @@ impl pallet_identity::Config for Test {
     type Event = Event;
     type EnsureIdtyCallAllowed = ();
     type IdtyCreationPeriod = IdtyCreationPeriod;
-    type IdtyData = ();
-    type IdtyDataProvider = ();
     type IdtyNameValidator = IdtyNameValidatorTestImpl;
     type IdtyIndex = u64;
     type IdtyValidationOrigin = system::EnsureRoot<AccountId>;
diff --git a/pallets/identity/src/tests.rs b/pallets/identity/src/tests.rs
index 2d59bcdd4..f29ed1844 100644
--- a/pallets/identity/src/tests.rs
+++ b/pallets/identity/src/tests.rs
@@ -19,83 +19,50 @@ use crate::{Error, IdtyName, IdtyValue};
 //use frame_support::assert_err;
 use frame_support::assert_ok;
 use frame_system::{EventRecord, Phase};
+use maplit::btreemap;
+use std::collections::BTreeMap;
 
-type IdtyVal = IdtyValue<u64, u64, ()>;
+type IdtyVal = IdtyValue<u64>;
 
-fn alice() -> IdtyVal {
-    IdtyVal {
-        data: (),
-        owner_key: 1,
-        name: IdtyName::from("Alice"),
-        next_creatable_identity_on: 0,
-        removable_on: 0,
-        status: crate::IdtyStatus::Validated,
-    }
+fn alice() -> (IdtyName, IdtyVal) {
+    (
+        IdtyName::from("Alice"),
+        IdtyVal {
+            next_creatable_identity_on: 0,
+            removable_on: 0,
+            status: crate::IdtyStatus::Validated,
+        },
+    )
 }
 
 #[test]
 fn test_no_identity() {
     new_test_ext(IdentityConfig {
-        identities: Vec::with_capacity(0),
+        identities: BTreeMap::new(),
     })
     .execute_with(|| {
         assert_eq!(Identity::identities_count(), 0);
     });
 }
 
-#[test]
-fn test_creator_not_exist() {
-    new_test_ext(IdentityConfig {
-        identities: Vec::with_capacity(0),
-    })
-    .execute_with(|| {
-        assert_eq!(
-            Identity::create_identity(Origin::signed(1), 1, IdtyName::from("bob"), 2),
-            Err(Error::<Test>::CreatorNotExist.into())
-        );
-    });
-}
-
-#[test]
-fn test_creator_not_owner() {
-    new_test_ext(IdentityConfig {
-        identities: vec![alice()],
-    })
-    .execute_with(|| {
-        // We need to initialize at least one block before any call
-        run_to_block(1);
-
-        // Someone try to create an identity pretending to be Alice
-        assert_eq!(
-            Identity::create_identity(Origin::signed(2), 1, IdtyName::from("Charlie"), 3),
-            Err(Error::<Test>::RequireToBeOwner.into())
-        );
-    })
-}
-
 #[test]
 fn test_create_identity_ok() {
     new_test_ext(IdentityConfig {
-        identities: vec![alice()],
+        identities: btreemap![1 => alice()],
     })
     .execute_with(|| {
         // We need to initialize at least one block before any call
         run_to_block(1);
 
         // Alice should be able te create an identity
-        assert_ok!(Identity::create_identity(
-            Origin::signed(1),
-            1,
-            IdtyName::from("bob"),
-            2
-        ));
+        assert_ok!(Identity::create_identity(Origin::signed(1), 2));
         let events = System::events();
         assert_eq!(events.len(), 1);
         assert_eq!(
             events[0],
             EventRecord {
                 phase: Phase::Initialization,
-                event: Event::Identity(crate::Event::IdtyCreated(IdtyName::from("bob"), 2)),
+                event: Event::Identity(crate::Event::IdtyCreated(2, 2)),
                 topics: vec![],
             }
         );
@@ -105,26 +72,21 @@ fn test_create_identity_ok() {
 #[test]
 fn test_idty_creation_period() {
     new_test_ext(IdentityConfig {
-        identities: vec![alice()],
+        identities: btreemap![1 => alice()],
     })
     .execute_with(|| {
         // We need to initialize at least one block before any call
         run_to_block(1);
 
         // Alice should be able te create an identity
-        assert_ok!(Identity::create_identity(
-            Origin::signed(1),
-            1,
-            IdtyName::from("bob"),
-            2
-        ));
+        assert_ok!(Identity::create_identity(Origin::signed(1), 2));
         let events = System::events();
         assert_eq!(events.len(), 1);
         assert_eq!(
             events[0],
             EventRecord {
                 phase: Phase::Initialization,
-                event: Event::Identity(crate::Event::IdtyCreated(IdtyName::from("bob"), 2)),
+                event: Event::Identity(crate::Event::IdtyCreated(2, 2)),
                 topics: vec![],
             }
         );
@@ -133,25 +95,20 @@ fn test_idty_creation_period() {
         // Alice cannot create a new identity before block #4
         run_to_block(2);
         assert_eq!(
-            Identity::create_identity(Origin::signed(1), 1, IdtyName::from("Charlie"), 3),
+            Identity::create_identity(Origin::signed(1), 3),
             Err(Error::<Test>::NotRespectIdtyCreationPeriod.into())
         );
 
         // Alice should be able te create a second identity after block #4
         run_to_block(4);
-        assert_ok!(Identity::create_identity(
-            Origin::signed(1),
-            1,
-            IdtyName::from("Charlie"),
-            3
-        ));
+        assert_ok!(Identity::create_identity(Origin::signed(1), 3));
         let events = System::events();
         assert_eq!(events.len(), 1);
         assert_eq!(
             events[0],
             EventRecord {
                 phase: Phase::Initialization,
-                event: Event::Identity(crate::Event::IdtyCreated(IdtyName::from("Charlie"), 3)),
+                event: Event::Identity(crate::Event::IdtyCreated(3, 3)),
                 topics: vec![],
             }
         );
diff --git a/pallets/identity/src/traits.rs b/pallets/identity/src/traits.rs
index 5ddbf29c8..9163e2f17 100644
--- a/pallets/identity/src/traits.rs
+++ b/pallets/identity/src/traits.rs
@@ -19,7 +19,7 @@ use frame_support::pallet_prelude::*;
 
 pub trait EnsureIdtyCallAllowed<T: Config> {
     fn can_create_identity(creator: T::IdtyIndex) -> bool;
-    fn can_confirm_identity(idty_index: T::IdtyIndex) -> bool;
+    fn can_confirm_identity(idty_index: T::IdtyIndex, owner_key: T::AccountId) -> bool;
     fn can_validate_identity(idty_index: T::IdtyIndex) -> bool;
 }
 
@@ -27,7 +27,7 @@ impl<T: Config> EnsureIdtyCallAllowed<T> for () {
     fn can_create_identity(_: T::IdtyIndex) -> bool {
         true
     }
-    fn can_confirm_identity(_: T::IdtyIndex) -> bool {
+    fn can_confirm_identity(_: T::IdtyIndex, _: T::AccountId) -> bool {
         true
     }
     fn can_validate_identity(_: T::IdtyIndex) -> bool {
@@ -35,27 +35,6 @@ impl<T: Config> EnsureIdtyCallAllowed<T> for () {
     }
 }
 
-pub trait ProvideIdtyData<T: Config> {
-    fn provide_identity_data(
-        creator: T::IdtyIndex,
-        idty_name: &IdtyName,
-        idty_owner_key: &T::AccountId,
-    ) -> T::IdtyData;
-}
-
-impl<T: Config> ProvideIdtyData<T> for ()
-where
-    T::IdtyData: Default,
-{
-    fn provide_identity_data(
-        _creator: T::IdtyIndex,
-        _idty_name: &IdtyName,
-        _idty_owner_key: &T::AccountId,
-    ) -> T::IdtyData {
-        Default::default()
-    }
-}
-
 pub trait IdtyNameValidator {
     fn validate(idty_name: &IdtyName) -> bool;
 }
diff --git a/pallets/identity/src/types.rs b/pallets/identity/src/types.rs
index 9418974fe..e3070a1e1 100644
--- a/pallets/identity/src/types.rs
+++ b/pallets/identity/src/types.rs
@@ -80,14 +80,7 @@ impl Default for IdtyStatus {
 
 #[cfg_attr(feature = "std", derive(Deserialize, Serialize))]
 #[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo)]
-pub struct IdtyValue<
-    AccountId: Decode + Encode + TypeInfo,
-    BlockNumber: Decode + Encode + TypeInfo,
-    IdtyData: Decode + Encode + TypeInfo,
-> {
-    pub data: IdtyData,
-    pub owner_key: AccountId,
-    pub name: IdtyName,
+pub struct IdtyValue<BlockNumber: Decode + Encode + TypeInfo> {
     pub next_creatable_identity_on: BlockNumber,
     pub removable_on: BlockNumber,
     pub status: IdtyStatus,
diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs
index 14183b79b..69b98c6f3 100644
--- a/pallets/membership/src/lib.rs
+++ b/pallets/membership/src/lib.rs
@@ -29,9 +29,11 @@ mod benchmarking;*/
 pub use pallet::*;
 
 use frame_support::dispatch::Weight;
-use frame_support::pallet_prelude::DispatchResultWithPostInfo;
+use frame_support::error::BadOrigin;
+use frame_support::pallet_prelude::*;
+use frame_system::RawOrigin;
 use sp_membership::traits::*;
-use sp_membership::{MembershipData, OriginPermission};
+use sp_membership::MembershipData;
 use sp_runtime::traits::Zero;
 use sp_std::prelude::*;
 #[cfg(feature = "std")]
@@ -40,10 +42,9 @@ use std::collections::BTreeMap;
 #[frame_support::pallet]
 pub mod pallet {
     use super::*;
-    use frame_support::pallet_prelude::*;
     use frame_support::traits::StorageVersion;
     use frame_system::pallet_prelude::*;
-    use sp_runtime::traits::IsMember;
+    use sp_runtime::traits::{Convert, IsMember};
 
     /// The current storage version.
     const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);
@@ -57,10 +58,8 @@ pub mod pallet {
 
     #[pallet::config]
     pub trait Config<I: 'static = ()>: frame_system::Config {
-        type IsIdtyAllowedToClaimMembership: IsIdtyAllowedToClaimMembership<Self::IdtyId>;
         type IsIdtyAllowedToRenewMembership: IsIdtyAllowedToRenewMembership<Self::IdtyId>;
         type IsIdtyAllowedToRequestMembership: IsIdtyAllowedToRequestMembership<Self::IdtyId>;
-        type IsOriginAllowedToUseIdty: IsOriginAllowedToUseIdty<Self::Origin, Self::IdtyId>;
         /// Because this pallet emits events, it depends on the runtime's definition of an event.
         type Event: From<Event<Self, I>> + IsType<<Self as frame_system::Config>::Event>;
         /// Specify true if you want to externalize the storage of memberships, but in this case
@@ -68,8 +67,9 @@ pub mod pallet {
         type ExternalizeMembershipStorage: Get<bool>;
         /// Something that identifies an identity
         type IdtyId: Copy + MaybeSerializeDeserialize + Parameter + Ord;
+        type IdtyIdOf: Convert<Self::AccountId, Option<Self::IdtyId>>;
         /// Optional metadata
-        type MetaData: Parameter;
+        type MetaData: Parameter + Validate<Self::AccountId>;
         /// Provide your implementation of membership storage here, if you want the pallet to
         /// handle the storage for you, specify `()` and set `ExternalizeMembershipStorage` to
         /// `false`.
@@ -181,12 +181,14 @@ pub mod pallet {
 
     #[pallet::error]
     pub enum Error<T, I = ()> {
-        /// Identity not allowed to claim membership
-        IdtyNotAllowedToClaimMembership,
         /// Identity not allowed to request membership
         IdtyNotAllowedToRequestMembership,
         /// Identity not allowed to renew membership
         IdtyNotAllowedToRenewMembership,
+        /// Invalid meta data
+        InvalidMetaData,
+        /// Identity id not found
+        IdtyIdNotFound,
         /// Membership already acquired
         MembershipAlreadyAcquired,
         /// Membership already requested
@@ -228,22 +230,22 @@ pub mod pallet {
             idty_id: T::IdtyId,
             metadata: T::MetaData,
         ) -> DispatchResultWithPostInfo {
-            let allowed =
-                match T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id)
-                {
-                    OriginPermission::Forbidden => {
-                        return Err(Error::<T, I>::OriginNotAllowedToUseIdty.into())
+            let is_root = match origin.into() {
+                Ok(RawOrigin::Root) => true,
+                Ok(RawOrigin::Signed(account_id)) => {
+                    if let Some(expected_idty_id) = T::IdtyIdOf::convert(account_id.clone()) {
+                        if idty_id != expected_idty_id {
+                            return Err(BadOrigin.into());
+                        } else if !metadata.validate(&account_id) {
+                            return Err(Error::<T, I>::InvalidMetaData.into());
+                        }
+                    } else {
+                        return Err(Error::<T, I>::IdtyIdNotFound.into());
                     }
-                    OriginPermission::Allowed => {
-                        T::IsIdtyAllowedToRequestMembership::is_idty_allowed_to_request_membership(
-                            &idty_id,
-                        )
-                    }
-                    OriginPermission::Root => true,
-                };
-            if !allowed {
-                return Err(Error::<T, I>::IdtyNotAllowedToRequestMembership.into());
-            }
+                    false
+                }
+                _ => return Err(BadOrigin.into()),
+            };
             if PendingMembership::<T, I>::contains_key(&idty_id) {
                 return Err(Error::<T, I>::MembershipAlreadyRequested.into());
             }
@@ -253,6 +255,13 @@ pub mod pallet {
             if RevokedMembership::<T, I>::contains_key(&idty_id) {
                 return Err(Error::<T, I>::MembershipRevokedRecently.into());
             }
+            if !is_root
+                && !T::IsIdtyAllowedToRequestMembership::is_idty_allowed_to_request_membership(
+                    &idty_id,
+                )
+            {
+                return Err(Error::<T, I>::IdtyNotAllowedToRequestMembership.into());
+            }
 
             let block_number = frame_system::pallet::Pallet::<T>::block_number();
             let expire_on = block_number + T::PendingMembershipPeriod::get();
@@ -268,28 +277,14 @@ pub mod pallet {
         #[pallet::weight(0)]
         pub fn claim_membership(
             origin: OriginFor<T>,
-            idty_id: T::IdtyId,
+            maybe_idty_id: Option<T::IdtyId>,
         ) -> DispatchResultWithPostInfo {
             // Verify phase
+            let idty_id = Self::ensure_origin_and_get_idty_id(origin, maybe_idty_id)?;
+
             if Membership::<T, I>::contains_key(&idty_id) {
                 return Err(Error::<T, I>::MembershipAlreadyAcquired.into());
             }
-            let allowed =
-                match T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id)
-                {
-                    OriginPermission::Forbidden => {
-                        return Err(Error::<T, I>::OriginNotAllowedToUseIdty.into())
-                    }
-                    OriginPermission::Allowed => {
-                        T::IsIdtyAllowedToClaimMembership::is_idty_allowed_to_claim_membership(
-                            &idty_id,
-                        )
-                    }
-                    OriginPermission::Root => true,
-                };
-            if !allowed {
-                return Err(Error::<T, I>::IdtyNotAllowedToClaimMembership.into());
-            }
 
             let metadata = PendingMembership::<T, I>::take(&idty_id)
                 .ok_or(Error::<T, I>::MembershipRequestNotFound)?;
@@ -305,22 +300,12 @@ pub mod pallet {
         #[pallet::weight(0)]
         pub fn renew_membership(
             origin: OriginFor<T>,
-            idty_id: T::IdtyId,
+            maybe_idty_id: Option<T::IdtyId>,
         ) -> DispatchResultWithPostInfo {
-            let allowed =
-                match T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id)
-                {
-                    OriginPermission::Forbidden => {
-                        return Err(Error::<T, I>::OriginNotAllowedToUseIdty.into())
-                    }
-                    OriginPermission::Allowed => {
-                        T::IsIdtyAllowedToRenewMembership::is_idty_allowed_to_renew_membership(
-                            &idty_id,
-                        )
-                    }
-                    OriginPermission::Root => true,
-                };
-            if !allowed {
+            // Verify phase
+            let idty_id = Self::ensure_origin_and_get_idty_id(origin, maybe_idty_id)?;
+
+            if !T::IsIdtyAllowedToRenewMembership::is_idty_allowed_to_renew_membership(&idty_id) {
                 return Err(Error::<T, I>::IdtyNotAllowedToRenewMembership.into());
             }
 
@@ -341,14 +326,12 @@ pub mod pallet {
         #[pallet::weight(0)]
         pub fn revoke_membership(
             origin: OriginFor<T>,
-            idty_id: T::IdtyId,
+            maybe_idty_id: Option<T::IdtyId>,
         ) -> DispatchResultWithPostInfo {
-            if T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id)
-                == OriginPermission::Forbidden
-            {
-                return Err(Error::<T, I>::OriginNotAllowedToUseIdty.into());
-            }
+            // Verify phase
+            let idty_id = Self::ensure_origin_and_get_idty_id(origin, maybe_idty_id)?;
 
+            // Apply phase
             let _ = Self::do_revoke_membership(idty_id);
 
             Ok(().into())
@@ -393,6 +376,19 @@ pub mod pallet {
 
             0
         }
+        fn ensure_origin_and_get_idty_id(
+            origin: OriginFor<T>,
+            maybe_idty_id: Option<T::IdtyId>,
+        ) -> Result<T::IdtyId, DispatchError> {
+            match origin.into() {
+                Ok(RawOrigin::Root) => {
+                    maybe_idty_id.ok_or_else(|| Error::<T, I>::IdtyIdNotFound.into())
+                }
+                Ok(RawOrigin::Signed(account_id)) => T::IdtyIdOf::convert(account_id)
+                    .ok_or_else(|| Error::<T, I>::IdtyIdNotFound.into()),
+                _ => Err(BadOrigin.into()),
+            }
+        }
         fn expire_memberships(block_number: T::BlockNumber) -> Weight {
             let mut total_weight: Weight = 0;
 
diff --git a/pallets/membership/src/mock.rs b/pallets/membership/src/mock.rs
index 27abbf1c3..507443161 100644
--- a/pallets/membership/src/mock.rs
+++ b/pallets/membership/src/mock.rs
@@ -21,11 +21,9 @@ use frame_support::{
 };
 use frame_system as system;
 use sp_core::H256;
-use sp_membership::traits::IsOriginAllowedToUseIdty;
-use sp_membership::OriginPermission;
 use sp_runtime::{
     testing::Header,
-    traits::{BlakeTwo256, IdentityLookup},
+    traits::{BlakeTwo256, ConvertInto, IdentityLookup},
     BuildStorage,
 };
 
@@ -79,19 +77,6 @@ impl system::Config for Test {
     type MaxConsumers = frame_support::traits::ConstU32<16>;
 }
 
-pub struct IsOriginAllowedToUseIdtyImpl;
-impl IsOriginAllowedToUseIdty<Origin, IdtyId> for IsOriginAllowedToUseIdtyImpl {
-    fn is_origin_allowed_to_use_idty(o: &Origin, idty_id: &IdtyId) -> OriginPermission {
-        match o.clone().into() {
-            Ok(system::RawOrigin::Root) => OriginPermission::Root,
-            Ok(system::RawOrigin::Signed(account_id)) if account_id == *idty_id => {
-                OriginPermission::Allowed
-            }
-            _ => OriginPermission::Forbidden,
-        }
-    }
-}
-
 parameter_types! {
     pub const ExternalizeMembershipStorage: bool = false;
     pub const MembershipPeriod: BlockNumber = 5;
@@ -101,13 +86,12 @@ parameter_types! {
 }
 
 impl pallet_membership::Config for Test {
-    type IsIdtyAllowedToClaimMembership = ();
     type IsIdtyAllowedToRenewMembership = ();
     type IsIdtyAllowedToRequestMembership = ();
-    type IsOriginAllowedToUseIdty = IsOriginAllowedToUseIdtyImpl;
     type Event = Event;
     type ExternalizeMembershipStorage = ExternalizeMembershipStorage;
     type IdtyId = IdtyId;
+    type IdtyIdOf = ConvertInto;
     type MembershipExternalStorage = crate::NoExternalStorage;
     type MembershipPeriod = MembershipPeriod;
     type MetaData = ();
diff --git a/pallets/membership/src/tests.rs b/pallets/membership/src/tests.rs
index 183a0d1f8..7ff7ab9eb 100644
--- a/pallets/membership/src/tests.rs
+++ b/pallets/membership/src/tests.rs
@@ -55,7 +55,7 @@ fn test_membership_not_yet_renewable() {
         run_to_block(1);
         // Merbership 0 cannot be renewed before #2
         assert_eq!(
-            DefaultMembership::renew_membership(Origin::signed(0), 0),
+            DefaultMembership::renew_membership(Origin::signed(0), None),
             Err(Error::<Test, _>::MembershipNotYetRenewable.into())
         );
     });
@@ -67,7 +67,7 @@ fn test_membership_already_acquired() {
         run_to_block(1);
         // Merbership 0 cannot be reclaimed
         assert_eq!(
-            DefaultMembership::claim_membership(Origin::signed(0), 0),
+            DefaultMembership::claim_membership(Origin::signed(0), None),
             Err(Error::<Test, _>::MembershipAlreadyAcquired.into())
         );
     });
@@ -79,7 +79,7 @@ fn test_membership_request_not_found() {
         run_to_block(1);
         // Merbership 0 cannot be reclaimed
         assert_eq!(
-            DefaultMembership::claim_membership(Origin::signed(1), 1),
+            DefaultMembership::claim_membership(Origin::signed(1), None),
             Err(Error::<Test, _>::MembershipRequestNotFound.into())
         );
     });
@@ -90,7 +90,7 @@ fn test_membership_renewal() {
     new_test_ext(default_gen_conf()).execute_with(|| {
         run_to_block(2);
         // Merbership 0 can be renewable on block #2
-        assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), 0),);
+        assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), None),);
         assert_eq!(
             System::events()[0].event,
             RuntimeEvent::DefaultMembership(Event::MembershipRenewed(0))
@@ -119,7 +119,10 @@ fn test_membership_revocation() {
     new_test_ext(default_gen_conf()).execute_with(|| {
         run_to_block(1);
         // Merbership 0 can be revocable on block #1
-        assert_ok!(DefaultMembership::revoke_membership(Origin::signed(0), 0),);
+        assert_ok!(DefaultMembership::revoke_membership(
+            Origin::signed(0),
+            None
+        ),);
         assert_eq!(
             System::events()[0].event,
             RuntimeEvent::DefaultMembership(Event::MembershipRevoked(0))
@@ -192,7 +195,7 @@ fn test_membership_workflow() {
 
         // Then, idty 0 claim membership
         run_to_block(2);
-        assert_ok!(DefaultMembership::claim_membership(Origin::signed(0), 0,),);
+        assert_ok!(DefaultMembership::claim_membership(Origin::signed(0), None),);
         assert_eq!(
             System::events()[0].event,
             RuntimeEvent::DefaultMembership(Event::MembershipAcquired(0))
@@ -201,13 +204,13 @@ fn test_membership_workflow() {
         // Then, idty 0 claim renewal, should fail
         run_to_block(3);
         assert_eq!(
-            DefaultMembership::renew_membership(Origin::signed(0), 0),
+            DefaultMembership::renew_membership(Origin::signed(0), None),
             Err(Error::<Test, _>::MembershipNotYetRenewable.into())
         );
 
         // Then, idty 0 claim renewal after renewable period, should success
         run_to_block(2 + RenewablePeriod::get());
-        assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), 0),);
+        assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), None),);
 
         // Then, idty 0 shoul still member until membership period ended
         run_to_block(2 + RenewablePeriod::get() + MembershipPeriod::get() - 1);
diff --git a/pallets/ud-accounts-storage/src/lib.rs b/pallets/ud-accounts-storage/src/lib.rs
index f318148bb..cd479353e 100644
--- a/pallets/ud-accounts-storage/src/lib.rs
+++ b/pallets/ud-accounts-storage/src/lib.rs
@@ -66,17 +66,20 @@ pub mod pallet {
 
     #[pallet::storage]
     #[pallet::getter(fn ud_accounts)]
-    pub type UdAccounts<T: Config> = StorageMap<_, Blake2_128Concat, T::AccountId, (), ValueQuery>;
+    pub type UdAccounts<T: Config> = StorageMap<_, Blake2_128Concat, T::AccountId, u32, ValueQuery>;
 
     #[pallet::storage]
     #[pallet::getter(fn ud_accounts_count)]
     pub(super) type UdAccountsCounter<T: Config> = StorageValue<_, u64, ValueQuery>;
 
+    #[pallet::storage]
+    pub(super) type ToBeRemoved<T: Config> = StorageValue<_, Vec<u32>, ValueQuery>;
+
     // GENESIS //
 
     #[pallet::genesis_config]
     pub struct GenesisConfig<T: Config> {
-        pub ud_accounts: sp_std::collections::btree_set::BTreeSet<T::AccountId>,
+        pub ud_accounts: sp_std::collections::btree_map::BTreeMap<T::AccountId, u32>,
     }
 
     #[cfg(feature = "std")]
@@ -93,8 +96,8 @@ pub mod pallet {
         fn build(&self) {
             <StorageVersion<T>>::put(Releases::V1_0_0);
             <UdAccountsCounter<T>>::put(self.ud_accounts.len() as u64);
-            for account in &self.ud_accounts {
-                <UdAccounts<T>>::insert(account, ());
+            for (account, index) in &self.ud_accounts {
+                <UdAccounts<T>>::insert(account, index);
             }
         }
     }
@@ -103,29 +106,55 @@ pub mod pallet {
 
     impl<T: Config> Pallet<T> {
         pub fn account_list() -> Vec<T::AccountId> {
-            <UdAccounts<T>>::iter().map(|(k, _v)| k).collect()
+            let mut to_be_removed = ToBeRemoved::<T>::take();
+            to_be_removed.sort_unstable();
+
+            let mut accounts_to_pass = Vec::new();
+            let mut accounts_to_remove = Vec::new();
+            <UdAccounts<T>>::iter().for_each(|(k, v)| {
+                if to_be_removed.binary_search(&v).is_ok() {
+                    accounts_to_remove.push(k);
+                } else {
+                    accounts_to_pass.push(k);
+                }
+            });
+            for account in accounts_to_remove {
+                UdAccounts::<T>::remove(account);
+            }
+
+            accounts_to_pass
         }
         pub fn replace_account(
             old_account_opt: Option<T::AccountId>,
             new_account_opt: Option<T::AccountId>,
+            index: u32,
         ) -> Weight {
             if let Some(old_account) = old_account_opt {
                 if let Some(new_account) = new_account_opt {
-                    Self::replace_account_inner(old_account, new_account)
+                    Self::replace_account_inner(old_account, new_account, index)
                 } else {
                     Self::del_account(old_account)
                 }
             } else if let Some(new_account) = new_account_opt {
-                Self::add_account(new_account)
+                Self::add_account(new_account, index)
             } else {
                 0
             }
         }
-        fn replace_account_inner(old_account: T::AccountId, new_account: T::AccountId) -> Weight {
+        pub fn remove_account(account_index: u32) -> Weight {
+            ToBeRemoved::<T>::append(account_index);
+            UdAccountsCounter::<T>::mutate(|counter| counter.saturating_sub(1));
+            0
+        }
+        fn replace_account_inner(
+            old_account: T::AccountId,
+            new_account: T::AccountId,
+            index: u32,
+        ) -> Weight {
             if <UdAccounts<T>>::contains_key(&old_account) {
                 if !<UdAccounts<T>>::contains_key(&new_account) {
                     <UdAccounts<T>>::remove(&old_account);
-                    <UdAccounts<T>>::insert(&new_account, ());
+                    <UdAccounts<T>>::insert(&new_account, index);
                 } else {
                     frame_support::runtime_print!(
                         "ERROR: replace_account(): new_account {:?} already added",
@@ -140,14 +169,10 @@ pub mod pallet {
             }
             0
         }
-        fn add_account(account: T::AccountId) -> Weight {
+        fn add_account(account: T::AccountId, index: u32) -> Weight {
             if !<UdAccounts<T>>::contains_key(&account) {
-                <UdAccounts<T>>::insert(&account, ());
-                if let Ok(counter) = <UdAccountsCounter<T>>::try_get() {
-                    <UdAccountsCounter<T>>::put(counter.saturating_add(1));
-                } else {
-                    <UdAccountsCounter<T>>::put(1);
-                }
+                <UdAccounts<T>>::insert(&account, index);
+                UdAccountsCounter::<T>::mutate(|counter| counter.saturating_add(1));
             } else {
                 frame_support::runtime_print!(
                     "ERROR: add_account(): account {:?} already added",
@@ -159,13 +184,8 @@ pub mod pallet {
         fn del_account(account: T::AccountId) -> Weight {
             if <UdAccounts<T>>::contains_key(&account) {
                 <UdAccounts<T>>::remove(&account);
-                if let Ok(counter) = <UdAccountsCounter<T>>::try_get() {
-                    <UdAccountsCounter<T>>::put(counter.saturating_sub(1));
-                } else {
-                    frame_support::runtime_print!(
-                        "FATAL ERROR: del_account(): UdAccountsCounter is None!"
-                    );
-                }
+
+                UdAccountsCounter::<T>::mutate(|counter| counter.saturating_sub(1));
             } else {
                 frame_support::runtime_print!(
                     "ERROR: del_account(): account {:?} already deleted",
diff --git a/primitives/membership/src/lib.rs b/primitives/membership/src/lib.rs
index 150d436f2..600ae3661 100644
--- a/primitives/membership/src/lib.rs
+++ b/primitives/membership/src/lib.rs
@@ -42,13 +42,6 @@ pub enum Event<IdtyId, MetaData = ()> {
     PendingMembershipExpired(IdtyId),
 }
 
-#[derive(PartialEq)]
-pub enum OriginPermission {
-    Allowed,
-    Forbidden,
-    Root,
-}
-
 #[cfg_attr(feature = "std", derive(Deserialize, Serialize))]
 #[derive(Encode, Decode, Default, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub struct MembershipData<BlockNumber: Decode + Encode + TypeInfo> {
diff --git a/primitives/membership/src/traits.rs b/primitives/membership/src/traits.rs
index 9406861d4..bf596fd07 100644
--- a/primitives/membership/src/traits.rs
+++ b/primitives/membership/src/traits.rs
@@ -17,16 +17,6 @@
 use crate::*;
 use frame_support::pallet_prelude::{TypeInfo, Weight};
 
-pub trait IsIdtyAllowedToClaimMembership<IdtyId> {
-    fn is_idty_allowed_to_claim_membership(idty_id: &IdtyId) -> bool;
-}
-
-impl<IdtyId> IsIdtyAllowedToClaimMembership<IdtyId> for () {
-    fn is_idty_allowed_to_claim_membership(_: &IdtyId) -> bool {
-        true
-    }
-}
-
 pub trait IsIdtyAllowedToRenewMembership<IdtyId> {
     fn is_idty_allowed_to_renew_membership(idty_id: &IdtyId) -> bool;
 }
@@ -47,16 +37,6 @@ impl<IdtyId> IsIdtyAllowedToRequestMembership<IdtyId> for () {
     }
 }
 
-pub trait IsOriginAllowedToUseIdty<Origin, IdtyId> {
-    fn is_origin_allowed_to_use_idty(origin: &Origin, idty_id: &IdtyId) -> OriginPermission;
-}
-
-impl<Origin, IdtyId> IsOriginAllowedToUseIdty<Origin, IdtyId> for () {
-    fn is_origin_allowed_to_use_idty(_: &Origin, _: &IdtyId) -> OriginPermission {
-        OriginPermission::Allowed
-    }
-}
-
 pub trait IsInPendingMemberships<IdtyId> {
     fn is_in_pending_memberships(idty_id: IdtyId) -> bool;
 }
@@ -100,3 +80,13 @@ impl<BlockNumber: Decode + Encode + TypeInfo, IdtyId> MembershipExternalStorage<
         panic!("{}", INVALID_CONF_MSG)
     }
 }
+
+pub trait Validate<AccountId> {
+    fn validate(&self, account_id: &AccountId) -> bool;
+}
+
+impl<AccountId> Validate<AccountId> for () {
+    fn validate(&self, _account_id: &AccountId) -> bool {
+        true
+    }
+}
diff --git a/runtime/common/src/entities.rs b/runtime/common/src/entities.rs
index a6224aa17..73b279d3b 100644
--- a/runtime/common/src/entities.rs
+++ b/runtime/common/src/entities.rs
@@ -16,6 +16,7 @@
 
 pub use pallet_identity::IdtyName;
 
+use super::AccountId;
 use frame_support::pallet_prelude::*;
 use scale_info::TypeInfo;
 #[cfg(feature = "std")]
@@ -59,9 +60,17 @@ macro_rules! declare_session_keys {
 #[cfg_attr(feature = "std", derive(Deserialize, Serialize))]
 #[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, TypeInfo)]
 pub struct SmithsMembershipMetaData<SessionKeysWrapper> {
+    pub owner_key: AccountId,
     pub p2p_endpoint: sp_runtime::RuntimeString,
     pub session_keys: SessionKeysWrapper,
 }
+impl<SessionKeysWrapper> sp_membership::traits::Validate<AccountId>
+    for SmithsMembershipMetaData<SessionKeysWrapper>
+{
+    fn validate(&self, who: &AccountId) -> bool {
+        &self.owner_key == who
+    }
+}
 
 #[cfg_attr(feature = "std", derive(Deserialize, Serialize))]
 #[derive(
diff --git a/runtime/common/src/handlers.rs b/runtime/common/src/handlers.rs
index e7729ed69..59ec8b28e 100644
--- a/runtime/common/src/handlers.rs
+++ b/runtime/common/src/handlers.rs
@@ -14,42 +14,37 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Substrate-Libre-Currency. If not, see <https://www.gnu.org/licenses/>.
 
-use super::entities::SmithsMembershipMetaData;
-use super::IdtyIndex;
+use super::entities::*;
+use super::{AccountId, IdtyIndex};
 use frame_support::dispatch::UnfilteredDispatchable;
-use frame_support::instances::Instance2;
+use frame_support::instances::{Instance1, Instance2};
 use frame_support::pallet_prelude::Weight;
 use frame_support::Parameter;
 
 pub struct OnMembershipEventHandler<Inner, Runtime>(core::marker::PhantomData<(Inner, Runtime)>);
 
+type MembershipMetaData = pallet_duniter_wot::MembershipMetaData<AccountId>;
+
 impl<
-        IdtyIndex: Parameter,
-        Inner: sp_membership::traits::OnEvent<IdtyIndex, ()>,
-        Runtime: pallet_identity::Config<IdtyIndex = IdtyIndex> + pallet_ud_accounts_storage::Config,
-    > sp_membership::traits::OnEvent<IdtyIndex, ()> for OnMembershipEventHandler<Inner, Runtime>
+        Inner: sp_membership::traits::OnEvent<IdtyIndex, MembershipMetaData>,
+        Runtime: frame_system::Config<AccountId = AccountId>
+            + pallet_identity::Config<IdtyIndex = IdtyIndex>
+            + pallet_membership::Config<Instance1, MetaData = MembershipMetaData>
+            + pallet_ud_accounts_storage::Config,
+    > sp_membership::traits::OnEvent<IdtyIndex, MembershipMetaData>
+    for OnMembershipEventHandler<Inner, Runtime>
 {
-    fn on_event(membership_event: &sp_membership::Event<IdtyIndex>) -> Weight {
+    fn on_event(membership_event: &sp_membership::Event<IdtyIndex, MembershipMetaData>) -> Weight {
         (match membership_event {
-            sp_membership::Event::<IdtyIndex>::MembershipAcquired(idty_index, ()) => {
-                if let Some(idty_value) = pallet_identity::Pallet::<Runtime>::identity(idty_index) {
-                    <pallet_ud_accounts_storage::Pallet<Runtime>>::replace_account(
-                        None,
-                        Some(idty_value.owner_key),
-                    )
-                } else {
-                    0
-                }
+            sp_membership::Event::MembershipAcquired(idty_index, owner_key) => {
+                pallet_ud_accounts_storage::Pallet::<Runtime>::replace_account(
+                    None,
+                    Some(owner_key.0.clone()),
+                    *idty_index,
+                )
             }
-            sp_membership::Event::<IdtyIndex>::MembershipRevoked(idty_index) => {
-                if let Some(idty_value) = pallet_identity::Pallet::<Runtime>::identity(idty_index) {
-                    <pallet_ud_accounts_storage::Pallet<Runtime>>::replace_account(
-                        Some(idty_value.owner_key),
-                        None,
-                    )
-                } else {
-                    0
-                }
+            sp_membership::Event::MembershipRevoked(idty_index) => {
+                pallet_ud_accounts_storage::Pallet::<Runtime>::remove_account(*idty_index)
             }
             _ => 0,
         }) + Inner::on_event(membership_event)
@@ -64,7 +59,8 @@ impl<
         IdtyIndex: Copy + Parameter,
         SessionKeysWrapper: Clone,
         Inner: sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeysWrapper>>,
-        Runtime: pallet_identity::Config<IdtyIndex = IdtyIndex>
+        Runtime: frame_system::Config<AccountId = AccountId>
+            + pallet_identity::Config<IdtyIndex = IdtyIndex>
             + pallet_authority_members::Config<KeysWrapper = SessionKeysWrapper, MemberId = IdtyIndex>
             + pallet_membership::Config<
                 Instance2,
@@ -82,19 +78,21 @@ impl<
         (match membership_event {
             sp_membership::Event::MembershipAcquired(
                 idty_index,
-                SmithsMembershipMetaData { session_keys, .. },
+                SmithsMembershipMetaData {
+                    owner_key,
+                    session_keys,
+                    ..
+                },
             ) => {
-                if let Some(idty_value) = pallet_identity::Pallet::<Runtime>::identity(idty_index) {
-                    let call = pallet_authority_members::Call::<Runtime>::set_session_keys {
-                        member_id: *idty_index,
-                        keys: session_keys.clone(),
-                    };
-                    if let Err(e) = call.dispatch_bypass_filter(
-                        frame_system::Origin::<Runtime>::Signed(idty_value.owner_key).into(),
-                    ) {
-                        sp_std::if_std! {
-                            println!("{:?}", e)
-                        }
+                let call = pallet_authority_members::Call::<Runtime>::set_session_keys {
+                    member_id: *idty_index,
+                    keys: session_keys.clone(),
+                };
+                if let Err(e) = call.dispatch_bypass_filter(
+                    frame_system::Origin::<Runtime>::Signed(owner_key.clone()).into(),
+                ) {
+                    sp_std::if_std! {
+                        println!("{:?}", e)
                     }
                 }
                 0
@@ -117,16 +115,16 @@ impl<
     }
 }
 
-pub struct OnRemovedAUthorityMemberHandler<Runtime>(core::marker::PhantomData<Runtime>);
+pub struct OnRemovedAuthorityMemberHandler<Runtime>(core::marker::PhantomData<Runtime>);
 impl<Runtime> pallet_authority_members::traits::OnRemovedMember<IdtyIndex>
-    for OnRemovedAUthorityMemberHandler<Runtime>
+    for OnRemovedAuthorityMemberHandler<Runtime>
 where
     Runtime: frame_system::Config + pallet_membership::Config<Instance2, IdtyId = IdtyIndex>,
 {
     fn on_removed_member(idty_index: IdtyIndex) -> Weight {
         if let Err(e) = pallet_membership::Pallet::<Runtime, Instance2>::revoke_membership(
             frame_system::RawOrigin::Root.into(),
-            idty_index,
+            Some(idty_index),
         ) {
             sp_std::if_std! {
                 println!("{:?}", e)
diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs
index 88b16d498..50912a0c4 100644
--- a/runtime/common/src/lib.rs
+++ b/runtime/common/src/lib.rs
@@ -75,16 +75,3 @@ impl pallet_identity::traits::IdtyNameValidator for IdtyNameValidatorImpl {
         idty_name.0.len() >= 3 && idty_name.0.len() <= 64
     }
 }
-
-pub struct OwnerKeyOfImpl<Runtime>(core::marker::PhantomData<Runtime>);
-
-impl<
-        Runtime: frame_system::Config<AccountId = AccountId>
-            + pallet_identity::Config<IdtyIndex = IdtyIndex>,
-    > sp_runtime::traits::Convert<IdtyIndex, Option<AccountId>> for OwnerKeyOfImpl<Runtime>
-{
-    fn convert(idty_index: IdtyIndex) -> Option<AccountId> {
-        pallet_identity::Pallet::<Runtime>::identity(idty_index)
-            .map(|idty_value| idty_value.owner_key)
-    }
-}
diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs
index 226d575d8..4bf4251a0 100644
--- a/runtime/common/src/pallets_config.rs
+++ b/runtime/common/src/pallets_config.rs
@@ -25,57 +25,57 @@ macro_rules! pallets_config {
 			pub const Version: RuntimeVersion = VERSION;
 		}
 
-        impl frame_system::Config for Runtime {
-            /// The basic call filter to use in dispatchable.
-            type BaseCallFilter = BaseCallFilter;
-            /// Block & extrinsics weights: base values and limits.
-            type BlockWeights = BlockWeights;
-            /// The maximum length of a block (in bytes).
-            type BlockLength = BlockLength;
-            /// The identifier used to distinguish between accounts.
-            type AccountId = AccountId;
-            /// The aggregated dispatch type that is available for extrinsics.
-            type Call = Call;
-            /// The lookup mechanism to get account ID from whatever is passed in dispatchers.
-            type Lookup = AccountIdLookup<AccountId, ()>;
-            /// The index type for storing how many extrinsics an account has signed.
-            type Index = Index;
-            /// The index type for blocks.
-            type BlockNumber = BlockNumber;
-            /// The type for hashing blocks and tries.
-            type Hash = Hash;
-            /// The hashing algorithm used.
-            type Hashing = BlakeTwo256;
-            /// The header type.
-            type Header = generic::Header<BlockNumber, BlakeTwo256>;
-            /// The ubiquitous event type.
-            type Event = Event;
-            /// The ubiquitous origin type.
-            type Origin = Origin;
-            /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
-            type BlockHashCount = BlockHashCount;
-            /// The weight of database operations that the runtime can invoke.
-            type DbWeight = RocksDbWeight;
-            /// Version of the runtime.
-            type Version = Version;
-            /// Converts a module to the index of the module in `construct_runtime!`.
-            ///
-            /// This type is being generated by `construct_runtime!`.
-            type PalletInfo = PalletInfo;
-            /// What to do if a new account is created.
-            type OnNewAccount = ();
-            /// What to do if an account is fully reaped from the system.
-            type OnKilledAccount = ();
-            /// The data to be stored in an account.
-            type AccountData = pallet_balances::AccountData<Balance>;
-            /// Weight information for the extrinsics of this pallet.
-            type SystemWeightInfo = ();
-            /// This is used as an identifier of the chain. 42 is the generic substrate prefix.
-            type SS58Prefix = SS58Prefix;
-            /// The set code logic, just the default since we're not a parachain.
-            type OnSetCode = ();
+		impl frame_system::Config for Runtime {
+			/// The basic call filter to use in dispatchable.
+			type BaseCallFilter = BaseCallFilter;
+			/// Block & extrinsics weights: base values and limits.
+			type BlockWeights = BlockWeights;
+			/// The maximum length of a block (in bytes).
+			type BlockLength = BlockLength;
+			/// The identifier used to distinguish between accounts.
+			type AccountId = AccountId;
+			/// The aggregated dispatch type that is available for extrinsics.
+			type Call = Call;
+			/// The lookup mechanism to get account ID from whatever is passed in dispatchers.
+			type Lookup = AccountIdLookup<AccountId, ()>;
+			/// The index type for storing how many extrinsics an account has signed.
+			type Index = Index;
+			/// The index type for blocks.
+			type BlockNumber = BlockNumber;
+			/// The type for hashing blocks and tries.
+			type Hash = Hash;
+			/// The hashing algorithm used.
+			type Hashing = BlakeTwo256;
+			/// The header type.
+			type Header = generic::Header<BlockNumber, BlakeTwo256>;
+			/// The ubiquitous event type.
+			type Event = Event;
+			/// The ubiquitous origin type.
+			type Origin = Origin;
+			/// Maximum number of block number to block hash mappings to keep (oldest pruned first).
+			type BlockHashCount = BlockHashCount;
+			/// The weight of database operations that the runtime can invoke.
+			type DbWeight = RocksDbWeight;
+			/// Version of the runtime.
+			type Version = Version;
+			/// Converts a module to the index of the module in `construct_runtime!`.
+			///
+			/// This type is being generated by `construct_runtime!`.
+			type PalletInfo = PalletInfo;
+			/// What to do if a new account is created.
+			type OnNewAccount = ();
+			/// What to do if an account is fully reaped from the system.
+			type OnKilledAccount = ();
+			/// The data to be stored in an account.
+			type AccountData = pallet_balances::AccountData<Balance>;
+			/// Weight information for the extrinsics of this pallet.
+			type SystemWeightInfo = ();
+			/// This is used as an identifier of the chain. 42 is the generic substrate prefix.
+			type SS58Prefix = SS58Prefix;
+			/// The set code logic, just the default since we're not a parachain.
+			type OnSetCode = ();
 			type MaxConsumers = frame_support::traits::ConstU32<16>;
-        }
+		}
 
 		// SCHEDULER //
 
@@ -150,26 +150,26 @@ macro_rules! pallets_config {
 		// MONEY MANAGEMENT //
 
 		impl pallet_balances::Config for Runtime {
-            type MaxLocks = MaxLocks;
-            type MaxReserves = ();
-            type ReserveIdentifier = [u8; 8];
-            /// The type for recording an account's balance.
-            type Balance = Balance;
-            /// The ubiquitous event type.
-            type Event = Event;
-            type DustRemoval = ();
-            type ExistentialDeposit = ExistentialDeposit;
-            type AccountStore = System;
-            type WeightInfo = pallet_balances::weights::SubstrateWeight<Runtime>;
-        }
-
-        impl pallet_transaction_payment::Config for Runtime {
-            type OnChargeTransaction = CurrencyAdapter<Balances, ()>;
-            type TransactionByteFee = TransactionByteFee;
+			type MaxLocks = MaxLocks;
+			type MaxReserves = ();
+			type ReserveIdentifier = [u8; 8];
+			/// The type for recording an account's balance.
+			type Balance = Balance;
+			/// The ubiquitous event type.
+			type Event = Event;
+			type DustRemoval = ();
+			type ExistentialDeposit = ExistentialDeposit;
+			type AccountStore = System;
+			type WeightInfo = pallet_balances::weights::SubstrateWeight<Runtime>;
+		}
+
+		impl pallet_transaction_payment::Config for Runtime {
+			type OnChargeTransaction = CurrencyAdapter<Balances, ()>;
+			type TransactionByteFee = TransactionByteFee;
 			type OperationalFeeMultiplier = frame_support::traits::ConstU8<5>;
-            type WeightToFee = common_runtime::fees::WeightToFeeImpl<Balance>;
-            type FeeMultiplierUpdate = ();
-        }
+			type WeightToFee = common_runtime::fees::WeightToFeeImpl<Balance>;
+			type FeeMultiplierUpdate = ();
+		}
 
 		// CONSENSUS  //
 
@@ -180,12 +180,11 @@ macro_rules! pallets_config {
 			type Event = Event;
 			type KeysWrapper = opaque::SessionKeysWrapper;
 			type IsMember = SmithsMembership;
-			type OnRemovedMember = OnRemovedAUthorityMemberHandler<Runtime>;
-			type OwnerKeyOf = OwnerKeyOfImpl<Runtime>;
+			type OnRemovedMember = OnRemovedAuthorityMemberHandler<Runtime>;
 			type MemberId = IdtyIndex;
+			type MemberIdOf = Identity;
 			type MaxKeysLife = frame_support::pallet_prelude::ConstU32<1_000>;
 			type MaxOfflineSessions = frame_support::pallet_prelude::ConstU32<100>;
-			type RefreshValidatorIdOrigin = EnsureRoot<Self::AccountId>;
 			type RemoveMemberOrigin = EnsureRoot<Self::AccountId>;
 		}
 		impl pallet_authorship::Config for Runtime {
@@ -226,26 +225,26 @@ macro_rules! pallets_config {
 			type FullIdentification = ValidatorFullIdentification;
 			type FullIdentificationOf = FullIdentificationOfImpl;
 		}
-        impl pallet_grandpa::Config for Runtime {
-            type Event = Event;
-            type Call = Call;
+		impl pallet_grandpa::Config for Runtime {
+			type Event = Event;
+			type Call = Call;
 
-            type KeyOwnerProofSystem = ();
+			type KeyOwnerProofSystem = ();
 
-            type KeyOwnerProof =
-                <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof;
+			type KeyOwnerProof =
+				<Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof;
 
-            type KeyOwnerIdentification = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(
-                KeyTypeId,
-                GrandpaId,
-            )>>::IdentificationTuple;
+			type KeyOwnerIdentification = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(
+				KeyTypeId,
+				GrandpaId,
+			)>>::IdentificationTuple;
 
-            type HandleEquivocation = ();
+			type HandleEquivocation = ();
 
-            type WeightInfo = ();
+			type WeightInfo = ();
 
 			type MaxAuthorities = MaxAuthorities;
-        }
+		}
 
 		// UTILITIES //
 
@@ -258,20 +257,20 @@ macro_rules! pallets_config {
 
 		// UNIVERSAL DIVIDEND //
 
-        impl pallet_universal_dividend::Config for Runtime {
-            type Currency = pallet_balances::Pallet<Runtime>;
-            type Event = Event;
-            type MembersCount = common_runtime::providers::UdAccountsProvider<Runtime>;
-            type MembersIds = common_runtime::providers::UdAccountsProvider<Runtime>;
-            type SquareMoneyGrowthRate = SquareMoneyGrowthRate;
-            type UdCreationPeriod = UdCreationPeriod;
+		impl pallet_universal_dividend::Config for Runtime {
+			type Currency = pallet_balances::Pallet<Runtime>;
+			type Event = Event;
+			type MembersCount = common_runtime::providers::UdAccountsProvider<Runtime>;
+			type MembersIds = common_runtime::providers::UdAccountsProvider<Runtime>;
+			type SquareMoneyGrowthRate = SquareMoneyGrowthRate;
+			type UdCreationPeriod = UdCreationPeriod;
 			type UdFirstReeval = UdFirstReeval;
-            type UdReevalPeriod = UdReevalPeriod;
-            type UdReevalPeriodInBlocks = UdReevalPeriodInBlocks;
+			type UdReevalPeriod = UdReevalPeriod;
+			type UdReevalPeriodInBlocks = UdReevalPeriodInBlocks;
 			type UnitsPerUd = frame_support::traits::ConstU64<1_000>;
-        }
+		}
 
-        impl pallet_ud_accounts_storage::Config for Runtime {}
+		impl pallet_ud_accounts_storage::Config for Runtime {}
 
 		// WEB OF TRUST //
 
@@ -284,50 +283,47 @@ macro_rules! pallets_config {
 		}
 
 		impl pallet_identity::Config for Runtime {
-            type ConfirmPeriod = ConfirmPeriod;
-            type Event = Event;
-            type EnsureIdtyCallAllowed = Wot;
+			type ConfirmPeriod = ConfirmPeriod;
+			type Event = Event;
+			type EnsureIdtyCallAllowed = Wot;
 			type IdtyCreationPeriod = IdtyCreationPeriod;
-			type IdtyDataProvider = ();
-            type IdtyData = ();
-            type IdtyIndex = IdtyIndex;
-            type IdtyNameValidator = IdtyNameValidatorImpl;
-            type IdtyValidationOrigin = EnsureRoot<Self::AccountId>;
+			type IdtyIndex = IdtyIndex;
+			type IdtyNameValidator = IdtyNameValidatorImpl;
+			type IdtyValidationOrigin = EnsureRoot<Self::AccountId>;
 			type IsMember = Membership;
-            type OnIdtyChange = Wot;
-            type MaxDisabledPeriod = MaxDisabledPeriod;
-        }
+			type OnIdtyChange = Wot;
+			type MaxDisabledPeriod = MaxDisabledPeriod;
+		}
 
 		impl pallet_membership::Config<frame_support::instances::Instance1> for Runtime {
-			type IsIdtyAllowedToClaimMembership = Wot;
 			type IsIdtyAllowedToRenewMembership = Wot;
 			type IsIdtyAllowedToRequestMembership = Wot;
-			type IsOriginAllowedToUseIdty = Wot;
 			type Event = Event;
 			type ExternalizeMembershipStorage = frame_support::traits::ConstBool<false>;
 			type IdtyId = IdtyIndex;
+			type IdtyIdOf = Identity;
 			type MembershipExternalStorage = sp_membership::traits::NoExternalStorage;
 			type MembershipPeriod = MembershipPeriod;
-			type MetaData = ();
+			type MetaData = pallet_duniter_wot::MembershipMetaData<AccountId>;
 			type OnEvent = OnMembershipEventHandler<Wot, Runtime>;
 			type PendingMembershipPeriod = PendingMembershipPeriod;
 			type RenewablePeriod = RenewablePeriod;
 			type RevocationPeriod = frame_support::traits::ConstU32<0>;
 		}
 
-        impl pallet_certification::Config<Instance1> for Runtime {
-            type AddCertOrigin = pallet_duniter_wot::AddCertOrigin<Runtime, Instance1>;
-            type CertPeriod = CertPeriod;
-            type DelCertOrigin = pallet_duniter_wot::DelCertOrigin<Runtime, Instance1>;
-            type Event = Event;
-            type IdtyIndex = IdtyIndex;
-            type MaxByIssuer = MaxByIssuer;
+		impl pallet_certification::Config<Instance1> for Runtime {
+			type AddCertOrigin = pallet_duniter_wot::AddCertOrigin<Runtime, Instance1>;
+			type CertPeriod = CertPeriod;
+			type DelCertOrigin = pallet_duniter_wot::DelCertOrigin<Runtime, Instance1>;
+			type Event = Event;
+			type IdtyIndex = IdtyIndex;
+			type MaxByIssuer = MaxByIssuer;
 			type MinReceivedCertToBeAbleToIssueCert = MinReceivedCertToBeAbleToIssueCert;
-            type OnNewcert = Wot;
-            type OnRemovedCert = Wot;
-            type CertRenewablePeriod = CertRenewablePeriod;
-            type ValidityPeriod = ValidityPeriod;
-        }
+			type OnNewcert = Wot;
+			type OnRemovedCert = Wot;
+			type CertRenewablePeriod = CertRenewablePeriod;
+			type ValidityPeriod = ValidityPeriod;
+		}
 
 		// SMITHS SUB-WOT //
 
@@ -340,13 +336,12 @@ macro_rules! pallets_config {
 		}
 
 		impl pallet_membership::Config<Instance2> for Runtime {
-			type IsIdtyAllowedToClaimMembership = ();
 			type IsIdtyAllowedToRenewMembership = ();
 			type IsIdtyAllowedToRequestMembership = ();
-			type IsOriginAllowedToUseIdty = Wot;
 			type Event = Event;
 			type ExternalizeMembershipStorage = frame_support::traits::ConstBool<false>;
 			type IdtyId = IdtyIndex;
+			type IdtyIdOf = Identity;
 			type MembershipExternalStorage = sp_membership::traits::NoExternalStorage;
 			type MembershipPeriod = SmithMembershipPeriod;
 			type MetaData = SmithsMembershipMetaData<opaque::SessionKeysWrapper>;
@@ -356,19 +351,19 @@ macro_rules! pallets_config {
 			type RevocationPeriod = frame_support::traits::ConstU32<0>;
 		}
 
-        impl pallet_certification::Config<Instance2> for Runtime {
-            type AddCertOrigin = pallet_duniter_wot::AddCertOrigin<Runtime, Instance2>;
-            type CertPeriod = SmithCertPeriod;
-            type DelCertOrigin = pallet_duniter_wot::DelCertOrigin<Runtime, Instance2>;
-            type Event = Event;
-            type IdtyIndex = IdtyIndex;
-            type MaxByIssuer = SmithMaxByIssuer;
+		impl pallet_certification::Config<Instance2> for Runtime {
+			type AddCertOrigin = pallet_duniter_wot::AddCertOrigin<Runtime, Instance2>;
+			type CertPeriod = SmithCertPeriod;
+			type DelCertOrigin = pallet_duniter_wot::DelCertOrigin<Runtime, Instance2>;
+			type Event = Event;
+			type IdtyIndex = IdtyIndex;
+			type MaxByIssuer = SmithMaxByIssuer;
 			type MinReceivedCertToBeAbleToIssueCert = SmithMinReceivedCertToBeAbleToIssueCert;
-            type OnNewcert = SmithsSubWot;
-            type OnRemovedCert = SmithsSubWot;
-            type CertRenewablePeriod = SmithCertRenewablePeriod;
-            type ValidityPeriod = SmithValidityPeriod;
-        }
+			type OnNewcert = SmithsSubWot;
+			type OnRemovedCert = SmithsSubWot;
+			type CertRenewablePeriod = SmithCertRenewablePeriod;
+			type ValidityPeriod = SmithValidityPeriod;
+		}
 
 		// MULTISIG //
 
diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs
index c71bad91d..ea6c251f1 100644
--- a/runtime/g1/src/lib.rs
+++ b/runtime/g1/src/lib.rs
@@ -40,7 +40,7 @@ pub use pallet_universal_dividend;
 pub use sp_runtime::BuildStorage;
 pub use sp_runtime::{KeyTypeId, Perbill, Permill};
 
-use common_runtime::{IdtyNameValidatorImpl, OwnerKeyOfImpl};
+use common_runtime::IdtyNameValidatorImpl;
 use frame_system::EnsureRoot;
 use pallet_grandpa::fg_primitives;
 use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList};
diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs
index c0527be54..9bbdb2593 100644
--- a/runtime/gdev/src/lib.rs
+++ b/runtime/gdev/src/lib.rs
@@ -41,7 +41,7 @@ pub use pallet_universal_dividend;
 pub use sp_runtime::BuildStorage;
 pub use sp_runtime::{KeyTypeId, Perbill, Permill};
 
-use common_runtime::{IdtyNameValidatorImpl, OwnerKeyOfImpl};
+use common_runtime::IdtyNameValidatorImpl;
 use frame_system::EnsureRoot;
 use pallet_grandpa::fg_primitives;
 use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList};
@@ -139,45 +139,53 @@ impl frame_support::traits::Contains<Call> for BaseCallFilter {
 
 // Configure FRAME pallets to include in runtime.
 common_runtime::pallets_config! {
-    // Dynamic parameters
-    pub type EpochDuration = pallet_duniter_test_parameters::BabeEpochDuration<Runtime>;
-    pub type CertPeriod = pallet_duniter_test_parameters::CertPeriod<Runtime>;
-    pub type MaxByIssuer = pallet_duniter_test_parameters::CertMaxByIssuer<Runtime>;
-    pub type MinReceivedCertToBeAbleToIssueCert = pallet_duniter_test_parameters::CertMinReceivedCertToIssueCert<Runtime>;
-    pub type CertRenewablePeriod = pallet_duniter_test_parameters::CertRenewablePeriod<Runtime>;
-    pub type ValidityPeriod = pallet_duniter_test_parameters::CertValidityPeriod<Runtime>;
-    pub type ConfirmPeriod = pallet_duniter_test_parameters::IdtyConfirmPeriod<Runtime>;
-    pub type IdtyCreationPeriod = pallet_duniter_test_parameters::IdtyCreationPeriod<Runtime>;
-    pub type MaxDisabledPeriod = pallet_duniter_test_parameters::IdtyMaxDisabledPeriod<Runtime>;
-    pub type MembershipPeriod = pallet_duniter_test_parameters::MembershipPeriod<Runtime>;
-    pub type RenewablePeriod = pallet_duniter_test_parameters::MembershipRenewablePeriod<Runtime>;
-    pub type PendingMembershipPeriod = pallet_duniter_test_parameters::PendingMembershipPeriod<Runtime>;
-    pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>;
-    pub type UdFirstReeval = pallet_duniter_test_parameters::UdFirstReeval<Runtime>;
-    pub type UdReevalPeriod = pallet_duniter_test_parameters::UdReevalPeriod<Runtime>;
-    pub type UdReevalPeriodInBlocks = pallet_duniter_test_parameters::UdReevalPeriodInBlocks<Runtime>;
-    pub type WotFirstCertIssuableOn = pallet_duniter_test_parameters::WotFirstCertIssuableOn<Runtime>;
-    pub type WotMinCertForMembership = pallet_duniter_test_parameters::WotMinCertForMembership<Runtime>;
-    pub type WotMinCertForCreateIdtyRight = pallet_duniter_test_parameters::WotMinCertForCreateIdtyRight<Runtime>;
-    pub type SmithCertPeriod = pallet_duniter_test_parameters::SmithCertPeriod<Runtime>;
-    pub type SmithMaxByIssuer = pallet_duniter_test_parameters::SmithCertMaxByIssuer<Runtime>;
-    pub type SmithMinReceivedCertToBeAbleToIssueCert = pallet_duniter_test_parameters::SmithCertMinReceivedCertToIssueCert<Runtime>;
-    pub type SmithCertRenewablePeriod = pallet_duniter_test_parameters::SmithCertRenewablePeriod<Runtime>;
-    pub type SmithValidityPeriod = pallet_duniter_test_parameters::SmithCertValidityPeriod<Runtime>;
-    pub type SmithMembershipPeriod = pallet_duniter_test_parameters::SmithMembershipPeriod<Runtime>;
-    pub type SmithPendingMembershipPeriod = pallet_duniter_test_parameters::SmithPendingMembershipPeriod<Runtime>;
-    pub type SmithRenewablePeriod = pallet_duniter_test_parameters::SmithMembershipRenewablePeriod<Runtime>;
-    pub type SmithsWotFirstCertIssuableOn = pallet_duniter_test_parameters::SmithsWotFirstCertIssuableOn<Runtime>;
-    pub type SmithsWotMinCertForMembership = pallet_duniter_test_parameters::SmithsWotMinCertForMembership<Runtime>;
+// Dynamic parameters
+pub type EpochDuration = pallet_duniter_test_parameters::BabeEpochDuration<Runtime>;
+pub type CertPeriod = pallet_duniter_test_parameters::CertPeriod<Runtime>;
+pub type MaxByIssuer = pallet_duniter_test_parameters::CertMaxByIssuer<Runtime>;
+pub type MinReceivedCertToBeAbleToIssueCert =
+    pallet_duniter_test_parameters::CertMinReceivedCertToIssueCert<Runtime>;
+pub type CertRenewablePeriod = pallet_duniter_test_parameters::CertRenewablePeriod<Runtime>;
+pub type ValidityPeriod = pallet_duniter_test_parameters::CertValidityPeriod<Runtime>;
+pub type ConfirmPeriod = pallet_duniter_test_parameters::IdtyConfirmPeriod<Runtime>;
+pub type IdtyCreationPeriod = pallet_duniter_test_parameters::IdtyCreationPeriod<Runtime>;
+pub type MaxDisabledPeriod = pallet_duniter_test_parameters::IdtyMaxDisabledPeriod<Runtime>;
+pub type MembershipPeriod = pallet_duniter_test_parameters::MembershipPeriod<Runtime>;
+pub type RenewablePeriod = pallet_duniter_test_parameters::MembershipRenewablePeriod<Runtime>;
+pub type PendingMembershipPeriod = pallet_duniter_test_parameters::PendingMembershipPeriod<Runtime>;
+pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>;
+pub type UdFirstReeval = pallet_duniter_test_parameters::UdFirstReeval<Runtime>;
+pub type UdReevalPeriod = pallet_duniter_test_parameters::UdReevalPeriod<Runtime>;
+pub type UdReevalPeriodInBlocks = pallet_duniter_test_parameters::UdReevalPeriodInBlocks<Runtime>;
+pub type WotFirstCertIssuableOn = pallet_duniter_test_parameters::WotFirstCertIssuableOn<Runtime>;
+pub type WotMinCertForMembership = pallet_duniter_test_parameters::WotMinCertForMembership<Runtime>;
+pub type WotMinCertForCreateIdtyRight =
+    pallet_duniter_test_parameters::WotMinCertForCreateIdtyRight<Runtime>;
+pub type SmithCertPeriod = pallet_duniter_test_parameters::SmithCertPeriod<Runtime>;
+pub type SmithMaxByIssuer = pallet_duniter_test_parameters::SmithCertMaxByIssuer<Runtime>;
+pub type SmithMinReceivedCertToBeAbleToIssueCert =
+    pallet_duniter_test_parameters::SmithCertMinReceivedCertToIssueCert<Runtime>;
+pub type SmithCertRenewablePeriod =
+    pallet_duniter_test_parameters::SmithCertRenewablePeriod<Runtime>;
+pub type SmithValidityPeriod = pallet_duniter_test_parameters::SmithCertValidityPeriod<Runtime>;
+pub type SmithMembershipPeriod = pallet_duniter_test_parameters::SmithMembershipPeriod<Runtime>;
+pub type SmithPendingMembershipPeriod =
+    pallet_duniter_test_parameters::SmithPendingMembershipPeriod<Runtime>;
+pub type SmithRenewablePeriod =
+    pallet_duniter_test_parameters::SmithMembershipRenewablePeriod<Runtime>;
+pub type SmithsWotFirstCertIssuableOn =
+    pallet_duniter_test_parameters::SmithsWotFirstCertIssuableOn<Runtime>;
+pub type SmithsWotMinCertForMembership =
+    pallet_duniter_test_parameters::SmithsWotMinCertForMembership<Runtime>;
 
-    impl pallet_duniter_test_parameters::Config for Runtime {
-        type CertCount = u32;
-        type PeriodCount = Balance;
-    }
-    impl pallet_sudo::Config for Runtime {
-        type Event = Event;
-        type Call = Call;
-    }
+impl pallet_duniter_test_parameters::Config for Runtime {
+    type CertCount = u32;
+    type PeriodCount = Balance;
+}
+impl pallet_sudo::Config for Runtime {
+    type Event = Event;
+    type Call = Call;
+}
 }
 
 // Create the runtime by composing the FRAME pallets that were previously configured.
diff --git a/runtime/gtest/src/lib.rs b/runtime/gtest/src/lib.rs
index 9ee2105a0..8890c722b 100644
--- a/runtime/gtest/src/lib.rs
+++ b/runtime/gtest/src/lib.rs
@@ -40,7 +40,7 @@ pub use pallet_universal_dividend;
 pub use sp_runtime::BuildStorage;
 pub use sp_runtime::{KeyTypeId, Perbill, Permill};
 
-use common_runtime::{IdtyNameValidatorImpl, OwnerKeyOfImpl};
+use common_runtime::IdtyNameValidatorImpl;
 use frame_system::EnsureRoot;
 use pallet_grandpa::fg_primitives;
 use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList};
-- 
GitLab