diff --git a/arch/x86_64/src/device/mod.rs b/arch/x86_64/src/device/mod.rs
index d4d56e66645d75901afebb5e9b15e8864f12e6be..522b2b484ffcb600ef4abd6125ae7f2d5a09d595 100644
--- a/arch/x86_64/src/device/mod.rs
+++ b/arch/x86_64/src/device/mod.rs
@@ -2,10 +2,12 @@ use paging::ActivePageTable;
 
 pub mod cpu;
 pub mod local_apic;
+pub mod pic;
 pub mod rtc;
 pub mod serial;
 
 pub unsafe fn init(active_table: &mut ActivePageTable){
+    pic::init();
     local_apic::init(active_table);
     rtc::init();
     serial::init();
diff --git a/arch/x86_64/src/device/pic.rs b/arch/x86_64/src/device/pic.rs
new file mode 100644
index 0000000000000000000000000000000000000000..f5b636987e90f6ddd03727060c92eb65becf9cf8
--- /dev/null
+++ b/arch/x86_64/src/device/pic.rs
@@ -0,0 +1,48 @@
+use syscall::io::{Io, Pio};
+
+pub static mut MASTER: Pic = Pic::new(0x20);
+pub static mut SLAVE: Pic = Pic::new(0xA0);
+
+pub unsafe fn init() {
+    // Start initialization
+    MASTER.cmd.write(0x11);
+    SLAVE.cmd.write(0x11);
+
+    // Set offsets
+    MASTER.data.write(0x20);
+    SLAVE.data.write(0x28);
+
+    // Set up cascade
+    MASTER.data.write(4);
+    SLAVE.data.write(2);
+
+    // Set up interrupt mode (1 is manual, 2 is auto EOI)
+    MASTER.data.write(1);
+    SLAVE.data.write(1);
+
+    // Unmask interrupts
+    MASTER.data.write(0);
+    SLAVE.data.write(0);
+
+    // Ack remaining interrupts
+    MASTER.ack();
+    SLAVE.ack();
+}
+
+pub struct Pic {
+    cmd: Pio<u8>,
+    data: Pio<u8>,
+}
+
+impl Pic {
+    pub const fn new(port: u16) -> Pic {
+        Pic {
+            cmd: Pio::new(port),
+            data: Pio::new(port + 1),
+        }
+    }
+
+    pub fn ack(&mut self) {
+        self.cmd.write(0x20);
+    }
+}
diff --git a/arch/x86_64/src/start.rs b/arch/x86_64/src/start.rs
index 72772ea18b18e34193b8336ee032eb1589d8e218..448800959f7142c54a3682c9b9c4a2e3b615d8b7 100644
--- a/arch/x86_64/src/start.rs
+++ b/arch/x86_64/src/start.rs
@@ -120,10 +120,6 @@ pub unsafe extern fn kstart() -> ! {
         // Read ACPI tables, starts APs
         acpi::init(&mut active_table);
 
-        // Clear pending IRQs
-        // TODO: Remove this and ack all IRQs without listeners
-        interrupt::irq::acknowledge(8);
-
         BSP_READY.store(true, Ordering::SeqCst);
     }