diff --git a/context/context.rs b/context/context.rs
index fd51e969ddea48f04902c1ace7d99b0599f0008f..c280dae523e4cd800063ffb32a578233dd49def9 100644
--- a/context/context.rs
+++ b/context/context.rs
@@ -35,6 +35,8 @@ pub struct Context {
     pub status: Status,
     /// Context running or not
     pub running: bool,
+    /// CPU ID, if locked
+    pub cpuid: Option<usize>,
     /// Context is halting parent
     pub vfork: bool,
     /// Context is being waited on
@@ -79,6 +81,7 @@ impl Context {
             egid: 0,
             status: Status::Blocked,
             running: false,
+            cpuid: None,
             vfork: false,
             waitpid: Arc::new(WaitCondition::new()),
             wake: None,
diff --git a/context/mod.rs b/context/mod.rs
index 9da1259c1746e687a227ff72857e66dc215f3cc7..882eb6c9845d220472582389244dbd9a488adacd 100644
--- a/context/mod.rs
+++ b/context/mod.rs
@@ -50,6 +50,7 @@ pub fn init() {
     context.kfx = Some(fx);
     context.status = Status::Runnable;
     context.running = true;
+    context.cpuid = Some(::cpu_id());
     CONTEXT_ID.store(context.id, Ordering::SeqCst);
 }
 
diff --git a/context/switch.rs b/context/switch.rs
index 0e291e6196f19a2d267f6bc9d652ed053887ede2..ccc517671144e152a7934a996cba3078e5296496 100644
--- a/context/switch.rs
+++ b/context/switch.rs
@@ -27,20 +27,22 @@ pub unsafe fn switch() -> bool {
         }
 
         let check_context = |context: &mut Context| -> bool {
-            if context.status == Status::Blocked && context.wake.is_some() {
-                let wake = context.wake.expect("context::switch: wake not set");
+            if context.cpuid == None || context.cpuid == Some(::cpu_id()) {
+                if context.status == Status::Blocked && context.wake.is_some() {
+                    let wake = context.wake.expect("context::switch: wake not set");
 
-                let current = arch::time::monotonic();
-                if current.0 > wake.0 || (current.0 == wake.0 && current.1 >= wake.1) {
-                    context.unblock();
+                    let current = arch::time::monotonic();
+                    if current.0 > wake.0 || (current.0 == wake.0 && current.1 >= wake.1) {
+                        context.unblock();
+                    }
                 }
-            }
 
-            if context.status == Status::Runnable && ! context.running {
-                true
-            } else {
-                false
+                if context.status == Status::Runnable && ! context.running {
+                    return true;
+                }
             }
+
+            false
         };
 
         for (pid, context_lock) in contexts.iter() {
@@ -72,7 +74,7 @@ pub unsafe fn switch() -> bool {
         return false;
     }
 
-    //println!("Switch {} to {}", (&*from_ptr).id, (&*to_ptr).id);
+    // println!("{}: Switch {} to {}", ::cpu_id(), (&*from_ptr).id, (&*to_ptr).id);
 
     (&mut *from_ptr).running = false;
     (&mut *to_ptr).running = true;