diff --git a/Cargo.lock b/Cargo.lock
index 966a4e812ae62e681570eb1e93cb1bafb0e52624..7c939dae90fe4114d37d5934cd15ab862df6c7f6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -8863,6 +8863,17 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "scale-bits"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89"
+dependencies = [
+ "parity-scale-codec",
+ "scale-info",
+ "serde",
+]
+
 [[package]]
 name = "scale-decode"
 version = "0.5.0"
@@ -8871,12 +8882,25 @@ checksum = "c7e5527e4b3bf079d4c0b2f253418598c380722ba37ef20fac9088081407f2b6"
 dependencies = [
  "parity-scale-codec",
  "primitive-types",
- "scale-bits",
+ "scale-bits 0.3.0",
  "scale-decode-derive",
  "scale-info",
  "thiserror",
 ]
 
+[[package]]
+name = "scale-decode"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7caaf753f8ed1ab4752c6afb20174f03598c664724e0e32628e161c21000ff76"
+dependencies = [
+ "derive_more",
+ "parity-scale-codec",
+ "scale-bits 0.4.0",
+ "scale-info",
+ "smallvec",
+]
+
 [[package]]
 name = "scale-decode-derive"
 version = "0.5.0"
@@ -8898,12 +8922,25 @@ checksum = "15546e5efbb45f0fc2291f7e202dee8623274c5d8bbfdf9c6886cc8b44a7ced3"
 dependencies = [
  "parity-scale-codec",
  "primitive-types",
- "scale-bits",
+ "scale-bits 0.3.0",
  "scale-encode-derive",
  "scale-info",
  "thiserror",
 ]
 
+[[package]]
+name = "scale-encode"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5"
+dependencies = [
+ "derive_more",
+ "parity-scale-codec",
+ "scale-bits 0.4.0",
+ "scale-info",
+ "smallvec",
+]
+
 [[package]]
 name = "scale-encode-derive"
 version = "0.1.2"
@@ -8952,13 +8989,33 @@ dependencies = [
  "either",
  "frame-metadata",
  "parity-scale-codec",
- "scale-bits",
- "scale-decode",
- "scale-encode",
+ "scale-bits 0.3.0",
+ "scale-decode 0.5.0",
+ "scale-encode 0.1.2",
  "scale-info",
  "serde",
  "thiserror",
- "yap",
+ "yap 0.10.0",
+]
+
+[[package]]
+name = "scale-value"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58223c7691bf0bd46b43c9aea6f0472d1067f378d574180232358d7c6e0a8089"
+dependencies = [
+ "base58",
+ "blake2",
+ "derive_more",
+ "either",
+ "frame-metadata",
+ "parity-scale-codec",
+ "scale-bits 0.4.0",
+ "scale-decode 0.10.0",
+ "scale-encode 0.5.0",
+ "scale-info",
+ "serde",
+ "yap 0.11.0",
 ]
 
 [[package]]
@@ -10423,11 +10480,11 @@ dependencies = [
  "parity-scale-codec",
  "parking_lot 0.12.1",
  "primitive-types",
- "scale-bits",
- "scale-decode",
- "scale-encode",
+ "scale-bits 0.3.0",
+ "scale-decode 0.5.0",
+ "scale-encode 0.1.2",
  "scale-info",
- "scale-value",
+ "scale-value 0.7.0",
  "serde",
  "serde_json",
  "sp-core",
@@ -12426,6 +12483,7 @@ dependencies = [
  "reqwest",
  "run_script",
  "scale-info",
+ "scale-value 0.13.0",
  "serde",
  "serde_json",
  "tera",
@@ -12455,6 +12513,12 @@ version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e2a7eb6d82a11e4d0b8e6bda8347169aff4ccd8235d039bba7c47482d977dcf7"
 
+[[package]]
+name = "yap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff4524214bc4629eba08d78ceb1d6507070cc0bcbbed23af74e19e6e924a24cf"
+
 [[package]]
 name = "yasna"
 version = "0.5.2"
diff --git a/resources/weight_analyzer/src/lib.rs b/resources/weight_analyzer/src/lib.rs
index 8b212ce1296c6eaf2231f897ed26d547900006f1..d4c3756d017f782f0c50285034cb832ec0f0ba05 100644
--- a/resources/weight_analyzer/src/lib.rs
+++ b/resources/weight_analyzer/src/lib.rs
@@ -23,6 +23,11 @@ impl Div<&MaxBlockWeight> for f64 {
         self / max_block_weight.0
     }
 }
+impl MaxBlockWeight {
+    pub fn new(value: f64) -> Self {
+        MaxBlockWeight(value)
+    }
+}
 
 #[derive(Clone, Debug, Serialize)]
 pub struct WeightInfo {
diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml
index 05166cc4ee3994bc4bb46b786dee5179de184850..43d347a1de779e63e71571463602e9f76a01baeb 100644
--- a/xtask/Cargo.toml
+++ b/xtask/Cargo.toml
@@ -31,3 +31,4 @@ version_check = "0.9.2"
 version-compare = "0.0.11"
 tera = { version = "1", default-features = false }
 weight-analyzer = {path = "../resources/weight_analyzer"}
+scale-value = "0.13.0"
diff --git a/xtask/src/gen_doc.rs b/xtask/src/gen_doc.rs
index ba26fafba546ec7c74d76243c03e18eb5a5624d2..7dc7631b0fa4eb76bb0ccaca9e428a0faf458fcb 100644
--- a/xtask/src/gen_doc.rs
+++ b/xtask/src/gen_doc.rs
@@ -255,8 +255,8 @@ pub(super) fn gen_doc() -> Result<()> {
 
     println!("Metadata successfully loaded!");
 
-    let mut runtime = if let frame_metadata::RuntimeMetadata::V14(metadata_v14) = metadata.1 {
-        get_from_metadata_v14(metadata_v14)?
+    let mut runtime = if let frame_metadata::RuntimeMetadata::V14(ref metadata_v14) = metadata.1 {
+        get_from_metadata_v14(metadata_v14.clone())?
     } else {
         bail!("unsuported metadata version")
     };
@@ -264,8 +264,53 @@ pub(super) fn gen_doc() -> Result<()> {
     // Compute the weights from the weight files.
     // Require the `pallet_xxx.rs` weights,
     // the `paritydb_weights.rs` and the `extrinsic_weights.rs`
-    let mut weights = get_weights();
+    // TODO SIMPLIFY IF POSSIBLE!!!
+    let max_weight = if let frame_metadata::RuntimeMetadata::V14(metadata_v14) = metadata.1 {
+        let block_weights = metadata_v14
+            .pallets
+            .iter()
+            .find(|pallet| pallet.name == "System")
+            .unwrap()
+            .constants
+            .iter()
+            .find(|constant| constant.name == "BlockWeights")
+            .unwrap();
+
+        let block_weights = scale_value::scale::decode_as_type(
+            &mut &*block_weights.value,
+            block_weights.ty.id,
+            &metadata_v14.types,
+        )
+        .unwrap()
+        .value;
+
+        let max_weight: u128 =
+            if let scale_value::ValueDef::Composite(scale_value::Composite::Named(i)) =
+                block_weights
+            {
+                if let scale_value::ValueDef::Composite(scale_value::Composite::Named(j)) =
+                    &i.iter().find(|name| name.0 == "max_block").unwrap().1.value
+                {
+                    if let scale_value::ValueDef::Primitive(scale_value::Primitive::U128(k)) =
+                        &j.iter().find(|name| name.0 == "ref_time").unwrap().1.value
+                    {
+                        *k
+                    } else {
+                        0u128
+                    }
+                } else {
+                    0u128
+                }
+            } else {
+                0u128
+            };
+
+        max_weight
+    } else {
+        0u128
+    };
 
+    let mut weights = get_weights(max_weight);
     // AdHoc names convertion
     // TODO automatic, possible???
     rename_key(&mut weights, &"FrameSystem".into(), "System".into());
@@ -393,9 +438,12 @@ fn get_from_metadata_v14(
     Ok(pallets)
 }
 
-fn get_weights() -> HashMap<String, HashMap<String, WeightInfo>> {
-    analyze_weight(Path::new(WEIGHT_FILEPATH), &MaxBlockWeight::default())
-        .expect("Weights unavailable")
+fn get_weights(max_weight: u128) -> HashMap<String, HashMap<String, WeightInfo>> {
+    analyze_weight(
+        Path::new(WEIGHT_FILEPATH),
+        &MaxBlockWeight::new(max_weight as f64),
+    )
+    .expect("Weights unavailable")
 }
 
 /// use template to render markdown file with runtime calls documentation