diff --git a/Cargo.lock b/Cargo.lock
index 7ec7e9a8b543f62cc5666c001330e6850d8fcf8f..468fd6f4fe5ff69bfd01cb2908eddb349ff3f51c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1465,6 +1465,7 @@ dependencies = [
  "frame-support",
  "frame-system",
  "frame-system-benchmarking",
+ "frame-try-runtime",
  "pallet-authority-members",
  "pallet-babe",
  "pallet-balances",
@@ -3438,6 +3439,7 @@ dependencies = [
  "frame-system",
  "frame-system-benchmarking",
  "frame-system-rpc-runtime-api",
+ "frame-try-runtime",
  "hex-literal",
  "log",
  "node-primitives",
@@ -3511,6 +3513,7 @@ dependencies = [
  "frame-system",
  "frame-system-benchmarking",
  "frame-system-rpc-runtime-api",
+ "frame-try-runtime",
  "hex-literal",
  "log",
  "node-primitives",
diff --git a/README.md b/README.md
index e0f90e8b379a7cf4ffa0faef05677e90e4d97cae..87da44bff3379104081c5514900741e176c80e87 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,7 @@
     - [git-conventions](./docs/dev/git-conventions.md)
     - [launch-a-live-network](./docs/dev/launch-a-live-network.md)
     - [setup](./docs/dev/setup.md)
+    - [compilation features](./docs/dev/compilation.md)
     - [verify-runtime-code](./docs/dev/verify-runtime-code.md)
     - [weights-benchmarking](./docs/dev/weights-benchmarking.md)
     - [upgrade-substrate](./docs/dev/upgrade-substrate.md)
diff --git a/docs/dev/compilation.md b/docs/dev/compilation.md
new file mode 100644
index 0000000000000000000000000000000000000000..e26c408be9ae7c3c7077c3e63ffe62ae72851070
--- /dev/null
+++ b/docs/dev/compilation.md
@@ -0,0 +1,26 @@
+# Compilation
+
+Duniter is compiled using the Rust compiler. For a general overview, refer to the [Rustc Dev Guide](https://rustc-dev-guide.rust-lang.org/overview.html).
+
+Substrate and Duniter provide a set of features enabling or disabling parts of the code using conditional compilation. More information on conditional compilation can be found [here](https://doc.rust-lang.org/reference/conditional-compilation.html), or by enabling or disabling compilation of packages. Below is a list of all available features:
+
+## External
+
+- **runtime-benchmarks**: Compiles the runtime with benchmarks for extrinsics benchmarking.
+- **try-runtime**: Compiles the runtime for tests and verifies operations in a simulated environment.
+- **std**: Enables the Rust standard library.
+
+## Duniter
+
+- **gdev**: Sets `gdev-runtime` and `std` used to build the development chain.
+- **gtest**: Sets `gtest-runtime` and `std` used to build the test chain.
+- **g1**: Sets `g1-runtime` and `std` used to build the production chain.
+- **constant-fees**: Uses a constant and predictable weight-to-fee conversion only for testing.
+- **embed**: Enables hardcoded live chainspecs loaded from "../specs/gtest-raw.json" file.
+- **native**: Compiles the runtime into native-platform executable only for debugging purposes.
+
+Note: By default, Duniter will be compiled using the `gdev` feature and including the compilation of the distance oracle. Since the three Duniter chains are mutually exclusive, it is mandatory to disable the default feature to compile `gtest` and `g1` as follows:
+
+- `cargo build --no-default-features --features gtest`
+- `cargo build --no-default-features --features g1`
+- `cargo build --no-default-features -p distance-oracle --features std`
diff --git a/node/Cargo.toml b/node/Cargo.toml
index fc62d177c502f1a993b1ce4021866451d795e04b..4f1958cfa1ae9af016fc9d201ef89c384d148ef8 100644
--- a/node/Cargo.toml
+++ b/node/Cargo.toml
@@ -48,6 +48,7 @@ runtime-benchmarks = [
 	"sp-runtime/runtime-benchmarks",
 ]
 try-runtime = [
+  "runtime-benchmarks",
 	"common-runtime/try-runtime",
 	"dc-distance/try-runtime",
 	"distance-oracle?/try-runtime",
diff --git a/node/src/cli.rs b/node/src/cli.rs
index effac655de2fd519c2a098967d56a53128fcc601..175ffa56a601623feb9a1ffcc87836a6576178c4 100644
--- a/node/src/cli.rs
+++ b/node/src/cli.rs
@@ -83,7 +83,7 @@ pub enum Subcommand {
 
     /// Try some command against runtime state.
     #[cfg(feature = "try-runtime")]
-    TryRuntime(try_runtime_cli::TryRuntimeCmd),
+    TryRuntime,
 
     /// Try some command against runtime state. Note: `try-runtime` feature must be enabled.
     #[cfg(not(feature = "try-runtime"))]
diff --git a/node/src/command.rs b/node/src/command.rs
index 494001e91575c66e5a3cc1106d9d0662399446a0..fa6900d93e398c6e55f30072ad3d473c655aac9f 100644
--- a/node/src/command.rs
+++ b/node/src/command.rs
@@ -20,16 +20,9 @@
 pub mod key;
 pub mod utils;
 
-#[cfg(feature = "gtest")]
-use crate::chain_spec::gtest;
 use crate::cli::{Cli, Subcommand};
-#[cfg(feature = "g1")]
-use crate::service::g1_executor::G1Executor;
-#[cfg(feature = "gdev")]
-use crate::service::gdev_executor::GDevExecutor;
-#[cfg(feature = "gtest")]
-use crate::service::gtest_executor::GTestExecutor;
-use crate::service::{IdentifyRuntimeType, RuntimeType};
+use crate::service::runtime_executor::Executor;
+use crate::service::RuntimeType;
 use crate::{chain_spec, service};
 use clap::CommandFactory;
 #[cfg(feature = "runtime-benchmarks")]
@@ -56,14 +49,7 @@ macro_rules! unwrap_client {
 		$code:expr
 	) => {
         match $client.as_ref() {
-            #[cfg(feature = "g1")]
-            crate::service::client::Client::G1($client) => $code,
-            #[cfg(feature = "gtest")]
-            crate::service::client::Client::GTest($client) => $code,
-            #[cfg(feature = "gdev")]
-            crate::service::client::Client::GDev($client) => $code,
-            #[allow(unreachable_patterns)]
-            _ => panic!("unknown runtime"),
+            crate::service::client::Client::Client($client) => $code,
         }
     };
 }
@@ -95,19 +81,20 @@ impl SubstrateCli for Cli {
 
     fn load_spec(&self, id: &str) -> Result<Box<dyn sc_service::ChainSpec>, String> {
         Ok(match id {
-            // === GDEV ===
-            // development chainspec with generated genesis and Alice validator
+            // Development chainspec with generated genesis and Alice as a validator
             #[cfg(feature = "gdev")]
             "dev" => Box::new(chain_spec::gdev::local_testnet_config(1, 3, 4)?),
-            // local testnet with g1 data, gdev configuration (parameters & smiths) and Alice validator
-            // > optionally from DUNITER_GENESIS_CONFIG file to override default gdev configuration
+
+            // Local testnet with G1 data, Gdev configuration (parameters & Smiths), and Alice as a validator.
+            // Optionally, load configuration from DUNITER_GENESIS_CONFIG file to override default Gdev configuration.
             #[cfg(feature = "gdev")]
             "gdev_dev" => Box::new(chain_spec::gdev::gdev_development_chain_spec(
                 "resources/gdev.yaml".to_string(),
             )?),
-            // chainspecs for live network with g1 data, gdev configuration (parameters & smiths)
-            // but must have a smith with declared session keys
-            // > optionally from DUNITER_GENESIS_CONFIG file to override default gdev configuration
+
+            // Chainspecs for live network with G1 data, Gdev configuration (parameters & Smiths).
+            // A Smith with declared session keys is required.
+            // Optionally load configuration from DUNITER_GENESIS_CONFIG file to override default Gdev configuration.
             #[cfg(feature = "gdev")]
             "gdev_live" => {
                 const CLIENT_SPEC: &str = "./node/specs/gdev_client-specs.yaml";
@@ -119,34 +106,33 @@ impl SubstrateCli for Cli {
                     .map_err(|e| format!("failed to read {CLIENT_SPEC} {e}"))?[..],
                 )
                 .map_err(|e| format!("failed to parse {e}"))?;
-                // rebuild chainspecs from these files
                 Box::new(chain_spec::gdev::gen_live_conf(
                     client_spec,
                     "resources/gdev.yaml".to_string(),
                 )?)
             }
-            // hardcoded previously generated raw chainspecs
-            // yields a pointlessly heavy binary because of hexadecimal-text-encoded values
+
+            // Hardcoded raw chainspecs with previously generated values, resulting in a needlessly heavy binary due to hexadecimal-text-encoded values.
             #[cfg(feature = "gdev")]
             "gdev" => Box::new(chain_spec::gdev::ChainSpec::from_json_bytes(
                 &include_bytes!("../specs/gdev-raw.json")[..],
             )?),
-            // === GTEST ===
-            // generate dev chainspecs with Alice validator
-            // provide DUNITER_GTEST_GENESIS env var if you want to build genesis from json
-            // otherwise you get a local testnet with generated genesis
+
+            // Generate development chainspecs with Alice as a validator.
+            // Provide the DUNITER_GTEST_GENESIS environment variable to build genesis from JSON; otherwise, a local testnet with generated genesis will be used.
             #[cfg(feature = "gtest")]
             "gtest_dev" => Box::new(chain_spec::gtest::development_chainspecs(
                 "resources/gtest.yaml".to_string(),
             )?),
-            // chainspecs for live network
-            // must have following files in ./node/specs folder or overwrite with env var:
+
+            // Chainspecs for the live network.
+            // Required files in the ./node/specs folder or override with environment variables:
             // - gtest.json / DUNITER_GTEST_GENESIS
             // - gtest_client-specs.json / DUNITER_GTEST_CLIENT_SPEC
             #[cfg(feature = "gtest")]
             "gtest_live" => {
                 const JSON_CLIENT_SPEC: &str = "./node/specs/gtest_client-specs.yaml";
-                let client_spec: gtest::ClientSpec = serde_yaml::from_slice(
+                let client_spec: chain_spec::gtest::ClientSpec = serde_yaml::from_slice(
                     &std::fs::read(
                         std::env::var("DUNITER_CLIENT_SPEC")
                             .unwrap_or_else(|_| JSON_CLIENT_SPEC.to_string()),
@@ -154,31 +140,27 @@ impl SubstrateCli for Cli {
                     .map_err(|e| format!("failed to read {JSON_CLIENT_SPEC} {e}"))?[..],
                 )
                 .map_err(|e| format!("failed to parse {e}"))?;
-                // rebuild chainspecs from these files
                 Box::new(chain_spec::gtest::live_chainspecs(
                     client_spec,
                     "resources/gtest.yaml".to_string(),
                 )?)
             }
-            // return hardcoded live chainspecs, only with embed feature
-            // embed client spec and genesis to avoid embeding hexadecimal runtime
-            // and having hexadecimal runtime in git history
-            // will only build on a branch that has a file
-            // ./node/specs/gtest-raw.json
+
+            // Return hardcoded live chainspecs, only with the embed feature enabled.
+            // Embed client spec and genesis to avoid embedding hexadecimal runtime
+            // and having hexadecimal runtime in the git history.
+            // This will only build on a branch that has a file named ./node/specs/gtest-raw.json.
             #[cfg(all(feature = "gtest", feature = "embed"))]
             "gtest" => Box::new(chain_spec::gtest::ChainSpec::from_json_bytes(
                 &include_bytes!("../specs/gtest-raw.json")[..],
             )?),
 
-            // === G1 ===
             #[cfg(feature = "g1")]
             "g1" => {
                 unimplemented!()
                 //Box::new(chain_spec::g1::ChainSpec::from_json_file(file_path)?)
             }
-            // Specs provided as json specify which runtime to use in their file name. For example,
-            // `g1-custom.json` uses the g1 runtime.
-            // `gdev-workshop.json` uses the gdev runtime.
+
             path => {
                 let path = std::path::PathBuf::from(path);
 
@@ -311,7 +293,7 @@ pub fn run() -> sc_cli::Result<()> {
         #[cfg(feature = "runtime-benchmarks")]
         Some(Subcommand::Benchmark(cmd)) => {
             let runner = cli.create_runner(&**cmd)?;
-            let chain_spec = &runner.config().chain_spec;
+            let _chain_spec = &runner.config().chain_spec;
 
             match &**cmd {
                 BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| {
@@ -346,30 +328,12 @@ pub fn run() -> sc_cli::Result<()> {
                 }),
                 BenchmarkCmd::Pallet(cmd) => {
                     if cfg!(feature = "runtime-benchmarks") {
-                        match chain_spec.runtime_type() {
-                            #[cfg(feature = "g1")]
-                            RuntimeType::G1 => runner.sync_run(|config| {
-                                cmd.run::<g1_runtime::Block, ExtendedHostFunctions<
-                                    sp_io::SubstrateHostFunctions,
-                                    <G1Executor as NativeExecutionDispatch>::ExtendHostFunctions,
-                                >>(config)
-                            }),
-                            #[cfg(feature = "gtest")]
-                            RuntimeType::GTest => runner.sync_run(|config| {
-                                cmd.run::<gtest_runtime::Block, ExtendedHostFunctions<
+                        runner.sync_run(|config| {
+                                cmd.run::<service::runtime_executor::runtime::Block, ExtendedHostFunctions<
                                     sp_io::SubstrateHostFunctions,
-                                    <GTestExecutor as NativeExecutionDispatch>::ExtendHostFunctions,
+                                    <Executor as NativeExecutionDispatch>::ExtendHostFunctions,
                                 >>(config)
-                            }),
-                            #[cfg(feature = "gdev")]
-                            RuntimeType::GDev => runner.sync_run(|config| {
-                                cmd.run::<gdev_runtime::Block, ExtendedHostFunctions<
-                                    sp_io::SubstrateHostFunctions,
-                                    <GDevExecutor as NativeExecutionDispatch>::ExtendHostFunctions,
-                                >>(config)
-                            }),
-                            _ => Err(sc_cli::Error::Application("unknown runtime type".into())),
-                        }
+                            })
                     } else {
                         Err("Benchmarking wasn't enabled when building the node. \
 								You can enable it with `--features runtime-benchmarks`."
@@ -392,42 +356,7 @@ pub fn run() -> sc_cli::Result<()> {
                 .into())
         }
         #[cfg(feature = "try-runtime")]
-        Some(Subcommand::TryRuntime(cmd)) => {
-            let runner = cli.create_runner(cmd)?;
-            let chain_spec = &runner.config().chain_spec;
-
-            use sc_service::TaskManager;
-            let registry = &runner
-                .config()
-                .prometheus_config
-                .as_ref()
-                .map(|cfg| &cfg.registry);
-            let task_manager = TaskManager::new(runner.config().tokio_handle.clone(), *registry)
-                .map_err(|e| {
-                    sc_cli::Error::Application(format!("Fail to create TaskManager: {}", e).into())
-                })?;
-
-            // Ensure dev spec
-            if !chain_spec.id().ends_with("dev") {
-                return Err(sc_cli::Error::Application(
-                    "try-runtime only support dev specs".into(),
-                ));
-            }
-
-            match chain_spec.runtime_type() {
-                #[cfg(feature = "gdev")]
-                RuntimeType::GDev => {
-                    //sp_core::crypto::set_default_ss58_version(Ss58AddressFormatRegistry::GDev);
-                    runner.async_run(|config| {
-                        Ok((
-                            cmd.run::<gdev_runtime::Block, GDevExecutor>(config),
-                            task_manager,
-                        ))
-                    })
-                }
-                _ => Err(sc_cli::Error::Application("unknown runtime type".into())),
-            }
-        }
+        Some(Subcommand::TryRuntime) => Err(try_runtime_cli::DEPRECATION_NOTICE.into()),
         #[cfg(not(feature = "try-runtime"))]
         Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \
 				You can enable it with `--features try-runtime`."
@@ -441,27 +370,12 @@ pub fn run() -> sc_cli::Result<()> {
                     config.offchain_worker.indexing_enabled = true;
                 }
 
-                match config.chain_spec.runtime_type() {
-                    #[cfg(feature = "g1")]
-                    RuntimeType::G1 => {
-                        service::new_full::<g1_runtime::RuntimeApi, G1Executor>(config, cli.sealing)
-                            .map_err(sc_cli::Error::Service)
-                    }
-                    #[cfg(feature = "gtest")]
-                    RuntimeType::GTest => service::new_full::<
-                        gtest_runtime::RuntimeApi,
-                        GTestExecutor,
-                    >(config, cli.sealing)
-                    .map_err(sc_cli::Error::Service),
-                    #[cfg(feature = "gdev")]
-                    RuntimeType::GDev => {
-                        service::new_full::<gdev_runtime::RuntimeApi, GDevExecutor>(
-                            config,
-                            cli.sealing,
-                        )
-                        .map_err(sc_cli::Error::Service)
-                    }
-                    _ => Err(sc_cli::Error::Application("unknown runtime".into())),
+                {
+                    service::new_full::<service::runtime_executor::runtime::RuntimeApi, Executor>(
+                        config,
+                        cli.sealing,
+                    )
+                    .map_err(sc_cli::Error::Service)
                 }
             })
         }
diff --git a/node/src/service.rs b/node/src/service.rs
index 3c08c188197c9850dc1c4a70d75d827a86e2b171..e8375a7af709738912d601dfa1cedb856728ded2 100644
--- a/node/src/service.rs
+++ b/node/src/service.rs
@@ -29,6 +29,7 @@ use sc_consensus_manual_seal::{run_manual_seal, EngineCommand, ManualSealParams}
 use sc_service::WarpSyncParams;
 use sc_service::{error::Error as ServiceError, Configuration, PartialComponents, TaskManager};
 use sc_telemetry::{Telemetry, TelemetryWorker};
+use sp_consensus_babe::inherents::InherentDataProvider;
 use sp_core::H256;
 use sp_runtime::traits::BlakeTwo256;
 use std::{sync::Arc, time::Duration};
@@ -54,91 +55,30 @@ type FullClient<RuntimeApi, Executor> =
 type FullBackend = sc_service::TFullBackend<Block>;
 type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;
 
-#[cfg(feature = "gdev")]
-pub mod gdev_executor {
+pub mod runtime_executor {
     use crate::service::HostFunctions;
-    pub use gdev_runtime;
-    use sc_executor::sp_wasm_interface::{Function, HostFunctionRegistry};
-
-    pub struct GDevExecutor;
-    impl sc_executor::NativeExecutionDispatch for GDevExecutor {
-        type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
-
-        fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-            gdev_runtime::api::dispatch(method, data)
-        }
-
-        fn native_version() -> sc_executor::NativeVersion {
-            gdev_runtime::native_version()
-        }
-    }
-    impl sc_executor::sp_wasm_interface::HostFunctions for GDevExecutor {
-        fn host_functions() -> Vec<&'static dyn Function> {
-            HostFunctions::host_functions()
-        }
-
-        fn register_static<T>(registry: &mut T) -> Result<(), T::Error>
-        where
-            T: HostFunctionRegistry,
-        {
-            HostFunctions::register_static(registry)
-        }
-    }
-}
+    #[cfg(feature = "g1")]
+    pub use g1_runtime as runtime;
+    #[cfg(feature = "gdev")]
+    pub use gdev_runtime as runtime;
+    #[cfg(feature = "gtest")]
+    pub use gtest_runtime as runtime;
 
-#[allow(dead_code)]
-#[cfg(feature = "g1")]
-pub mod g1_executor {
-    use crate::service::HostFunctions;
-    pub use g1_runtime;
     use sc_executor::sp_wasm_interface::{Function, HostFunctionRegistry};
 
-    pub struct G1Executor;
-    impl sc_executor::NativeExecutionDispatch for G1Executor {
+    pub struct Executor;
+    impl sc_executor::NativeExecutionDispatch for Executor {
         type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
 
         fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-            g1_runtime::api::dispatch(method, data)
+            runtime::api::dispatch(method, data)
         }
 
         fn native_version() -> sc_executor::NativeVersion {
-            g1_runtime::native_version()
+            runtime::native_version()
         }
     }
-    impl sc_executor::sp_wasm_interface::HostFunctions for G1Executor {
-        fn host_functions() -> Vec<&'static dyn Function> {
-            HostFunctions::host_functions()
-        }
-
-        fn register_static<T>(registry: &mut T) -> Result<(), T::Error>
-        where
-            T: HostFunctionRegistry,
-        {
-            HostFunctions::register_static(registry)
-        }
-    }
-}
-
-#[allow(dead_code)]
-#[cfg(feature = "gtest")]
-pub mod gtest_executor {
-    use crate::service::HostFunctions;
-    pub use gtest_runtime;
-    use sc_executor::sp_wasm_interface::{Function, HostFunctionRegistry};
-
-    pub struct GTestExecutor;
-    impl sc_executor::NativeExecutionDispatch for GTestExecutor {
-        type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
-
-        fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-            gtest_runtime::api::dispatch(method, data)
-        }
-
-        fn native_version() -> sc_executor::NativeVersion {
-            gtest_runtime::native_version()
-        }
-    }
-    impl sc_executor::sp_wasm_interface::HostFunctions for GTestExecutor {
+    impl sc_executor::sp_wasm_interface::HostFunctions for Executor {
         fn host_functions() -> Vec<&'static dyn Function> {
             HostFunctions::host_functions()
         }
@@ -163,27 +103,6 @@ pub enum RuntimeType {
     GTest,
 }
 
-/// Can be called for a `Configuration` to check if it is a configuration for
-/// a particular runtime type.
-pub trait IdentifyRuntimeType {
-    /// Returns the runtime type
-    fn runtime_type(&self) -> RuntimeType;
-}
-
-impl IdentifyRuntimeType for Box<dyn sc_chain_spec::ChainSpec> {
-    fn runtime_type(&self) -> RuntimeType {
-        if self.id().starts_with("g1") {
-            RuntimeType::G1
-        } else if self.id().starts_with("dev") || self.id().starts_with("gdev") {
-            RuntimeType::GDev
-        } else if self.id().starts_with("gtest") {
-            RuntimeType::GTest
-        } else {
-            panic!("unknown runtime")
-        }
-    }
-}
-
 /// Builds a new object suitable for chain operations.
 #[allow(clippy::type_complexity)]
 pub fn new_chain_ops(
@@ -198,66 +117,22 @@ pub fn new_chain_ops(
     ),
     ServiceError,
 > {
-    match config.chain_spec.runtime_type() {
-        #[cfg(feature = "g1")]
-        RuntimeType::G1::G1 => {
-            let PartialComponents {
-                client,
-                backend,
-                import_queue,
-                task_manager,
-                ..
-            } = new_partial::<g1_runtime::RuntimeApi, g1_executor::G1Executor>(
-                config,
-                manual_consensus,
-            )?;
-            Ok((
-                Arc::new(Client::G1(client)),
-                backend,
-                import_queue,
-                task_manager,
-            ))
-        }
-        #[cfg(feature = "gtest")]
-        RuntimeType::GTest => {
-            let PartialComponents {
-                client,
-                backend,
-                import_queue,
-                task_manager,
-                ..
-            } = new_partial::<gtest_runtime::RuntimeApi, gtest_executor::GTestExecutor>(
-                config,
-                manual_consensus,
-            )?;
-            Ok((
-                Arc::new(Client::GTest(client)),
-                backend,
-                import_queue,
-                task_manager,
-            ))
-        }
-        #[cfg(feature = "gdev")]
-        RuntimeType::GDev => {
-            let PartialComponents {
-                client,
-                backend,
-                import_queue,
-                task_manager,
-                ..
-            } = new_partial::<gdev_runtime::RuntimeApi, gdev_executor::GDevExecutor>(
-                config,
-                manual_consensus,
-            )?;
-            Ok((
-                Arc::new(Client::GDev(client)),
-                backend,
-                import_queue,
-                task_manager,
-            ))
-        }
-        _ => panic!("unknown runtime"),
-    }
+    let PartialComponents {
+        client,
+        backend,
+        import_queue,
+        task_manager,
+        ..
+    } = new_partial::<runtime_executor::runtime::RuntimeApi, runtime_executor::Executor>(
+        config,
+        manual_consensus,
+    )?;
+    Ok((
+        Arc::new(Client::Client(client)),
+        backend,
+        import_queue,
+        task_manager,
+    ))
 }
 
 type FullGrandpaBlockImport<RuntimeApi, Executor> = sc_consensus_grandpa::GrandpaBlockImport<
@@ -382,11 +257,10 @@ where
                 create_inherent_data_providers: move |_, ()| async move {
                     let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
 
-                    let slot =
-				sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration(
-					*timestamp,
-					slot_duration,
-				);
+                    let slot = InherentDataProvider::from_timestamp_and_slot_duration(
+                        *timestamp,
+                        slot_duration,
+                    );
 
                     Ok((slot, timestamp))
                 },
@@ -603,7 +477,7 @@ where
                                     client.clone(),
                                 )
                                 .map_err(|err| format!("{:?}", err))?;
-                            let babe = sp_consensus_babe::inherents::InherentDataProvider::new(
+                            let babe = InherentDataProvider::new(
                                 timestamp.slot(),
                             );
                             let distance =
@@ -643,11 +517,10 @@ where
                     async move {
                         let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
 
-                        let slot =
-						sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration(
-							*timestamp,
-							slot_duration,
-						);
+                        let slot = InherentDataProvider::from_timestamp_and_slot_duration(
+                            *timestamp,
+                            slot_duration,
+                        );
 
                         let storage_proof =
                             sp_transaction_storage_proof::registration::new_data_provider(
diff --git a/node/src/service/client.rs b/node/src/service/client.rs
index cad8ce1d679a92cfef21b17774c69d6832294d99..d9019c6825fe9e406a963dd4a244c9f509b8ca54 100644
--- a/node/src/service/client.rs
+++ b/node/src/service/client.rs
@@ -145,12 +145,14 @@ impl<Api> RuntimeApiCollection for Api where
 /// A client instance.
 #[derive(Clone)]
 pub enum Client {
-    #[cfg(feature = "g1")]
-    G1(Arc<super::FullClient<g1_runtime::RuntimeApi, super::g1_executor::G1Executor>>),
-    #[cfg(feature = "gtest")]
-    GTest(Arc<super::FullClient<gtest_runtime::RuntimeApi, super::gtest_executor::GTestExecutor>>),
-    #[cfg(feature = "gdev")]
-    GDev(Arc<super::FullClient<gdev_runtime::RuntimeApi, super::gdev_executor::GDevExecutor>>),
+    Client(
+        Arc<
+            super::FullClient<
+                super::runtime_executor::runtime::RuntimeApi,
+                super::runtime_executor::Executor,
+            >,
+        >,
+    ),
 }
 
 macro_rules! with_client {
@@ -162,22 +164,8 @@ macro_rules! with_client {
         }
     } => {
         match $self {
-            #[cfg(feature = "g1")]
-            Self::G1($client) => {
-                #[allow(unused_imports)]
-                use g1_runtime as runtime;
-                $( $code )*
-            }
-            #[cfg(feature = "gtest")]
-            Self::GTest($client) => {
-                #[allow(unused_imports)]
-                use gtest_runtime as runtime;
-                $( $code )*
-            }
-            #[cfg(feature = "gdev")]
-            Self::GDev($client) => {
+            Self::Client($client) => {
                 #[allow(unused_imports)]
-                use gdev_runtime as runtime;
                 $( $code )*
             }
         }
@@ -196,52 +184,32 @@ impl ClientHandle for Client {
     }
 }
 
-#[cfg(feature = "g1")]
-impl From<Arc<super::FullClient<g1_runtime::RuntimeApi, super::g1_executor::G1Executor>>>
-    for Client
-{
-    fn from(
-        client: Arc<super::FullClient<g1_runtime::RuntimeApi, super::g1_executor::G1Executor>>,
-    ) -> Self {
-        Self::G1(client)
-    }
-}
-
-#[cfg(feature = "gtest")]
-impl From<Arc<super::FullClient<gtest_runtime::RuntimeApi, super::gtest_executor::GTestExecutor>>>
-    for Client
-{
-    fn from(
-        client: Arc<
-            super::FullClient<gtest_runtime::RuntimeApi, super::gtest_executor::GTestExecutor>,
+impl
+    From<
+        Arc<
+            super::FullClient<
+                super::runtime_executor::runtime::RuntimeApi,
+                super::runtime_executor::Executor,
+            >,
         >,
-    ) -> Self {
-        Self::GTest(client)
-    }
-}
-
-#[cfg(feature = "gdev")]
-impl From<Arc<super::FullClient<gdev_runtime::RuntimeApi, super::gdev_executor::GDevExecutor>>>
-    for Client
+    > for Client
 {
     fn from(
         client: Arc<
-            super::FullClient<gdev_runtime::RuntimeApi, super::gdev_executor::GDevExecutor>,
+            super::FullClient<
+                super::runtime_executor::runtime::RuntimeApi,
+                super::runtime_executor::Executor,
+            >,
         >,
     ) -> Self {
-        Self::GDev(client)
+        Self::Client(client)
     }
 }
 
 macro_rules! match_client {
     ($self:ident, $method:ident($($param:ident),*)) => {
         match $self {
-            #[cfg(feature = "g1")]
-            Self::G1(client) => client.$method($($param),*),
-            #[cfg(feature = "gtest")]
-            Self::GTest(client) => client.$method($($param),*),
-            #[cfg(feature = "gdev")]
-            Self::GDev(client) => client.$method($($param),*),
+            Self::Client(client) => client.$method($($param),*),
         }
     };
 }
@@ -326,23 +294,28 @@ trait BenchmarkCallSigner<RuntimeCall: Encode + Clone, Signer: Pair> {
 }
 
 #[cfg(feature = "g1")]
-use g1_runtime as runtime;
-#[cfg(feature = "g1")]
-type FullClient = super::FullClient<runtime::RuntimeApi, super::g1_executor::G1Executor>;
-#[cfg(feature = "gdev")]
-use gdev_runtime as runtime;
+type FullClient = super::FullClient<
+    super::runtime_executor::runtime::RuntimeApi,
+    super::runtime_executor::Executor,
+>;
 #[cfg(feature = "gdev")]
-type FullClient = super::FullClient<runtime::RuntimeApi, super::gdev_executor::GDevExecutor>;
+type FullClient = super::FullClient<
+    super::runtime_executor::runtime::RuntimeApi,
+    super::runtime_executor::Executor,
+>;
 #[cfg(feature = "gtest")]
-use gtest_runtime as runtime;
-#[cfg(feature = "gtest")]
-type FullClient = super::FullClient<runtime::RuntimeApi, super::gtest_executor::GTestExecutor>;
-
-#[cfg(any(feature = "gdev", feature = "gtest"))]
-impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullClient {
+type FullClient = super::FullClient<
+    super::runtime_executor::runtime::RuntimeApi,
+    super::runtime_executor::Executor,
+>;
+
+#[cfg(any(feature = "gdev", feature = "gtest", feature = "g1"))]
+impl BenchmarkCallSigner<super::runtime_executor::runtime::RuntimeCall, sp_core::sr25519::Pair>
+    for FullClient
+{
     fn sign_call(
         &self,
-        call: runtime::RuntimeCall,
+        call: super::runtime_executor::runtime::RuntimeCall,
         nonce: u32,
         current_block: u64,
         period: u64,
@@ -351,17 +324,20 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC
     ) -> sp_runtime::OpaqueExtrinsic {
         // use runtime;
 
-        let extra: runtime::SignedExtra = (
-            frame_system::CheckNonZeroSender::<runtime::Runtime>::new(),
-            frame_system::CheckSpecVersion::<runtime::Runtime>::new(),
-            frame_system::CheckTxVersion::<runtime::Runtime>::new(),
-            frame_system::CheckGenesis::<runtime::Runtime>::new(),
-            frame_system::CheckMortality::<runtime::Runtime>::from(
+        let extra: super::runtime_executor::runtime::SignedExtra = (
+            frame_system::CheckNonZeroSender::<super::runtime_executor::runtime::Runtime>::new(),
+            frame_system::CheckSpecVersion::<super::runtime_executor::runtime::Runtime>::new(),
+            frame_system::CheckTxVersion::<super::runtime_executor::runtime::Runtime>::new(),
+            frame_system::CheckGenesis::<super::runtime_executor::runtime::Runtime>::new(),
+            frame_system::CheckMortality::<super::runtime_executor::runtime::Runtime>::from(
                 sp_runtime::generic::Era::mortal(period, current_block),
             ),
-            frame_system::CheckNonce::<runtime::Runtime>::from(nonce).into(),
-            frame_system::CheckWeight::<runtime::Runtime>::new(),
-            pallet_transaction_payment::ChargeTransactionPayment::<runtime::Runtime>::from(0),
+            frame_system::CheckNonce::<super::runtime_executor::runtime::Runtime>::from(nonce)
+                .into(),
+            frame_system::CheckWeight::<super::runtime_executor::runtime::Runtime>::new(),
+            pallet_transaction_payment::ChargeTransactionPayment::<
+                super::runtime_executor::runtime::Runtime,
+            >::from(0),
         );
 
         let payload = sp_runtime::generic::SignedPayload::from_raw(
@@ -369,8 +345,8 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC
             extra.clone(),
             (
                 (),
-                runtime::VERSION.spec_version,
-                runtime::VERSION.transaction_version,
+                super::runtime_executor::runtime::VERSION.spec_version,
+                super::runtime_executor::runtime::VERSION.transaction_version,
                 genesis,
                 genesis,
                 (),
@@ -380,7 +356,7 @@ impl BenchmarkCallSigner<runtime::RuntimeCall, sp_core::sr25519::Pair> for FullC
         );
 
         let signature = payload.using_encoded(|p| acc.sign(p));
-        runtime::UncheckedExtrinsic::new_signed(
+        super::runtime_executor::runtime::UncheckedExtrinsic::new_signed(
             call,
             sp_runtime::AccountId32::from(acc.public()).into(),
             common_runtime::Signature::Sr25519(signature),
@@ -402,10 +378,10 @@ impl frame_benchmarking_cli::ExtrinsicBuilder for Client {
     fn build(&self, nonce: u32) -> std::result::Result<sp_runtime::OpaqueExtrinsic, &'static str> {
         with_client! {
             self, client, {
-                let call = runtime::RuntimeCall::System(runtime::SystemCall::remark { remark: vec![] });
+                let call = super::runtime_executor::runtime::RuntimeCall::System(super::runtime_executor::runtime::SystemCall::remark { remark: vec![] });
                 let signer = sp_keyring::Sr25519Keyring::Bob.pair();
 
-                let period = runtime::BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64;
+                let period = super::runtime_executor::runtime::BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64;
                 let genesis = client.usage_info().chain.best_hash;
 
                 Ok(client.sign_call(call, nonce, 0, period, genesis, signer))
diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml
index aafe5a6b14de465e42a911f8c36b4ef844a6c9ed..a204abf7b207843103bd8fa7ca9b6bd1d1bb6983 100644
--- a/runtime/common/Cargo.toml
+++ b/runtime/common/Cargo.toml
@@ -55,6 +55,7 @@ std = [
 	"frame-support/std",
 	"frame-system-benchmarking?/std",
 	"frame-system/std",
+	"frame-try-runtime/std",
 	"pallet-authority-members/std",
 	"pallet-babe/std",
 	"pallet-balances/std",
@@ -98,6 +99,7 @@ try-runtime = [
 	"duniter-primitives/try-runtime",
 	"frame-support/try-runtime",
 	"frame-system/try-runtime",
+	"frame-try-runtime/try-runtime",
 	"pallet-authority-members/try-runtime",
 	"pallet-babe/try-runtime",
 	"pallet-balances/try-runtime",
@@ -137,6 +139,7 @@ frame-benchmarking = { workspace = true }
 frame-support = { workspace = true }
 frame-system = { workspace = true }
 frame-system-benchmarking = { workspace = true, optional = true }
+frame-try-runtime = { workspace = true, optional = true }
 pallet-authority-members = { workspace = true }
 pallet-babe = { workspace = true }
 pallet-balances = { workspace = true }
diff --git a/runtime/common/src/apis.rs b/runtime/common/src/apis.rs
index af95e113f640d2a2318d6f464d20722c1b760f63..e654b92494695406deb993d44962350b59a62c3f 100644
--- a/runtime/common/src/apis.rs
+++ b/runtime/common/src/apis.rs
@@ -231,23 +231,19 @@ macro_rules! runtime_apis {
 	}
 
             #[cfg(feature = "try-runtime")]
-            impl frame_try_runtime::TryRuntime<Block> for Runtime where <Runtime as frame_system::Config>::BlockNumber: Clone + sp_std::fmt::Debug + sp_runtime::traits::AtLeast32BitUnsigned {
-                fn on_runtime_upgrade() -> (Weight, Weight) {
-                    log::info!("try-runtime::on_runtime_upgrade.");
-                    todo!()
-                    // TODO solve the problem to uncomment this:
-                    //let weight = Executive::try_runtime_upgrade().unwrap();
-                    //(weight, BlockWeights::get().max_block)
+            impl frame_try_runtime::TryRuntime<Block> for Runtime {
+                fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) {
+                    let weight = Executive::try_runtime_upgrade(checks).unwrap();
+					(weight, BlockWeights::get().max_block)
                 }
 
                 fn execute_block(
                     block: Block,
                     state_root_check: bool,
+					signature_check: bool,
                     select: frame_try_runtime::TryStateSelect,
                 ) -> Weight {
-                    todo!()
-                    // TODO solve the problem to uncomment this:
-                    //Executive::try_execute_block(block, state_root_check, select).expect("try_execute_block failed")
+                    Executive::try_execute_block(block, state_root_check, signature_check, select).expect("execute-block failed")
                 }
             }
 
diff --git a/runtime/g1/Cargo.toml b/runtime/g1/Cargo.toml
index 76c98358b332ebbdd5e5289daf76d18bf2a39775..94b683b12f8e9a7c3dbffafd51f120e85c0314d0 100644
--- a/runtime/g1/Cargo.toml
+++ b/runtime/g1/Cargo.toml
@@ -60,6 +60,7 @@ std = [
 	"frame-system-benchmarking/std",
 	"frame-system-rpc-runtime-api/std",
 	"frame-system/std",
+	"frame-try-runtime/std",
 	"log/std",
 	"node-primitives/std",
 	"pallet-atomic-swap/std",
@@ -124,6 +125,7 @@ try-runtime = [
 	"frame-executive/try-runtime",
 	"frame-support/try-runtime",
 	"frame-system/try-runtime",
+	"frame-try-runtime/try-runtime",
 	"pallet-atomic-swap/try-runtime",
 	"pallet-authority-discovery/try-runtime",
 	"pallet-authority-members/try-runtime",
@@ -178,6 +180,7 @@ frame-benchmarking = { workspace = true }
 frame-system-benchmarking = { workspace = true }
 frame-system = { workspace = true }
 frame-system-rpc-runtime-api = { workspace = true }
+frame-try-runtime = { workspace = true, optional = true }
 hex-literal = { workspace = true, optional = true }
 log = { workspace = true }
 pallet-atomic-swap = { workspace = true }
diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs
index 64b716370645ae389873c616ceaecb720be7f6de..3ce455b521947adc07bc9f9370f9abadb5bf0d20 100644
--- a/runtime/g1/src/lib.rs
+++ b/runtime/g1/src/lib.rs
@@ -33,6 +33,7 @@ pub use common_runtime::{
     constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber,
     FullIdentificationOfImpl, GetCurrentEpochIndex, Hash, Header, IdtyIndex, Index, Signature,
 };
+pub use frame_system::Call as SystemCall;
 pub use pallet_balances::Call as BalancesCall;
 pub use pallet_identity::{IdtyStatus, IdtyValue};
 pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
diff --git a/runtime/gdev/Cargo.toml b/runtime/gdev/Cargo.toml
index ef804b7e94e0c75568108ba79655475c39aa64ea..76c167816194255171006124e51020cbf00b2d56 100644
--- a/runtime/gdev/Cargo.toml
+++ b/runtime/gdev/Cargo.toml
@@ -60,6 +60,7 @@ std = [
 	"frame-system-benchmarking/std",
 	"frame-system-rpc-runtime-api/std",
 	"frame-system/std",
+	"frame-try-runtime/std",
 	"log/std",
 	"node-primitives/std",
 	"pallet-atomic-swap/std",
@@ -126,6 +127,7 @@ try-runtime = [
 	"frame-executive/try-runtime",
 	"frame-support/try-runtime",
 	"frame-system/try-runtime",
+	"frame-try-runtime/try-runtime",
 	"pallet-atomic-swap/try-runtime",
 	"pallet-authority-discovery/try-runtime",
 	"pallet-authority-members/try-runtime",
@@ -182,6 +184,7 @@ frame-support = { workspace = true }
 frame-system = { workspace = true }
 frame-system-benchmarking = { workspace = true, optional = true }
 frame-system-rpc-runtime-api = { workspace = true }
+frame-try-runtime = { workspace = true, optional = true }
 hex-literal = { workspace = true, optional = true }
 log = { workspace = true }
 node-primitives = { workspace = true }
diff --git a/runtime/gtest/Cargo.toml b/runtime/gtest/Cargo.toml
index 2b7cbbcc1edcc490efac4a91f96e4d980a7d180d..3e14eae2708c8c29770c63a430375dd5dc76b1f4 100644
--- a/runtime/gtest/Cargo.toml
+++ b/runtime/gtest/Cargo.toml
@@ -59,7 +59,7 @@ std = [
 	"frame-system-benchmarking/std",
 	"frame-system-rpc-runtime-api/std",
 	"frame-system/std",
-	"frame-try-runtime?/std",
+	"frame-try-runtime/std",
 	"log/std",
 	"node-primitives/std",
 	"pallet-atomic-swap/std",
@@ -124,7 +124,7 @@ try-runtime = [
 	"frame-executive/try-runtime",
 	"frame-support/try-runtime",
 	"frame-system/try-runtime",
-	"frame-try-runtime?/try-runtime",
+	"frame-try-runtime/try-runtime",
 	"pallet-atomic-swap/try-runtime",
 	"pallet-authority-discovery/try-runtime",
 	"pallet-authority-members/try-runtime",