Index: kernel/generic/include/ddi/irq.h
===================================================================
--- kernel/generic/include/ddi/irq.h	(revision c9b550bff53b2109d2746935072fca1bbe632894)
+++ kernel/generic/include/ddi/irq.h	(revision 7bdd725420e5d69311ceb06481f1906fe44af490)
@@ -37,14 +37,14 @@
 
 typedef enum {
-	CMD_MEM_READ_1 = 0,
-	CMD_MEM_READ_2,
-	CMD_MEM_READ_4,
-	CMD_MEM_READ_8,
-	CMD_MEM_WRITE_1,
-	CMD_MEM_WRITE_2,
-	CMD_MEM_WRITE_4,
-	CMD_MEM_WRITE_8,
-	CMD_PORT_READ_1,
-	CMD_PORT_WRITE_1,
+	CMD_PIO_READ_8 = 1,
+	CMD_PIO_READ_16,
+	CMD_PIO_READ_32,
+	CMD_PIO_WRITE_8,
+	CMD_PIO_WRITE_16,
+	CMD_PIO_WRITE_32,
+	CMD_BTEST,
+	CMD_PREDICATE,
+	CMD_ACCEPT,
+	CMD_DECLINE,
 	CMD_LAST
 } irq_cmd_type;
@@ -53,6 +53,7 @@
 	irq_cmd_type cmd;
 	void *addr;
-	unsigned long long value; 
-	int dstarg;
+	unsigned long long value;
+	unsigned int srcarg;
+	unsigned int dstarg;
 } irq_cmd_t;
 
@@ -66,6 +67,8 @@
 #include <arch/types.h>
 #include <adt/list.h>
+#include <adt/hash_table.h>
 #include <synch/spinlock.h>
 #include <proc/task.h>
+#include <ipc/ipc.h>
 
 typedef enum {
@@ -97,4 +100,6 @@
 	/** Method to be used for the notification. */
 	unative_t method;
+	/** Arguments that will be sent if the IRQ is claimed. */
+	unative_t scratch[IPC_CALL_LEN];
 	/** Top-half pseudocode. */
 	irq_code_t *code;
@@ -155,9 +160,11 @@
 } irq_t;
 
+SPINLOCK_EXTERN(irq_uspace_hash_table_lock);
+extern hash_table_t irq_uspace_hash_table;
+
 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/include/ipc/irq.h
===================================================================
--- kernel/generic/include/ipc/irq.h	(revision c9b550bff53b2109d2746935072fca1bbe632894)
+++ kernel/generic/include/ipc/irq.h	(revision 7bdd725420e5d69311ceb06481f1906fe44af490)
@@ -37,5 +37,5 @@
 
 /** Maximum length of IPC IRQ program */
-#define IRQ_MAX_PROG_SIZE	10
+#define IRQ_MAX_PROG_SIZE	20
 
 #include <ipc/ipc.h>
@@ -44,9 +44,12 @@
 #include <adt/list.h>
 
-extern int ipc_irq_register(answerbox_t *box, inr_t inr, devno_t devno,
-    unative_t method, irq_code_t *ucode);
-extern void ipc_irq_send_notif(irq_t *irq);
-extern void ipc_irq_unregister(answerbox_t *box, inr_t inr, devno_t devno);
-extern void ipc_irq_cleanup(answerbox_t *box);
+extern int ipc_irq_register(answerbox_t *, inr_t, devno_t, unative_t,
+    irq_code_t *);
+
+extern irq_ownership_t ipc_irq_top_half_claim(irq_t *);
+extern void ipc_irq_top_half_handler(irq_t *);
+
+extern int ipc_irq_unregister(answerbox_t *, inr_t, devno_t);
+extern void ipc_irq_cleanup(answerbox_t *);
 
 /*
@@ -67,6 +70,6 @@
     ipc_irq_send_msg((irq), (a1), (a2), (a3), (a4), (a5))
 
-extern void ipc_irq_send_msg(irq_t *irq, unative_t a1, unative_t a2,
-    unative_t a3, unative_t a4, unative_t a5);
+extern void ipc_irq_send_msg(irq_t *, unative_t, unative_t, unative_t, unative_t,
+    unative_t);
 
 #endif
