diff --git a/end2end-tests/cucumber-genesis/default.json b/end2end-tests/cucumber-genesis/default.json
index 9b59a91533dc42d9ca0dbc2ec4fbbe72cdb53406..2a4229359214bad31681038d8af52bf8534897f9 100644
--- a/end2end-tests/cucumber-genesis/default.json
+++ b/end2end-tests/cucumber-genesis/default.json
@@ -2,10 +2,8 @@
   "first_ud": 1000,
   "first_ud_reeval": 100,
   "genesis_parameters": {
-    "genesis_certs_expire_on": 100000,
     "genesis_certs_min_received": 2,
     "genesis_memberships_expire_on": 100000,
-    "genesis_smith_certs_expire_on": 100000,
     "genesis_smith_certs_min_received": 2,
     "genesis_smith_memberships_expire_on": 100000
   },
diff --git a/end2end-tests/cucumber-genesis/wot.json b/end2end-tests/cucumber-genesis/wot.json
index ac93ccc96dbfdddb33c2f11683d387b7e77710e1..9640372aa23180df03b8cc1cb4f7ee65360cc9b6 100644
--- a/end2end-tests/cucumber-genesis/wot.json
+++ b/end2end-tests/cucumber-genesis/wot.json
@@ -2,10 +2,8 @@
   "first_ud": 1000,
   "first_ud_reeval": 100,
   "genesis_parameters": {
-    "genesis_certs_expire_on": 100000,
     "genesis_certs_min_received": 2,
     "genesis_memberships_expire_on": 100000,
-    "genesis_smith_certs_expire_on": 100000,
     "genesis_smith_certs_min_received": 2,
     "genesis_smith_memberships_expire_on": 100000
   },
diff --git a/node/src/chain_spec.rs b/node/src/chain_spec.rs
index 57d8aa0c00154d4e36a33547c481376b51907195..38dc68b41d80b9c64777782af81a8f92bccd0492 100644
--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -57,8 +57,7 @@ where
 
 fn clique_wot(
     initial_identities_len: usize,
-    cert_validity_period: common_runtime::BlockNumber,
-) -> BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, common_runtime::BlockNumber>> {
+) -> BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, Option<common_runtime::BlockNumber>>> {
     let mut certs_by_issuer = BTreeMap::new();
     for i in 1..=initial_identities_len {
         certs_by_issuer.insert(
@@ -66,7 +65,7 @@ fn clique_wot(
             (1..=initial_identities_len)
                 .filter_map(|j| {
                     if i != j {
-                        Some((j as IdtyIndex, cert_validity_period))
+                        Some((j as IdtyIndex, None))
                     } else {
                         None
                     }
diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index 6836f23d34b6c1640f9877c7c6e8b415594d44b9..7f1551147bca151c732e4fe7c71df4b1d6acf293 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -306,7 +306,7 @@ fn gen_genesis_for_local_chain(
                 smith_cert_period: 15,
                 smith_cert_max_by_issuer: 8,
                 smith_cert_min_received_cert_to_issue_cert: 2,
-                smith_cert_validity_period: 1_000,
+                smith_cert_validity_period,
                 smith_membership_period,
                 smith_pending_membership_period: 500,
                 smiths_wot_first_cert_issuable_on: 20,
@@ -381,7 +381,7 @@ fn gen_genesis_for_local_chain(
         },
         cert: CertConfig {
             apply_cert_period_at_genesis: false,
-            certs_by_receiver: clique_wot(initial_identities.len(), cert_validity_period),
+            certs_by_receiver: clique_wot(initial_identities.len()),
         },
         smiths_membership: SmithsMembershipConfig {
             memberships: (1..=initial_smiths_len)
@@ -390,7 +390,7 @@ fn gen_genesis_for_local_chain(
         },
         smiths_cert: SmithsCertConfig {
             apply_cert_period_at_genesis: false,
-            certs_by_receiver: clique_wot(initial_smiths_len, smith_cert_validity_period),
+            certs_by_receiver: clique_wot(initial_smiths_len),
         },
         universal_dividend: UniversalDividendConfig {
             first_reeval: 100,
diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs
index 1b47ee55d82bb80952cc21c89f06cd96b80449ad..800f28eb57725b71b6f66424fc75e38714f84dc7 100644
--- a/node/src/chain_spec/gen_genesis_data.rs
+++ b/node/src/chain_spec/gen_genesis_data.rs
@@ -26,7 +26,7 @@ const EXISTENTIAL_DEPOSIT: u64 = 100;
 #[derive(Clone)]
 pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> {
     pub accounts: BTreeMap<AccountId, GenesisAccountData<u64>>,
-    pub certs_by_receiver: BTreeMap<u32, BTreeMap<u32, u32>>,
+    pub certs_by_receiver: BTreeMap<u32, BTreeMap<u32, Option<u32>>>,
     pub first_ud: u64,
     pub first_ud_reeval: u32,
     pub identities: Vec<(String, AccountId)>,
@@ -35,7 +35,7 @@ pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> {
     pub memberships: BTreeMap<u32, MembershipData>,
     pub parameters: Parameters,
     pub session_keys_map: BTreeMap<AccountId, SessionKeys>,
-    pub smiths_certs_by_receiver: BTreeMap<u32, BTreeMap<u32, u32>>,
+    pub smiths_certs_by_receiver: BTreeMap<u32, BTreeMap<u32, Option<u32>>>,
     pub smiths_memberships: BTreeMap<u32, MembershipData>,
     pub sudo_key: Option<AccountId>,
     pub technical_committee_members: Vec<AccountId>,
@@ -43,10 +43,8 @@ pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> {
 
 #[derive(Default, Deserialize, Serialize)]
 pub struct ParamsAppliedAtGenesis {
-    pub genesis_certs_expire_on: u32,
     pub genesis_certs_min_received: u32,
     pub genesis_memberships_expire_on: u32,
-    pub genesis_smith_certs_expire_on: u32,
     pub genesis_smith_certs_min_received: u32,
     pub genesis_smith_memberships_expire_on: u32,
 }
@@ -130,10 +128,8 @@ where
         first_ud_reeval,
         genesis_parameters:
             ParamsAppliedAtGenesis {
-                genesis_certs_expire_on,
                 genesis_certs_min_received,
                 genesis_memberships_expire_on,
-                genesis_smith_certs_expire_on,
                 genesis_smith_certs_min_received,
                 genesis_smith_memberships_expire_on,
             },
@@ -237,7 +233,7 @@ where
             let issuer_index = idty_index_of
                 .get(issuer)
                 .ok_or(format!("Identity '{}' not exist", issuer))?;
-            receiver_certs.insert(*issuer_index, genesis_certs_expire_on);
+            receiver_certs.insert(*issuer_index, None);
         }
         certs_by_receiver.insert(*issuer_index, receiver_certs);
     }
@@ -319,7 +315,7 @@ where
             let issuer_index = idty_index_of
                 .get(receiver)
                 .ok_or(format!("Identity '{}' not exist", receiver))?;
-            receiver_certs.insert(*issuer_index, genesis_smith_certs_expire_on);
+            receiver_certs.insert(*issuer_index, None);
         }
         smiths_certs_by_receiver.insert(*idty_index, receiver_certs);
 
diff --git a/pallets/certification/src/lib.rs b/pallets/certification/src/lib.rs
index a7e20c39d5103daa613252e3edd5b630c5162e6a..7360129340499cb52eced8f207519c98872af12d 100644
--- a/pallets/certification/src/lib.rs
+++ b/pallets/certification/src/lib.rs
@@ -90,9 +90,11 @@ pub mod pallet {
     // GENESIS STUFFĂ‚ //
 
     #[pallet::genesis_config]
+    #[allow(clippy::type_complexity)]
     pub struct GenesisConfig<T: Config<I>, I: 'static = ()> {
         pub apply_cert_period_at_genesis: bool,
-        pub certs_by_receiver: BTreeMap<T::IdtyIndex, BTreeMap<T::IdtyIndex, T::BlockNumber>>,
+        pub certs_by_receiver:
+            BTreeMap<T::IdtyIndex, BTreeMap<T::IdtyIndex, Option<T::BlockNumber>>>,
     }
 
     #[cfg(feature = "std")]
@@ -128,7 +130,8 @@ pub mod pallet {
                         received_count: issuers.len() as u32,
                     });
 
-                for (issuer, removable_on) in issuers {
+                let mut issuers_: Vec<_> = Vec::with_capacity(issuers.len());
+                for (issuer, maybe_removable_on) in issuers {
                     // Count issued certs
                     cert_meta_by_issuer
                         .entry(*issuer)
@@ -139,9 +142,13 @@ pub mod pallet {
                         })
                         .issued_count += 1;
 
+                    // Compute and store removable_on
+                    let removable_on = maybe_removable_on.unwrap_or_else(T::ValidityPeriod::get);
+                    issuers_.push((*issuer, removable_on));
+
                     // Prepare CertsRemovableOn
                     certs_removable_on
-                        .entry(*removable_on)
+                        .entry(removable_on)
                         .or_default()
                         .push((*issuer, *receiver));
 
@@ -158,9 +165,8 @@ pub mod pallet {
                 }
 
                 // Write CertsByReceiver
-                let mut issuers: Vec<_> = issuers.iter().collect();
-                issuers.sort();
-                CertsByReceiver::<T, I>::insert(receiver, issuers);
+                issuers_.sort();
+                CertsByReceiver::<T, I>::insert(receiver, issuers_);
             }
 
             // Write StorageIdtyCertMeta
diff --git a/pallets/certification/src/tests.rs b/pallets/certification/src/tests.rs
index 2667ecce5b552287cb3898b6ed5d0c75d87def9f..fd4632bcd7f4f89438f872d69f9ad5238cfc9e29 100644
--- a/pallets/certification/src/tests.rs
+++ b/pallets/certification/src/tests.rs
@@ -42,8 +42,8 @@ fn test_cannot_certify_self() {
         apply_cert_period_at_genesis: true,
         certs_by_receiver: btreemap![
             0 => btreemap![
-                1 => 5,
-                2 => 5,
+                1 => Some(5),
+                2 => Some(5),
             ],
         ],
     })
@@ -63,16 +63,16 @@ fn test_genesis_build() {
         apply_cert_period_at_genesis: true,
         certs_by_receiver: btreemap![
             0 => btreemap![
-                1 => 7,
-                2 => 9,
+                1 => Some(7),
+                2 => Some(9),
             ],
             1 => btreemap![
-                0 => 10,
-                2 => 3,
+                0 => Some(10),
+                2 => Some(3),
             ],
             2 => btreemap![
-                0 => 5,
-                1 => 4,
+                0 => Some(5),
+                1 => Some(4),
             ],
         ],
     })
@@ -132,16 +132,16 @@ fn test_cert_period() {
         apply_cert_period_at_genesis: true,
         certs_by_receiver: btreemap![
             0 => btreemap![
-                1 => 10,
-                2 => 10,
+                1 => Some(10),
+                2 => Some(10),
             ],
             1 => btreemap![
-                0 => 10,
-                2 => 10,
+                0 => Some(10),
+                2 => Some(10),
             ],
             2 => btreemap![
-                0 => 10,
-                1 => 10,
+                0 => Some(10),
+                1 => Some(10),
             ],
         ],
     })
diff --git a/pallets/duniter-wot/src/mock.rs b/pallets/duniter-wot/src/mock.rs
index b32f0b46b7e1c36b27ce7ac04c131f6aa55a6a8e..458c40d119721b7bf08aa56924cf2132c8a91a74 100644
--- a/pallets/duniter-wot/src/mock.rs
+++ b/pallets/duniter-wot/src/mock.rs
@@ -347,7 +347,7 @@ pub fn run_to_block(n: u64) {
 fn clique_wot(
     initial_identities_len: usize,
     cert_validity_period: u64,
-) -> BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, u64>> {
+) -> BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, Option<u64>>> {
     let mut certs_by_issuer = BTreeMap::new();
     for i in 1..=initial_identities_len {
         certs_by_issuer.insert(
@@ -355,7 +355,7 @@ fn clique_wot(
             (1..=initial_identities_len)
                 .filter_map(|j| {
                     if i != j {
-                        Some((j as IdtyIndex, cert_validity_period))
+                        Some((j as IdtyIndex, Some(cert_validity_period)))
                     } else {
                         None
                     }
diff --git a/runtime/gdev/tests/common/mod.rs b/runtime/gdev/tests/common/mod.rs
index 247c0e78a4d86a745b722c249b4f0fc0c9bf145a..5d64a4cef079c999783c06f47b36ebc6244f1a3b 100644
--- a/runtime/gdev/tests/common/mod.rs
+++ b/runtime/gdev/tests/common/mod.rs
@@ -395,7 +395,7 @@ pub fn make_secondary_vrf_pre_digest(
 fn clique_wot(
     initial_identities_len: usize,
     cert_validity_period: common_runtime::BlockNumber,
-) -> BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, common_runtime::BlockNumber>> {
+) -> BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, Option<common_runtime::BlockNumber>>> {
     let mut certs_by_issuer = BTreeMap::new();
     for i in 1..=initial_identities_len {
         certs_by_issuer.insert(
@@ -403,7 +403,7 @@ fn clique_wot(
             (1..=initial_identities_len)
                 .filter_map(|j| {
                     if i != j {
-                        Some((j as IdtyIndex, cert_validity_period))
+                        Some((j as IdtyIndex, Some(cert_validity_period)))
                     } else {
                         None
                     }