diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs
index 2b64346bdf1fb4c665fa0bd33fc88d7c7e77fcc3..65124194a8b78d2f365673149552cf5958c94bc9 100644
--- a/src/cmd/mod.rs
+++ b/src/cmd/mod.rs
@@ -2,25 +2,26 @@ pub mod acl;
 pub mod package;
 
 use log::error;
-use std::{process::abort, string::String};
+use std::{process::abort, string::String, sync::Arc};
 
 #[allow(dead_code)]
+#[derive(Clone)]
 enum CmdHandler {
-    Simple(Box<dyn Fn(Vec<String>) -> bool>),
-    Echo(Box<dyn Fn(Vec<String>) -> String>),
-    MultiEcho(Box<dyn Fn(Vec<String>) -> Vec<String>>),
+    Simple(Arc<dyn Fn(Vec<String>) -> bool>),
+    Echo(Arc<dyn Fn(Vec<String>) -> String>),
+    MultiEcho(Arc<dyn Fn(Vec<String>) -> Vec<String>>),
 }
 
 #[allow(dead_code)]
+#[derive(Clone)]
 pub struct Cmd {
     name: String,
     argc: u32,
     handler: CmdHandler,
 }
 
-// unsafe impl Sync for CmdHandler {}
 unsafe impl Sync for Cmd {}
-// unsafe impl Send for Cmd {}
+unsafe impl Send for Cmd {}
 
 impl Cmd {
     #[allow(dead_code)]
@@ -51,7 +52,7 @@ impl Cmd {
     }
 
     #[allow(dead_code)]
-    pub fn new_simple(name: String, argc: u32, f: Box<dyn Fn(Vec<String>) -> bool>) -> Cmd {
+    pub fn new_simple(name: String, argc: u32, f: Arc<dyn Fn(Vec<String>) -> bool>) -> Cmd {
         Cmd {
             name: name,
             argc: argc,
@@ -60,7 +61,7 @@ impl Cmd {
     }
 
     #[allow(dead_code)]
-    pub fn new_echo(name: String, argc: u32, f: Box<dyn Fn(Vec<String>) -> String>) -> Cmd {
+    pub fn new_echo(name: String, argc: u32, f: Arc<dyn Fn(Vec<String>) -> String>) -> Cmd {
         Cmd {
             name: name,
             argc: argc,
@@ -72,7 +73,7 @@ impl Cmd {
     pub fn new_multi_echo(
         name: String,
         argc: u32,
-        f: Box<dyn Fn(Vec<String>) -> Vec<String>>,
+        f: Arc<dyn Fn(Vec<String>) -> Vec<String>>,
     ) -> Cmd {
         Cmd {
             name: name,
diff --git a/src/cmd/package.rs b/src/cmd/package.rs
index c12c05686cd8404158b46f0469afbc43a714191e..a66d2d6fb30947ee175f604d66f2ab1f2df07725 100644
--- a/src/cmd/package.rs
+++ b/src/cmd/package.rs
@@ -6,6 +6,7 @@ use ini::Properties as IniSection;
 use matrix_sdk::{room::Joined as JoinedRoom, ruma::UserId};
 use std::{convert::TryFrom, fmt};
 
+#[derive(Clone)]
 pub struct CmdPackage {
     name: String,
     acl: CmdAcl,
diff --git a/src/main.rs b/src/main.rs
index fbc01ae08e13b9dac9c1a0e1b2b9fd495ed16156..6d6be28c79dc41dc6ea7fb24633546781932d427 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,5 @@
+#![feature(clone_closures)]
+
 mod cmd;
 mod config;
 mod matrix;
diff --git a/src/matrix.rs b/src/matrix.rs
index 02c18575c6882a007994e88c0700b3d4371e8464..84d27f19955cda13b56dcbded3703b84f63a49ad 100644
--- a/src/matrix.rs
+++ b/src/matrix.rs
@@ -16,7 +16,7 @@ use matrix_sdk::{
     },
     Client, Result, SyncSettings,
 };
-use std::{convert::TryFrom, process::abort};
+use std::{convert::TryFrom, process::abort, sync::Arc};
 use tokio::time::{sleep, Duration};
 
 async fn join_room(room: &Invited) {
@@ -82,17 +82,16 @@ async fn startup_and_log_rooms(client: &Client) {
 
 pub async fn connect_and_handle(config: Config) -> Result<()> {
     // TODO: Refactor
-    let username_copy = config.user_name.clone();
     let pkg_commands_vec = vec![
-        Cmd::new_simple(format!("ping"), 0, Box::new(|_x| true)),
+        Cmd::new_simple(format!("ping"), 0, Arc::new(|_x| true)),
         Cmd::new_echo(
             format!("bot_name"),
             0,
-            Box::new(move |_x| username_copy.clone()),
+            Arc::new(move |_x| format!("toto")),
         ),
     ];
     let pkg = match config.section("basic") {
-        Some(section) => Box::new(CmdPackage::from_config(&section, pkg_commands_vec)),
+        Some(section) => CmdPackage::from_config(&section, pkg_commands_vec),
         None => {
             abort();
         }
@@ -123,7 +122,7 @@ pub async fn connect_and_handle(config: Config) -> Result<()> {
 
     client
         .register_event_handler(
-            |ev: SyncMessageEvent<MessageEventContent>,
+            move |ev: SyncMessageEvent<MessageEventContent>,
                   room: Room,
                   _encryption_info: Option<EncryptionInfo>| async {
                 let sender_id = ev.sender;
@@ -145,7 +144,7 @@ pub async fn connect_and_handle(config: Config) -> Result<()> {
                         if body.starts_with("%") {
                             info!("Got message from {sender_id} in {room_id} a.k.a. {room_name}");
                             let args = vec![];
-                            let ret = &pkg.handle(&joined, &sender_id, args);
+                            let locked_pkg = pkg.handle(&joined, &sender_id, args);
                         }
                     }
                 }