Index: kernel/arch/ia32/src/smp/apic.c
===================================================================
--- kernel/arch/ia32/src/smp/apic.c	(revision 410ed0de5f795378bddd39291f618013b459d912)
+++ kernel/arch/ia32/src/smp/apic.c	(revision 3e35fd71b00303c0b9a3181c7922806e86f52ff0)
@@ -45,4 +45,6 @@
 #include <arch/asm.h>
 #include <arch.h>
+#include <ddi/irq.h>
+#include <ddi/device.h>
 
 #ifdef CONFIG_SMP
@@ -72,4 +74,5 @@
 
 uint32_t apic_id_mask = 0;
+static irq_t l_apic_timer_irq;
 
 static int apic_poll_errors(void);
@@ -118,7 +121,25 @@
 #endif /* LAPIC_VERBOSE */
 
-
-static void apic_spurious(int n, istate_t *istate);
-static void l_apic_timer_interrupt(int n, istate_t *istate);
+/** APIC spurious interrupt handler.
+ *
+ * @param n Interrupt vector.
+ * @param istate Interrupted state.
+ */
+static void apic_spurious(int n, istate_t *istate)
+{
+#ifdef CONFIG_DEBUG
+	printf("cpu%d: APIC spurious interrupt\n", CPU->id);
+#endif
+}
+
+static irq_ownership_t l_apic_timer_claim(void)
+{
+	return IRQ_ACCEPT;
+}
+
+static void l_apic_timer_irq_handler(irq_t *irq, void *arg, ...)
+{
+	clock();
+}
 
 /** Initialize APIC on BSP. */
@@ -140,11 +161,17 @@
 	 */
 	io_apic_disable_irqs(0xffff);
-	exc_register(VECTOR_CLK, "l_apic_timer", (iroutine) l_apic_timer_interrupt);
+	
+	irq_initialize(&l_apic_timer_irq);
+	l_apic_timer_irq.devno = device_assign_devno();
+	l_apic_timer_irq.inr = IRQ_CLK;
+	l_apic_timer_irq.claim = l_apic_timer_claim;
+	l_apic_timer_irq.handler = l_apic_timer_irq_handler;
+	irq_register(&l_apic_timer_irq);
+	
 	for (i = 0; i < IRQ_COUNT; i++) {
 		int pin;
 	
-		if ((pin = smp_irq_to_pin(i)) != -1) {
+		if ((pin = smp_irq_to_pin(i)) != -1)
 			io_apic_change_ioredtbl(pin, DEST_ALL, IVT_IRQBASE+i, LOPRI);
-		}
 	}
 	
@@ -153,7 +180,7 @@
 	 */
 	idreg.value = io_apic_read(IOAPICID);
-	if ((1<<idreg.apic_id) & apic_id_mask) {	/* see if IO APIC ID is used already */
+	if ((1 << idreg.apic_id) & apic_id_mask) {	/* see if IO APIC ID is used already */
 		for (i = 0; i < APIC_ID_COUNT; i++) {
-			if (!((1<<i) & apic_id_mask)) {
+			if (!((1 << i) & apic_id_mask)) {
 				idreg.apic_id = i;
 				io_apic_write(IOAPICID, idreg.value);
@@ -169,16 +196,4 @@
 
 	l_apic_debug();	
-}
-
-/** APIC spurious interrupt handler.
- *
- * @param n Interrupt vector.
- * @param istate Interrupted state.
- */
-void apic_spurious(int n, istate_t *istate)
-{
-#ifdef CONFIG_DEBUG
-	printf("cpu%d: APIC spurious interrupt\n", CPU->id);
-#endif
 }
 
@@ -441,15 +456,4 @@
 }
 
-/** Local APIC Timer Interrupt.
- *
- * @param n Interrupt vector number.
- * @param istate Interrupted state.
- */
-void l_apic_timer_interrupt(int n, istate_t *istate)
-{
-	l_apic_eoi();
-	clock();
-}
-
 /** Get Local APIC ID.
  *
