diff --git a/pallets/duniter-wot/src/mock.rs b/pallets/duniter-wot/src/mock.rs
index dd6396b8fc4872cc38e7ef2ca4ae0b454b73b07f..39f7e8ae507ab9a456ed37b3f79d48b74283e41c 100644
--- a/pallets/duniter-wot/src/mock.rs
+++ b/pallets/duniter-wot/src/mock.rs
@@ -150,6 +150,7 @@ impl pallet_membership::Config<Instance1> for Test {
     type MetaData = ();
     type OnEvent = DuniterWot;
     type RuntimeEvent = RuntimeEvent;
+    type WeightInfo = ();
     type PendingMembershipPeriod = PendingMembershipPeriod;
 }
 
@@ -204,6 +205,7 @@ impl pallet_membership::Config<Instance2> for Test {
     type MetaData = ();
     type OnEvent = SmithsSubWot;
     type PendingMembershipPeriod = SmithsPendingMembershipPeriod;
+    type WeightInfo = ();
     type RuntimeEvent = RuntimeEvent;
 }
 
diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs
index 76037d965cf6d8c39b4519d7a15801f606fc258a..b8beaa20e2178cae4c8a3fc5917780f36100d566 100644
--- a/pallets/membership/src/lib.rs
+++ b/pallets/membership/src/lib.rs
@@ -26,7 +26,10 @@ mod tests;
 #[cfg(feature = "runtime-benchmarks")]
 mod benchmarking;
 
+pub mod weights;
+
 pub use pallet::*;
+pub use weights::WeightInfo;
 
 use frame_support::dispatch::Weight;
 use frame_support::error::BadOrigin;
@@ -80,6 +83,7 @@ pub mod pallet {
         /// Because this pallet emits events, it depends on the runtime's definition of an event.
         type RuntimeEvent: From<Event<Self, I>>
             + IsType<<Self as frame_system::Config>::RuntimeEvent>;
+        type WeightInfo: WeightInfo;
     }
 
     // GENESIS STUFF //
@@ -197,8 +201,8 @@ pub mod pallet {
 
     #[pallet::call]
     impl<T: Config<I>, I: 'static> Pallet<T, I> {
-        #[pallet::weight(1_000_000_000)]
         /// request membership without checks
+        #[pallet::weight(T::WeightInfo::force_request_membership())]
         pub fn force_request_membership(
             origin: OriginFor<T>,
             idty_id: T::IdtyId,
@@ -209,9 +213,9 @@ pub mod pallet {
             Self::do_request_membership(idty_id, metadata)
         }
 
-        #[pallet::weight(1_000_000_000)]
         /// submit a membership request (must have a declared identity)
         /// (only available for sub wot, automatic for main wot)
+        #[pallet::weight(T::WeightInfo::request_membership())]
         pub fn request_membership(
             origin: OriginFor<T>,
             metadata: T::MetaData,
@@ -227,9 +231,9 @@ pub mod pallet {
             Self::do_request_membership(idty_id, metadata)
         }
 
-        #[pallet::weight(1_000_000_000)]
         /// claim that the previously requested membership fullfills the requirements
         /// (only available for sub wot, automatic for main wot)
+        #[pallet::weight(T::WeightInfo::claim_membership())]
         pub fn claim_membership(
             origin: OriginFor<T>,
             maybe_idty_id: Option<T::IdtyId>,
@@ -255,8 +259,8 @@ pub mod pallet {
             Ok(().into())
         }
 
-        #[pallet::weight(1_000_000_000)]
         /// extend the validity period of an active membership
+        #[pallet::weight(T::WeightInfo::renew_membership())]
         pub fn renew_membership(
             origin: OriginFor<T>,
             maybe_idty_id: Option<T::IdtyId>,
@@ -276,9 +280,9 @@ pub mod pallet {
             Ok(().into())
         }
 
-        #[pallet::weight(1_000_000_000)]
         /// revoke an active membership
         /// (only available for sub wot, automatic for main wot)
+        #[pallet::weight(T::WeightInfo::revoke_membership())]
         pub fn revoke_membership(
             origin: OriginFor<T>,
             maybe_idty_id: Option<T::IdtyId>,
diff --git a/pallets/membership/src/mock.rs b/pallets/membership/src/mock.rs
index 53d7f081bfdc0665682ff29a1f529465aef6cda5..e51038e9a57e6b5c0566caf4c6b2c5a9e74dc890 100644
--- a/pallets/membership/src/mock.rs
+++ b/pallets/membership/src/mock.rs
@@ -92,6 +92,7 @@ impl pallet_membership::Config for Test {
     type OnEvent = ();
     type PendingMembershipPeriod = PendingMembershipPeriod;
     type RuntimeEvent = RuntimeEvent;
+    type WeightInfo = ();
 }
 
 // Build genesis storage according to the mock runtime.
diff --git a/pallets/membership/src/weights.rs b/pallets/membership/src/weights.rs
new file mode 100644
index 0000000000000000000000000000000000000000..efd18e4571e2f150bc9f3c676a0c250b77664cad
--- /dev/null
+++ b/pallets/membership/src/weights.rs
@@ -0,0 +1,84 @@
+// Copyright 2021-2023 Axiom-Team
+//
+// This file is part of Duniter-v2S.
+//
+// Duniter-v2S is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// Duniter-v2S is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
+
+#![allow(clippy::unnecessary_cast)]
+
+use frame_support::weights::{constants::RocksDbWeight, Weight};
+
+/// Weight functions needed for pallet_universal_dividend.
+pub trait WeightInfo {
+    fn force_request_membership() -> Weight;
+    fn request_membership() -> Weight;
+    fn claim_membership() -> Weight;
+    fn renew_membership() -> Weight;
+    fn revoke_membership() -> Weight;
+}
+
+// Insecure weights implementation, use it for tests only!
+impl WeightInfo for () {
+    // Storage: Membership PendingMembership (r:1 w:1)
+    // Storage: Membership Membership (r:1 w:0)
+    // Storage: Parameters ParametersStorage (r:1 w:0)
+    // Storage: Membership PendingMembershipsExpireOn (r:1 w:1)
+    fn force_request_membership() -> Weight {
+        // Minimum execution time: 89_725 nanoseconds.
+        Weight::from_ref_time(98_333_000 as u64)
+            .saturating_add(RocksDbWeight::get().reads(4 as u64))
+            .saturating_add(RocksDbWeight::get().writes(2 as u64))
+    }
+    // Storage: Identity IdentityIndexOf (r:1 w:0)
+    // Storage: Identity Identities (r:1 w:0)
+    fn request_membership() -> Weight {
+        // Minimum execution time: 48_477 nanoseconds.
+        Weight::from_ref_time(50_689_000 as u64)
+            .saturating_add(RocksDbWeight::get().reads(2 as u64))
+    }
+    // Storage: Identity IdentityIndexOf (r:1 w:0)
+    // Storage: Membership Membership (r:1 w:1)
+    // Storage: Cert StorageIdtyCertMeta (r:1 w:0)
+    // Storage: Parameters ParametersStorage (r:1 w:0)
+    // Storage: Membership PendingMembership (r:1 w:1)
+    // Storage: Membership CounterForMembership (r:1 w:1)
+    // Storage: Membership MembershipsExpireOn (r:1 w:1)
+    fn claim_membership() -> Weight {
+        // Minimum execution time: 144_079 nanoseconds.
+        Weight::from_ref_time(146_565_000 as u64)
+            .saturating_add(RocksDbWeight::get().reads(7 as u64))
+            .saturating_add(RocksDbWeight::get().writes(4 as u64))
+    }
+    // Storage: Identity IdentityIndexOf (r:1 w:0)
+    // Storage: Membership Membership (r:1 w:1)
+    // Storage: Identity Identities (r:1 w:0)
+    // Storage: Parameters ParametersStorage (r:1 w:0)
+    // Storage: Membership MembershipsExpireOn (r:1 w:1)
+    fn renew_membership() -> Weight {
+        // Minimum execution time: 120_859 nanoseconds.
+        Weight::from_ref_time(124_222_000 as u64)
+            .saturating_add(RocksDbWeight::get().reads(5 as u64))
+            .saturating_add(RocksDbWeight::get().writes(2 as u64))
+    }
+    // Storage: Identity IdentityIndexOf (r:1 w:0)
+    // Storage: Membership Membership (r:1 w:1)
+    // Storage: Membership CounterForMembership (r:1 w:1)
+    // Storage: Identity Identities (r:1 w:0)
+    // Storage: UniversalDividend CurrentUdIndex (r:1 w:0)
+    fn revoke_membership() -> Weight {
+        // Minimum execution time: 109_486 nanoseconds.
+        Weight::from_ref_time(113_303_000 as u64)
+            .saturating_add(RocksDbWeight::get().reads(5 as u64))
+            .saturating_add(RocksDbWeight::get().writes(2 as u64))
+    }
+}