diff --git a/src/cmd/acl.rs b/src/cmd/acl.rs
index 49aa25c25c52095276c9391b3d42645fb8b5a789..dee722842ce30a35aed69b346967350111c6df00 100644
--- a/src/cmd/acl.rs
+++ b/src/cmd/acl.rs
@@ -36,35 +36,47 @@ impl CmdAdminRegister {
             None => return Err("Is not an admin".to_string()),
         }
     }
+
+    #[allow(dead_code)]
+    pub fn from_vec(admins_vec: Vec<UserId>) -> CmdAdminRegister {
+        CmdAdminRegister { admins: admins_vec }
+    }
 }
 
-#[allow(dead_code)]
-pub fn action_permited(
-    cmd_admin_register: &CmdAdminRegister,
-    acls: &CmdAcl,
-    room: &Room,
-    user_id: &UserId,
-) -> Result<(), String> {
-    return match acls {
-        CmdAcl::AdminOnly => bool_to_result!(
-            cmd_admin_register.is_admin(user_id.clone()),
-            (),
-            "Is not an admin".to_string()
-        ),
-        CmdAcl::RoomOnly(room_id) => bool_to_result!(
-            room.room_id() == room_id,
-            (),
-            "Not permited in this room".to_string()
-        ),
-        CmdAcl::List(acl_list) => match acl_list
-            .iter()
-            .map(|acl| action_permited(cmd_admin_register, acl, room, user_id))
-            .filter(|acl_res| acl_res.is_err())
-            .map(|acl_res| acl_res.clone().unwrap_err())
-            .reduce(|err1, err2| err1 + ", " + &err2)
-        {
-            Some(err) => Err(err),
-            None => Ok(()),
-        },
-    };
+impl CmdAcl {
+    #[allow(dead_code)]
+    pub fn action_permited(
+        cmd_admin_register: &CmdAdminRegister,
+        acls: &CmdAcl,
+        room: &Room,
+        user_id: &UserId,
+    ) -> Result<(), String> {
+        return match acls {
+            CmdAcl::AdminOnly => bool_to_result!(
+                cmd_admin_register.is_admin(user_id.clone()),
+                (),
+                "Is not an admin".to_string()
+            ),
+            CmdAcl::RoomOnly(room_id) => bool_to_result!(
+                room.room_id() == room_id,
+                (),
+                "Not permited in this room".to_string()
+            ),
+            CmdAcl::List(acl_list) => match acl_list
+                .iter()
+                .map(|acl| CmdAcl::action_permited(cmd_admin_register, acl, room, user_id))
+                .filter(|acl_res| acl_res.is_err())
+                .map(|acl_res| acl_res.clone().unwrap_err())
+                .reduce(|err1, err2| err1 + ", " + &err2)
+            {
+                Some(err) => Err(err),
+                None => Ok(()),
+            },
+        };
+    }
+
+    #[allow(dead_code)]
+    pub fn from_string(string: String) -> CmdAcl {
+        CmdAcl::AdminOnly
+    }
 }
diff --git a/src/cmd/package.rs b/src/cmd/package.rs
index 2f2b1cde32917b2d06b1ad7c524ef32928a4b6f2..cbb5115a70d61fbe29e50b03439a1838976c83d5 100644
--- a/src/cmd/package.rs
+++ b/src/cmd/package.rs
@@ -1,9 +1,11 @@
 use crate::cmd::{
-    acl::{action_permited, CmdAcl, CmdAdminRegister},
+    acl::{CmdAcl, CmdAdminRegister},
     cmd::Cmd,
 };
+use ini::Properties as IniSection;
 use log::{error, info, warn};
 use matrix_sdk::{room::Room, ruma::UserId};
+use std::convert::TryFrom;
 
 pub struct CmdPackage {
     name: String,
@@ -16,7 +18,7 @@ pub struct CmdPackage {
 impl CmdPackage {
     #[allow(dead_code)]
     pub fn handle(&self, room: &Room, user_id: &UserId, user_cmd: Vec<String>) -> String {
-        match action_permited(&self.admin_register, &self.acl, room, user_id) {
+        match CmdAcl::action_permited(&self.admin_register, &self.acl, room, user_id) {
             Err(string) => "Action not permited: ".to_string() + &string,
             Ok(()) => match user_cmd.split_first() {
                 None => "No command was passed".to_string(),
@@ -31,4 +33,21 @@ impl CmdPackage {
             },
         }
     }
+
+    #[allow(dead_code)]
+    pub fn from_config(section: IniSection, commands: Vec<Cmd>) -> CmdPackage {
+        CmdPackage {
+            name: section.get("name").unwrap().to_string(),
+            acl: CmdAcl::from_string(section.get("acl").unwrap().to_string()),
+            admin_register: CmdAdminRegister::from_vec(
+                section
+                    .get("admins")
+                    .unwrap()
+                    .split(",")
+                    .map(|x| UserId::try_from(x).unwrap())
+                    .collect::<Vec<UserId>>(),
+            ),
+            commands: commands,
+        }
+    }
 }