diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index 9f5121312483736d2c1ae2f03a4beab6fab6f7b4..6bbb5b65b0e58400776c53f170641283d846ff26 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -19,10 +19,10 @@ use common_runtime::constants::*;
 use common_runtime::entities::IdtyData;
 use common_runtime::*;
 use gdev_runtime::{
-    opaque::SessionKeys, AccountConfig, AccountId, AuthorityMembersConfig, BabeConfig,
-    BalancesConfig, CertConfig, GenesisConfig, IdentityConfig, ImOnlineId, MembershipConfig,
-    ParametersConfig, SessionConfig, SmithsCertConfig, SmithsMembershipConfig, SudoConfig,
-    SystemConfig, TechnicalCommitteeConfig, UniversalDividendConfig, WASM_BINARY,
+    opaque::SessionKeys, AccountConfig, AccountId, AuthorityMembersConfig, BabeConfig, CertConfig,
+    GenesisConfig, IdentityConfig, ImOnlineId, MembershipConfig, ParametersConfig, SessionConfig,
+    SmithsCertConfig, SmithsMembershipConfig, SudoConfig, SystemConfig, TechnicalCommitteeConfig,
+    UniversalDividendConfig, WASM_BINARY,
 };
 use sc_service::ChainType;
 use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
@@ -34,8 +34,8 @@ use std::collections::BTreeMap;
 
 pub type AuthorityKeys = (
     AccountId,
-    BabeId,
     GrandpaId,
+    BabeId,
     ImOnlineId,
     AuthorityDiscoveryId,
 );
@@ -53,16 +53,51 @@ const TOKEN_SYMBOL: &str = "ÄžD";
 pub fn get_authority_keys_from_seed(s: &str) -> AuthorityKeys {
     (
         get_account_id_from_seed::<sr25519::Public>(s),
-        get_from_seed::<BabeId>(s),
         get_from_seed::<GrandpaId>(s),
+        get_from_seed::<BabeId>(s),
         get_from_seed::<ImOnlineId>(s),
         get_from_seed::<AuthorityDiscoveryId>(s),
     )
 }
 
+/// Generate session keys
+fn get_session_keys_from_seed(s: &str) -> SessionKeys {
+    let authority_keys = get_authority_keys_from_seed(s);
+    session_keys(
+        authority_keys.1,
+        authority_keys.2,
+        authority_keys.3,
+        authority_keys.4,
+    )
+}
+
+/// get environment variable
+fn get_env_u32(env_var_name: &'static str, default_value: u32) -> u32 {
+    std::env::var(env_var_name)
+        .map_or(Ok(default_value), |s| s.parse())
+        .unwrap_or_else(|_| panic!("{} must be a number", env_var_name))
+}
+
+/// make session keys struct
+fn session_keys(
+    grandpa: GrandpaId,
+    babe: BabeId,
+    im_online: ImOnlineId,
+    authority_discovery: AuthorityDiscoveryId,
+) -> SessionKeys {
+    SessionKeys {
+        grandpa,
+        babe,
+        im_online,
+        authority_discovery,
+    }
+}
+
+/// generate development chainspec with Alice validator
 pub fn development_chain_spec() -> Result<ChainSpec, String> {
     let wasm_binary = WASM_BINARY.ok_or_else(|| "Development wasm not available".to_string())?;
 
+    // custom genesis
     if std::env::var("DUNITER_GENESIS_CONFIG").is_ok() {
         super::gen_genesis_data::generate_genesis_data(
             |genesis_data| {
@@ -71,7 +106,9 @@ pub fn development_chain_spec() -> Result<ChainSpec, String> {
                     "Development",
                     // ID
                     "gdev",
+                    // chain type
                     sc_service::ChainType::Development,
+                    // constructor
                     move || genesis_data_to_gdev_genesis_conf(genesis_data.clone(), wasm_binary),
                     // Bootnodes
                     vec![],
@@ -95,15 +132,19 @@ pub fn development_chain_spec() -> Result<ChainSpec, String> {
                     None,
                 )
             },
-            Some(get_authority_keys_from_seed("Alice").encode()),
+            Some(get_session_keys_from_seed("Alice").encode()),
         )
-    } else {
+    }
+    // generated genesis
+    else {
         Ok(ChainSpec::from_genesis(
             // Name
             "Development",
             // ID
             "gdev",
+            // chain type
             ChainType::Development,
+            // constructor
             move || {
                 gen_genesis_for_local_chain(
                     wasm_binary,
@@ -142,6 +183,7 @@ pub fn development_chain_spec() -> Result<ChainSpec, String> {
     }
 }
 
+/// generate live network chainspecs
 pub fn gen_live_conf() -> Result<ChainSpec, String> {
     let wasm_binary = WASM_BINARY.ok_or_else(|| "wasm not available".to_string())?;
 
@@ -186,6 +228,7 @@ pub fn gen_live_conf() -> Result<ChainSpec, String> {
     )
 }
 
+/// generate local network chainspects
 pub fn local_testnet_config(
     initial_authorities_len: usize,
     initial_smiths_len: usize,
@@ -236,6 +279,7 @@ pub fn local_testnet_config(
     ))
 }
 
+/// generate genesis
 fn gen_genesis_for_local_chain(
     wasm_binary: &[u8],
     initial_authorities_len: usize,
@@ -324,9 +368,7 @@ fn gen_genesis_for_local_chain(
                 .map(|(i, keys)| (i as u32 + 1, (keys.0.clone(), i < initial_authorities_len)))
                 .collect(),
         },
-        balances: BalancesConfig {
-            balances: Default::default(),
-        },
+        balances: Default::default(),
         babe: BabeConfig {
             authorities: Vec::with_capacity(0),
             epoch_config: Some(BABE_GENESIS_EPOCH_CONFIG),
@@ -401,26 +443,7 @@ fn gen_genesis_for_local_chain(
     }
 }
 
-fn get_env_u32(env_var_name: &'static str, default_value: u32) -> u32 {
-    std::env::var(env_var_name)
-        .map_or(Ok(default_value), |s| s.parse())
-        .unwrap_or_else(|_| panic!("{} must be a number", env_var_name))
-}
-
-fn session_keys(
-    babe: BabeId,
-    grandpa: GrandpaId,
-    im_online: ImOnlineId,
-    authority_discovery: AuthorityDiscoveryId,
-) -> SessionKeys {
-    SessionKeys {
-        babe,
-        grandpa,
-        im_online,
-        authority_discovery,
-    }
-}
-
+/// custom genesis
 fn genesis_data_to_gdev_genesis_conf(
     genesis_data: super::gen_genesis_data::GenesisData<GenesisParameters, SessionKeys>,
     wasm_binary: &[u8],
@@ -456,7 +479,7 @@ fn genesis_data_to_gdev_genesis_conf(
         balances: Default::default(),
         babe: BabeConfig {
             authorities: Vec::with_capacity(0),
-            epoch_config: Some(common_runtime::constants::BABE_GENESIS_EPOCH_CONFIG),
+            epoch_config: Some(BABE_GENESIS_EPOCH_CONFIG),
         },
         grandpa: Default::default(),
         im_online: Default::default(),
@@ -475,14 +498,14 @@ fn genesis_data_to_gdev_genesis_conf(
             identities: identities
                 .into_iter()
                 .enumerate()
-                .map(|(i, (name, pubkey))| common_runtime::GenesisIdty {
+                .map(|(i, (name, owner_key))| GenesisIdty {
                     index: i as u32 + 1,
                     name: common_runtime::IdtyName::from(name.as_str()),
                     value: common_runtime::IdtyValue {
                         data: IdtyData::new(),
                         next_creatable_identity_on: 0,
                         old_owner_key: None,
-                        owner_key: pubkey,
+                        owner_key,
                         removable_on: 0,
                         status: IdtyStatus::Validated,
                     },
diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs
index 7d0d5bde10781ccfbd3af026d6310ceebc3e0178..21ada90c3a400bd9cc0bd4db160f8aa168f1f9aa 100644
--- a/node/src/chain_spec/gen_genesis_data.rs
+++ b/node/src/chain_spec/gen_genesis_data.rs
@@ -294,7 +294,11 @@ where
                 return Err("session_keys field forbidden".to_owned());
             }
             if *idty_index == 1 {
+                // online authority
                 initial_authorities.insert(1, (identity.pubkey.clone(), true));
+            } else {
+                // authority but offline
+                initial_authorities.insert(*idty_index, (identity.pubkey.clone(), false));
             }
         } else {
             initial_authorities.insert(
@@ -319,11 +323,9 @@ where
             fake_session_keys_bytes
             //vec![initial_authorities.len() as u8; std::mem::size_of::<SK>()]
         };
-        session_keys_map.insert(
-            identity.pubkey.clone(),
-            SK::decode(&mut &session_keys_bytes[..])
-                .map_err(|_| format!("invalid session keys for idty {}", &idty_name))?,
-        );
+        let session_keys = SK::decode(&mut &session_keys_bytes[..])
+            .map_err(|_| format!("invalid session keys for idty {}", &idty_name))?;
+        session_keys_map.insert(identity.pubkey.clone(), session_keys);
 
         // Certifications
         let mut receiver_certs = BTreeMap::new();
diff --git a/node/src/command/key.rs b/node/src/command/key.rs
index 2448aa11d7929e9c1a8c39ebfc5f29e075551a91..655ebc2071e03add5365637b80dc8540c65d0ef5 100644
--- a/node/src/command/key.rs
+++ b/node/src/command/key.rs
@@ -99,12 +99,16 @@ impl GenSessionKeysCmd {
         }
 
         let mut buffer = [0; 32];
+        // grandpa
         buffer.copy_from_slice(&public_keys_bytes[..32]);
         println!("grandpa: {}", AccountId32::new(buffer));
+        // babe
         buffer.copy_from_slice(&public_keys_bytes[32..64]);
         println!("babe: {}", AccountId32::new(buffer));
+        // im_online
         buffer.copy_from_slice(&public_keys_bytes[64..96]);
         println!("im_online: {}", AccountId32::new(buffer));
+        // authority discovery
         buffer.copy_from_slice(&public_keys_bytes[96..]);
         println!("authority_discovery: {}", AccountId32::new(buffer));