diff --git a/context/context.rs b/context/context.rs
index bb86bf1ec4f6575a0a6cee561bf6f75c311f4b50..6b4f7c7cfe33dbd14339157bb8ca8789e8bac267 100644
--- a/context/context.rs
+++ b/context/context.rs
@@ -11,7 +11,7 @@ use super::memory::{Memory, SharedMemory};
 pub enum Status {
     Runnable,
     Blocked,
-    Exited
+    Exited(usize)
 }
 
 /// A context, which identifies either a process or a thread
diff --git a/context/mod.rs b/context/mod.rs
index 7c85c7f46b77c46650057f50a24dcc3531de9311..041eec60922895ebe30056b5300b659fd37fe9fc 100644
--- a/context/mod.rs
+++ b/context/mod.rs
@@ -57,3 +57,7 @@ pub fn contexts() -> RwLockReadGuard<'static, ContextList> {
 pub fn contexts_mut() -> RwLockWriteGuard<'static, ContextList> {
     CONTEXTS.call_once(init_contexts).write()
 }
+
+pub fn context_id() -> usize {
+    CONTEXT_ID.load(Ordering::SeqCst)
+}
diff --git a/syscall/process.rs b/syscall/process.rs
index 4530297a7470ab014d4794bc5859815f2d7644ca..fb21a7097870ee2146ecda2317075d4224426e6d 100644
--- a/syscall/process.rs
+++ b/syscall/process.rs
@@ -52,10 +52,10 @@ pub const CLONE_FS: usize = 0x200;
 pub const CLONE_FILES: usize = 0x400;
 pub const CLONE_VFORK: usize = 0x4000;
 pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
-    //TODO: Implement flags
     //TODO: Copy on write?
     println!("Clone {:X}: {:X}", flags, stack_base);
 
+    let ppid;
     let pid;
     {
         let arch;
@@ -71,6 +71,9 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
             let contexts = context::contexts();
             let context_lock = contexts.current().ok_or(Error::NoProcess)?;
             let context = context_lock.read();
+
+            ppid = context.id;
+
             arch = context.arch.clone();
 
             if let Some(ref stack) = context.kstack {
@@ -300,8 +303,6 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
 }
 
 pub fn exit(status: usize) -> ! {
-    println!("Exit {}", status);
-
     {
         let contexts = context::contexts();
         let context_lock = contexts.current().expect("tried to exit without context");
@@ -309,7 +310,7 @@ pub fn exit(status: usize) -> ! {
         context.image.clear();
         drop(context.heap.take());
         drop(context.stack.take());
-        context.status = context::Status::Exited;
+        context.status = context::Status::Exited(status);
     }
 
     unsafe { context::switch(); }
@@ -365,6 +366,7 @@ pub fn sched_yield() -> Result<usize> {
 }
 
 pub fn waitpid(pid: usize, _status_ptr: usize, _options: usize) -> Result<usize> {
+    //TODO: Implement status_ptr and options
     loop {
         {
             let mut exited = false;
@@ -373,7 +375,8 @@ pub fn waitpid(pid: usize, _status_ptr: usize, _options: usize) -> Result<usize>
                 let contexts = context::contexts();
                 let context_lock = contexts.get(pid).ok_or(Error::NoProcess)?;
                 let context = context_lock.read();
-                if context.status == context::Status::Exited {
+                if let context::Status::Exited(status) = context.status {
+                    //TODO: set status_ptr
                     exited = true;
                 }
             }