diff --git a/scheme/mod.rs b/scheme/mod.rs
index 5e2c05796b8cb17a76116c5dac54a2d1cad19a46..96e2ef9134408f95c9d031b1cac218b8ff6de184 100644
--- a/scheme/mod.rs
+++ b/scheme/mod.rs
@@ -20,9 +20,11 @@ use self::event::EventScheme;
 use self::env::EnvScheme;
 use self::initfs::InitFsScheme;
 use self::irq::{IRQ_SCHEME_ID, IrqScheme};
+use self::null::NullScheme;
 use self::pipe::{PIPE_SCHEME_ID, PipeScheme};
 use self::root::{ROOT_SCHEME_ID, RootScheme};
 use self::sys::SysScheme;
+use self::zero::ZeroScheme;
 
 /// Debug scheme
 pub mod debug;
@@ -39,6 +41,9 @@ pub mod initfs;
 /// IRQ handling
 pub mod irq;
 
+/// Null scheme
+pub mod null;
+
 /// Anonymouse pipe
 pub mod pipe;
 
@@ -51,6 +56,9 @@ pub mod sys;
 /// Userspace schemes
 pub mod user;
 
+/// Zero scheme
+pub mod zero;
+
 /// Limit on number of schemes
 pub const SCHEME_MAX_SCHEMES: usize = 65536;
 
@@ -132,8 +140,10 @@ fn init_schemes() -> RwLock<SchemeList> {
     list.insert(Box::new(*b"env"), Arc::new(Box::new(EnvScheme::new()))).expect("failed to insert env scheme");
     list.insert(Box::new(*b"initfs"), Arc::new(Box::new(InitFsScheme::new()))).expect("failed to insert initfs scheme");
     IRQ_SCHEME_ID.store(list.insert(Box::new(*b"irq"), Arc::new(Box::new(IrqScheme))).expect("failed to insert irq scheme"), Ordering::SeqCst);
+    list.insert(Box::new(*b"null"), Arc::new(Box::new(NullScheme))).expect("failed to insert null scheme");
     PIPE_SCHEME_ID.store(list.insert(Box::new(*b"pipe"), Arc::new(Box::new(PipeScheme))).expect("failed to insert pipe scheme"), Ordering::SeqCst);
     list.insert(Box::new(*b"sys"), Arc::new(Box::new(SysScheme::new()))).expect("failed to insert sys scheme");
+    list.insert(Box::new(*b"zero"), Arc::new(Box::new(ZeroScheme))).expect("failed to insert zero scheme");
     RwLock::new(list)
 }
 
diff --git a/scheme/null.rs b/scheme/null.rs
new file mode 100644
index 0000000000000000000000000000000000000000..690c16c4d2c33f1d489234e3f69325628c74adef
--- /dev/null
+++ b/scheme/null.rs
@@ -0,0 +1,37 @@
+use syscall::error::*;
+use syscall::scheme::Scheme;
+
+pub struct NullScheme;
+
+impl Scheme for NullScheme {
+    fn open(&self, _path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
+        Ok(0)
+    }
+
+    fn dup(&self, _file: usize, _buf: &[u8]) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Read the file `number` into the `buffer`
+    ///
+    /// Returns the number of bytes read
+    fn read(&self, _file: usize, _buf: &mut [u8]) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Write the `buffer` to the `file`
+    ///
+    /// Returns the number of bytes written
+    fn write(&self, _file: usize, buffer: &[u8]) -> Result<usize> {
+        Ok(buffer.len())
+    }
+
+    fn fsync(&self, _file: usize) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Close the file `number`
+    fn close(&self, _file: usize) -> Result<usize> {
+        Ok(0)
+    }
+}
diff --git a/scheme/zero.rs b/scheme/zero.rs
new file mode 100644
index 0000000000000000000000000000000000000000..90175cbd5957c6f8007ba0ffde01716758827261
--- /dev/null
+++ b/scheme/zero.rs
@@ -0,0 +1,42 @@
+use syscall::error::*;
+use syscall::scheme::Scheme;
+
+pub struct ZeroScheme;
+
+impl Scheme for ZeroScheme {
+    fn open(&self, _path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
+        Ok(0)
+    }
+
+    fn dup(&self, _file: usize, _buf: &[u8]) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Read the file `number` into the `buffer`
+    ///
+    /// Returns the number of bytes read
+    fn read(&self, _file: usize, buf: &mut [u8]) -> Result<usize> {
+        let mut i = 0;
+        while i < buf.len() {
+            buf[i] = 0;
+            i += 1;
+        }
+        Ok(i)
+    }
+
+    /// Write the `buffer` to the `file`
+    ///
+    /// Returns the number of bytes written
+    fn write(&self, _file: usize, buffer: &[u8]) -> Result<usize> {
+        Ok(buffer.len())
+    }
+
+    fn fsync(&self, _file: usize) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Close the file `number`
+    fn close(&self, _file: usize) -> Result<usize> {
+        Ok(0)
+    }
+}