diff --git a/pallets/certification/src/benchmarking.rs b/pallets/certification/src/benchmarking.rs
index 1fa4b0bfb708c1573e8dc46f2fdd60c2488b723c..668d5cdfae938ace52c59b76c7e78e4386d81ca2 100644
--- a/pallets/certification/src/benchmarking.rs
+++ b/pallets/certification/src/benchmarking.rs
@@ -37,11 +37,11 @@ mod benchmarks {
 
     fn add_certs<T: Config>(i: u32, receiver: T::IdtyIndex) -> Result<(), &'static str> {
         Pallet::<T>::remove_all_certs_received_by(RawOrigin::Root.into(), receiver)?;
-        for j in 1..i {
+        for j in 1..i + 1 {
             Pallet::<T>::do_add_cert_checked(j.into(), receiver, false)?;
         }
         assert!(
-            CertsByReceiver::<T>::get(receiver).len() as u32 == i - 1,
+            CertsByReceiver::<T>::get(receiver).len() as u32 == i,
             "Certs not added",
         );
         Ok(())
@@ -157,6 +157,29 @@ mod benchmarks {
         Ok(())
     }
 
+    #[benchmark]
+    fn do_remove_all_certs_received_by(i: Linear<2, 100>) -> Result<(), BenchmarkError> {
+        let receiver: T::IdtyIndex = 0.into();
+        add_certs::<T>(i, receiver)?;
+
+        #[block]
+        {
+            Pallet::<T>::do_remove_all_certs_received_by(receiver);
+        }
+
+        for issuer in 1..i + 1 {
+            assert_has_event::<T>(
+                Event::<T>::CertRemoved {
+                    issuer: issuer.into(),
+                    receiver,
+                    expiration: false,
+                }
+                .into(),
+            );
+        }
+        Ok(())
+    }
+
     impl_benchmark_test_suite!(
         Pallet,
         crate::mock::new_test_ext(crate::mock::DefaultCertificationConfig {
diff --git a/pallets/certification/src/lib.rs b/pallets/certification/src/lib.rs
index 08aa992f71627b50bc57fb8bf059eeb8b3dabc72..204c8cb08d70bb44323b8eaa53df92db2ff69154 100644
--- a/pallets/certification/src/lib.rs
+++ b/pallets/certification/src/lib.rs
@@ -362,11 +362,28 @@ pub mod pallet {
     impl<T: Config> Pallet<T> {
         /// Perform removal of all certifications received by an identity.
         pub fn do_remove_all_certs_received_by(idty_index: T::IdtyIndex) -> Weight {
-            let mut weight = T::DbWeight::get().reads_writes(1, 0);
-            for (issuer, _) in CertsByReceiver::<T>::get(idty_index) {
-                weight = weight.saturating_add(Self::do_remove_cert(issuer, idty_index, None));
+            let received_certs = CertsByReceiver::<T>::take(idty_index);
+            for (receiver_received_count, (issuer, _)) in received_certs.iter().enumerate().rev() {
+                let issuer_issued_count =
+                    <StorageIdtyCertMeta<T>>::mutate_exists(issuer, |cert_meta_opt| {
+                        let cert_meta = cert_meta_opt.get_or_insert(IdtyCertMeta::default());
+                        cert_meta.issued_count = cert_meta.issued_count.saturating_sub(1);
+                        cert_meta.issued_count
+                    });
+                T::OnRemovedCert::on_removed_cert(
+                    *issuer,
+                    issuer_issued_count,
+                    idty_index,
+                    receiver_received_count as u32,
+                    false,
+                );
+                Self::deposit_event(Event::CertRemoved {
+                    issuer: *issuer,
+                    receiver: idty_index,
+                    expiration: false,
+                });
             }
-            weight
+            T::WeightInfo::do_remove_all_certs_received_by(received_certs.len() as u32)
         }
 
         /// Get the issuer index from the origin.
diff --git a/pallets/certification/src/weights.rs b/pallets/certification/src/weights.rs
index e58c33831e312ab841d57ef2d91c56159d941e23..49280e9f297d4eec2b90db86fe011f30b891b630 100644
--- a/pallets/certification/src/weights.rs
+++ b/pallets/certification/src/weights.rs
@@ -27,6 +27,7 @@ pub trait WeightInfo {
     fn on_initialize() -> Weight;
     fn do_remove_cert_noop() -> Weight;
     fn do_remove_cert() -> Weight;
+    fn do_remove_all_certs_received_by(i: u32) -> Weight;
 }
 
 // Insecure weights implementation, use it for tests only!
@@ -102,4 +103,20 @@ impl WeightInfo for () {
             .saturating_add(RocksDbWeight::get().reads(7 as u64))
             .saturating_add(RocksDbWeight::get().writes(4 as u64))
     }
+
+    // Storage: Cert CertsByReceiver (r:1 w:1)
+    // Storage: Cert StorageIdtyCertMeta (r:2 w:2)
+    // Storage: Parameters ParametersStorage (r:1 w:0)
+    // Storage: Membership Membership (r:1 w:0)
+    /// The range of component `i` is `[2, 1000]`.
+    fn do_remove_all_certs_received_by(i: u32) -> Weight {
+        // Minimum execution time: 223_292 nanoseconds.
+        Weight::from_parts(233_586_000 as u64, 0)
+            // Standard Error: 598_929
+            .saturating_add(Weight::from_parts(53_659_501 as u64, 0).saturating_mul(i as u64))
+            .saturating_add(RocksDbWeight::get().reads(3 as u64))
+            .saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(i as u64)))
+            .saturating_add(RocksDbWeight::get().writes(1 as u64))
+            .saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(i as u64)))
+    }
 }
diff --git a/runtime/g1/src/weights/pallet_certification.rs b/runtime/g1/src/weights/pallet_certification.rs
index 9b40f1ab37e273f17ab497b9d7e33a201f161f63..3b52d4e48a4d49b559614a03f87b12da53d58d20 100644
--- a/runtime/g1/src/weights/pallet_certification.rs
+++ b/runtime/g1/src/weights/pallet_certification.rs
@@ -188,4 +188,26 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1000 w:1000)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[2, 1000]`.
+	fn do_remove_all_certs_received_by(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `554 + i * (35 ±0)`
+		//  Estimated: `4018 + i * (2511 ±0)`
+		// Minimum execution time: 30_026_000 picoseconds.
+		Weight::from_parts(30_298_000, 0)
+			.saturating_add(Weight::from_parts(0, 4018))
+			// Standard Error: 24_742
+			.saturating_add(Weight::from_parts(8_970_118, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2511).saturating_mul(i.into()))
+	}
 }
diff --git a/runtime/gdev/src/weights/pallet_certification.rs b/runtime/gdev/src/weights/pallet_certification.rs
index e3accd5ecafa1602dc6bfb4affcd1d4e0e4e5f93..73df17f4b80ad7deb0ff5c2a0ab985425abdb755 100644
--- a/runtime/gdev/src/weights/pallet_certification.rs
+++ b/runtime/gdev/src/weights/pallet_certification.rs
@@ -172,4 +172,28 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1000 w:1000)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[2, 1000]`.
+	fn do_remove_all_certs_received_by(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `665 + i * (35 ±0)`
+		//  Estimated: `4129 + i * (2511 ±0)`
+		// Minimum execution time: 33_392_000 picoseconds.
+		Weight::from_parts(34_295_000, 0)
+			.saturating_add(Weight::from_parts(0, 4129))
+			// Standard Error: 24_307
+			.saturating_add(Weight::from_parts(9_192_872, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2511).saturating_mul(i.into()))
+	}
 }
diff --git a/runtime/gtest/src/weights/pallet_certification.rs b/runtime/gtest/src/weights/pallet_certification.rs
index df9b6216da3df8c692168ee1db4b785b156fbc5b..6c9f58a2c7e403c39c300978ad204a62ba96619e 100644
--- a/runtime/gtest/src/weights/pallet_certification.rs
+++ b/runtime/gtest/src/weights/pallet_certification.rs
@@ -188,4 +188,26 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:1000 w:1000)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::Membership` (r:1 w:0)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// The range of component `i` is `[2, 1000]`.
+	fn do_remove_all_certs_received_by(i: u32, ) -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `554 + i * (35 ±0)`
+		//  Estimated: `4018 + i * (2511 ±0)`
+		// Minimum execution time: 29_810_000 picoseconds.
+		Weight::from_parts(30_875_000, 0)
+			.saturating_add(Weight::from_parts(0, 4018))
+			// Standard Error: 25_367
+			.saturating_add(Weight::from_parts(8_966_191, 0).saturating_mul(i.into()))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into())))
+			.saturating_add(T::DbWeight::get().writes(1))
+			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
+			.saturating_add(Weight::from_parts(0, 2511).saturating_mul(i.into()))
+	}
 }