Index: kernel/arch/amd64/src/interrupt.c
===================================================================
--- kernel/arch/amd64/src/interrupt.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/amd64/src/interrupt.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -174,5 +174,5 @@
 			ack = true;
 		}
-		irq->handler(irq, irq->arg);
+		irq->handler(irq);
 		spinlock_unlock(&irq->lock);
 	} else {
Index: kernel/arch/arm32/src/drivers/gxemul.c
===================================================================
--- kernel/arch/arm32/src/drivers/gxemul.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/arm32/src/drivers/gxemul.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -185,7 +185,6 @@
  *  
  *  @param irq IRQ information.
- *  @param arg Not used.
- */
-static void gxemul_irq_handler(irq_t *irq, void *arg, ...)
+ */
+static void gxemul_irq_handler(irq_t *irq)
 {
 	if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) {
@@ -205,5 +204,5 @@
 }
 
-static irq_ownership_t gxemul_claim(void)
+static irq_ownership_t gxemul_claim(void *instance)
 {
 	return IRQ_ACCEPT;
@@ -267,5 +266,5 @@
 }
 
-static irq_ownership_t gxemul_timer_claim(void)
+static irq_ownership_t gxemul_timer_claim(void *instance)
 {
 	return IRQ_ACCEPT;
@@ -277,5 +276,5 @@
  * @param arg Not used.
  */
-static void gxemul_timer_irq_handler(irq_t *irq, void *arg, ...)
+static void gxemul_timer_irq_handler(irq_t *irq)
 {
 	/*
@@ -371,5 +370,5 @@
 			if (irq) {
 				/* The IRQ handler was found. */
-				irq->handler(irq, irq->arg);
+				irq->handler(irq);
 				spinlock_unlock(&irq->lock);
 			} else {
Index: kernel/arch/ia32/src/drivers/i8254.c
===================================================================
--- kernel/arch/ia32/src/drivers/i8254.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/ia32/src/drivers/i8254.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -62,10 +62,10 @@
 static irq_t i8254_irq;
 
-static irq_ownership_t i8254_claim(void)
+static irq_ownership_t i8254_claim(void *instance)
 {
 	return IRQ_ACCEPT;
 }
 
-static void i8254_irq_handler(irq_t *irq, void *arg __attribute__((unused)), ...)
+static void i8254_irq_handler(irq_t *irq)
 {
 	/*
Index: kernel/arch/ia32/src/interrupt.c
===================================================================
--- kernel/arch/ia32/src/interrupt.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/ia32/src/interrupt.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -189,5 +189,5 @@
 			ack = true;
 		}
-		irq->handler(irq, irq->arg);
+		irq->handler(irq);
 		spinlock_unlock(&irq->lock);
 	} else {
Index: kernel/arch/ia32/src/smp/apic.c
===================================================================
--- kernel/arch/ia32/src/smp/apic.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/ia32/src/smp/apic.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -133,10 +133,10 @@
 }
 
-static irq_ownership_t l_apic_timer_claim(void)
+static irq_ownership_t l_apic_timer_claim(void *instance)
 {
 	return IRQ_ACCEPT;
 }
 
-static void l_apic_timer_irq_handler(irq_t *irq, void *arg __attribute__((unused)), ...)
+static void l_apic_timer_irq_handler(irq_t *irq)
 {
 	/*
Index: kernel/arch/ia64/src/drivers/it.c
===================================================================
--- kernel/arch/ia64/src/drivers/it.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/ia64/src/drivers/it.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -57,6 +57,6 @@
 static irq_t it_irq;
 
-static irq_ownership_t it_claim(void);
-static void it_interrupt(irq_t *irq, void *arg, ...);
+static irq_ownership_t it_claim(void *);
+static void it_interrupt(irq_t *irq);
 
 /** Initialize Interval Timer. */
@@ -105,5 +105,5 @@
  * @return Always IRQ_ACCEPT.
  */
-irq_ownership_t it_claim(void)
+irq_ownership_t it_claim(void *instance)
 {
 	return IRQ_ACCEPT;
@@ -111,5 +111,5 @@
 
 /** Process Interval Timer interrupt. */
-void it_interrupt(irq_t *irq, void *arg, ...)
+void it_interrupt(irq_t *irq)
 {
 	int64_t c;
Index: kernel/arch/ia64/src/interrupt.c
===================================================================
--- kernel/arch/ia64/src/interrupt.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/ia64/src/interrupt.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -267,5 +267,5 @@
 		irq = irq_dispatch_and_lock(ivr.vector);
 		if (irq) {
-			irq->handler(irq, irq->arg);
+			irq->handler(irq);
 			spinlock_unlock(&irq->lock);
 		} else {
@@ -284,5 +284,5 @@
 				end_of_local_irq();
 			}
-			irq->handler(irq, irq->arg);
+			irq->handler(irq);
 			if (!irq->preack)
 				end_of_local_irq();
Index: kernel/arch/ia64/src/ski/ski.c
===================================================================
--- kernel/arch/ia64/src/ski/ski.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/ia64/src/ski/ski.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -187,5 +187,5 @@
  * @return Always IRQ_DECLINE.
  */
-static irq_ownership_t ski_kbd_claim(void)
+static irq_ownership_t ski_kbd_claim(void *instance)
 {
 	return IRQ_DECLINE;
Index: kernel/arch/mips32/src/drivers/msim.c
===================================================================
--- kernel/arch/mips32/src/drivers/msim.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/mips32/src/drivers/msim.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -95,5 +95,5 @@
 
 /** Process keyboard interrupt. */
-static void msim_irq_handler(irq_t *irq, void *arg, ...)
+static void msim_irq_handler(irq_t *irq)
 {
 	if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox))
@@ -111,5 +111,5 @@
 }
 
-static irq_ownership_t msim_claim(void)
+static irq_ownership_t msim_claim(void *instance)
 {
 	return IRQ_ACCEPT;
Index: kernel/arch/mips32/src/drivers/serial.c
===================================================================
--- kernel/arch/mips32/src/drivers/serial.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/mips32/src/drivers/serial.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -113,5 +113,5 @@
 
 /** Process keyboard interrupt. Does not work in simics? */
-static void serial_irq_handler(irq_t *irq, void *arg, ...)
+static void serial_irq_handler(irq_t *irq)
 {
 	if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox))
@@ -121,5 +121,5 @@
 }
 
-static irq_ownership_t serial_claim(void)
+static irq_ownership_t serial_claim(void *instance)
 {
 	return IRQ_ACCEPT;
Index: kernel/arch/mips32/src/exception.c
===================================================================
--- kernel/arch/mips32/src/exception.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/mips32/src/exception.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -145,5 +145,5 @@
 	
 	/* decode interrupt number and process the interrupt */
-	cause = (cp0_cause_read() >> 8) &0xff;
+	cause = (cp0_cause_read() >> 8) & 0xff;
 	
 	for (i = 0; i < 8; i++) {
@@ -154,5 +154,5 @@
 				 * The IRQ handler was found.
 				 */
-				irq->handler(irq, irq->arg);
+				irq->handler(irq);
 				spinlock_unlock(&irq->lock);
 			} else {
@@ -161,5 +161,6 @@
 				 */
 #ifdef CONFIG_DEBUG
-				printf("cpu%u: spurious interrupt (inum=%d)\n", CPU->id, i);
+				printf("cpu%u: spurious interrupt (inum=%d)\n",
+				    CPU->id, i);
 #endif
 			}
Index: kernel/arch/mips32/src/interrupt.c
===================================================================
--- kernel/arch/mips32/src/interrupt.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/mips32/src/interrupt.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -101,10 +101,10 @@
 }
 
-static irq_ownership_t timer_claim(void)
+static irq_ownership_t timer_claim(void *instance)
 {
 	return IRQ_ACCEPT;
 }
 
-static void timer_irq_handler(irq_t *irq, void *arg, ...)
+static void timer_irq_handler(irq_t *irq)
 {
 	unsigned long drift;
Index: kernel/arch/ppc32/src/drivers/cuda.c
===================================================================
--- kernel/arch/ppc32/src/drivers/cuda.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/ppc32/src/drivers/cuda.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -250,5 +250,5 @@
 }
 
-static void cuda_irq_handler(irq_t *irq, void *arg, ...)
+static void cuda_irq_handler(irq_t *irq)
 {
 	if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox))
@@ -265,5 +265,5 @@
 }
 
-static irq_ownership_t cuda_claim(void)
+static irq_ownership_t cuda_claim(void *instance)
 {
 	return IRQ_ACCEPT;
Index: kernel/arch/ppc32/src/interrupt.c
===================================================================
--- kernel/arch/ppc32/src/interrupt.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/ppc32/src/interrupt.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -74,5 +74,5 @@
 			}
 			
-			irq->handler(irq, irq->arg);
+			irq->handler(irq);
 			spinlock_unlock(&irq->lock);
 		} else {
Index: kernel/arch/sparc64/include/cpu_family.h
===================================================================
--- kernel/arch/sparc64/include/cpu_family.h	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/sparc64/include/cpu_family.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -81,2 +81,3 @@
 /** @}
  */
+
Index: kernel/arch/sparc64/include/cpu_node.h
===================================================================
--- kernel/arch/sparc64/include/cpu_node.h	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/sparc64/include/cpu_node.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -57,2 +57,3 @@
 /** @}
  */
+
Index: kernel/arch/sparc64/src/drivers/sgcn.c
===================================================================
--- kernel/arch/sparc64/src/drivers/sgcn.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/sparc64/src/drivers/sgcn.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -320,5 +320,5 @@
  * The driver works in polled mode, so no interrupt should be handled by it.
  */
-static irq_ownership_t sgcn_claim(void)
+static irq_ownership_t sgcn_claim(void *instance)
 {
 	return IRQ_DECLINE;
@@ -328,5 +328,5 @@
  * The driver works in polled mode, so no interrupt should be handled by it.
  */
-static void sgcn_irq_handler(irq_t *irq, void *arg, ...)
+static void sgcn_irq_handler(irq_t *irq)
 {
 	panic("Not yet implemented, SGCN works in polled mode.");
Index: kernel/arch/sparc64/src/trap/interrupt.c
===================================================================
--- kernel/arch/sparc64/src/trap/interrupt.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/arch/sparc64/src/trap/interrupt.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -87,5 +87,5 @@
 		 * The IRQ handler was found.
 		 */
-		irq->handler(irq, irq->arg);
+		irq->handler(irq);
 		/*
 		 * See if there is a clear-interrupt-routine and call it.
Index: kernel/genarch/include/kbd/ns16550.h
===================================================================
--- kernel/genarch/include/kbd/ns16550.h	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/genarch/include/kbd/ns16550.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -47,6 +47,6 @@
 extern void ns16550_release(void);
 extern char ns16550_key_read(chardev_t *);
-extern irq_ownership_t ns16550_claim(void);
-extern void ns16550_irq_handler(irq_t *, void *, ...);
+extern irq_ownership_t ns16550_claim(void *);
+extern void ns16550_irq_handler(irq_t *);
 
 #include <arch/types.h>
Index: kernel/genarch/include/kbd/z8530.h
===================================================================
--- kernel/genarch/include/kbd/z8530.h	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/genarch/include/kbd/z8530.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -50,6 +50,6 @@
 extern void z8530_interrupt(void);
 extern char z8530_key_read(chardev_t *);
-extern irq_ownership_t z8530_claim(void);
-extern void z8530_irq_handler(irq_t *, void *, ...);
+extern irq_ownership_t z8530_claim(void *);
+extern void z8530_irq_handler(irq_t *);
 
 #endif
Index: kernel/genarch/src/kbd/i8042.c
===================================================================
--- kernel/genarch/src/kbd/i8042.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/genarch/src/kbd/i8042.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -124,10 +124,10 @@
 }
 
-static irq_ownership_t i8042_claim(void)
+static irq_ownership_t i8042_claim(void *instance)
 {
 	return IRQ_ACCEPT;
 }
 
-static void i8042_irq_handler(irq_t *irq, void *arg, ...)
+static void i8042_irq_handler(irq_t *irq)
 {
 	if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
Index: kernel/genarch/src/kbd/ns16550.c
===================================================================
--- kernel/genarch/src/kbd/ns16550.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/genarch/src/kbd/ns16550.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -211,10 +211,10 @@
 }
 
-irq_ownership_t ns16550_claim(void)
+irq_ownership_t ns16550_claim(void *instance)
 {
 	return (ns16550_lsr_read(&ns16550) & LSR_DATA_READY);
 }
 
-void ns16550_irq_handler(irq_t *irq, void *arg, ...)
+void ns16550_irq_handler(irq_t *irq)
 {
 	if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
Index: kernel/genarch/src/kbd/z8530.c
===================================================================
--- kernel/genarch/src/kbd/z8530.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/genarch/src/kbd/z8530.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -195,10 +195,10 @@
 }
 
-irq_ownership_t z8530_claim(void)
+irq_ownership_t z8530_claim(void *instance)
 {
 	return (z8530_read_a(&z8530, RR0) & RR0_RCA);
 }
 
-void z8530_irq_handler(irq_t *irq, void *arg, ...)
+void z8530_irq_handler(irq_t *irq)
 {
 	if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
Index: kernel/generic/include/ddi/irq.h
===================================================================
--- kernel/generic/include/ddi/irq.h	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/generic/include/ddi/irq.h	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -80,8 +80,8 @@
 
 struct irq;
-typedef void (* irq_handler_t)(struct irq *irq, void *arg, ...);
+typedef void (* irq_handler_t)(struct irq *);
 
 /** Type for function used to clear the interrupt. */
-typedef void (* cir_t)(void *arg, inr_t inr);
+typedef void (* cir_t)(void *, inr_t);
 
 /** IPC notification config structure.
@@ -140,9 +140,9 @@
 	irq_trigger_t trigger;
 	/** Claim ownership of the IRQ. */
-	irq_ownership_t (* claim)(void);
+	irq_ownership_t (* claim)(void *);
 	/** Handler for this IRQ and device. */
 	irq_handler_t handler;
-	/** Argument for the handler. */
-	void *arg;
+	/** Instance argument for the handler and the claim function. */
+	void *instance;
 
 	/** Clear interrupt routine. */
@@ -155,9 +155,9 @@
 } irq_t;
 
-extern void irq_init(count_t inrs, count_t chains);
-extern void irq_initialize(irq_t *irq);
-extern void irq_register(irq_t *irq);
-extern irq_t *irq_dispatch_and_lock(inr_t inr);
-extern irq_t *irq_find_and_lock(inr_t inr, devno_t devno);
+extern void irq_init(count_t, count_t);
+extern void irq_initialize(irq_t *);
+extern void irq_register(irq_t *);
+extern irq_t *irq_dispatch_and_lock(inr_t);
+extern irq_t *irq_find_and_lock(inr_t, devno_t);
 
 #endif
Index: kernel/generic/src/console/console.c
===================================================================
--- kernel/generic/src/console/console.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/generic/src/console/console.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -102,5 +102,5 @@
  * @return Always returns IRQ_DECLINE.
  */
-static irq_ownership_t klog_claim(void)
+static irq_ownership_t klog_claim(void *instance)
 {
 	return IRQ_DECLINE;
Index: kernel/generic/src/console/kconsole.c
===================================================================
--- kernel/generic/src/console/kconsole.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/generic/src/console/kconsole.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -104,5 +104,5 @@
  *
  */
-static irq_ownership_t kconsole_claim(void)
+static irq_ownership_t kconsole_claim(void *instance)
 {
 	return IRQ_DECLINE;
Index: kernel/generic/src/ddi/irq.c
===================================================================
--- kernel/generic/src/ddi/irq.c	(revision fa094491c49be2130cd1f5bbad081181cbad82b1)
+++ kernel/generic/src/ddi/irq.c	(revision 6cd9aa607e6515e17e369c7e888779416251db4d)
@@ -40,5 +40,6 @@
  * This code is designed to support:
  * - multiple devices sharing single IRQ
- * - multiple IRQs per signle device
+ * - multiple IRQs per single device
+ * - multiple instances of the same device
  *
  *
@@ -145,5 +146,5 @@
 	irq->claim = NULL;
 	irq->handler = NULL;
-	irq->arg = NULL;
+	irq->instance = NULL;
 	irq->cir = NULL;
 	irq->cir_arg = NULL;
@@ -307,5 +308,6 @@
 	if (devno == -1) {
 		/* Invoked by irq_dispatch_and_lock(). */
-		rv = ((irq->inr == inr) && (irq->claim() == IRQ_ACCEPT));
+		rv = ((irq->inr == inr) &&
+		    (irq->claim(irq->instance) == IRQ_ACCEPT));
 	} else {
 		/* Invoked by irq_find_and_lock(). */
@@ -366,5 +368,5 @@
 	if (devno == -1) {
 		/* Invoked by irq_dispatch_and_lock() */
-		rv = (irq->claim() == IRQ_ACCEPT);
+		rv = (irq->claim(irq->instance) == IRQ_ACCEPT);
 	} else {
 		/* Invoked by irq_find_and_lock() */
