diff --git a/xtask/res/templates/runtime-calls-category.md b/xtask/res/templates/runtime-calls-category.md
index 71c6a7bcec12c936d5ccf4dd912227954ab18b3b..40fd4dca280a0dfcd8ace52f0ef4f4894ec041c5 100644
--- a/xtask/res/templates/runtime-calls-category.md
+++ b/xtask/res/templates/runtime-calls-category.md
@@ -23,8 +23,7 @@ Taking {{ call.weight }} % of a block.
 ```
 </details>
 
-{# replace markdown sytax in documentation breaking the final result #}
-{{ call.documentation | replace(from="# WARNING:", to="WARNING:") | replace(from="## Complexity", to="**Complexity**") }}
+See [Pallet::{{ call.name }}](./doc/{{ pallet.type_name }}/pallet/struct.Pallet.html#method.{{ call.name }} )
 
 {% endfor -%}
 {% endfor -%}
diff --git a/xtask/src/gen_doc.rs b/xtask/src/gen_doc.rs
index 5e4b4b23898522ce26c57be25f12abca7c2289fe..85dc61d546da82d5f59a0dcaf9fd57182e0c51cb 100644
--- a/xtask/src/gen_doc.rs
+++ b/xtask/src/gen_doc.rs
@@ -56,6 +56,7 @@ type RuntimePallets = Vec<Pallet>;
 struct Pallet {
     index: u8,
     name: String,
+    type_name: String,
     calls: Vec<Call>,
     events: Vec<Event>,
     errors: Vec<ErroR>,
@@ -96,6 +97,7 @@ impl Pallet {
     fn new(
         index: u8,
         name: String,
+        type_name: String,
         call_scale_type_def: &Option<scale_info::TypeDef<PortableForm>>,
         event_scale_type_def: &Option<scale_info::TypeDef<PortableForm>>,
         error_scale_type_def: &Option<scale_info::TypeDef<PortableForm>>,
@@ -130,6 +132,7 @@ impl Pallet {
         Ok(Self {
             index,
             name,
+            type_name,
             calls,
             events,
             errors,
@@ -382,10 +385,17 @@ fn get_from_metadata_v15(
     println!("Number of pallets: {}", metadata_v15.pallets.len());
     let mut pallets = Vec::new();
     for pallet in metadata_v15.pallets {
+        let mut type_name: String = Default::default();
         let calls_type_def = if let Some(calls) = pallet.calls {
             let Some(calls_type) = metadata_v15.types.resolve(calls.ty.id) else {
                 bail!("Invalid metadata")
             };
+            type_name = calls_type
+                .path
+                .segments
+                .first()
+                .expect("cannot decode pallet type")
+                .to_string();
             Some(calls_type.type_def.clone())
         } else {
             println!("{}: {} (0 calls)", pallet.index, pallet.name);
@@ -413,6 +423,7 @@ fn get_from_metadata_v15(
         let pallet = Pallet::new(
             pallet.index,
             pallet.name.clone(),
+            type_name,
             &calls_type_def,
             &events_type_def,
             &errors_type_def,