diff --git a/core/lib.rs b/core/lib.rs
index 9f46712eec87d3a2cc0820aeaaac14559dec2d6d..423c836ad6675992d0bacea035d589b8dc28fa82 100644
--- a/core/lib.rs
+++ b/core/lib.rs
@@ -69,6 +69,91 @@ use threadpool::ThreadPool;
 /// Number of thread in plugins ThreadPool
 pub static THREAD_POOL_SIZE: &'static usize = &2;
 
+#[macro_export]
+macro_rules! durs_core_server {
+    ( $closure_inject_cli:expr, $closure_plug:expr ) => {{
+        duniter_core::main(
+            env!("CARGO_PKG_NAME"),
+            env!("CARGO_PKG_VERSION"),
+            &DursOpt::clap(),
+            $closure_inject_cli,
+            $closure_plug,
+        );
+    }};
+}
+
+#[macro_export]
+macro_rules! durs_inject_cli {
+    ( $( $Module:ty ),* ) => {
+        {
+            |core| {
+                $(core.inject_cli_subcommand::<$Module>();)*
+            }
+        }
+    };
+}
+
+#[macro_export]
+macro_rules! durs_plug {
+    ( [ $( $NetworkModule:ty ),* ], [ $( $Module:ty ),* ] ) => {
+        {
+            |core| {
+                $(core.plug::<$Module>();)*
+                $(core.plug_network::<$NetworkModule>();)*
+            }
+        }
+    };
+}
+/*
+macro_rules! o_O {
+    (
+        $(
+            $x:expr; [ $( $y:expr ),* ]
+        );*
+    ) => {
+        &[ $($( $x + $y ),*),* ]
+    }
+}
+
+
+macro_rules! vec {
+    ( $( $x:expr ),* ) => {
+        {
+            let mut temp_vec = Vec::new();
+            $(
+                temp_vec.push($x);
+            )*
+            temp_vec
+        }
+    };
+}*/
+
+/// Durs main function
+pub fn main<'b, 'a: 'b, CliFunc, PlugFunc>(
+    soft_name: &'static str,
+    soft_version: &'static str,
+    clap_app: &'a App<'b, 'a>,
+    mut inject_modules_subcommands: CliFunc,
+    mut plug_modules: PlugFunc,
+) where
+    'b: 'a,
+    CliFunc: FnMut(&mut DuniterCore<'a, 'b, DuRsConf>) -> (),
+    PlugFunc: FnMut(&mut DuniterCore<'a, 'b, DuRsConf>) -> (),
+{
+    // Instantiate duniter core
+    let mut duniter_core = DuniterCore::<DuRsConf>::new(soft_name, soft_version, clap_app, 0);
+
+    // Inject modules subcommands
+    inject_modules_subcommands(&mut duniter_core);
+
+    // Match user command
+    if duniter_core.match_user_command() {
+        // Plug all plugins
+        plug_modules(&mut duniter_core);
+        duniter_core.start_core();
+    }
+}
+
 #[derive(Debug, Clone)]
 /// User command
 pub enum UserCommand {
@@ -149,6 +234,11 @@ impl<'a, 'b: 'a> DuniterCore<'b, 'a, DuRsConf> {
             thread_pool: ThreadPool::new(*THREAD_POOL_SIZE),
         }
     }
+    /// Inject cli subcommand
+    pub fn inject_cli_subcommand<M: DuniterModule<DuRsConf, DursMsg>>(&mut self) {
+        //self.cli_conf = TupleApp(&self.cli_conf.0.clone().subcommand(M::ModuleOpt::clap()));
+        self.plugins_cli_conf.push(M::ModuleOpt::clap());
+    }
     /// Execute user command
     pub fn match_user_command(&mut self) -> bool {
         self.match_specialize_user_command(vec![], None, vec![])
@@ -446,19 +536,13 @@ impl<'a, 'b: 'a> DuniterCore<'b, 'a, DuRsConf> {
         }
     }
 
-    /// Inject cli subcommand
-    pub fn inject_cli_subcommand<M: DuniterModule<DuRsConf, DursMsg>>(&mut self) {
-        //self.cli_conf = TupleApp(&self.cli_conf.0.clone().subcommand(M::ModuleOpt::clap()));
-        self.plugins_cli_conf.push(M::ModuleOpt::clap());
-    }
-
     /// Plug a module
     pub fn plug<M: DuniterModule<DuRsConf, DursMsg>>(&mut self) {
         self.plug_::<M>(false);
     }
 
     /// Plug a module
-    fn plug_<M: DuniterModule<DuRsConf, DursMsg>>(&mut self, is_network_module: bool) {
+    pub fn plug_<M: DuniterModule<DuRsConf, DursMsg>>(&mut self, is_network_module: bool) {
         let enabled = enabled::<DuRsConf, DursMsg, M>(&self.soft_meta_datas.conf);
         if enabled {
             if let Some(UserCommand::Start()) = self.user_command {
diff --git a/src/main.rs b/src/main.rs
index 14bb6220dfe44e2388defddf5221acae6e052b93..0ef666e3306801eb8c037a5ad749443cbc36cf6e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -28,7 +28,9 @@
     unused_qualifications
 )]
 
+#[macro_use]
 extern crate duniter_core;
+
 #[cfg(unix)]
 extern crate duniter_tui;
 extern crate durs_ws2p_v1_legacy;
@@ -46,84 +48,20 @@ use structopt::StructOpt;
 #[cfg(unix)]
 #[cfg(not(target_arch = "arm"))]
 fn main() {
-    // Get software name and version
-    let soft_name = env!("CARGO_PKG_NAME");
-    let soft_version = env!("CARGO_PKG_VERSION");
-
-    // Instantiate duniter core
-    let clap_app = DursOpt::clap();
-    let mut duniter_core = DuniterCore::<DuRsConf>::new(soft_name, soft_version, &clap_app, 0);
-
-    // Inject plugins subcommands
-    //duniter_core.inject_cli_subcommand::<GvaModule>();
-    duniter_core.inject_cli_subcommand::<TuiModule>();
-    duniter_core.inject_cli_subcommand::<WS2PModule>();
-
-    // Match user command
-    if duniter_core.match_user_command() {
-        // Plug all plugins
-        //duniter_core.plug::<GuiModule>();
-        //duniter_core.plug::<GvaModule>();
-        //duniter_core.plug::<PoolModule>();
-        //duniter_core.plug::<PowModule>();
-        duniter_core.plug::<TuiModule>();
-        duniter_core.plug_network::<WS2PModule>();
-        duniter_core.start_core();
-    }
+    durs_core_server!(
+        durs_inject_cli![WS2PModule, TuiModule /*,DasaModule*/],
+        durs_plug!([WS2PModule], [TuiModule /*,DasaModule*/])
+    );
 }
 #[cfg(unix)]
 #[cfg(target_arch = "arm")]
 fn main() {
-    // Get software name and version
-    let soft_name = env!("CARGO_PKG_NAME");
-    let soft_version = env!("CARGO_PKG_VERSION");
-
-    // Instantiate duniter core
-    let clap_app = DursOpt::clap();
-    let mut duniter_core = DuniterCore::<DuRsConf>::new(soft_name, soft_version, &clap_app, 0);
-
-    // Inject plugins subcommands
-    //duniter_core.inject_cli_subcommand::<DasaModule>();
-    //duniter_core.inject_cli_subcommand::<GvaModule>();
-    duniter_core.inject_cli_subcommand::<TuiModule>();
-    duniter_core.inject_cli_subcommand::<WS2PModule>();
-
-    // Match user command
-    if duniter_core.match_user_command() {
-        // Plug all plugins
-        //duniter_core.plug::<DasaModule>();
-        //duniter_core.plug::<GuiModule>();
-        //duniter_core.plug::<GvaModule>();
-        //duniter_core.plug::<PoolModule>();
-        //duniter_core.plug::<PowModule>();
-        duniter_core.plug::<TuiModule>();
-        duniter_core.plug_network::<WS2PModule>();
-        duniter_core.start_core();
-    }
+    durs_core_server!(
+        durs_inject_cli![WS2PModule, TuiModule],
+        durs_plug!([WS2PModule], [TuiModule])
+    );
 }
 #[cfg(windows)]
 fn main() {
-    // Get software name and version
-    let soft_name = env!("CARGO_PKG_NAME");
-    let soft_version = env!("CARGO_PKG_VERSION");
-
-    // Instantiate duniter core
-    let clap_app = DursOpt::clap();
-    let mut duniter_core = DuniterCore::<DuRsConf>::new(soft_name, soft_version, &clap_app, 0);
-
-    // Inject plugins subcommands
-    //duniter_core.inject_cli_subcommand::<GvaModule>();
-    duniter_core.inject_cli_subcommand::<WS2PModule>();
-
-    // Match user command
-    if duniter_core.match_user_command() {
-        // Plug all plugins
-        //duniter_core.plug::<DasaModule>();
-        //duniter_core.plug::<GuiModule>();
-        //duniter_core.plug::<GvaModule>();
-        //duniter_core.plug::<PoolModule>();
-        //duniter_core.plug::<PowModule>();
-        duniter_core.plug_network::<WS2PModule>();
-        duniter_core.start_core();
-    }
+    durs_core_server!(durs_inject_cli![WS2PModule], durs_plug!([WS2PModule], []));
 }