diff --git a/node/src/chain_spec.rs b/node/src/chain_spec.rs
index 4eed2a351e05f838379b50df91add8666a267363..435415335fce6553d02e11bf8943d56791d7a979 100644
--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -50,9 +50,14 @@ where
 
 fn clique_wot(
     initial_identities_len: usize,
-) -> BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, Option<common_runtime::BlockNumber>>> {
+) -> (
+    BTreeMap<IdtyIndex, BTreeMap<IdtyIndex, Option<common_runtime::BlockNumber>>>,
+    u32,
+) {
     let mut certs_by_issuer = BTreeMap::new();
+    let mut count: u32 = 0;
     for i in 1..=initial_identities_len {
+        count += initial_identities_len as u32;
         certs_by_issuer.insert(
             i as IdtyIndex,
             (1..=initial_identities_len)
@@ -66,5 +71,5 @@ fn clique_wot(
                 .collect(),
         );
     }
-    certs_by_issuer
+    (certs_by_issuer, count)
 }
diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index e7afbff621033b439b64a901bcef243d590ff92f..b3352cf2ad78b0bfded11585d786df9db17caeb4 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -149,7 +149,7 @@ pub fn benchmark_chain_spec() -> Result<ChainSpec, String> {
                 get_local_chain_parameters(),
                 // Sudo account
                 get_account_id_from_seed::<sr25519::Public>("Alice"),
-                true,
+                get_parameters,
             )
             .expect("Genesis Data must be buildable");
             genesis_data_to_gdev_genesis_conf(genesis_data, wasm_binary)
@@ -256,7 +256,7 @@ pub fn local_testnet_config(
                 get_local_chain_parameters(),
                 // Sudo account
                 get_account_id_from_seed::<sr25519::Public>("Alice"),
-                true,
+                get_parameters,
             )
             .expect("Genesis Data must be buildable");
             genesis_data_to_gdev_genesis_conf(genesis_data, wasm_binary)
@@ -390,7 +390,7 @@ fn genesis_data_to_gdev_genesis_conf(
     }
 }
 
-fn get_local_chain_parameters() -> GenesisParameters {
+fn get_local_chain_parameters() -> Option<GenesisParameters> {
     let babe_epoch_duration = get_env("DUNITER_BABE_EPOCH_DURATION", 30) as u64;
     let cert_validity_period = get_env("DUNITER_CERT_VALIDITY_PERIOD", 1_000);
     let membership_period = get_env("DUNITER_MEMBERSHIP_PERIOD", 1_000);
@@ -398,7 +398,7 @@ fn get_local_chain_parameters() -> GenesisParameters {
     let smith_membership_period = get_env("DUNITER_SMITH_MEMBERSHIP_PERIOD", 1_000);
     let ud_creation_period = get_env("DUNITER_UD_CREATION_PERIOD", 60_000);
     let ud_reeval_period = get_env("DUNITER_UD_REEEVAL_PERIOD", 1_200_000);
-    GenesisParameters {
+    Some(GenesisParameters {
         babe_epoch_duration,
         cert_period: 15,
         cert_max_by_issuer: 10,
@@ -421,7 +421,7 @@ fn get_local_chain_parameters() -> GenesisParameters {
         wot_first_cert_issuable_on: 20,
         wot_min_cert_for_create_idty_right: 2,
         wot_min_cert_for_membership: 2,
-    }
+    })
 }
 
 /// get environment variable
diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs
index eab84d0ab8bf53b3ffe56874a7e4af99abf7477b..0998c5eea7572a6556ce579cbce43fb5faa5cb5e 100644
--- a/node/src/chain_spec/gen_genesis_data.rs
+++ b/node/src/chain_spec/gen_genesis_data.rs
@@ -229,14 +229,6 @@ struct CliqueSmith {
     session_keys: Option<String>,
 }
 
-struct GenesisMemberIdentity {
-    index: u32,
-    owned_key: AccountId,
-    old_owned_key: Option<AccountId>,
-    name: String,
-    active: bool,
-}
-
 struct SmithWoT<SK: Decode> {
     smith_certs_by_receiver: BTreeMap<u32, BTreeMap<u32, Option<u32>>>,
     smith_memberships: BTreeMap<u32, sp_membership::MembershipData<u32>>,
@@ -244,6 +236,20 @@ struct SmithWoT<SK: Decode> {
         BTreeMap<<<MultiSignature as Verify>::Signer as IdentifyAccount>::AccountId, SK>,
 }
 
+struct GenesisInfo<'a> {
+    accounts: &'a BTreeMap<AccountId32, GenesisAccountData<u64>>,
+    genesis_data_wallets_count: &'a usize,
+    inactive_identities: &'a HashMap<u32, String>,
+    identities: &'a Vec<GenesisIdentity>,
+    identity_index: &'a HashMap<u32, String>,
+    smith_memberships: &'a BTreeMap<u32, MembershipData>,
+    counter_online_authorities: &'a u32,
+    counter_cert: &'a u32,
+    counter_smith_cert: &'a u32,
+    technical_committee_members: &'a Vec<AccountId32>,
+    common_parameters: &'a CommonParameters,
+}
+
 /// generate genesis data from a json file
 /// takes DUNITER_GENESIS_CONFIG env var if present or duniter-gen-conf.json by default
 // this function is targeting dev chainspecs, do not use in production network
@@ -495,67 +501,21 @@ where
             );
         });
 
-    // give genesis info
-    log::info!(
-        "prepared genesis with:
-        - {} accounts ({} identities, {} simple wallets)
-        - {} total identities ({} active, {} inactive)
-        - {} smiths
-        - {} initial online authorities
-        - {} certifications
-        - {} smith certifications
-        - {} members in technical committee",
-        accounts.len(),
-        identities.len() - inactive_identities.len(),
-        genesis_data_wallets_count,
-        identity_index.len(),
-        identities.len() - inactive_identities.len(),
-        inactive_identities.len(),
-        smith_memberships.len(),
-        counter_online_authorities,
-        counter_cert,
-        counter_smith_cert,
-        technical_committee_members.len(),
-    );
+    let genesis_info = GenesisInfo {
+        accounts: &accounts,
+        genesis_data_wallets_count: &genesis_data_wallets_count,
+        identities: &identities,
+        inactive_identities: &inactive_identities,
+        identity_index: &identity_index,
+        smith_memberships: &smith_memberships,
+        counter_online_authorities: &counter_online_authorities,
+        counter_cert: &counter_cert,
+        counter_smith_cert: &counter_smith_cert,
+        technical_committee_members: &technical_committee_members,
+        common_parameters: &common_parameters,
+    };
 
-    // give genesis info
-    log::info!(
-        "currency parameters:
-        - existential deposit: {} {}
-        - currency decimals: {}
-        - membership validity: {} days
-        - certification period: {} days
-        - certification validity duration: {} days
-        - smith membership validity: {} days
-        - smith certification validity: {} days
-        - required certifications: {}
-        - smith required certifications: {}
-        - max certifications by issuer: {}
-        - money growth rate: {}% every {} days
-        - UD creation period: {} days
-        - distance percent of required referees: {}%
-        - distance max depth: {}",
-        common_parameters.existential_deposit,
-        common_parameters.currency_name,
-        common_parameters.decimals,
-        common_parameters.membership_period as f32 / DAYS as f32,
-        common_parameters.cert_period as f32 / DAYS as f32,
-        common_parameters.cert_validity_period as f32 / DAYS as f32,
-        common_parameters.smith_membership_period as f32 / DAYS as f32,
-        common_parameters.smith_certs_validity_period as f32 / DAYS as f32,
-        common_parameters.min_cert,
-        common_parameters.smith_min_cert,
-        common_parameters.cert_max_by_issuer,
-        f32::sqrt(common_parameters.c2.deconstruct() as f32 / 1_000_000_000f32) * 100f32,
-        common_parameters.ud_reeval_period as f32 / DAYS as f32,
-        common_parameters.ud_creation_period as f32 / DAYS as f32,
-        common_parameters
-            .distance_min_accessible_referees
-            .deconstruct() as f32
-            / 1_000_000_000f32
-            * 100f32,
-        common_parameters.max_depth,
-    );
+    dump_genesis_info(genesis_info);
 
     if parameters.is_some() {
         let g1_duniter_v1_c = 0.0488;
@@ -748,16 +708,7 @@ where
         certs_by_receiver,
         first_ud,
         first_ud_reeval,
-        identities: identities
-            .into_iter()
-            .map(|i| GenesisIdentity {
-                idty_index: i.index,
-                name: i.name,
-                owner_key: i.owned_key,
-                old_owner_key: i.old_owned_key,
-                active: i.active,
-            })
-            .collect(),
+        identities,
         initial_authorities,
         initial_monetary_mass: genesis_data.initial_monetary_mass,
         memberships,
@@ -774,6 +725,70 @@ where
     Ok(genesis_data)
 }
 
+fn dump_genesis_info(info: GenesisInfo) {
+    // give genesis info
+    log::info!(
+        "prepared genesis with:
+        - {} accounts ({} identities, {} simple wallets)
+        - {} total identities ({} active, {} inactive)
+        - {} smiths
+        - {} initial online authorities
+        - {} certifications
+        - {} smith certifications
+        - {} members in technical committee",
+        info.accounts.len(),
+        info.identities.len() - info.inactive_identities.len(),
+        info.genesis_data_wallets_count,
+        info.identity_index.len(),
+        info.identities.len() - info.inactive_identities.len(),
+        info.inactive_identities.len(),
+        info.smith_memberships.len(),
+        info.counter_online_authorities,
+        info.counter_cert,
+        info.counter_smith_cert,
+        info.technical_committee_members.len(),
+    );
+
+    // give genesis info
+    log::info!(
+        "currency parameters:
+        - existential deposit: {} {}
+        - currency decimals: {}
+        - membership validity: {} days
+        - certification period: {} days
+        - certification validity duration: {} days
+        - smith membership validity: {} days
+        - smith certification validity: {} days
+        - required certifications: {}
+        - smith required certifications: {}
+        - max certifications by issuer: {}
+        - money growth rate: {}% every {} days
+        - UD creation period: {} days
+        - distance percent of required referees: {}%
+        - distance max depth: {}",
+        info.common_parameters.existential_deposit,
+        info.common_parameters.currency_name,
+        info.common_parameters.decimals,
+        info.common_parameters.membership_period as f32 / DAYS as f32,
+        info.common_parameters.cert_period as f32 / DAYS as f32,
+        info.common_parameters.cert_validity_period as f32 / DAYS as f32,
+        info.common_parameters.smith_membership_period as f32 / DAYS as f32,
+        info.common_parameters.smith_certs_validity_period as f32 / DAYS as f32,
+        info.common_parameters.min_cert,
+        info.common_parameters.smith_min_cert,
+        info.common_parameters.cert_max_by_issuer,
+        f32::sqrt(info.common_parameters.c2.deconstruct() as f32 / 1_000_000_000f32) * 100f32,
+        info.common_parameters.ud_reeval_period as f32 / DAYS as f32,
+        info.common_parameters.ud_creation_period as f32 / DAYS as f32,
+        info.common_parameters
+            .distance_min_accessible_referees
+            .deconstruct() as f32
+            / 1_000_000_000f32
+            * 100f32,
+        info.common_parameters.max_depth,
+    );
+}
+
 fn smiths_and_technical_committee_checks(
     inactive_identities: &HashMap<u32, String>,
     technical_committee: &Vec<String>,
@@ -1138,9 +1153,9 @@ fn feed_identities(
     inactive_identities: &mut HashMap<u32, String>,
     memberships: &mut BTreeMap<u32, MembershipData>,
     identities_v2: &HashMap<String, IdentityV2>,
-) -> Result<(bool, Vec<GenesisMemberIdentity>), String> {
+) -> Result<(bool, Vec<GenesisIdentity>), String> {
     let mut fatal = false;
-    let mut identities: Vec<GenesisMemberIdentity> = Vec::new();
+    let mut identities: Vec<GenesisIdentity> = Vec::new();
     for (name, identity) in identities_v2 {
         // identity name
         if !validate_idty_name(name) {
@@ -1204,15 +1219,15 @@ fn feed_identities(
         if expired {
             inactive_identities.insert(identity.index, name.clone());
         };
-        identities.push(GenesisMemberIdentity {
+        identities.push(GenesisIdentity {
             // N.B.: every **non-expired** identity on Genesis is considered to have:
             //  - removable_on: 0,
             //  - next_creatable_identity_on: 0,
             //  - status: IdtyStatus::Validated,
-            index: identity.index,
+            idty_index: identity.index,
             name: name.to_owned().clone(),
-            owned_key: identity.owner_key.clone(),
-            old_owned_key: identity.old_owner_key.clone(),
+            owner_key: identity.owner_key.clone(),
+            old_owner_key: identity.old_owner_key.clone(),
             // but expired identities will just have their pseudonym reserved in the storage
             active: !expired,
         });
@@ -1228,7 +1243,7 @@ fn feed_identities(
         }
     }
     // sort the identities by index for reproducibility (should have been a vec in json)
-    identities.sort_unstable_by(|a, b| a.index.cmp(&b.index));
+    identities.sort_unstable_by(|a, b| a.idty_index.cmp(&b.idty_index));
 
     Ok((fatal, identities))
 }
@@ -1421,9 +1436,9 @@ pub fn generate_genesis_data_for_local_chain<P, SK, SessionKeys: Encode, SKP>(
     initial_smiths_len: usize,
     initial_identities_len: usize,
     treasury_balance: u64,
-    parameters: P,
+    parameters: Option<P>,
     root_key: AccountId,
-    _enable_println: bool,
+    get_common_parameters: fn(&Option<P>) -> CommonParameters,
 ) -> Result<GenesisData<P, SK>, String>
 where
     P: Default + DeserializeOwned,
@@ -1435,6 +1450,7 @@ where
     assert!(initial_authorities_len <= initial_smiths_len);
     let ud = 1_000;
     let idty_index_start: u32 = 1;
+    let common_parameters = get_common_parameters(&parameters);
 
     let initial_smiths = (0..initial_smiths_len)
         .map(|i| get_authority_keys_from_seed(NAMES[i]))
@@ -1457,7 +1473,7 @@ where
         session_keys_map.insert(x.0.clone(), sk);
     });
 
-    let identities_ = initial_identities
+    let identities: Vec<GenesisIdentity> = initial_identities
         .iter()
         .enumerate()
         .map(|(i, (name, owner_key))| GenesisIdentity {
@@ -1469,55 +1485,102 @@ where
         })
         .collect();
 
+    let (certs_by_receiver, counter_cert) = clique_wot(initial_identities.len());
+
+    let accounts = initial_identities
+        .iter()
+        .enumerate()
+        .map(|(i, (_, owner_key))| {
+            (
+                owner_key.clone(),
+                GenesisAccountData {
+                    random_id: H256(blake2_256(
+                        &(i as u32 + idty_index_start, owner_key).encode(),
+                    )),
+                    balance: ud,
+                    is_identity: true,
+                },
+            )
+        })
+        .collect();
+
+    let identity_index = identities
+        .iter()
+        .map(|i| (i.idty_index, i.name.clone()))
+        .collect();
+
+    let genesis_data_wallets_count = 0;
+    let inactive_identities = HashMap::new();
+
+    let smith_memberships = (1..=initial_smiths_len)
+        .map(|i| (i as u32, MembershipData { expire_on: 0 }))
+        .collect();
+
+    let (smith_certs_by_receiver, counter_smith_cert) = clique_wot(initial_smiths_len);
+
+    let initial_authorities: BTreeMap<
+        u32,
+        (
+            <<MultiSignature as Verify>::Signer as IdentifyAccount>::AccountId,
+            bool,
+        ),
+    > = initial_smiths
+        .iter()
+        .enumerate()
+        .map(|(i, keys)| {
+            (
+                i as u32 + idty_index_start,
+                (keys.0.clone(), i < initial_authorities_len),
+            )
+        })
+        .collect();
+
+    let counter_online_authorities = initial_authorities
+        .iter()
+        .filter(|(_, authority)| authority.1)
+        .count() as u32;
+
+    let technical_committee_members = initial_smiths
+        .iter()
+        .map(|x| x.0.clone())
+        .collect::<Vec<_>>();
+
+    let genesis_info = GenesisInfo {
+        accounts: &accounts,
+        genesis_data_wallets_count: &genesis_data_wallets_count,
+        identities: &identities,
+        inactive_identities: &inactive_identities,
+        identity_index: &identity_index,
+        smith_memberships: &smith_memberships,
+        counter_online_authorities: &counter_online_authorities,
+        counter_cert: &counter_cert,
+        counter_smith_cert: &counter_smith_cert,
+        technical_committee_members: &technical_committee_members,
+        common_parameters: &common_parameters,
+    };
+
+    dump_genesis_info(genesis_info);
+
     let genesis_data = GenesisData {
-        accounts: initial_identities
-            .iter()
-            .enumerate()
-            .map(|(i, (_, owner_key))| {
-                (
-                    owner_key.clone(),
-                    GenesisAccountData {
-                        random_id: H256(blake2_256(
-                            &(i as u32 + idty_index_start, owner_key).encode(),
-                        )),
-                        balance: ud,
-                        is_identity: true,
-                    },
-                )
-            })
-            .collect(),
+        accounts,
         // Treasury balance is created out of nothing for local blockchain
         treasury_balance,
-        certs_by_receiver: clique_wot(initial_identities.len()),
+        certs_by_receiver,
         first_ud: None,
         first_ud_reeval: None,
-        identities: identities_,
-        initial_authorities: initial_smiths
-            .iter()
-            .enumerate()
-            .map(|(i, keys)| {
-                (
-                    i as u32 + idty_index_start,
-                    (keys.0.clone(), i < initial_authorities_len),
-                )
-            })
-            .collect(),
+        identities,
+        initial_authorities,
         initial_monetary_mass: initial_identities_len as u64 * ud,
         memberships: (1..=initial_identities.len())
             .map(|i| (i as u32, MembershipData { expire_on: 0 }))
             .collect(),
-        parameters: Some(parameters),
+        parameters,
         common_parameters: None,
         session_keys_map,
-        smith_certs_by_receiver: clique_wot(initial_smiths_len),
-        smith_memberships: (1..=initial_smiths_len)
-            .map(|i| (i as u32, MembershipData { expire_on: 0 }))
-            .collect(),
+        smith_certs_by_receiver,
+        smith_memberships,
         sudo_key: Some(root_key),
-        technical_committee_members: initial_smiths
-            .iter()
-            .map(|x| x.0.clone())
-            .collect::<Vec<_>>(),
+        technical_committee_members,
         ud,
     };