diff --git a/src/acpi/aml/namedobj.rs b/src/acpi/aml/namedobj.rs
index e91990c4c566e7155313ed4f1d4282207070f9a6..c2897fdaf2ee69fac3937b69f8ffb29a83905e57 100644
--- a/src/acpi/aml/namedobj.rs
+++ b/src/acpi/aml/namedobj.rs
@@ -276,7 +276,7 @@ fn parse_def_create_dword_field(data: &[u8],
 
     let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?;
 
-    ctx.add_to_namespace(local_scope_string, AmlValue::BufferField(BufferField {
+    let _ = ctx.add_to_namespace(local_scope_string, AmlValue::BufferField(BufferField {
         source_buf: Box::new(source_buf.val),
         index: Box::new(bit_index.val),
         length: Box::new(AmlValue::IntegerConstant(32))
diff --git a/src/acpi/aml/namespace.rs b/src/acpi/aml/namespace.rs
index 906713695cc1645ac7dd6b1152b1c201e205620d..39e21030fcd0be12f38c42e8e13aa69be70b7b73 100644
--- a/src/acpi/aml/namespace.rs
+++ b/src/acpi/aml/namespace.rs
@@ -132,12 +132,12 @@ pub enum AmlValue {
     String(String),
     PowerResource(PowerResource),
     Processor(Processor),
-    RawDataBuffer(Vec<u8>),
+    //RawDataBuffer(Vec<u8>),
     ThermalZone(ThermalZone)
 }
 
 impl Debug for AmlValue {
-    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { Ok(()) }
+    fn fmt(&self, _f: &mut Formatter) -> Result<(), Error> { Ok(()) }
 }
 
 impl AmlValue {
@@ -373,12 +373,14 @@ impl AmlValue {
         }
     }
 
+    /*
     pub fn get_as_operation_region(&self) -> Result<OperationRegion, AmlError> {
         match *self {
             AmlValue::OperationRegion(ref p) => Ok(p.clone()),
             _ => Err(AmlError::AmlValueError)
         }
     }
+    */
 
     pub fn get_as_package(&self) -> Result<Vec<AmlValue>, AmlError> {
         match *self {
@@ -435,7 +437,7 @@ impl Method {
         let mut ctx = AmlExecutionContext::new(scope);
         ctx.init_arg_vars(parameters);
 
-        parse_term_list(&self.term_list[..], &mut ctx);
+        let _ = parse_term_list(&self.term_list[..], &mut ctx);
         ctx.clean_namespace();
 
         match ctx.state {
diff --git a/src/acpi/aml/parser.rs b/src/acpi/aml/parser.rs
index 0b95031ceb14e1ba5f9189ad8dc292b9d6cdc3cc..0f263211125fd0647882551fa3e677456b9d127b 100644
--- a/src/acpi/aml/parser.rs
+++ b/src/acpi/aml/parser.rs
@@ -364,12 +364,12 @@ impl AmlExecutionContext {
                 let mut idx = indices[0];
                 idx += b.index.get_as_integer()?;
 
-                self.modify(AmlValue::ObjectReference(ObjectReference::Index(b.source_buf.clone(), Box::new(AmlValue::Integer(idx.clone())))), value);
+                let _ = self.modify(AmlValue::ObjectReference(ObjectReference::Index(b.source_buf.clone(), Box::new(AmlValue::Integer(idx.clone())))), value);
 
                 Ok(AmlValue::BufferField(b.clone()))
             },
             AmlValue::Package(ref p) => {
-                if indices.len() < 0 {
+                if indices.len() == 0 {
                     return Err(AmlError::AmlValueError);
                 }
 
@@ -491,7 +491,7 @@ impl AmlExecutionContext {
                 Ok(AmlValue::Integer(b.source_buf.get_as_buffer()?[idx as usize] as u64))
             },
             AmlValue::Package(ref p) => {
-                if indices.len() < 0 {
+                if indices.len() == 0 {
                     return Err(AmlError::AmlValueError);
                 }
 
diff --git a/src/acpi/aml/type1opcode.rs b/src/acpi/aml/type1opcode.rs
index 3942ee13496f6cdfa7eb2d367bc69315e82fa88f..1b90930c66d1d9362ad781ae3b932c629ff2135a 100644
--- a/src/acpi/aml/type1opcode.rs
+++ b/src/acpi/aml/type1opcode.rs
@@ -157,7 +157,7 @@ fn parse_def_load(data: &[u8],
     if is_aml_table(sdt) {
         load_table(get_sdt_signature(sdt));
         let delta = parse_aml_table(sdt)?;
-        ctx.modify(ddb_handle_object.val, AmlValue::DDBHandle((delta, get_sdt_signature(sdt))));
+        let _ = ctx.modify(ddb_handle_object.val, AmlValue::DDBHandle((delta, get_sdt_signature(sdt))));
 
         Ok(AmlParseType {
             val: AmlValue::None,
@@ -229,7 +229,7 @@ fn parse_def_release(data: &[u8],
     parser_opcode_extended!(data, 0x27);
 
     let obj = parse_super_name(&data[2..], ctx)?;
-    ctx.release_mutex(obj.val);
+    let _ = ctx.release_mutex(obj.val);
 
     Ok(AmlParseType {
         val: AmlValue::None,
@@ -252,7 +252,7 @@ fn parse_def_reset(data: &[u8],
     let object = parse_super_name(&data[2..], ctx)?;
     ctx.get(object.val.clone())?.get_as_event()?;
 
-    ctx.modify(object.val.clone(), AmlValue::Event(0));
+    let _ = ctx.modify(object.val.clone(), AmlValue::Event(0));
 
     Ok(AmlParseType {
         val: AmlValue::None,
diff --git a/src/acpi/aml/type2opcode.rs b/src/acpi/aml/type2opcode.rs
index ff7698c59ed850f529de56df9911a3a403e7366d..19e359c7a45f4987a8c4bc17851b508274061a1a 100644
--- a/src/acpi/aml/type2opcode.rs
+++ b/src/acpi/aml/type2opcode.rs
@@ -367,9 +367,9 @@ fn parse_def_increment(data: &[u8],
 
     let obj = parse_super_name(&data[1..], ctx)?;
 
-    let mut _namespace = ctx.prelock();
+    let _namespace = ctx.prelock();
     let value = AmlValue::Integer(ctx.get(obj.val.clone())?.get_as_integer()? + 1);
-    ctx.modify(obj.val, value.clone());
+    let _ = ctx.modify(obj.val, value.clone());
 
     Ok(AmlParseType {
         val: value,
@@ -394,7 +394,7 @@ fn parse_def_index(data: &[u8],
     let target = parse_target(&data[1 + obj.len + idx.len..], ctx)?;
 
     let reference = AmlValue::ObjectReference(ObjectReference::Index(Box::new(obj.val), Box::new(idx.val)));
-    ctx.modify(target.val, reference.clone());
+    let _ = ctx.modify(target.val, reference.clone());
 
     Ok(AmlParseType {
         val: reference,
@@ -571,7 +571,7 @@ fn parse_def_to_hex_string(data: &[u8],
         _ => return Err(AmlError::AmlValueError)
     };
 
-    ctx.modify(target.val, res.clone());
+    let _ = ctx.modify(target.val, res.clone());
 
     Ok(AmlParseType {
         val: res,
@@ -595,7 +595,7 @@ fn parse_def_to_buffer(data: &[u8],
     let target = parse_target(&data[2 + operand.len..], ctx)?;
 
     let res = AmlValue::Buffer(operand.val.get_as_buffer()?);
-    ctx.modify(target.val, res.clone());
+    let _ = ctx.modify(target.val, res.clone());
 
     Ok(AmlParseType {
         val: res,
@@ -628,7 +628,7 @@ fn parse_def_to_bcd(data: &[u8],
     }
 
     let result = AmlValue::Integer(result);
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -668,7 +668,7 @@ fn parse_def_to_decimal_string(data: &[u8],
         _ => return Err(AmlError::AmlValueError)
     };
 
-    ctx.modify(target.val, res.clone());
+    let _ = ctx.modify(target.val, res.clone());
 
     Ok(AmlParseType {
         val: res,
@@ -693,7 +693,7 @@ fn parse_def_to_integer(data: &[u8],
 
     let res = AmlValue::Integer(operand.val.get_as_integer()?);
 
-    ctx.modify(target.val, res.clone());
+    let _ = ctx.modify(target.val, res.clone());
 
     Ok(AmlParseType {
         val: res,
@@ -726,7 +726,7 @@ fn parse_def_to_string(data: &[u8],
     string.truncate(length.val.get_as_integer()? as usize);
     let res = AmlValue::String(string);
 
-    ctx.modify(target.val, res.clone());
+    let _ = ctx.modify(target.val, res.clone());
 
     Ok(AmlParseType {
         val: res,
@@ -752,7 +752,7 @@ fn parse_def_subtract(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? - rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -803,7 +803,7 @@ fn parse_def_store(data: &[u8],
     let operand = parse_term_arg(&data[1..], ctx)?;
     let target = parse_super_name(&data[1 + operand.len..], ctx)?;
 
-    ctx.modify(target.val.clone(), operand.val);
+    let _ = ctx.modify(target.val.clone(), operand.val);
 
     Ok(AmlParseType {
         val: target.val,
@@ -829,7 +829,7 @@ fn parse_def_or(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? | rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -855,7 +855,7 @@ fn parse_def_shift_left(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? >> rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -881,7 +881,7 @@ fn parse_def_shift_right(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? << rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -907,7 +907,7 @@ fn parse_def_add(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? + rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -933,7 +933,7 @@ fn parse_def_and(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? & rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -959,7 +959,7 @@ fn parse_def_xor(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? ^ rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1093,7 +1093,7 @@ fn parse_def_cond_ref_of(data: &[u8],
         _ => return Err(AmlError::AmlValueError)
     };
 
-    ctx.modify(target.val, AmlValue::ObjectReference(res));
+    let _ = ctx.modify(target.val, AmlValue::ObjectReference(res));
 
     Ok(AmlParseType {
         val: AmlValue::Integer(1),
@@ -1208,9 +1208,9 @@ fn parse_def_decrement(data: &[u8],
 
     let obj = parse_super_name(&data[1..], ctx)?;
 
-    let namespace = ctx.prelock();
+    let _namespace = ctx.prelock();
     let value = AmlValue::Integer(ctx.get(obj.val.clone())?.get_as_integer()? - 1);
-    ctx.modify(obj.val, value.clone());
+    let _ = ctx.modify(obj.val, value.clone());
 
     Ok(AmlParseType {
         val: value,
@@ -1241,8 +1241,8 @@ fn parse_def_divide(data: &[u8],
     let remainder = numerator % denominator;
     let quotient = (numerator - remainder) / denominator;
 
-    ctx.modify(target_remainder.val, AmlValue::Integer(remainder));
-    ctx.modify(target_quotient.val, AmlValue::Integer(quotient));
+    let _ = ctx.modify(target_remainder.val, AmlValue::Integer(remainder));
+    let _ = ctx.modify(target_quotient.val, AmlValue::Integer(quotient));
 
     Ok(AmlParseType {
         val: AmlValue::Integer(quotient),
@@ -1278,7 +1278,7 @@ fn parse_def_find_set_left_bit(data: &[u8],
     }
 
     let result = AmlValue::Integer(first_bit);
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1318,7 +1318,7 @@ fn parse_def_find_set_right_bit(data: &[u8],
     }
 
     let result = AmlValue::Integer(first_bit);
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1364,7 +1364,7 @@ fn parse_def_load_table(data: &[u8],
 
         if let Some(sdt) = sdt {
             let hdl = parse_aml_with_scope(sdt, root_path.val.get_as_string()?)?;
-            ctx.modify(parameter_path.val, parameter_data.val);
+            let _ = ctx.modify(parameter_path.val, parameter_data.val);
 
             return Ok(AmlParseType {
                 val: AmlValue::DDBHandle((hdl, sdt_signature)),
@@ -1553,7 +1553,7 @@ fn parse_def_from_bcd(data: &[u8],
 
     let result = AmlValue::Integer(result);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1615,7 +1615,7 @@ fn parse_def_mid(data: &[u8],
         }
     };
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1645,7 +1645,7 @@ fn parse_def_mod(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? % rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1672,7 +1672,7 @@ fn parse_def_multiply(data: &[u8],
 
     let result = AmlValue::Integer(lhs.val.get_as_integer()? * rhs.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1698,7 +1698,7 @@ fn parse_def_nand(data: &[u8],
 
     let result = AmlValue::Integer(!(lhs.val.get_as_integer()? & rhs.val.get_as_integer()?));
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1724,7 +1724,7 @@ fn parse_def_nor(data: &[u8],
 
     let result = AmlValue::Integer(!(lhs.val.get_as_integer()? | rhs.val.get_as_integer()?));
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
@@ -1749,7 +1749,7 @@ fn parse_def_not(data: &[u8],
 
     let result = AmlValue::Integer(!operand.val.get_as_integer()?);
 
-    ctx.modify(target.val, result.clone());
+    let _ = ctx.modify(target.val, result.clone());
 
     Ok(AmlParseType {
         val: result,
diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs
index 7d8a1a4c2234fa4f09f162c25940d91628a2ce4b..6d1ac173c623663023bab23212d9599f379e6563 100644
--- a/src/acpi/mod.rs
+++ b/src/acpi/mod.rs
@@ -145,7 +145,7 @@ pub unsafe fn init(active_table: &mut ActivePageTable) {
         rxsdt.map_all(active_table);
 
         for sdt_address in rxsdt.iter() {
-            let sdt = unsafe { &*(sdt_address as *const Sdt) };
+            let sdt = &*(sdt_address as *const Sdt);
 
             let signature = get_sdt_signature(sdt);
             if let Some(ref mut ptrs) = *(SDT_POINTERS.write()) {
diff --git a/src/arch/x86_64/interrupt/irq.rs b/src/arch/x86_64/interrupt/irq.rs
index b4220364d0b854b3af943bd8d25b9d53d567d62e..6cc5a1536bd177e46c25e6ba4dff120dcd0435d8 100644
--- a/src/arch/x86_64/interrupt/irq.rs
+++ b/src/arch/x86_64/interrupt/irq.rs
@@ -53,7 +53,7 @@ interrupt!(pit, {
     pic::MASTER.ack();
 
     if PIT_TICKS.fetch_add(1, Ordering::SeqCst) >= 10 {
-        context::switch();
+        let _ = context::switch();
     }
 
     // Any better way of doing this?
diff --git a/src/consts.rs b/src/consts.rs
index be856c35b7ed5a204fe122fb03b751335d1c7f99..52b2415b91cbdae178bce94ad440c1adcc525a29 100644
--- a/src/consts.rs
+++ b/src/consts.rs
@@ -15,7 +15,7 @@
     /// Offset to kernel heap
     pub const KERNEL_HEAP_OFFSET: usize = KERNEL_OFFSET + PML4_SIZE/2;
     /// Size of kernel heap
-    pub const KERNEL_HEAP_SIZE: usize = 64 * 1024 * 1024; // 64 MB
+    pub const KERNEL_HEAP_SIZE: usize = 256 * 1024 * 1024; // 256 MB
 
     /// Offset to kernel percpu variables
     //TODO: Use 64-bit fs offset to enable this pub const KERNEL_PERCPU_OFFSET: usize = KERNEL_HEAP_OFFSET - PML4_SIZE;
diff --git a/src/context/mod.rs b/src/context/mod.rs
index f0e428c1ab711756be7e9a5430c6c9719d37d600..62ef93a056f73418a88fbeb1baeb6880f066fff0 100644
--- a/src/context/mod.rs
+++ b/src/context/mod.rs
@@ -7,7 +7,7 @@ use spin::{Once, RwLock, RwLockReadGuard, RwLockWriteGuard};
 
 pub use self::context::{Context, ContextId, Status};
 pub use self::list::ContextList;
-pub use self::switch::switch;
+pub use self::switch::{switch, SwitchResult};
 
 #[path = "arch/x86_64.rs"]
 mod arch;
diff --git a/src/context/switch.rs b/src/context/switch.rs
index 54f188004d92ef480972a2ad1b6e9698fc676523..91ac6f2d8eb41e6eaaa32164e76c66b40f6a4c6f 100644
--- a/src/context/switch.rs
+++ b/src/context/switch.rs
@@ -10,12 +10,22 @@ use interrupt::irq::PIT_TICKS;
 use syscall;
 use time;
 
+#[must_use]
+pub enum SwitchResult {
+    /// No context to switch to
+    None,
+    /// Received a signal
+    Signal,
+    /// Switched correctly
+    Normal,
+}
+
 /// Switch to the next context
 ///
 /// # Safety
 ///
 /// Do not call this while holding locks!
-pub unsafe fn switch() -> bool {
+pub unsafe fn switch() -> SwitchResult {
     use core::ops::DerefMut;
 
     //set PIT Interrupt counter to 0, giving each process same amount of PIT ticks
@@ -122,23 +132,26 @@ pub unsafe fn switch() -> bool {
         }
     };
 
-    if to_ptr as usize == 0 {
-        // Unset global lock if no context found
-        arch::CONTEXT_SWITCH_LOCK.store(false, Ordering::SeqCst);
-        return false;
-    }
-
-    (&mut *from_ptr).running = false;
-    (&mut *to_ptr).running = true;
-    if let Some(ref stack) = (*to_ptr).kstack {
-        gdt::TSS.rsp[0] = (stack.as_ptr() as usize + stack.len() - 256) as u64;
+    // Switch process states, TSS stack pointer, and store new context ID
+    if to_ptr as usize != 0 {
+        (&mut *from_ptr).running = false;
+        (&mut *to_ptr).running = true;
+        if let Some(ref stack) = (*to_ptr).kstack {
+            gdt::TSS.rsp[0] = (stack.as_ptr() as usize + stack.len() - 256) as u64;
+        }
+        CONTEXT_ID.store((&mut *to_ptr).id, Ordering::SeqCst);
     }
-    CONTEXT_ID.store((&mut *to_ptr).id, Ordering::SeqCst);
 
     // Unset global lock before switch, as arch is only usable by the current CPU at this time
     arch::CONTEXT_SWITCH_LOCK.store(false, Ordering::SeqCst);
 
-    if let Some(sig) = to_sig {
+    if to_ptr as usize == 0 {
+        // No target was found, return
+
+        SwitchResult::None
+    } else if let Some(sig) = to_sig {
+        // Signal was found, run signal handler
+
         //TODO: Allow nested signals
         assert!((&mut *to_ptr).ksig.is_none());
 
@@ -147,11 +160,17 @@ pub unsafe fn switch() -> bool {
         let kstack = (&mut *to_ptr).kstack.clone();
         (&mut *to_ptr).ksig = Some((arch, kfx, kstack));
         (&mut *to_ptr).arch.signal_stack(signal_handler, sig);
-    }
 
-    (&mut *from_ptr).arch.switch_to(&mut (&mut *to_ptr).arch);
+        (&mut *from_ptr).arch.switch_to(&mut (&mut *to_ptr).arch);
 
-    true
+        SwitchResult::Signal
+    } else {
+        // Found a target, had no signals
+
+        (&mut *from_ptr).arch.switch_to(&mut (&mut *to_ptr).arch);
+
+        SwitchResult::Normal
+    }
 }
 
 extern "C" fn signal_handler(sig: usize) {
diff --git a/src/devices/uart_16550.rs b/src/devices/uart_16550.rs
index 8dfb356d5116987b1dd0244a12ae965b9cf147d7..ac628313c0722f309e21fe24f7246b63459ceb42 100644
--- a/src/devices/uart_16550.rs
+++ b/src/devices/uart_16550.rs
@@ -57,7 +57,7 @@ impl SerialPort<Pio<u8>> {
 }
 
 impl SerialPort<Mmio<u8>> {
-    pub fn new(base: usize) -> SerialPort<Mmio<u8>> {
+    pub fn new(_base: usize) -> SerialPort<Mmio<u8>> {
         SerialPort {
             data: Mmio::new(),
             int_en: Mmio::new(),
diff --git a/src/lib.rs b/src/lib.rs
index ffde36a694d4a2f2cca6f7e2d8530ad6b9d69cf9..c30602b78b94676f7abc482656767c0bcba43167 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -14,7 +14,6 @@
 #![feature(const_fn)]
 #![feature(const_max_value)]
 #![feature(core_intrinsics)]
-#![feature(drop_types_in_const)]
 #![feature(global_allocator)]
 #![feature(integer_atomics)]
 #![feature(lang_items)]
@@ -41,6 +40,7 @@ use alloc::arc::Arc;
 use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
 use spin::Mutex;
 
+use context::SwitchResult;
 use scheme::{FileHandle, SchemeNamespace};
 
 pub use consts::*;
@@ -171,11 +171,14 @@ pub fn kmain(cpus: usize, env: &[u8]) -> ! {
     loop {
         unsafe {
             interrupt::disable();
-            if context::switch() {
-                interrupt::enable_and_nop();
-            } else {
-                // Enable interrupts, then halt CPU (to save power) until the next interrupt is actually fired.
-                interrupt::enable_and_halt();
+            match context::switch() {
+                SwitchResult::None => {
+                    // Enable interrupts, then halt CPU (to save power) until the next interrupt is actually fired.
+                    interrupt::enable_and_halt();
+                }
+                _ => {
+                    interrupt::enable_and_nop();
+                }
             }
         }
     }
@@ -195,11 +198,14 @@ pub fn kmain_ap(id: usize) -> ! {
         loop {
             unsafe {
                 interrupt::disable();
-                if context::switch() {
-                    interrupt::enable_and_nop();
-                } else {
-                    // Enable interrupts, then halt CPU (to save power) until the next interrupt is actually fired.
-                    interrupt::enable_and_halt();
+                match context::switch() {
+                    SwitchResult::None => {
+                        // Enable interrupts, then halt CPU (to save power) until the next interrupt is actually fired.
+                        interrupt::enable_and_halt();
+                    }
+                    _ => {
+                        interrupt::enable_and_nop();
+                    }
                 }
             }
         }
diff --git a/src/scheme/pipe.rs b/src/scheme/pipe.rs
index 9bd5f6790c948b11f585213298c65146fe9cfd86..f30a901a5784e386f5c98e58bf1b84d9d9c0dec3 100644
--- a/src/scheme/pipe.rs
+++ b/src/scheme/pipe.rs
@@ -3,10 +3,10 @@ use collections::{BTreeMap, VecDeque};
 use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
 use spin::{Mutex, Once, RwLock, RwLockReadGuard, RwLockWriteGuard};
 
-use context;
+use context::{self, SwitchResult};
 use scheme::{AtomicSchemeId, ATOMIC_SCHEMEID_INIT, SchemeId};
 use sync::WaitCondition;
-use syscall::error::{Error, Result, EAGAIN, EBADF, EINVAL, EPIPE, ESPIPE};
+use syscall::error::{Error, Result, EAGAIN, EBADF, EINTR, EINVAL, EPIPE, ESPIPE};
 use syscall::flag::{EVENT_READ, F_GETFL, F_SETFL, O_ACCMODE, O_NONBLOCK, MODE_FIFO};
 use syscall::scheme::Scheme;
 use syscall::data::Stat;
@@ -236,7 +236,13 @@ impl PipeRead {
             } else if self.flags.load(Ordering::SeqCst) & O_NONBLOCK == O_NONBLOCK {
                 return Err(Error::new(EAGAIN));
             } else {
-                self.condition.wait();
+                match self.condition.wait() {
+                    SwitchResult::Signal => {
+                        println!("Received signal during pipe read");
+                        return Err(Error::new(EINTR));
+                    },
+                    _ => ()
+                }
             }
         }
     }
diff --git a/src/sync/wait_condition.rs b/src/sync/wait_condition.rs
index d48af9d67a250f10c42dcbb2b50db4fe6c86c354..46db303f947926474df322037e462fe052d85683 100644
--- a/src/sync/wait_condition.rs
+++ b/src/sync/wait_condition.rs
@@ -2,7 +2,7 @@ use alloc::arc::Arc;
 use collections::Vec;
 use spin::{Mutex, RwLock};
 
-use context::{self, Context};
+use context::{self, Context, SwitchResult};
 
 #[derive(Debug)]
 pub struct WaitCondition {
@@ -25,7 +25,7 @@ impl WaitCondition {
         len
     }
 
-    pub fn wait(&self) {
+    pub fn wait(&self) -> SwitchResult {
         {
             let context_lock = {
                 let contexts = context::contexts();
@@ -37,7 +37,8 @@ impl WaitCondition {
 
             self.contexts.lock().push(context_lock);
         }
-        unsafe { context::switch(); }
+
+        unsafe { context::switch() }
     }
 }
 
diff --git a/src/sync/wait_map.rs b/src/sync/wait_map.rs
index c0198a175b0c10ac3e0aea506979ccaec1e6dd30..1812077ffafed587e6af080ae48665ce9604cbcf 100644
--- a/src/sync/wait_map.rs
+++ b/src/sync/wait_map.rs
@@ -27,7 +27,7 @@ impl<K, V> WaitMap<K, V> where K: Clone + Ord {
             if let Some(value) = self.receive_nonblock(key) {
                 return value;
             }
-            self.condition.wait();
+            let _ = self.condition.wait();
         }
     }
 
@@ -45,7 +45,7 @@ impl<K, V> WaitMap<K, V> where K: Clone + Ord {
             if let Some(entry) = self.receive_any_nonblock() {
                 return entry;
             }
-            self.condition.wait();
+            let _ = self.condition.wait();
         }
     }
 
diff --git a/src/sync/wait_queue.rs b/src/sync/wait_queue.rs
index fdf81b54b1ec00d6b30e4ca88f61ab6a6e1fa0c0..d36bc30dbaa6842a39df767eaee9213c46712ef3 100644
--- a/src/sync/wait_queue.rs
+++ b/src/sync/wait_queue.rs
@@ -33,7 +33,7 @@ impl<T> WaitQueue<T> {
             if let Some(value) = self.inner.lock().pop_front() {
                 return value;
             }
-            self.condition.wait();
+            let _ = self.condition.wait();
         }
     }
 
diff --git a/src/syscall/privilege.rs b/src/syscall/privilege.rs
index 4351262d579d0ee02e9a7a1746a2dc4c4bc7fecd..c5d6f6e7e693d39bddf5d9989f61dcc637807070 100644
--- a/src/syscall/privilege.rs
+++ b/src/syscall/privilege.rs
@@ -78,10 +78,10 @@ pub fn setregid(rgid: u32, egid: u32) -> Result<usize> {
             // Allow changing RGID if root
             true
         } else if rgid == context.egid {
-            /// Allow changing RGID if used for EGID
+            // Allow changing RGID if used for EGID
             true
         } else if rgid == context.rgid {
-            /// Allow changing RGID if used for RGID
+            // Allow changing RGID if used for RGID
             true
         } else if rgid as i32 == -1 {
             // Ignore RGID if -1 is passed
@@ -96,10 +96,10 @@ pub fn setregid(rgid: u32, egid: u32) -> Result<usize> {
             // Allow changing EGID if root
             true
         } else if egid == context.egid {
-            /// Allow changing EGID if used for EGID
+            // Allow changing EGID if used for EGID
             true
         } else if egid == context.rgid {
-            /// Allow changing EGID if used for RGID
+            // Allow changing EGID if used for RGID
             true
         } else if egid as i32 == -1 {
             // Ignore EGID if -1 is passed
diff --git a/src/syscall/process.rs b/src/syscall/process.rs
index 8a56b24fc64be3490340c4207c88a3ec8a23f2cc..5c1309ecb814d781af44b07630006f9ef57addfc 100644
--- a/src/syscall/process.rs
+++ b/src/syscall/process.rs
@@ -473,7 +473,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> {
         }
     }
 
-    unsafe { context::switch(); }
+    let _ = unsafe { context::switch() };
 
     Ok(pid)
 }
@@ -919,7 +919,7 @@ pub fn exit(status: usize) -> ! {
         }
     }
 
-    unsafe { context::switch(); }
+    let _ = unsafe { context::switch() };
 
     unreachable!();
 }
@@ -1098,7 +1098,7 @@ pub fn sigreturn() -> Result<usize> {
         context.block();
     }
 
-    unsafe { context::switch(); }
+    let _ = unsafe { context::switch() };
 
     unreachable!();
 }