Index: kernel/arch/ia32/src/drivers/i8254.c
===================================================================
--- kernel/arch/ia32/src/drivers/i8254.c	(revision a78cdcdcf390f50d5c22636e2478d9debc21bc61)
+++ kernel/arch/ia32/src/drivers/i8254.c	(revision 2e311daf8cae0e3b930fd0f490e13611dd9eaa77)
@@ -96,8 +96,8 @@
 {
 	pio_write_8(CLK_PORT4, 0x36);
-	pic_disable_irqs(1 << IRQ_CLK);
+	i8259_disable_irqs(1 << IRQ_CLK);
 	pio_write_8(CLK_PORT1, (CLK_CONST / HZ) & 0xf);
 	pio_write_8(CLK_PORT1, (CLK_CONST / HZ) >> 8);
-	pic_enable_irqs(1 << IRQ_CLK);
+	i8259_enable_irqs(1 << IRQ_CLK);
 }
 
Index: kernel/arch/ia32/src/ia32.c
===================================================================
--- kernel/arch/ia32/src/ia32.c	(revision a78cdcdcf390f50d5c22636e2478d9debc21bc61)
+++ kernel/arch/ia32/src/ia32.c	(revision 2e311daf8cae0e3b930fd0f490e13611dd9eaa77)
@@ -58,4 +58,5 @@
 #include <genarch/multiboot/multiboot.h>
 #include <genarch/multiboot/multiboot2.h>
+#include <genarch/pic/pic_ops.h>
 #include <arch/pm.h>
 #include <arch/vreg.h>
@@ -112,12 +113,6 @@
 		    (i8259_t *) I8259_PIC1_BASE, IVT_IRQBASE);
 
-		/*
-		 * Set the enable/disable IRQs handlers.
-		 * Set the End-of-Interrupt handler.
-		 */
-		enable_irqs_function = pic_enable_irqs;
-		disable_irqs_function = pic_disable_irqs;
-		eoi_function = pic_eoi;
-		irqs_info = "i8259";
+		/* Set PIC operations. */
+		pic_ops = &i8259_pic_ops;
 	}
 }
@@ -194,6 +189,6 @@
 			indev_t *kbrd = kbrd_wire(kbrd_instance, sink);
 			i8042_wire(i8042_instance, kbrd);
-			trap_virtual_enable_irqs(1 << IRQ_KBD);
-			trap_virtual_enable_irqs(1 << IRQ_MOUSE);
+			pic_ops->enable_irqs(1 << IRQ_KBD);
+			pic_ops->enable_irqs(1 << IRQ_MOUSE);
 		}
 	}
@@ -220,5 +215,5 @@
 			indev_t *srln = srln_wire(srln_instance, sink);
 			ns16550_wire(ns16550_instance, srln);
-			trap_virtual_enable_irqs(1 << IRQ_NS16550);
+			pic_ops->enable_irqs(1 << IRQ_NS16550);
 		}
 #endif
@@ -231,6 +226,5 @@
 #endif
 
-	if (irqs_info != NULL)
-		sysinfo_set_item_val(irqs_info, NULL, true);
+	sysinfo_set_item_val(pic_ops->get_name(), NULL, true);
 }
 
Index: kernel/arch/ia32/src/interrupt.c
===================================================================
--- kernel/arch/ia32/src/interrupt.c	(revision a78cdcdcf390f50d5c22636e2478d9debc21bc61)
+++ kernel/arch/ia32/src/interrupt.c	(revision 2e311daf8cae0e3b930fd0f490e13611dd9eaa77)
@@ -40,4 +40,5 @@
 #include <panic.h>
 #include <genarch/drivers/i8259/i8259.h>
+#include <genarch/pic/pic_ops.h>
 #include <halt.h>
 #include <cpu.h>
@@ -61,8 +62,5 @@
  */
 
-void (*disable_irqs_function)(uint16_t irqmask) = NULL;
-void (*enable_irqs_function)(uint16_t irqmask) = NULL;
-void (*eoi_function)(unsigned int) = NULL;
-const char *irqs_info = NULL;
+pic_ops_t *pic_ops = NULL;
 
 void istate_decode(istate_t *istate)
@@ -88,13 +86,4 @@
 	    istate_from_uspace(istate) ? istate->esp :
 	    (uint32_t) &istate->esp);
-}
-
-static void trap_virtual_eoi(unsigned int inum)
-{
-	if (eoi_function)
-		eoi_function(inum);
-	else
-		panic("No eoi_function.");
-
 }
 
@@ -179,5 +168,5 @@
     istate_t *istate __attribute__((unused)))
 {
-	trap_virtual_eoi(0);
+	pic_ops->eoi(0);
 	tlb_shootdown_ipi_recv();
 }
@@ -202,5 +191,5 @@
 		if (irq->preack) {
 			/* Send EOI before processing the interrupt */
-			trap_virtual_eoi(inum);
+			pic_ops->eoi(inum);
 			ack = true;
 		}
@@ -215,5 +204,5 @@
 
 	if (!ack)
-		trap_virtual_eoi(inum);
+		pic_ops->eoi(inum);
 }
 
@@ -221,10 +210,10 @@
 {
 	unsigned int inum = n - IVT_IRQBASE;
-	if (!pic_is_spurious(inum)) {
+	if (!pic_ops->is_spurious(inum)) {
 		/* This is actually not a spurious IRQ, so proceed as usual. */
 		irq_interrupt(n, istate);
 		return;
 	}
-	pic_handle_spurious(n);
+	pic_ops->handle_spurious(n);
 #ifdef CONFIG_DEBUG
 	log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id,
@@ -264,20 +253,4 @@
 }
 
-void trap_virtual_enable_irqs(uint16_t irqmask)
-{
-	if (enable_irqs_function)
-		enable_irqs_function(irqmask);
-	else
-		panic("No enable_irqs_function.");
-}
-
-void trap_virtual_disable_irqs(uint16_t irqmask)
-{
-	if (disable_irqs_function)
-		disable_irqs_function(irqmask);
-	else
-		panic("No disable_irqs_function.");
-}
-
 /** @}
  */
Index: kernel/arch/ia32/src/smp/apic.c
===================================================================
--- kernel/arch/ia32/src/smp/apic.c	(revision a78cdcdcf390f50d5c22636e2478d9debc21bc61)
+++ kernel/arch/ia32/src/smp/apic.c	(revision 2e311daf8cae0e3b930fd0f490e13611dd9eaa77)
@@ -47,4 +47,5 @@
 #include <arch.h>
 #include <ddi/irq.h>
+#include <genarch/pic/pic_ops.h>
 
 #ifdef CONFIG_SMP
@@ -63,4 +64,17 @@
  */
 
+static const char *apic_get_name(void);
+static bool l_apic_is_spurious(unsigned int);
+static void l_apic_handle_spurious(unsigned int);
+
+pic_ops_t apic_pic_ops = {
+	.get_name = apic_get_name,
+	.enable_irqs = io_apic_enable_irqs,
+	.disable_irqs = io_apic_disable_irqs,
+	.eoi = l_apic_eoi,
+	.is_spurious = l_apic_is_spurious,
+	.handle_spurious = l_apic_handle_spurious,
+};
+
 /*
  * These variables either stay configured as initilalized, or are changed by
@@ -125,4 +139,18 @@
 #endif /* LAPIC_VERBOSE */
 
+const char *apic_get_name(void)
+{
+	return "apic";
+}
+
+bool l_apic_is_spurious(unsigned int n)
+{
+	return n == VECTOR_APIC_SPUR;
+}
+
+void l_apic_handle_spurious(unsigned int n)
+{
+}
+
 /** APIC spurious interrupt handler.
  *
@@ -134,7 +162,4 @@
     istate_t *istate __attribute__((unused)))
 {
-#ifdef CONFIG_DEBUG
-	log(LF_ARCH, LVL_DEBUG, "cpu%u: APIC spurious interrupt", CPU->id);
-#endif
 }
 
@@ -175,8 +200,5 @@
 	    (iroutine_t) apic_spurious);
 
-	enable_irqs_function = io_apic_enable_irqs;
-	disable_irqs_function = io_apic_disable_irqs;
-	eoi_function = l_apic_eoi;
-	irqs_info = "apic";
+	pic_ops = &apic_pic_ops;
 
 	/*
Index: kernel/arch/ia32/src/smp/smp.c
===================================================================
--- kernel/arch/ia32/src/smp/smp.c	(revision a78cdcdcf390f50d5c22636e2478d9debc21bc61)
+++ kernel/arch/ia32/src/smp/smp.c	(revision 2e311daf8cae0e3b930fd0f490e13611dd9eaa77)
@@ -130,5 +130,5 @@
 	pio_write_8((ioport8_t *) 0x71, 0xa);
 
-	pic_disable_irqs(0xffff);
+	i8259_disable_irqs(0xffff);
 	apic_init();
 
