diff --git a/Cargo.lock b/Cargo.lock
index e2a26c2..4312a9c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -61,9 +61,9 @@ dependencies = [
 
 [[package]]
 name = "anyhow"
-version = "1.0.88"
+version = "1.0.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356"
+checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
 
 [[package]]
 name = "autocfg"
@@ -148,9 +148,9 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
 
 [[package]]
 name = "cc"
-version = "1.1.18"
+version = "1.1.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476"
+checksum = "2d74707dde2ba56f86ae90effb3b43ddd369504387e718014de010cec7959800"
 dependencies = [
  "shlex",
 ]
@@ -395,7 +395,7 @@ source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#4a9b9de87fd56a6bbd5
 [[package]]
 name = "hbbytecode"
 version = "0.1.0"
-source = "git+https://git.ablecorp.us/ableos/holey-bytes#c133c2dbe71b3f1e1142bacef200775ae0c1d22d"
+source = "git+https://git.ablecorp.us/ableos/holey-bytes.git#6968e7d769d905c41fbe4c195d9d34d3339c32cf"
 
 [[package]]
 name = "hblang"
@@ -416,9 +416,9 @@ dependencies = [
 [[package]]
 name = "hbvm"
 version = "0.1.0"
-source = "git+https://git.ablecorp.us/ableos/holey-bytes#c133c2dbe71b3f1e1142bacef200775ae0c1d22d"
+source = "git+https://git.ablecorp.us/ableos/holey-bytes.git#6968e7d769d905c41fbe4c195d9d34d3339c32cf"
 dependencies = [
- "hbbytecode 0.1.0 (git+https://git.ablecorp.us/ableos/holey-bytes)",
+ "hbbytecode 0.1.0 (git+https://git.ablecorp.us/ableos/holey-bytes.git)",
 ]
 
 [[package]]
@@ -597,7 +597,7 @@ dependencies = [
  "derive_more",
  "embedded-graphics",
  "hashbrown",
- "hbvm 0.1.0 (git+https://git.ablecorp.us/ableos/holey-bytes)",
+ "hbvm 0.1.0 (git+https://git.ablecorp.us/ableos/holey-bytes.git)",
  "limine",
  "log",
  "sbi",
diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml
index d1764db..b21af68 100644
--- a/kernel/Cargo.toml
+++ b/kernel/Cargo.toml
@@ -6,7 +6,7 @@ version = "0.2.0"
 
 [dependencies]
 embedded-graphics = "0.8"
-hbvm.git = "https://git.ablecorp.us/ableos/holey-bytes"
+hbvm.git = "https://git.ablecorp.us/ableos/holey-bytes.git"
 log = "0.4"
 spin = "0.9"
 slab = { version = "0.4", default-features = false }
diff --git a/kernel/src/holeybytes/ecah.rs b/kernel/src/holeybytes/ecah.rs
index b92ed70..d966778 100644
--- a/kernel/src/holeybytes/ecah.rs
+++ b/kernel/src/holeybytes/ecah.rs
@@ -97,55 +97,37 @@ pub fn handler(vm: &mut Vm) {
                     let msg_vec = block_read(mem_addr, length);
                     let msg_type = msg_vec[0];
                     match msg_type {
-                        0 => 'wow: {
-                            let size = match msg_vec[0] {
-                                0 => 1,
-                                1 => 2,
-                                2 => 4,
-                                _ => {
-                                    error!("Tried to write more than 32 bits");
-                                    break 'wow;
-                                }
-                            };
-                            let addr = u16::from_le_bytes(msg_vec[1..3].try_into().unwrap());
+                        0 => {
+                            let size = msg_vec[1];
+                            let addr = u16::from_le_bytes(msg_vec[2..4].try_into().unwrap());
                             let value = unsafe {
                                 match size {
-                                    1 => x86_in::<u8>(addr) as u64,
-                                    2 => x86_in::<u16>(addr) as u64,
-                                    4 => x86_in::<u32>(addr) as u64,
+                                    0 => x86_in::<u8>(addr) as u64,
+                                    1 => x86_in::<u16>(addr) as u64,
+                                    2 => x86_in::<u32>(addr) as u64,
                                     _ => panic!("how?"),
                                 }
                             };
-                            trace!("Read the value {} from address {}", value, addr);
+                            info!("Read the value {} from address {}", value, addr);
                             vm.registers[1] = hbvm::value::Value(value);
                         }
-                        1 => 'wow: {
-                            let size = match msg_vec[1] {
-                                0 => 1,
-                                1 => 2,
-                                2 => 4,
-                                _ => {
-                                    error!("Tried to write more than 32 bits");
-                                    break 'wow;
-                                }
-                            };
-                            let addr = unsafe {
-                                u16::from_le_bytes(msg_vec[1..3].try_into().unwrap_unchecked())
-                            };
+                        1 => {
+                            let size = msg_vec[1];
+                            let addr = u16::from_le_bytes(msg_vec[2..4].try_into().unwrap());
                             trace!("Setting address {}", addr);
                             unsafe {
                                 match size {
-                                    1 => x86_out(addr, msg_vec[3]),
-                                    2 => x86_out(
+                                    0 => x86_out(addr, msg_vec[4]),
+                                    1 => x86_out(
                                         addr,
                                         u16::from_le_bytes(
-                                            msg_vec[3..5].try_into().unwrap_unchecked(),
+                                            msg_vec[4..6].try_into().unwrap_unchecked(),
                                         ),
                                     ),
-                                    4 => x86_out(
+                                    2 => x86_out(
                                         addr,
                                         u32::from_le_bytes(
-                                            msg_vec[3..7].try_into().unwrap_unchecked(),
+                                            msg_vec[4..8].try_into().unwrap_unchecked(),
                                         ),
                                     ),
                                     _ => panic!("How?"),
diff --git a/kernel/src/holeybytes/kernel_services/mod.rs b/kernel/src/holeybytes/kernel_services/mod.rs
index 1e536a7..dd9722e 100644
--- a/kernel/src/holeybytes/kernel_services/mod.rs
+++ b/kernel/src/holeybytes/kernel_services/mod.rs
@@ -6,6 +6,6 @@ pub mod mem_serve;
 pub mod service_definition_service;
 
 #[inline(always)]
-pub fn block_read<'a>(mem_addr: u64, length: usize) -> &'a [u8] {
-    unsafe { slice::from_raw_parts(mem_addr as *const u8, length) }
+pub fn block_read<'a>(mem_addr: u64, length: usize) -> &'a mut [u8] {
+    unsafe { slice::from_raw_parts_mut(mem_addr as *mut _, length) }
 }
diff --git a/kernel/src/holeybytes/mod.rs b/kernel/src/holeybytes/mod.rs
index aecadd3..a7f6478 100644
--- a/kernel/src/holeybytes/mod.rs
+++ b/kernel/src/holeybytes/mod.rs
@@ -61,28 +61,22 @@ impl<'p> Future for ExecThread {
     fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
         match self.vm.run() {
             Err(err) => {
-                error!("HBVM Error\r\nRegister dump: {:?}", self.vm.registers);
-                Poll::Ready(Err(err))
-            }
-            Ok(VmRunOk::End) => Poll::Ready(Ok(())),
-            Ok(VmRunOk::Ecall) => {
-                ecah::handler(&mut self.vm);
-                cx.waker().wake_by_ref();
-                Poll::Pending
-            }
-            Ok(VmRunOk::Timer) => {
-                cx.waker().wake_by_ref();
-                Poll::Pending
+                log::error!("HBVM Error\r\nRegister dump: {:?}", self.vm.registers,);
+                return Poll::Ready(Err(err));
             }
+            Ok(VmRunOk::End) => return Poll::Ready(Ok(())),
+            Ok(VmRunOk::Ecall) => ecah::handler(&mut self.vm),
+            Ok(VmRunOk::Timer) => (),
             Ok(VmRunOk::Breakpoint) => {
-                error!(
+                log::error!(
                     "HBVM Debug breakpoint\r\nRegister dump: {:?}",
-                    self.vm.registers
+                    self.vm.registers,
                 );
-                cx.waker().wake_by_ref();
-                Poll::Pending
             }
         }
+
+        cx.waker().wake_by_ref();
+        Poll::Pending
     }
 }
 
diff --git a/kernel/src/kmain.rs b/kernel/src/kmain.rs
index dcd2ad8..f6d5530 100644
--- a/kernel/src/kmain.rs
+++ b/kernel/src/kmain.rs
@@ -12,7 +12,7 @@ use {
     hashbrown::HashMap,
     hbvm::mem::Address,
     limine::{Framebuffer, FramebufferRequest, NonNullPtr},
-    log::{debug, info},
+    log::{debug, trace},
     spin::{Lazy, Mutex},
 };
 
@@ -36,9 +36,9 @@ pub fn kmain(_cmdline: &str, boot_modules: BootModules) -> ! {
     let dt = DEVICE_TREE.lock();
 
     // TODO(Able): This line causes a deadlock
-    info!("Device Tree: {}", dt);
+    debug!("Device Tree: {}", dt);
 
-    info!("Boot complete. Moving to init_system");
+    trace!("Boot complete. Moving to init_system");
 
     // TODO: schedule the disk driver from the initramfs
     // TODO: schedule the filesystem driver from the initramfs
@@ -60,39 +60,32 @@ pub fn kmain(_cmdline: &str, boot_modules: BootModules) -> ! {
         disp.set_attribute("pitch", fb1.pitch);
         dt.devices.insert("Displays".to_string(), alloc::vec![disp]);
     }
-    log::info!("Graphics initialised");
-    log::info!(
+    debug!("Graphics initialised");
+    debug!(
         "Graphics front ptr {:?}",
         fb1.address.as_ptr().unwrap() as *const u8
     );
 
     let mut executor = crate::task::Executor::new(256);
-    let bm_take = boot_modules.len();
     unsafe {
-        for module in boot_modules.into_iter().take(bm_take) {
-            let mut cmd = module.cmd;
-            if cmd.len() > 2 {
-                // // Remove the quotes
-                // cmd.remove(0);
-                // cmd.pop();
-                cmd = &cmd[1..cmd.len()]
-            }
+        for module in boot_modules.iter() {
+            let cmd = module.cmd.trim_matches('"');
             let cmd_len = cmd.len() as u64;
 
             log::info!("Spawning {} with arguments \"{}\"", module.path, cmd);
 
+            let mut thr = ExecThread::new(&module.bytes, Address::new(0));
+            if cmd_len > 0 {
+                thr.set_arguments(cmd.as_ptr() as u64, cmd_len);
+            }
             executor.spawn(async move {
-                let mut thr = ExecThread::new(&module.bytes, Address::new(0));
-                if cmd_len > 0 {
-                    thr.set_arguments(cmd.as_bytes().as_ptr() as u64, cmd_len);
-                }
                 if let Err(e) = thr.await {
                     log::error!("{e:?}");
                 }
             })
         }
 
-        info!("Random number: {}", hardware_random_u64());
+        debug!("Random number: {}", hardware_random_u64());
 
         executor.run();
     };
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs
index 194b150..2e6d256 100644
--- a/kernel/src/lib.rs
+++ b/kernel/src/lib.rs
@@ -2,8 +2,8 @@
 //! Named akern.
 //! Akern is woefully undersupported at the moment but we are looking to add support improve hardware discovery and make our lives as kernel and operating system developers easier and better
 #![no_std]
-#![feature(new_uninit)]
 #![feature(
+    new_uninit,
     abi_x86_interrupt,
     alloc_error_handler,
     ptr_sub_ptr,
diff --git a/sysdata/libraries/stn/src/memory.hb b/sysdata/libraries/stn/src/memory.hb
index 7d4e71f..bfbd39b 100644
--- a/sysdata/libraries/stn/src/memory.hb
+++ b/sysdata/libraries/stn/src/memory.hb
@@ -18,21 +18,13 @@ release_page := fn(ptr: ^u8, page_count: u8): void {
 }
 
 outb := fn(addr: u16, value: u8): void {
-	msg := "\0\0\0\0\0";
-	*@as(^u8, msg) = @as(u8, 1);
-	*@as(^u8, msg + 1) = @as(u8, 0);
-	*@as(^u16, @bitcast(msg + 2)) = addr;
-	*@as(^u8, msg + 4) = value
-	@eca(void, 3, 3, msg, 5)
-	return
+	msg := [u8; 5].(1, 0, @as(u8, addr & 0xFF), @as(u8, addr >> 8 & 0xFF), value)
+	return @eca(void, 3, 3, &msg, 5)
 }
 
 inb := fn(addr: u16): u8 {
-	msg := "\0\0\0\0";
-	*@as(^u8, msg) = @as(u8, 0);
-	*@as(^u8, msg + 1) = @as(u8, 0);
-	*@as(^u16, @bitcast(msg + 2)) = addr
-	return @eca(u8, 3, 3, msg, 4)
+	msg := [u8; 4].(0, 0, @as(u8, addr & 0xFF), @as(u8, addr >> 8 & 0xFF))
+	return @eca(u8, 3, 3, &msg, 4)
 }
 
 outl := fn(addr: u16, value: u32): void {
diff --git a/sysdata/programs/ps2_driver/README.md b/sysdata/programs/ps2_driver/README.md
new file mode 100644
index 0000000..c76d3c8
--- /dev/null
+++ b/sysdata/programs/ps2_driver/README.md
@@ -0,0 +1,3 @@
+# PS/2 Driver
+
+This program is a simple driver to read keypresses from a PS/2 Keyboard Also will contain an abstraction for the PS/2 controller in general so the Mouse code will probably also live here...maybe
\ No newline at end of file
diff --git a/sysdata/programs/ps2_driver/meta.toml b/sysdata/programs/ps2_driver/meta.toml
new file mode 100644
index 0000000..0a2d770
--- /dev/null
+++ b/sysdata/programs/ps2_driver/meta.toml
@@ -0,0 +1,11 @@
+[package]
+name = "ps2_driver"
+authors = ["Talha Qamar"]
+
+[dependants.libraries]
+
+[dependants.binaries]
+hblang.version = "1.0.0"
+
+[build]
+command = "hblang src/main.hb"
diff --git a/sysdata/programs/ps2_driver/src/main.hb b/sysdata/programs/ps2_driver/src/main.hb
new file mode 100644
index 0000000..f727978
--- /dev/null
+++ b/sysdata/programs/ps2_driver/src/main.hb
@@ -0,0 +1,33 @@
+.{memory, log, string, buffer} := @use("../../../libraries/stn/src/lib.hb")
+
+send_byte := fn(byte: u8): u8 {
+	memory.outb(96, byte)
+	return memory.inb(96)
+}
+
+main := fn(): int {
+	send_byte(238)
+	log.info("PS/2 Driver Loaded\0")
+	if send_byte(238) == 238 {
+		log.info("PS/2 Keyboard Echoed\0")
+	}
+	a := 0
+	a += 1
+	if send_byte(244) == 250 {
+		log.info("Enabled scanning\0")
+	}
+	buf := buffer.create("XKeyboard\0")
+	ptr := memory.request_page(1)
+	prev_input := 250
+	loop {
+		input := memory.inb(96)
+		if input == prev_input {
+			continue
+		}
+		prev_input = input
+		keycode_str := string.display_int(input, ptr)
+		log.info(string.display_int(input, ptr))
+		buffer.send_message(keycode_str, buf)
+	}
+	return 0
+}
\ No newline at end of file