diff --git a/src/devices/uart_16550.rs b/src/devices/uart_16550.rs
index f610e3fbcbfc4b901c8fdf65e6c12808f96fc256..9e2566fa8bf6a92fd26d48b8b9f9418fb52cc70b 100644
--- a/src/devices/uart_16550.rs
+++ b/src/devices/uart_16550.rs
@@ -89,7 +89,8 @@ impl<T: Io<Value = u8>> SerialPort<T> {
 
     pub fn receive(&mut self) {
         while self.line_sts().contains(LineStsFlags::INPUT_FULL) {
-            debug_input(self.data.read());
+            let b = self.data.read();
+            debug_input(b);
         }
     }
 
diff --git a/src/scheme/debug.rs b/src/scheme/debug.rs
index 90bf8532ffd9be2e12ccf1f176aa6d11f0242d60..fc3c983b5d2e26062f901377ae9e69dfb4da270f 100644
--- a/src/scheme/debug.rs
+++ b/src/scheme/debug.rs
@@ -1,5 +1,5 @@
-use core::sync::atomic::Ordering;
-use spin::Once;
+use core::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
+use spin::{Once, RwLock, RwLockReadGuard, RwLockWriteGuard};
 
 use device::serial::COM1;
 use event;
@@ -18,31 +18,43 @@ fn init_input() -> WaitQueue<u8> {
     WaitQueue::new()
 }
 
+static NEXT_ID: AtomicUsize = ATOMIC_USIZE_INIT;
+
+static HANDLES: Once<RwLock<BTreeMap<usize, usize>>> = Once::new();
+
+fn init_handles() -> RwLock<BTreeMap<usize, usize>> {
+    RwLock::new(BTreeMap::new())
+}
+
+fn handles() -> RwLockReadGuard<'static, BTreeMap<usize, usize>> {
+    HANDLES.call_once(init_handles).read()
+}
+
+fn handles_mut() -> RwLockWriteGuard<'static, BTreeMap<usize, usize>> {
+    HANDLES.call_once(init_handles).write()
+}
+
 /// Add to the input queue
 pub fn debug_input(b: u8) {
     INPUT.call_once(init_input).send(b);
-    event::trigger(DEBUG_SCHEME_ID.load(Ordering::SeqCst), 0, EVENT_READ);
+    for (id, _flags) in handles().iter() {
+        event::trigger(DEBUG_SCHEME_ID.load(Ordering::SeqCst), *id, EVENT_READ);
+    }
 }
 
-pub struct DebugScheme {
-    next_id: AtomicUsize,
-    handles: RwLock<BTreeMap<usize, usize>>
-}
+pub struct DebugScheme;
 
 impl DebugScheme {
     pub fn new(scheme_id: SchemeId) -> DebugScheme {
         DEBUG_SCHEME_ID.store(scheme_id, Ordering::SeqCst);
-        DebugScheme {
-            next_id: AtomicUsize::new(0),
-            handles: RwLock::new(BTreeMap::new())
-        }
+        DebugScheme
     }
 }
 
 impl Scheme for DebugScheme {
     fn open(&self, _path: &[u8], flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
-        let id = self.next_id.fetch_add(1, Ordering::SeqCst);
-        self.handles.write().insert(id, flags & ! O_ACCMODE);
+        let id = NEXT_ID.fetch_add(1, Ordering::SeqCst);
+        handles_mut().insert(id, flags & ! O_ACCMODE);
 
         Ok(id)
     }
@@ -53,12 +65,12 @@ impl Scheme for DebugScheme {
         }
 
         let flags = {
-            let handles = self.handles.read();
+            let handles = handles();
             *handles.get(&id).ok_or(Error::new(EBADF))?
         };
 
-        let new_id = self.next_id.fetch_add(1, Ordering::SeqCst);
-        self.handles.write().insert(new_id, flags);
+        let new_id = NEXT_ID.fetch_add(1, Ordering::SeqCst);
+        handles_mut().insert(new_id, flags);
 
         Ok(new_id)
     }
@@ -68,7 +80,7 @@ impl Scheme for DebugScheme {
     /// Returns the number of bytes read
     fn read(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
         let flags = {
-            let handles = self.handles.read();
+            let handles = handles();
             *handles.get(&id).ok_or(Error::new(EBADF))?
         };
 
@@ -80,7 +92,7 @@ impl Scheme for DebugScheme {
     /// Returns the number of bytes written
     fn write(&self, id: usize, buffer: &[u8]) -> Result<usize> {
         let _flags = {
-            let handles = self.handles.read();
+            let handles = handles();
             *handles.get(&id).ok_or(Error::new(EBADF))?
         };
 
@@ -93,7 +105,7 @@ impl Scheme for DebugScheme {
     }
 
     fn fcntl(&self, id: usize, cmd: usize, arg: usize) -> Result<usize> {
-        let mut handles = self.handles.write();
+        let mut handles = handles_mut();
         if let Some(flags) = handles.get_mut(&id) {
             match cmd {
                 F_GETFL => Ok(*flags),
@@ -110,7 +122,7 @@ impl Scheme for DebugScheme {
 
     fn fevent(&self, id: usize, _flags: usize) -> Result<usize> {
         let _flags = {
-            let handles = self.handles.read();
+            let handles = handles();
             *handles.get(&id).ok_or(Error::new(EBADF))?
         };
 
@@ -119,7 +131,7 @@ impl Scheme for DebugScheme {
 
     fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
         let _flags = {
-            let handles = self.handles.read();
+            let handles = handles();
             *handles.get(&id).ok_or(Error::new(EBADF))?
         };
 
@@ -135,7 +147,7 @@ impl Scheme for DebugScheme {
 
     fn fsync(&self, id: usize) -> Result<usize> {
         let _flags = {
-            let handles = self.handles.read();
+            let handles = handles();
             *handles.get(&id).ok_or(Error::new(EBADF))?
         };
 
@@ -145,7 +157,7 @@ impl Scheme for DebugScheme {
     /// Close the file `number`
     fn close(&self, id: usize) -> Result<usize> {
         let _flags = {
-            let mut handles = self.handles.write();
+            let mut handles = handles_mut();
             handles.remove(&id).ok_or(Error::new(EBADF))?
         };