Index: kernel/arch/ia32/src/drivers/i8254.c
===================================================================
--- kernel/arch/ia32/src/drivers/i8254.c	(revision 7e5897971c2ec9ea1f833d1f148bc179a7abf5a7)
+++ kernel/arch/ia32/src/drivers/i8254.c	(revision ac88c93e54a03010f4e42edfccfda35af3482f3e)
@@ -83,4 +83,5 @@
 {
 	irq_initialize(&i8254_irq);
+	i8254_irq.preack = true;
 	i8254_irq.devno = device_assign_devno();
 	i8254_irq.inr = IRQ_CLK;
Index: kernel/arch/ia32/src/interrupt.c
===================================================================
--- kernel/arch/ia32/src/interrupt.c	(revision 7e5897971c2ec9ea1f833d1f148bc179a7abf5a7)
+++ kernel/arch/ia32/src/interrupt.c	(revision ac88c93e54a03010f4e42edfccfda35af3482f3e)
@@ -177,7 +177,8 @@
 	
 	int inum = n - IVT_IRQBASE;
+	bool ack = false;
 	ASSERT(inum < IRQ_COUNT);
 	ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1));
-
+	
 	irq_t *irq = irq_dispatch_and_lock(inum);
 	if (irq) {
@@ -185,4 +186,10 @@
 		 * The IRQ handler was found.
 		 */
+		 
+		if (irq->preack) {
+			/* Send EOI before processing the interrupt */
+			trap_virtual_eoi();
+			ack = true;
+		}
 		irq->handler(irq, irq->arg);
 		spinlock_unlock(&irq->lock);
@@ -195,5 +202,7 @@
 #endif
 	}
-	trap_virtual_eoi();
+	
+	if (!ack)
+		trap_virtual_eoi();
 }
 
Index: kernel/arch/ia32/src/smp/apic.c
===================================================================
--- kernel/arch/ia32/src/smp/apic.c	(revision 7e5897971c2ec9ea1f833d1f148bc179a7abf5a7)
+++ kernel/arch/ia32/src/smp/apic.c	(revision ac88c93e54a03010f4e42edfccfda35af3482f3e)
@@ -170,4 +170,5 @@
 	
 	irq_initialize(&l_apic_timer_irq);
+	l_apic_timer_irq.preack = true;
 	l_apic_timer_irq.devno = device_assign_devno();
 	l_apic_timer_irq.inr = IRQ_CLK;
