diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index fe2a6d9a041408f66ac4c1730d6b30dde586e3af..c7b13c41a515f38ed716257f5eaa43b175c14ea9 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -221,7 +221,7 @@ fn gen_genesis_conf(
         get_env_u32("DUNITER_SMITH_MEMBERSHIP_RENEWABLE_PERIOD", 20);
     let smith_membership_period = get_env_u32("DUNITER_SMITH_MEMBERSHIP_PERIOD", 1_000);
     let ud_creation_period = get_env_u32("DUNITER_UD_CREATION_PERIOD", 10);
-    let ud_reeval_period = get_env_u32("DUNITER_UD_REEEVAL_PERIOD", 20);
+    let ud_reeval_period = get_env_u32("DUNITER_UD_REEEVAL_PERIOD", 200);
 
     let initial_smiths = (0..initial_smiths_len)
         .map(|i| get_authority_keys_from_seed(NAMES[i]))
@@ -270,9 +270,7 @@ fn gen_genesis_conf(
                 membership_renewable_period,
                 pending_membership_period: 500,
                 ud_creation_period,
-                ud_first_reeval: 100,
-                ud_reeval_period: ud_reeval_period as u64,
-                ud_reeval_period_in_blocks: ud_creation_period * ud_reeval_period,
+                ud_reeval_period,
                 smith_cert_period: 15,
                 smith_cert_max_by_issuer: 8,
                 smith_cert_min_received_cert_to_issue_cert: 2,
@@ -381,6 +379,7 @@ fn gen_genesis_conf(
                 .collect(),
         },
         universal_dividend: UniversalDividendConfig {
+            first_reeval: 100,
             first_ud: 1_000,
             initial_monetary_mass: 0,
         },
@@ -415,6 +414,7 @@ fn genesis_data_to_gdev_genesis_conf(
         accounts,
         certs_by_issuer,
         first_ud,
+        first_ud_reeval,
         identities,
         initial_authorities,
         initial_monetary_mass,
@@ -483,6 +483,7 @@ fn genesis_data_to_gdev_genesis_conf(
         smiths_collective: Default::default(),
         ud_accounts_storage: UdAccountsStorageConfig { ud_accounts },
         universal_dividend: UniversalDividendConfig {
+            first_reeval: first_ud_reeval,
             first_ud,
             initial_monetary_mass,
         },
diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs
index c2303724fb7f1d3807d79aaf5ffce68a75fc0e82..bc8d197541d520cd6b7a8c4403a10ea584c51baa 100644
--- a/node/src/chain_spec/gen_genesis_data.rs
+++ b/node/src/chain_spec/gen_genesis_data.rs
@@ -28,6 +28,7 @@ pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> {
     pub accounts: BTreeMap<AccountId, GenesisAccountData<u64>>,
     pub certs_by_issuer: BTreeMap<u32, BTreeMap<u32, u32>>,
     pub first_ud: u64,
+    pub first_ud_reeval: u32,
     pub identities: Vec<(String, AccountId)>,
     pub initial_authorities: BTreeMap<u32, (AccountId, bool)>,
     pub initial_monetary_mass: u64,
@@ -53,6 +54,7 @@ pub struct ParamsAppliedAtGenesis {
 #[derive(Deserialize, Serialize)]
 struct GenesisConfig<Parameters> {
     first_ud: u64,
+    first_ud_reeval: u32,
     identities: BTreeMap<String, Idty>,
     #[serde(default)]
     parameters: Parameters,
@@ -132,6 +134,7 @@ where
     let GenesisConfig {
         sudo_key,
         first_ud,
+        first_ud_reeval,
         parameters,
         identities,
         smith_identities,
@@ -298,6 +301,7 @@ where
         accounts,
         certs_by_issuer,
         first_ud,
+        first_ud_reeval,
         identities: identities_,
         initial_authorities,
         initial_monetary_mass,
diff --git a/pallets/duniter-test-parameters/src/lib.rs b/pallets/duniter-test-parameters/src/lib.rs
index c7244a4d9f383ca16156b651839d57ab4596a8ed..b72c113419c66b2fc3a2bf697e80964f0d15f4d1 100644
--- a/pallets/duniter-test-parameters/src/lib.rs
+++ b/pallets/duniter-test-parameters/src/lib.rs
@@ -48,9 +48,7 @@ pub mod types {
         pub membership_renewable_period: BlockNumber,
         pub pending_membership_period: BlockNumber,
         pub ud_creation_period: BlockNumber,
-        pub ud_first_reeval: BlockNumber,
-        pub ud_reeval_period: PeriodCount,
-        pub ud_reeval_period_in_blocks: BlockNumber,
+        pub ud_reeval_period: BlockNumber,
         pub smith_cert_period: BlockNumber,
         pub smith_cert_max_by_issuer: CertCount,
         pub smith_cert_min_received_cert_to_issue_cert: CertCount,
diff --git a/pallets/universal-dividend/Cargo.toml b/pallets/universal-dividend/Cargo.toml
index f81235f99eec9c8bcd41c2c914f6b357affb1f1d..a6b48365569604c201874a827a381bd46a8fc522 100644
--- a/pallets/universal-dividend/Cargo.toml
+++ b/pallets/universal-dividend/Cargo.toml
@@ -78,7 +78,6 @@ targets = ['x86_64-unknown-linux-gnu']
 ### DEV ###
 
 [dev-dependencies.pallet-balances]
-default-features = false
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-02'
 
@@ -87,16 +86,13 @@ features = ["derive"]
 version = '1.0.119'
 
 [dev-dependencies.sp-core]
-default-features = false
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-02'
 
 [dev-dependencies.sp-io]
-default-features = false
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-02'
 
 [dev-dependencies.sp-runtime]
-default-features = false
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-02'
diff --git a/pallets/universal-dividend/src/lib.rs b/pallets/universal-dividend/src/lib.rs
index ee04af70627433e9c9ec30de9f91ddff7d464273..4a7d6d2ede2066db1110f17ee54c345c37dc2d41 100644
--- a/pallets/universal-dividend/src/lib.rs
+++ b/pallets/universal-dividend/src/lib.rs
@@ -30,7 +30,7 @@ mod benchmarking;
 use frame_support::traits::{tokens::ExistenceRequirement, Currency};
 use sp_arithmetic::{
     per_things::Permill,
-    traits::{CheckedSub, One, Saturating, Zero},
+    traits::{One, Saturating, Zero},
 };
 use sp_runtime::traits::StaticLookup;
 use sp_std::prelude::*;
@@ -43,7 +43,7 @@ pub mod pallet {
     use frame_support::pallet_prelude::*;
     use frame_support::traits::StorageVersion;
     use frame_system::pallet_prelude::*;
-    use scale_info::TypeInfo;
+    use sp_runtime::traits::Convert;
 
     pub type BalanceOf<T> =
         <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
@@ -59,6 +59,8 @@ pub mod pallet {
 
     #[pallet::config]
     pub trait Config: frame_system::Config {
+        // BlockNumber into Balance converter
+        type BlockNumberIntoBalance: Convert<Self::BlockNumber, BalanceOf<Self>>;
         // The currency
         type Currency: Currency<Self::AccountId>;
         /// Because this pallet emits events, it depends on the runtime's definition of an event.
@@ -74,16 +76,8 @@ pub mod pallet {
         /// Universal dividend creation period
         type UdCreationPeriod: Get<Self::BlockNumber>;
         #[pallet::constant]
-        /// Universal dividend first reevaluation (in block number)
-        /// Must be leess than UdReevalPeriodInBlocks
-        type UdFirstReeval: Get<Self::BlockNumber>;
-        #[pallet::constant]
-        /// Universal dividend reevaluation period (in number of creation period)
-        type UdReevalPeriod: Get<BalanceOf<Self>>;
-        #[pallet::constant]
-        /// Universal dividend reevaluation period in number of blocks
-        /// Must be equal to UdReevalPeriod * UdCreationPeriod
-        type UdReevalPeriodInBlocks: Get<Self::BlockNumber>;
+        /// Universal dividend reevaluation period (in number of blocks)
+        type UdReevalPeriod: Get<Self::BlockNumber>;
         #[pallet::constant]
         /// The number of units to divide the amounts expressed in number of UDs
         /// Example: If you wish to express the UD amounts with a maximum precision of the order
@@ -93,36 +87,26 @@ pub mod pallet {
 
     // STORAGE //
 
-    #[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
-    pub struct LastReeval<T: Config> {
-        members_count: BalanceOf<T>,
-        monetary_mass: BalanceOf<T>,
-        ud_amount: BalanceOf<T>,
-    }
-    impl<T: Config> Default for LastReeval<T> {
-        fn default() -> Self {
-            Self {
-                monetary_mass: Default::default(),
-                members_count: Default::default(),
-                ud_amount: Default::default(),
-            }
-        }
-    }
-
-    /// Last reevaluation
+    /// Current UD amount
     #[pallet::storage]
     #[pallet::getter(fn current_ud)]
-    pub type CurrentUdStorage<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
+    pub type CurrentUd<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
 
     /// Total quantity of money created by universal dividend (does not take into account the possible destruction of money)
     #[pallet::storage]
     #[pallet::getter(fn total_money_created)]
-    pub type MonetaryMassStorage<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
+    pub type MonetaryMass<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
+
+    /// Next UD reevaluation
+    #[pallet::storage]
+    #[pallet::getter(fn next_reeval)]
+    pub type NextReeval<T: Config> = StorageValue<_, T::BlockNumber, ValueQuery>;
 
     // GENESIS
 
     #[pallet::genesis_config]
     pub struct GenesisConfig<T: Config> {
+        pub first_reeval: T::BlockNumber,
         pub first_ud: BalanceOf<T>,
         pub initial_monetary_mass: BalanceOf<T>,
     }
@@ -131,6 +115,7 @@ pub mod pallet {
     impl<T: Config> Default for GenesisConfig<T> {
         fn default() -> Self {
             Self {
+                first_reeval: Default::default(),
                 first_ud: Default::default(),
                 initial_monetary_mass: Default::default(),
             }
@@ -143,8 +128,9 @@ pub mod pallet {
             assert!(!self.first_ud.is_zero());
             assert!(self.initial_monetary_mass >= T::Currency::total_issuance());
 
-            <CurrentUdStorage<T>>::put(self.first_ud);
-            <MonetaryMassStorage<T>>::put(self.initial_monetary_mass);
+            <CurrentUd<T>>::put(self.first_ud);
+            <MonetaryMass<T>>::put(self.initial_monetary_mass);
+            NextReeval::<T>::put(self.first_reeval);
         }
     }
 
@@ -155,13 +141,14 @@ pub mod pallet {
         fn on_initialize(n: T::BlockNumber) -> Weight {
             if (n % T::UdCreationPeriod::get()).is_zero() {
                 let current_members_count = T::MembersCount::get();
-                if (n % T::UdReevalPeriodInBlocks::get()).checked_sub(&T::UdFirstReeval::get())
-                    == Some(Zero::zero())
-                {
+                let next_reeval = NextReeval::<T>::get();
+                if n >= next_reeval {
+                    NextReeval::<T>::put(next_reeval.saturating_add(T::UdReevalPeriod::get()));
                     Self::reeval_ud(current_members_count)
                         + Self::create_ud(current_members_count, n)
+                        + T::DbWeight::get().reads_writes(2, 1)
                 } else {
-                    Self::create_ud(current_members_count, n)
+                    Self::create_ud(current_members_count, n) + T::DbWeight::get().reads(2)
                 }
             } else {
                 0
@@ -197,8 +184,8 @@ pub mod pallet {
         fn create_ud(members_count: BalanceOf<T>, n: T::BlockNumber) -> Weight {
             let total_weight: Weight = 0;
 
-            let ud_amount = <CurrentUdStorage<T>>::try_get().expect("corrupted storage");
-            let monetary_mass = <MonetaryMassStorage<T>>::try_get().expect("corrupted storage");
+            let ud_amount = <CurrentUd<T>>::try_get().expect("corrupted storage");
+            let monetary_mass = <MonetaryMass<T>>::try_get().expect("corrupted storage");
 
             for account_id in T::MembersIds::get() {
                 T::Currency::deposit_creating(&account_id, ud_amount);
@@ -207,7 +194,7 @@ pub mod pallet {
 
             let new_monetary_mass =
                 monetary_mass.saturating_add(ud_amount.saturating_mul(members_count));
-            MonetaryMassStorage::<T>::put(new_monetary_mass);
+            MonetaryMass::<T>::put(new_monetary_mass);
             Self::deposit_event(Event::NewUdCreated {
                 amount: ud_amount,
                 members_count,
@@ -224,8 +211,8 @@ pub mod pallet {
         ) -> DispatchResultWithPostInfo {
             let who = ensure_signed(origin)?;
             let dest = T::Lookup::lookup(dest)?;
-            let ud_amount = <CurrentUdStorage<T>>::try_get()
-                .map_err(|_| DispatchError::Other("corrupted storage"))?;
+            let ud_amount =
+                <CurrentUd<T>>::try_get().map_err(|_| DispatchError::Other("corrupted storage"))?;
             T::Currency::transfer(
                 &who,
                 &dest,
@@ -237,19 +224,21 @@ pub mod pallet {
         fn reeval_ud(members_count: BalanceOf<T>) -> Weight {
             let total_weight: Weight = 0;
 
-            let ud_amount = <CurrentUdStorage<T>>::try_get().expect("corrupted storage");
+            let ud_amount = <CurrentUd<T>>::try_get().expect("corrupted storage");
 
-            let monetary_mass = <MonetaryMassStorage<T>>::try_get().expect("corrupted storage");
+            let monetary_mass = <MonetaryMass<T>>::try_get().expect("corrupted storage");
 
             let new_ud_amount = Self::reeval_ud_formula(
                 ud_amount,
                 T::SquareMoneyGrowthRate::get(),
                 monetary_mass,
                 members_count,
-                T::UdReevalPeriod::get(),
+                T::BlockNumberIntoBalance::convert(
+                    T::UdReevalPeriod::get() / T::UdCreationPeriod::get(),
+                ),
             );
 
-            <CurrentUdStorage<T>>::put(new_ud_amount);
+            <CurrentUd<T>>::put(new_ud_amount);
 
             Self::deposit_event(Event::UdReevalued {
                 new_ud_amount,
diff --git a/pallets/universal-dividend/src/mock.rs b/pallets/universal-dividend/src/mock.rs
index ececa8976115a6286dd948c0e4ffe1a4e551844b..6c48595d82bd51d7166acabff892f12f40f736fd 100644
--- a/pallets/universal-dividend/src/mock.rs
+++ b/pallets/universal-dividend/src/mock.rs
@@ -99,9 +99,7 @@ parameter_types! {
     pub const MembersCount: u64 = 3;
     pub const SquareMoneyGrowthRate: Permill = Permill::from_percent(10);
     pub const UdCreationPeriod: BlockNumber = 2;
-    pub const UdFirstReeval: BlockNumber = 0;
-    pub const UdReevalPeriod: Balance = 4;
-    pub const UdReevalPeriodInBlocks: BlockNumber = 8; // 2 * 4
+    pub const UdReevalPeriod: BlockNumber = 8;
 }
 
 pub struct FakeWot;
@@ -112,15 +110,14 @@ impl Get<Vec<u64>> for FakeWot {
 }
 
 impl pallet_universal_dividend::Config for Test {
+    type BlockNumberIntoBalance = sp_runtime::traits::ConvertInto;
     type Currency = pallet_balances::Pallet<Test>;
     type Event = Event;
     type MembersCount = MembersCount;
     type MembersIds = FakeWot;
     type SquareMoneyGrowthRate = SquareMoneyGrowthRate;
     type UdCreationPeriod = UdCreationPeriod;
-    type UdFirstReeval = UdFirstReeval;
     type UdReevalPeriod = UdReevalPeriod;
-    type UdReevalPeriodInBlocks = UdReevalPeriodInBlocks;
     type UnitsPerUd = frame_support::traits::ConstU64<1_000>;
 }
 
diff --git a/pallets/universal-dividend/src/tests.rs b/pallets/universal-dividend/src/tests.rs
index 0f0510261b15c724e34919c8573d55ee5e938a71..2b48bef4cb364dbbfd0a8f97cd7ff1c11db0d918 100644
--- a/pallets/universal-dividend/src/tests.rs
+++ b/pallets/universal-dividend/src/tests.rs
@@ -20,6 +20,7 @@ use frame_system::{EventRecord, Phase};
 #[test]
 fn test_ud_creation() {
     new_test_ext(UniversalDividendConfig {
+        first_reeval: 8,
         first_ud: 1_000,
         initial_monetary_mass: 0,
     })
diff --git a/resources/gdev.json b/resources/gdev.json
index 46f27c0fe53d93c27e6778600dbfef38d138d866..54da96155e6c87628c36115ae1829c1361e481f5 100644
--- a/resources/gdev.json
+++ b/resources/gdev.json
@@ -1,5 +1,6 @@
 {
   "first_ud": 1000,
+  "first_ud_reeval": 200,
   "identities": {
     "Elois1": {
       "balance": 1000,
diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs
index cf6cfbbf3902b806225bba2181d35e7edd38ad7d..93afdda537fabbdca28822ab7947699b49589955 100644
--- a/runtime/common/src/pallets_config.rs
+++ b/runtime/common/src/pallets_config.rs
@@ -324,15 +324,14 @@ macro_rules! pallets_config {
 		// UNIVERSALĂ‚ DIVIDEND //
 
 		impl pallet_universal_dividend::Config for Runtime {
+			type BlockNumberIntoBalance = sp_runtime::traits::ConvertInto;
 			type Currency = pallet_balances::Pallet<Runtime>;
 			type Event = Event;
 			type MembersCount = common_runtime::providers::UdAccountsProvider<Runtime>;
 			type MembersIds = common_runtime::providers::UdAccountsProvider<Runtime>;
 			type SquareMoneyGrowthRate = SquareMoneyGrowthRate;
 			type UdCreationPeriod = UdCreationPeriod;
-			type UdFirstReeval = UdFirstReeval;
 			type UdReevalPeriod = UdReevalPeriod;
-			type UdReevalPeriodInBlocks = UdReevalPeriodInBlocks;
 			type UnitsPerUd = frame_support::traits::ConstU64<1_000>;
 		}
 
diff --git a/runtime/g1/src/parameters.rs b/runtime/g1/src/parameters.rs
index f1bf8f5b1f67c8d81f012ac0cdf8faad415d89cc..54617f36f98c105d23f1db49fb3b70f6777df88c 100644
--- a/runtime/g1/src/parameters.rs
+++ b/runtime/g1/src/parameters.rs
@@ -85,10 +85,7 @@ parameter_types! {
     // 0.002_381_440 = 0.0488^2
     pub const SquareMoneyGrowthRate: Permill = Permill::from_parts(2_381_440);
     pub const UdCreationPeriod: BlockNumber = DAYS;
-    // TODO: this value will depend on the date of the migration
-    pub const UdFirstReeval: BlockNumber = 45 * DAYS;
-    pub const UdReevalPeriod: Balance = 182;
-    pub const UdReevalPeriodInBlocks: BlockNumber = 2_620_800; // 86400 * 182 / 6
+    pub const UdReevalPeriod: BlockNumber = 2_620_800; // 86400 * 182 / 6
 }
 
 /*******/
diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs
index 7802aaa513417e4bd481dc05e26262a26b76e6df..d064ffe75265bdd2c9113f87bcc4cc7e5c4a8dc9 100644
--- a/runtime/gdev/src/lib.rs
+++ b/runtime/gdev/src/lib.rs
@@ -196,9 +196,7 @@ common_runtime::pallets_config! {
     pub type RenewablePeriod = pallet_duniter_test_parameters::MembershipRenewablePeriod<Runtime>;
     pub type PendingMembershipPeriod = pallet_duniter_test_parameters::PendingMembershipPeriod<Runtime>;
     pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>;
-    pub type UdFirstReeval = pallet_duniter_test_parameters::UdFirstReeval<Runtime>;
     pub type UdReevalPeriod = pallet_duniter_test_parameters::UdReevalPeriod<Runtime>;
-    pub type UdReevalPeriodInBlocks = pallet_duniter_test_parameters::UdReevalPeriodInBlocks<Runtime>;
     pub type WotFirstCertIssuableOn = pallet_duniter_test_parameters::WotFirstCertIssuableOn<Runtime>;
     pub type WotMinCertForMembership = pallet_duniter_test_parameters::WotMinCertForMembership<Runtime>;
     pub type WotMinCertForCreateIdtyRight =
diff --git a/runtime/gdev/tests/common/mod.rs b/runtime/gdev/tests/common/mod.rs
index d9a292ca24ca74a2dc485e1e6109b670f793f720..9bf3075898aa4b77cc64b37425d197d374715747 100644
--- a/runtime/gdev/tests/common/mod.rs
+++ b/runtime/gdev/tests/common/mod.rs
@@ -107,9 +107,7 @@ impl ExtBuilder {
                 membership_renewable_period: 5,
                 pending_membership_period: 500,
                 ud_creation_period: 10,
-                ud_first_reeval: 100,
-                ud_reeval_period: 20,
-                ud_reeval_period_in_blocks: 10 * 20,
+                ud_reeval_period: 10 * 20,
                 smith_cert_period: 15,
                 smith_cert_max_by_issuer: 8,
                 smith_cert_min_received_cert_to_issue_cert: 2,
@@ -280,6 +278,7 @@ impl ExtBuilder {
         .unwrap();
 
         pallet_universal_dividend::GenesisConfig::<Runtime> {
+            first_reeval: 100,
             first_ud: 1_000,
             initial_monetary_mass: 0,
         }
diff --git a/runtime/gtest/src/parameters.rs b/runtime/gtest/src/parameters.rs
index ece1ba7e91f005e5dd70705f5e695a5aac508519..ef26b0f20e40c46cdfa0417a792086a69694b284 100644
--- a/runtime/gtest/src/parameters.rs
+++ b/runtime/gtest/src/parameters.rs
@@ -86,8 +86,7 @@ parameter_types! {
     pub const SquareMoneyGrowthRate: Permill = Permill::from_parts(2_381_440);
     pub const UdCreationPeriod: BlockNumber = DAYS;
     pub const UdFirstReeval: BlockNumber = 2 * DAYS;
-    pub const UdReevalPeriod: Balance = 7;
-    pub const UdReevalPeriodInBlocks: BlockNumber = 100800; // 86400 * 7 / 6
+    pub const UdReevalPeriod: BlockNumber = 100_800; // 86400 * 7 / 6
 }
 
 /*******/