diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index 5e458c803cde655236db715967b75865da3a809b..aeb45dfd21511480a43a8765387d01e7703c2f5c 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -111,9 +111,11 @@ fn devnet_genesis(
             identities: initial_identities
                 .iter()
                 .map(|(name, account)| IdtyValue {
-                    name: name.clone(),
+                    data: Default::default(),
                     expire_on: gdev_runtime::MaxInactivityPeriod::get(),
                     owner_key: account.clone(),
+                    name: name.clone(),
+                    next_creatable_identity_on: Default::default(),
                     removable_on: 0,
                     renewable_on: gdev_runtime::StrongCertRenewablePeriod::get(),
                     rights: vec![
@@ -122,7 +124,6 @@ fn devnet_genesis(
                         (IdtyRight::Ud, None),
                     ],
                     status: gdev_runtime::IdtyStatus::Validated,
-                    data: Default::default(),
                 })
                 .collect(),
         },
diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs
index 4ab1afa758bb37e7b6608917168f226f54c33536..c7da9310720a2be4862a0d94ff3c1726e2be6dea 100644
--- a/pallets/identity/src/lib.rs
+++ b/pallets/identity/src/lib.rs
@@ -60,6 +60,8 @@ pub mod pallet {
         type DelRightOrigin: EnsureOrigin<Self::Origin>;
         /// Management of the authorizations of the different calls. (The default implementation only allows root)
         type EnsureIdtyCallAllowed: EnsureIdtyCallAllowed<Self>;
+        /// Minimum duration between the creation of 2 identities by the same creator
+        type IdtyCreationPeriod: Get<Self::BlockNumber>;
         ///  Identity custom data
         type IdtyData: Parameter + Member + MaybeSerializeDeserialize + Debug + Default;
         ///  Identity custom data provider
@@ -280,7 +282,25 @@ pub mod pallet {
             idty_name: IdtyName,
             owner_key: T::AccountId,
         ) -> DispatchResultWithPostInfo {
-            T::EnsureIdtyCallAllowed::can_create_identity(origin, creator, &idty_name, &owner_key)?;
+            let creator_idty_val =
+                Identities::<T>::try_get(&creator).map_err(|_| Error::<T>::CreatorNotExist)?;
+
+            let block_number = frame_system::pallet::Pallet::<T>::block_number();
+
+            if creator_idty_val.next_creatable_identity_on
+                > block_number + T::IdtyCreationPeriod::get()
+            {
+                return Err(Error::<T>::NotRespectIdtyCreationPeriod.into());
+            }
+
+            T::EnsureIdtyCallAllowed::can_create_identity(
+                origin,
+                creator,
+                creator_idty_val,
+                &idty_name,
+                &owner_key,
+            )?;
+
             if !T::IdtyNameValidator::validate(&idty_name) {
                 return Err(Error::<T>::IdtyNameInvalid.into());
             }
@@ -290,15 +310,15 @@ pub mod pallet {
                 return Err(Error::<T>::IdtyNameAlreadyExist.into());
             }
 
-            let block_number = frame_system::pallet::Pallet::<T>::block_number();
             let removable_on = block_number + T::ConfirmPeriod::get();
 
             let idty_index = Self::get_next_idty_index();
             <Identities<T>>::insert(
                 idty_index,
                 IdtyValue {
-                    name: idty_name.clone(),
                     expire_on: T::BlockNumber::zero(),
+                    name: idty_name.clone(),
+                    next_creatable_identity_on: T::BlockNumber::zero(),
                     owner_key: owner_key.clone(),
                     removable_on,
                     renewable_on: T::BlockNumber::zero(),
@@ -625,6 +645,8 @@ pub mod pallet {
 
     #[pallet::error]
     pub enum Error<T> {
+        /// Creator not exist
+        CreatorNotExist,
         /// Identity already confirmed
         IdtyAlreadyConfirmed,
         /// Identity already validated
@@ -649,6 +671,8 @@ pub mod pallet {
         RightAlreadyAdded,
         /// Right not exist
         RightNotExist,
+        /// Not respect IdtyCreationPeriod
+        NotRespectIdtyCreationPeriod,
     }
 
     // PUBLIC FUNCTIONS //
@@ -672,7 +696,7 @@ pub mod pallet {
             } else {
                 panic!("storage corrupted")
             }
-        } //NextIdtyIndex
+        }
         fn get_next_idty_index() -> T::IdtyIndex {
             if let Ok(next_index) = <NextIdtyIndex<T>>::try_get() {
                 <NextIdtyIndex<T>>::put(next_index.saturating_add(T::IdtyIndex::one()));
diff --git a/pallets/identity/src/mock.rs b/pallets/identity/src/mock.rs
index 0dfaf06f01176921df6f7ba54b7f418b1ca8c25a..d7b9ed028e0aae8c63bbf5b4af49e9eee143deb1 100644
--- a/pallets/identity/src/mock.rs
+++ b/pallets/identity/src/mock.rs
@@ -114,6 +114,7 @@ impl system::Config for Test {
 
 parameter_types! {
     pub const ConfirmPeriod: u64 = 2;
+    pub const IdtyCreationPeriod: u64 = 3;
     pub const MaxInactivityPeriod: u64 = 5;
     pub const MaxNoRightPeriod: u64 = 4;
     pub const RenewablePeriod: u64 = 3;
@@ -133,6 +134,7 @@ impl pallet_identity::Config for Test {
     type AddRightOrigin = system::EnsureRoot<AccountId>;
     type DelRightOrigin = system::EnsureRoot<AccountId>;
     type EnsureIdtyCallAllowed = ();
+    type IdtyCreationPeriod = IdtyCreationPeriod;
     type IdtyData = ();
     type IdtyDataProvider = ();
     type IdtyNameValidator = IdtyNameValidatorTestImpl;
diff --git a/pallets/identity/src/tests.rs b/pallets/identity/src/tests.rs
index 0748a04726b7cbf15ae5ed33f73125590849d54f..7b976305e0a9cfab16ea3501bdff334833ffd4a5 100644
--- a/pallets/identity/src/tests.rs
+++ b/pallets/identity/src/tests.rs
@@ -33,24 +33,26 @@ fn test_no_identity() {
 fn test_two_identities() {
     let identities = vec![
         crate::IdtyValue {
-            name: IdtyName(vec![0]),
+            data: (),
             expire_on: 5,
             owner_key: 1,
+            name: IdtyName(vec![0]),
+            next_creatable_identity_on: 0,
             removable_on: 0,
             renewable_on: 3,
             rights: vec![(Right::Right2, Some(10))],
             status: crate::IdtyStatus::Validated,
-            data: (),
         },
         crate::IdtyValue {
-            name: IdtyName(vec![1]),
+            data: (),
             expire_on: 5,
             owner_key: 2,
+            name: IdtyName(vec![1]),
+            next_creatable_identity_on: 0,
             removable_on: 0,
             renewable_on: 3,
             rights: vec![(Right::Right1, Some(20))],
             status: crate::IdtyStatus::Validated,
-            data: (),
         },
     ];
 
diff --git a/pallets/identity/src/traits.rs b/pallets/identity/src/traits.rs
index 44862c5e4e27ebac430728cffccdd3aa4cf31922..caa9c2446b811c733bdd037c832e5b298f0b6e6d 100644
--- a/pallets/identity/src/traits.rs
+++ b/pallets/identity/src/traits.rs
@@ -24,6 +24,7 @@ pub trait EnsureIdtyCallAllowed<T: Config> {
     fn can_create_identity(
         origin: T::Origin,
         creator: T::IdtyIndex,
+        creator_idty: IdtyValue<T::AccountId, T::BlockNumber, T::IdtyData, T::IdtyRight>,
         idty_name: &IdtyName,
         idty_owner_key: &T::AccountId,
     ) -> Result<(), DispatchError>;
@@ -33,6 +34,7 @@ impl<T: Config> EnsureIdtyCallAllowed<T> for () {
     fn can_create_identity(
         origin: T::Origin,
         _creator: T::IdtyIndex,
+        _creator_idty: IdtyValue<T::AccountId, T::BlockNumber, T::IdtyData, T::IdtyRight>,
         _idty_name: &IdtyName,
         _idty_owner_key: &T::AccountId,
     ) -> Result<(), DispatchError> {
diff --git a/pallets/identity/src/types.rs b/pallets/identity/src/types.rs
index 147cbd1abd22d97973674b66e689ae347b6cdcf6..dcca75ea962926705929c001bd7d0abf353a363f 100644
--- a/pallets/identity/src/types.rs
+++ b/pallets/identity/src/types.rs
@@ -79,14 +79,15 @@ pub struct IdtyValue<
     IdtyData: Decode + Encode + TypeInfo,
     IdtyRight: Decode + Encode + TypeInfo,
 > {
-    pub name: IdtyName,
+    pub data: IdtyData,
     pub expire_on: BlockNumber,
     pub owner_key: AccountId,
+    pub name: IdtyName,
+    pub next_creatable_identity_on: BlockNumber,
     pub removable_on: BlockNumber,
     pub renewable_on: BlockNumber,
     pub rights: Vec<(IdtyRight, Option<AccountId>)>,
     pub status: IdtyStatus,
-    pub data: IdtyData,
 }
 
 impl<AccountId, BlockNumber, IdtyData, IdtyRight>
diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs
index 7ecfdec32ec56ae4188ca808e38d3c841602b425..951ad411c340fc5c0c5dd47e8563bc24ba8d7dbf 100644
--- a/pallets/membership/src/lib.rs
+++ b/pallets/membership/src/lib.rs
@@ -479,7 +479,7 @@ impl<T: Config<I>, I: 'static> IsInPendingMemberships<T::IdtyId> for Pallet<T, I
 
 impl<T: Config<I>, I: 'static> IsMember<T::IdtyId> for Pallet<T, I> {
     fn is_member(idty_id: &T::IdtyId) -> bool {
-        Self::is_member_inner(&idty_id)
+        Self::is_member_inner(idty_id)
     }
 }
 
diff --git a/runtime/common/src/authorizations.rs b/runtime/common/src/authorizations.rs
index febd81ecc096add7a392aa38069acc3101e3f2cd..1c2ef413e85715ab5ed204c81a5219206ed246a8 100644
--- a/runtime/common/src/authorizations.rs
+++ b/runtime/common/src/authorizations.rs
@@ -38,38 +38,38 @@ impl<
     fn can_create_identity(
         origin: Runtime::Origin,
         creator: IdtyIndex,
+        creator_idty: pallet_identity::IdtyValue<
+            Runtime::AccountId,
+            BlockNumber,
+            IdtyData,
+            IdtyRight,
+        >,
         _idty_name: &pallet_identity::IdtyName,
         _idty_owner_key: &Runtime::AccountId,
     ) -> Result<(), DispatchError> {
         match origin.into() {
             Ok(frame_system::RawOrigin::Root) => Ok(()),
             Ok(frame_system::RawOrigin::Signed(signer)) => {
-                if let Some(creator_idty) = pallet_identity::Pallet::<Runtime>::identity(creator) {
-                    if let Some(authorized_key) = creator_idty.get_right_key(IdtyRight::CreateIdty)
+                if let Some(authorized_key) = creator_idty.get_right_key(IdtyRight::CreateIdty) {
+                    if signer != authorized_key {
+                        frame_support::runtime_print!("signer != authorized_key");
+                        Err(DispatchError::Other("signer != authorized_key"))
+                    } else if !IsIdtyAllowedToCreateCertImpl::is_idty_allowed_to_create_cert(
+                        creator,
+                    ) {
+                        frame_support::runtime_print!("not allowed to create cert");
+                        Err(DispatchError::Other("not allowed to create cert"))
+                    } else if creator_idty.data.can_create_on
+                        > frame_system::Pallet::<Runtime>::block_number()
                     {
-                        if signer != authorized_key {
-                            frame_support::runtime_print!("signer != authorized_key");
-                            Err(DispatchError::Other("signer != authorized_key"))
-                        } else if !IsIdtyAllowedToCreateCertImpl::is_idty_allowed_to_create_cert(
-                            creator,
-                        ) {
-                            frame_support::runtime_print!("not allowed to create cert");
-                            Err(DispatchError::Other("not allowed to create cert"))
-                        } else if creator_idty.data.can_create_on
-                            > frame_system::Pallet::<Runtime>::block_number()
-                        {
-                            frame_support::runtime_print!("Not respect IdtyCreatePeriod");
-                            Err(DispatchError::Other("Not respect IdtyCreatePeriod"))
-                        } else {
-                            Ok(())
-                        }
+                        frame_support::runtime_print!("Not respect IdtyCreatePeriod");
+                        Err(DispatchError::Other("Not respect IdtyCreatePeriod"))
                     } else {
-                        frame_support::runtime_print!("Idty not have right CreateIdty");
-                        Err(DispatchError::Other("Idty not have right CreateIdty"))
+                        Ok(())
                     }
                 } else {
-                    frame_support::runtime_print!("Idty not found");
-                    Err(DispatchError::Other("Idty not found"))
+                    frame_support::runtime_print!("Idty not have right CreateIdty");
+                    Err(DispatchError::Other("Idty not have right CreateIdty"))
                 }
             }
             _ => {
diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs
index 6f15bcaeb9f81ca9c44716176e60b87a37ef324b..ac789e56f56dcb857e087794291f4a95751808d7 100644
--- a/runtime/common/src/lib.rs
+++ b/runtime/common/src/lib.rs
@@ -53,7 +53,7 @@ pub type Hash = sp_core::H256;
 pub type Header = sp_runtime::generic::Header<BlockNumber, sp_runtime::traits::BlakeTwo256>;
 
 /// Index of an identity
-pub type IdtyIndex = u64;
+pub type IdtyIndex = u32;
 
 /// Index of a transaction in the chain.
 pub type Index = u32;
diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs
index 77101f901229d834e7c69e4151a3365b95870231..3bb3e44fd4f473ca89e482368483732d0859d0fb 100644
--- a/runtime/common/src/pallets_config.rs
+++ b/runtime/common/src/pallets_config.rs
@@ -190,6 +190,7 @@ macro_rules! pallets_config {
             type AddRightOrigin = EnsureRoot<Self::AccountId>;
             type DelRightOrigin = EnsureRoot<Self::AccountId>;
             type EnsureIdtyCallAllowed = EnsureIdtyCallAllowedImpl<Runtime, StrongCert>;
+			type IdtyCreationPeriod = IdtyCreationPeriod;
 			type IdtyDataProvider = IdtyDataProvider<Runtime, IDTY_CREATE_PERIOD>;
             type IdtyData = IdtyData;
             type IdtyNameValidator = IdtyNameValidatorImpl;
diff --git a/runtime/g1/src/parameters.rs b/runtime/g1/src/parameters.rs
index 03a91519c6ed2d1b13c2b3025fd03644d006ac2e..2a1eea4d603c738bf5a414fe8847b43737bfe8de 100644
--- a/runtime/g1/src/parameters.rs
+++ b/runtime/g1/src/parameters.rs
@@ -95,8 +95,9 @@ parameter_types! {
 // Identity
 pub const IDTY_CREATE_PERIOD: BlockNumber = 100;
 frame_support::parameter_types! {
-    pub const ConfirmPeriod: BlockNumber = 3 * DAYS;
+    pub const ConfirmPeriod: BlockNumber = 14 * DAYS;
     pub const FirstIssuableOn: BlockNumber = 30* DAYS;
+    pub const IdtyCreationPeriod: BlockNumber = MONTHS;
     pub const IdtyRenewablePeriod: BlockNumber = 6 * MONTHS;
     pub const MaxInactivityPeriod: BlockNumber = YEARS;
     pub const MaxNoRightPeriod: BlockNumber = YEARS;
diff --git a/runtime/gdev/src/parameters.rs b/runtime/gdev/src/parameters.rs
index 87ba20d7c2761adcc1c3321a618da86aed5375ea..e51875d38cb65d46c4c061f85db72302d8e89080 100644
--- a/runtime/gdev/src/parameters.rs
+++ b/runtime/gdev/src/parameters.rs
@@ -49,12 +49,13 @@ frame_support::parameter_types! {
 // Identity
 pub const IDTY_CREATE_PERIOD: BlockNumber = 100;
 frame_support::parameter_types! {
-    pub const ConfirmPeriod: BlockNumber = 12 * HOURS;
-    pub const FirstIssuableOn: BlockNumber = 10;
-    pub const IdtyRenewablePeriod: BlockNumber = 6 * MONTHS;
-    pub const MaxInactivityPeriod: BlockNumber = YEARS;
-    pub const MaxNoRightPeriod: BlockNumber = YEARS;
-    pub const ValidationPeriod: BlockNumber = 2 * MONTHS;
+    pub const ConfirmPeriod: BlockNumber = 40;
+    pub const FirstIssuableOn: BlockNumber = 20;
+    pub const IdtyCreationPeriod: BlockNumber = 50;
+    pub const IdtyRenewablePeriod: BlockNumber = 50;
+    pub const MaxInactivityPeriod: BlockNumber = 1_000;
+    pub const MaxNoRightPeriod: BlockNumber = 1_000;
+    pub const ValidationPeriod: BlockNumber = 500;
 }
 
 // Certification
diff --git a/runtime/gtest/src/parameters.rs b/runtime/gtest/src/parameters.rs
index 73dddb1b3a43ccd668e67ea74ada1582354c0e78..44f287dfde8ef904b62b7c55c8f459b18eb9f7b3 100644
--- a/runtime/gtest/src/parameters.rs
+++ b/runtime/gtest/src/parameters.rs
@@ -94,8 +94,9 @@ parameter_types! {
 // Identity
 pub const IDTY_CREATE_PERIOD: BlockNumber = 100;
 frame_support::parameter_types! {
-    pub const ConfirmPeriod: BlockNumber = DAYS;
+    pub const ConfirmPeriod: BlockNumber = 8 * HOURS;
     pub const FirstIssuableOn: BlockNumber = DAYS;
+    pub const IdtyCreationPeriod: BlockNumber = DAYS;
     pub const IdtyRenewablePeriod: BlockNumber = 12 * DAYS;
     pub const MaxInactivityPeriod: BlockNumber = 73 * DAYS;
     pub const MaxNoRightPeriod: BlockNumber = 73 * DAYS;