diff --git a/src/cmd/cmd.rs b/src/cmd/cmd.rs
deleted file mode 100644
index 5d7023815a64385a22b485351930eba2908bde9f..0000000000000000000000000000000000000000
--- a/src/cmd/cmd.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-use log::error;
-use std::{process::abort, string::String};
-
-#[allow(dead_code)]
-pub enum CmdHandler {
-    Simple(fn(Vec<String>) -> bool),
-    Echo(fn(Vec<String>) -> String),
-    MultiEcho(fn(Vec<String>) -> Vec<String>),
-}
-
-#[allow(dead_code)]
-pub struct Cmd {
-    name: String,
-    argc: u32,
-    handler: CmdHandler,
-}
-
-impl Cmd {
-    #[allow(dead_code)]
-    pub fn matches(&self, name: &String, args: &Vec<String>) -> bool {
-        (self.name == *name) && (self.argc as usize == args.len())
-    }
-
-    #[allow(dead_code)]
-    pub fn exec(&self, args: Vec<String>) -> String {
-        if args.len() != self.argc as usize {
-            error!("Arg count doesn't match");
-            abort();
-        }
-
-        match self.handler {
-            CmdHandler::Simple(f) => match f(args) {
-                true => "<b>Ok</b>".to_string(),
-                false => "<b>Failed!</b>".to_string(),
-            },
-            CmdHandler::Echo(f) => f(args),
-            CmdHandler::MultiEcho(f) => f(args).join("<br>---"),
-        }
-    }
-
-    #[allow(dead_code)]
-    pub fn get_name(&self) -> &str {
-        &self.name
-    }
-}
diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs
index bf3e74743a324e397f6f6b41be79bd8e65cb9a78..0db744d38e7eb2329b7a4e5817d8f9e5a6fb6984 100644
--- a/src/cmd/mod.rs
+++ b/src/cmd/mod.rs
@@ -1,3 +1,48 @@
 pub mod acl;
-pub mod cmd;
 pub mod package;
+
+use log::error;
+use std::{process::abort, string::String};
+
+#[allow(dead_code)]
+pub enum CmdHandler {
+    Simple(fn(Vec<String>) -> bool),
+    Echo(fn(Vec<String>) -> String),
+    MultiEcho(fn(Vec<String>) -> Vec<String>),
+}
+
+#[allow(dead_code)]
+pub struct Cmd {
+    name: String,
+    argc: u32,
+    handler: CmdHandler,
+}
+
+impl Cmd {
+    #[allow(dead_code)]
+    pub fn matches(&self, name: &String, args: &Vec<String>) -> bool {
+        (self.name == *name) && (self.argc as usize == args.len())
+    }
+
+    #[allow(dead_code)]
+    pub fn exec(&self, args: Vec<String>) -> String {
+        if args.len() != self.argc as usize {
+            error!("Arg count doesn't match");
+            abort();
+        }
+
+        match self.handler {
+            CmdHandler::Simple(f) => match f(args) {
+                true => "<b>Ok</b>".to_string(),
+                false => "<b>Failed!</b>".to_string(),
+            },
+            CmdHandler::Echo(f) => f(args),
+            CmdHandler::MultiEcho(f) => f(args).join("<br>---"),
+        }
+    }
+
+    #[allow(dead_code)]
+    pub fn get_name(&self) -> &str {
+        &self.name
+    }
+}
diff --git a/src/cmd/package.rs b/src/cmd/package.rs
index 44b2865f1492ca6e5b76a45ed2dc2e476e5c9f28..437f993b63721adf24be65a60d845424d543290a 100644
--- a/src/cmd/package.rs
+++ b/src/cmd/package.rs
@@ -1,6 +1,6 @@
 use crate::cmd::{
     acl::{CmdAcl, CmdAdminRegister},
-    cmd::Cmd,
+    Cmd,
 };
 use ini::Properties as IniSection;
 use matrix_sdk::{room::Room, ruma::UserId};
@@ -34,7 +34,7 @@ impl CmdPackage {
     }
 
     #[allow(dead_code)]
-    pub fn from_config(section: IniSection, commands: Vec<Cmd>) -> CmdPackage {
+    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()),
diff --git a/src/config.rs b/src/config.rs
index fcdef0ed81dedd6246a876ad129f9837c6f9d7d7..46a24fcd3b6fde99830794cbc2c3e1650b9d077c 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -1,6 +1,6 @@
 #![allow(dead_code)]
 
-use ini::{Error::Io as IniErrIo, Error::Parse as IniErrParse, Ini};
+use ini::{Error::Io as IniErrIo, Error::Parse as IniErrParse, Ini, Properties as IniSection};
 use log::{error, info, warn, LevelFilter};
 use std::{env, path::Path, process::abort, str::FromStr};
 use url::Url;
@@ -13,6 +13,14 @@ pub struct Config {
 
     pub handle_state_member: bool, // Install handler for state memver changes
     pub handle_room_message: bool, // Install handler for room messages
+
+    ini_handler: Ini,
+}
+
+impl Config {
+    pub fn section(&self, name: &str) -> Option<&IniSection> {
+        self.ini_handler.section(Some(name))
+    }
 }
 
 pub fn setup_logging() {
@@ -62,6 +70,7 @@ pub fn from_file(file_name: &String) -> Result<Config, String> {
                         .unwrap_or(false),
                     handle_state_member: <bool as FromStr>::from_str(&handle_state_member_str)
                         .unwrap_or(false),
+                    ini_handler: conf,
                 }),
             };
         }
diff --git a/src/matrix.rs b/src/matrix.rs
index bd364e70bbe43c0fcf65adb3ea5272fd3db25198..2b2e4aace47a36f52c10190cf83d441452fee813 100644
--- a/src/matrix.rs
+++ b/src/matrix.rs
@@ -1,4 +1,4 @@
-use crate::config::Config;
+use crate::{config::Config, cmd::package::CmdPackage, cmd::{ Cmd, CmdHandler}};
 use futures::future::join_all;
 use log::{error, info, warn};
 use matrix_sdk::{
@@ -16,7 +16,7 @@ use matrix_sdk::{
     },
     Client, Result, SyncSettings,
 };
-use std::convert::TryFrom;
+use std::{convert::TryFrom,process::abort};
 use tokio::time::{sleep, Duration};
 
 async fn join_room(room: &Invited) {
@@ -128,6 +128,14 @@ async fn startup_and_log_rooms(client: &Client) {
 }
 
 pub async fn connect_and_handle(config: Config) -> Result<()> {
+    // TODO: Refactor
+    let _pkg = match config.section("basic") {
+        Some(section) => CmdPackage::from_config(&section, vec![]),
+        None => {
+            abort();
+        }
+    };
+
     let alice = UserId::try_from(config.user_name)?;
     let client = Client::new(config.homeserver_url)?;