diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs
index 3870558f985b1e90f4e2950e79292b4f1f22b67f..6fc18fa720d419b3c12e00671a94f253e37f7cf8 100644
--- a/pallets/identity/src/lib.rs
+++ b/pallets/identity/src/lib.rs
@@ -134,7 +134,6 @@ pub mod pallet {
             let mut identities = self.identities.clone();
             identities.sort_unstable_by(|a, b| a.index.cmp(&b.index));
 
-            <IdentitiesCount<T>>::put(identities.len() as u64);
             for idty in identities.into_iter() {
                 let idty_index = Pallet::<T>::get_next_idty_index();
                 if idty.value.removable_on > T::BlockNumber::zero() {
@@ -155,7 +154,7 @@ pub mod pallet {
     #[pallet::storage]
     #[pallet::getter(fn identity)]
     pub type Identities<T: Config> =
-        StorageMap<_, Twox64Concat, T::IdtyIndex, IdtyValue<T::BlockNumber>, OptionQuery>;
+        CountedStorageMap<_, Twox64Concat, T::IdtyIndex, IdtyValue<T::BlockNumber>, OptionQuery>;
 
     #[pallet::storage]
     #[pallet::getter(fn identity_index_of)]
@@ -169,10 +168,6 @@ pub mod pallet {
     #[pallet::storage]
     pub(super) type NextIdtyIndex<T: Config> = StorageValue<_, T::IdtyIndex, ValueQuery>;
 
-    #[pallet::storage]
-    #[pallet::getter(fn identities_count)]
-    pub(super) type IdentitiesCount<T: Config> = StorageValue<_, u64, ValueQuery>;
-
     /// Identities by removed block
     #[pallet::storage]
     #[pallet::getter(fn removable_on)]
@@ -266,7 +261,6 @@ pub mod pallet {
             );
             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_index, owner_key));
             T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Created { creator });
             Ok(().into())
@@ -459,19 +453,19 @@ pub mod pallet {
         NotRespectIdtyCreationPeriod,
     }
 
-    // INTERNAL FUNCTIONS //
+    // PUBLIC FUNCTIONS //
 
     impl<T: Config> Pallet<T> {
-        fn dec_identities_counter() {
-            if let Ok(counter) = <IdentitiesCount<T>>::try_get() {
-                <IdentitiesCount<T>>::put(counter.saturating_sub(1));
-            } else {
-                panic!("storage corrupted")
-            }
+        pub fn identities_count() -> u32 {
+            Identities::<T>::count()
         }
+    }
+
+    // INTERNAL FUNCTIONS //
+
+    impl<T: Config> Pallet<T> {
         pub(super) fn do_remove_identity(idty_index: T::IdtyIndex) -> Weight {
             <Identities<T>>::remove(idty_index);
-            Self::dec_identities_counter();
             T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Removed);
 
             0
@@ -485,13 +479,6 @@ pub mod pallet {
                 T::IdtyIndex::one()
             }
         }
-        fn inc_identities_counter() {
-            if let Ok(counter) = <IdentitiesCount<T>>::try_get() {
-                <IdentitiesCount<T>>::put(counter.saturating_add(1));
-            } else {
-                <IdentitiesCount<T>>::put(1);
-            }
-        }
         fn prune_identities(block_number: T::BlockNumber) -> Weight {
             let mut total_weight: Weight = 0;
 
diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs
index 6bbd93241ad734a22e7cc3cb4e83090dc4562716..c543a17d0b2c2c5e2ecb62fafe3d3f8f100008e9 100644
--- a/pallets/membership/src/lib.rs
+++ b/pallets/membership/src/lib.rs
@@ -127,7 +127,7 @@ pub mod pallet {
     #[pallet::storage]
     #[pallet::getter(fn membership)]
     pub type Membership<T: Config<I>, I: 'static = ()> =
-        StorageMap<_, Twox64Concat, T::IdtyId, MembershipData<T::BlockNumber>, OptionQuery>;
+        CountedStorageMap<_, Twox64Concat, T::IdtyId, MembershipData<T::BlockNumber>, OptionQuery>;
 
     #[pallet::storage]
     #[pallet::getter(fn memberships_expire_on)]
@@ -477,3 +477,9 @@ impl<T: Config<I>, I: 'static> sp_runtime::traits::IsMember<T::IdtyId> for Palle
         Self::is_member_inner(idty_id)
     }
 }
+
+impl<T: Config<I>, I: 'static> MembersCount for Pallet<T, I> {
+    fn members_count() -> u32 {
+        Membership::<T, I>::count()
+    }
+}
diff --git a/pallets/membership/src/tests.rs b/pallets/membership/src/tests.rs
index 89b015fc7739e56cdb875d20fe81b4cec85d689b..8e96355971ddae717c856294587b7bd061873f30 100644
--- a/pallets/membership/src/tests.rs
+++ b/pallets/membership/src/tests.rs
@@ -19,7 +19,7 @@ use crate::mock::*;
 use crate::{Error, Event};
 use frame_support::assert_ok;
 use maplit::btreemap;
-use sp_membership::traits::IsInPendingMemberships;
+use sp_membership::traits::*;
 use sp_membership::MembershipData;
 use sp_runtime::traits::IsMember;
 
@@ -46,6 +46,7 @@ fn test_genesis_build() {
                 renewable_on: 2
             })
         );
+        assert_eq!(DefaultMembership::members_count(), 1);
     });
 }
 
diff --git a/primitives/membership/src/traits.rs b/primitives/membership/src/traits.rs
index bf596fd07dcdae8e6335db83693676611444df51..f437cfa0a2f330500e7c62a46bec185ff0ac67d9 100644
--- a/primitives/membership/src/traits.rs
+++ b/primitives/membership/src/traits.rs
@@ -51,6 +51,10 @@ impl<IdtyId, MetaData> OnEvent<IdtyId, MetaData> for () {
     }
 }
 
+pub trait MembersCount {
+    fn members_count() -> u32;
+}
+
 pub trait MembershipExternalStorage<BlockNumber: Decode + Encode + TypeInfo, IdtyId>:
     sp_runtime::traits::IsMember<IdtyId>
 {