diff --git a/src/console.rs b/src/console.rs
deleted file mode 100644
index 92f28d868eb5d098fe8eef91a707723cd3325eb3..0000000000000000000000000000000000000000
--- a/src/console.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-use core::fmt::{self, Write};
-use spin::Mutex;
-
-use device::serial::COM1;
-
-pub static CONSOLE: Mutex<Console> = Mutex::new(Console);
-
-pub struct Console;
-
-impl Write for Console {
-    fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> {
-        COM1.lock().write_str(s)
-    }
-}
diff --git a/src/device/serial.rs b/src/device/serial.rs
index 87e18c73d7e15b01a1cfa883883b4a4fae7e0f89..b29c8b05dbcb1cac0b30d225c70249e42422324a 100644
--- a/src/device/serial.rs
+++ b/src/device/serial.rs
@@ -1,6 +1,7 @@
 use core::fmt::{self, Write};
 use spin::Mutex;
 
+use scheme::debug::debug_input;
 use syscall::io::{Io, Pio, ReadOnly};
 
 pub static COM1: Mutex<SerialPort> = Mutex::new(SerialPort::new(0x3F8));
@@ -63,15 +64,6 @@ impl SerialPort {
         }
     }
 
-    fn line_sts(&self) -> LineStsFlags {
-        LineStsFlags::from_bits_truncate(self.line_sts.read())
-    }
-
-    fn write(&mut self, data: u8) {
-        while ! self.line_sts().contains(OUTPUT_EMPTY) {}
-        self.data.write(data)
-    }
-
     fn init(&mut self) {
         //TODO: Cleanup
         self.int_en.write(0x00);
@@ -84,15 +76,30 @@ impl SerialPort {
         self.int_en.write(0x01);
     }
 
-    pub fn on_receive(&mut self) {
+    fn line_sts(&self) -> LineStsFlags {
+        LineStsFlags::from_bits_truncate(self.line_sts.read())
+    }
+
+    pub fn receive(&mut self) {
         while self.line_sts().contains(INPUT_FULL) {
-            let data = self.data.read();
+            debug_input(self.data.read());
+        }
+    }
 
-            extern {
-                fn debug_input(byte: u8);
+    pub fn send(&mut self, data: u8) {
+        match data {
+            8 | 0x7F => {
+                while ! self.line_sts().contains(OUTPUT_EMPTY) {}
+                self.data.write(8);
+                while ! self.line_sts().contains(OUTPUT_EMPTY) {}
+                self.data.write(b' ');
+                while ! self.line_sts().contains(OUTPUT_EMPTY) {}
+                self.data.write(8);
+            },
+            _ => {
+                while ! self.line_sts().contains(OUTPUT_EMPTY) {}
+                self.data.write(data);
             }
-
-            unsafe { debug_input(data) };
         }
     }
 }
@@ -100,16 +107,7 @@ impl SerialPort {
 impl Write for SerialPort {
     fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> {
         for byte in s.bytes() {
-            match byte {
-                8 | 0x7F => {
-                    self.write(8);
-                    self.write(b' ');
-                    self.write(8);
-                },
-                _ => {
-                    self.write(byte);
-                }
-            }
+            self.send(byte);
         }
 
         Ok(())
diff --git a/src/interrupt/irq.rs b/src/interrupt/irq.rs
index a83a33f4c8e842c88a5e72b95213089e886bc021..976323621a6297d942fd8e0cc21589d51d070a89 100644
--- a/src/interrupt/irq.rs
+++ b/src/interrupt/irq.rs
@@ -54,12 +54,12 @@ interrupt!(cascade, {
 });
 
 interrupt!(com2, {
-    COM2.lock().on_receive();
+    COM2.lock().receive();
     pic::MASTER.ack();
 });
 
 interrupt!(com1, {
-    COM1.lock().on_receive();
+    COM1.lock().receive();
     pic::MASTER.ack();
 });
 
diff --git a/src/lib.rs b/src/lib.rs
index 131afa037f303e328c27d7064e04548e3ef067e6..55d3c57baf37b72365202750dd830d6f7c133fe0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -50,9 +50,6 @@ pub mod consts;
 /// ACPI table parsing
 mod acpi;
 
-/// Console handling
-pub mod console;
-
 /// Context management
 pub mod context;
 
diff --git a/src/macros.rs b/src/macros.rs
index 6946c2010e51d1d45a3c2162b400c32e7c4a2596..a54fb35399bd2ab11b687e3d0024f681fa9ee1d3 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -3,7 +3,7 @@
 macro_rules! print {
     ($($arg:tt)*) => ({
         use core::fmt::Write;
-        let _ = write!($crate::console::CONSOLE.lock(), $($arg)*);
+        let _ = write!($crate::device::serial::COM1.lock(), $($arg)*);
     });
 }
 
diff --git a/src/scheme/debug.rs b/src/scheme/debug.rs
index 4d929a84b66a0ec9e774c557509520cf8369161e..ddfa120c029961f9d69511f4d5200a77c575958f 100644
--- a/src/scheme/debug.rs
+++ b/src/scheme/debug.rs
@@ -1,8 +1,8 @@
-use core::str;
 use core::sync::atomic::Ordering;
 use spin::Once;
 
 use context;
+use device::serial::COM1;
 use scheme::*;
 use sync::WaitQueue;
 use syscall::flag::EVENT_READ;
@@ -19,10 +19,8 @@ fn init_input() -> WaitQueue<u8> {
 }
 
 /// Add to the input queue
-#[no_mangle]
-pub extern fn debug_input(b: u8) {
+pub fn debug_input(b: u8) {
     let len = INPUT.call_once(init_input).send(b);
-
     context::event::trigger(DEBUG_SCHEME_ID.load(Ordering::SeqCst), 0, EVENT_READ, len);
 }
 
@@ -55,8 +53,10 @@ impl Scheme for DebugScheme {
     ///
     /// Returns the number of bytes written
     fn write(&self, _file: usize, buffer: &[u8]) -> Result<usize> {
-        //TODO: Write bytes, do not convert to str
-        print!("{}", unsafe { str::from_utf8_unchecked(buffer) });
+        let mut com = COM1.lock();
+        for &byte in buffer.iter() {
+            com.send(byte);
+        }
         Ok(buffer.len())
     }