Index: uspace/drv/audio/hdaudio/hdaudio.c
===================================================================
--- uspace/drv/audio/hdaudio/hdaudio.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/audio/hdaudio/hdaudio.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -263,5 +263,5 @@
 	}
 
-	int irq_cap;
+	cap_irq_handle_t irq_cap;
 	rc = register_interrupt_handler(dev, res.irqs.irqs[0],
 	    hdaudio_interrupt, &irq_code, &irq_cap);
Index: uspace/drv/audio/sb16/main.c
===================================================================
--- uspace/drv/audio/sb16/main.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/audio/sb16/main.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -93,5 +93,5 @@
 	irq_cmd_t irq_cmds[irq_cmd_count];
 	irq_pio_range_t irq_ranges[1];
-	int irq_cap;
+	cap_irq_handle_t irq_cap;
 
 	sb16_t *soft_state = ddf_dev_data_alloc(device, sizeof(sb16_t));
Index: uspace/drv/block/ahci/ahci.c
===================================================================
--- uspace/drv/block/ahci/ahci.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/block/ahci/ahci.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -1184,5 +1184,5 @@
 	ct.ranges = ahci_ranges;
 
-	int irq_cap;
+	cap_irq_handle_t irq_cap;
 	errno_t rc = register_interrupt_handler(dev,
 	    hw_res_parsed.irqs.irqs[0], ahci_interrupt, &ct, &irq_cap);
Index: uspace/drv/block/ddisk/ddisk.c
===================================================================
--- uspace/drv/block/ddisk/ddisk.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/block/ddisk/ddisk.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -112,5 +112,5 @@
 	ddisk_regs_t *ddisk_regs;
 
-	int irq_cap;
+	cap_irq_handle_t irq_cap;
 
 	bd_srvs_t bds;
@@ -449,5 +449,5 @@
 	ddisk->bds.sarg = ddisk;
 
-	ddisk->irq_cap = -1;
+	ddisk->irq_cap = CAP_NIL;
 
 	/*
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -512,5 +512,5 @@
 
 	/* Enable interrupts */
-	if (instance->base.irq_cap >= 0) {
+	if (CAP_HANDLE_VALID(instance->base.irq_handle)) {
 		OHCI_WR(instance->registers->interrupt_enable,
 		    OHCI_USED_INTERRUPTS);
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -294,5 +294,5 @@
 	pio_write_32(&registers->flbaseadd, pa);
 
-	if (instance->base.irq_cap >= 0) {
+	if (CAP_HANDLE_VALID(instance->base.irq_handle)) {
 		/* Enable all interrupts, but resume interrupt */
 		pio_write_16(&instance->registers->usbintr,
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -495,5 +495,5 @@
 	XHCI_REG_WR(intr0, XHCI_INTR_ERSTBA, erstba_phys);
 
-	if (hc->base.irq_cap > 0) {
+	if (CAP_HANDLE_VALID(hc->base.irq_handle)) {
 		XHCI_REG_SET(intr0, XHCI_INTR_IE, 1);
 		XHCI_REG_SET(hc->op_regs, XHCI_OP_INTE, 1);
Index: uspace/drv/char/i8042/i8042.c
===================================================================
--- uspace/drv/char/i8042/i8042.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/char/i8042/i8042.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -281,7 +281,7 @@
 	};
 
-	int irq_kbd_cap;
+	cap_irq_handle_t kbd_ihandle;
 	rc = register_interrupt_handler(ddf_dev, irq_kbd,
-	    i8042_irq_handler, &irq_code, &irq_kbd_cap);
+	    i8042_irq_handler, &irq_code, &kbd_ihandle);
 	if (rc != EOK) {
 		ddf_msg(LVL_ERROR, "Failed set handler for kbd: %s.",
@@ -290,7 +290,7 @@
 	}
 
-	int irq_mouse_cap;
+	cap_irq_handle_t mouse_ihandle;
 	rc = register_interrupt_handler(ddf_dev, irq_mouse,
-	    i8042_irq_handler, &irq_code, &irq_mouse_cap);
+	    i8042_irq_handler, &irq_code, &mouse_ihandle);
 	if (rc != EOK) {
 		ddf_msg(LVL_ERROR, "Failed set handler for mouse: %s.",
Index: uspace/drv/char/msim-con/msim-con.c
===================================================================
--- uspace/drv/char/msim-con/msim-con.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/char/msim-con/msim-con.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -83,5 +83,4 @@
 {
 	ddf_fun_t *fun = NULL;
-	bool subscribed = false;
 	irq_cmd_t *msim_cmds = NULL;
 	errno_t rc;
@@ -90,4 +89,6 @@
 	fibril_mutex_initialize(&con->buf_lock);
 	fibril_condvar_initialize(&con->buf_cv);
+
+	con->irq_handle = CAP_NIL;
 
 	msim_cmds = malloc(sizeof(msim_cmds_proto));
@@ -125,6 +126,10 @@
 	con->irq_code.cmds = msim_cmds;
 
-	async_irq_subscribe(res->irq, msim_irq_handler, con, &con->irq_code, NULL);
-	subscribed = true;
+	rc = async_irq_subscribe(res->irq, msim_irq_handler, con,
+	    &con->irq_code, &con->irq_handle);
+	if (rc != EOK) {
+		ddf_msg(LVL_ERROR, "Error registering IRQ code.");
+		goto error;
+	}
 
 	chardev_srvs_init(&con->cds);
@@ -142,6 +147,6 @@
 	return EOK;
 error:
-	if (subscribed)
-		async_irq_unsubscribe(res->irq);
+	if (CAP_HANDLE_VALID(con->irq_handle))
+		async_irq_unsubscribe(con->irq_handle);
 	if (fun != NULL)
 		ddf_fun_destroy(fun);
Index: uspace/drv/char/msim-con/msim-con.h
===================================================================
--- uspace/drv/char/msim-con/msim-con.h	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/char/msim-con/msim-con.h	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -68,4 +68,5 @@
 	fibril_condvar_t buf_cv;
 	ioport8_t *out_reg;
+	cap_irq_handle_t irq_handle;
 } msim_con_t;
 
Index: uspace/drv/char/ns8250/ns8250.c
===================================================================
--- uspace/drv/char/ns8250/ns8250.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/char/ns8250/ns8250.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -165,5 +165,5 @@
 	int irq;
 	/** IRQ capability handle */
-	int irq_cap;
+	cap_irq_handle_t irq_handle;
 	/** The base i/o address of the devices registers. */
 	uintptr_t io_addr;
@@ -804,8 +804,8 @@
  */
 static inline errno_t ns8250_register_interrupt_handler(ns8250_t *ns,
-    cap_handle_t *handle)
+    cap_irq_handle_t *ihandle)
 {
 	return register_interrupt_handler(ns->dev, ns->irq,
-	    ns8250_interrupt_handler, NULL, handle);
+	    ns8250_interrupt_handler, NULL, ihandle);
 }
 
@@ -816,5 +816,5 @@
 static inline errno_t ns8250_unregister_interrupt_handler(ns8250_t *ns)
 {
-	return unregister_interrupt_handler(ns->dev, ns->irq_cap);
+	return unregister_interrupt_handler(ns->dev, ns->irq_handle);
 }
 
@@ -876,5 +876,6 @@
 
 	/* Register interrupt handler. */
-	rc = ns8250_register_interrupt_handler(ns, &ns->irq_cap);
+	ns->irq_handle = CAP_NIL;
+	rc = ns8250_register_interrupt_handler(ns, &ns->irq_handle);
 	if (rc != EOK) {
 		ddf_msg(LVL_ERROR, "Failed to register interrupt handler.");
Index: uspace/drv/char/pl050/pl050.c
===================================================================
--- uspace/drv/char/pl050/pl050.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/char/pl050/pl050.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -213,7 +213,7 @@
 	pl050->regs = regs;
 
-	int irq_cap;
+	cap_irq_handle_t ihandle;
 	rc = register_interrupt_handler(pl050->dev,
-	    res.irqs.irqs[0], pl050_interrupt, &pl050_irq_code, &irq_cap);
+	    res.irqs.irqs[0], pl050_interrupt, &pl050_irq_code, &ihandle);
 	if (rc != EOK) {
 		ddf_msg(LVL_ERROR, "Failed registering interrupt handler. (%s)",
Index: uspace/drv/nic/e1k/e1k.c
===================================================================
--- uspace/drv/nic/e1k/e1k.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/nic/e1k/e1k.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -1264,5 +1264,6 @@
  *
  */
-inline static errno_t e1000_register_int_handler(nic_t *nic, cap_handle_t *handle)
+inline static errno_t e1000_register_int_handler(nic_t *nic,
+    cap_irq_handle_t *handle)
 {
 	e1000_t *e1000 = DRIVER_DATA_NIC(nic);
@@ -2165,6 +2166,6 @@
 	ddf_fun_set_ops(fun, &e1000_dev_ops);
 
-	int irq_cap;
-	rc = e1000_register_int_handler(nic, &irq_cap);
+	cap_irq_handle_t irq_handle;
+	rc = e1000_register_int_handler(nic, &irq_handle);
 	if (rc != EOK) {
 		goto err_fun_create;
@@ -2204,5 +2205,5 @@
 	e1000_uninitialize_rx_structure(nic);
 err_irq:
-	unregister_interrupt_handler(dev, irq_cap);
+	unregister_interrupt_handler(dev, irq_handle);
 err_fun_create:
 	ddf_fun_destroy(fun);
Index: uspace/drv/nic/ne2k/ne2k.c
===================================================================
--- uspace/drv/nic/ne2k/ne2k.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/nic/ne2k/ne2k.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -124,5 +124,6 @@
 static void ne2k_interrupt_handler(ipc_call_t *, ddf_dev_t *);
 
-static errno_t ne2k_register_interrupt(nic_t *nic_data, cap_handle_t *handle)
+static errno_t ne2k_register_interrupt(nic_t *nic_data,
+    cap_irq_handle_t *handle)
 {
 	ne2k_t *ne2k = (ne2k_t *) nic_get_specific(nic_data);
Index: uspace/drv/nic/rtl8139/driver.c
===================================================================
--- uspace/drv/nic/rtl8139/driver.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/nic/rtl8139/driver.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -846,5 +846,6 @@
  *  @return An error code otherwise.
  */
-inline static errno_t rtl8139_register_int_handler(nic_t *nic_data, cap_handle_t *handle)
+inline static errno_t rtl8139_register_int_handler(nic_t *nic_data,
+    cap_irq_handle_t *handle)
 {
 	rtl8139_t *rtl8139 = nic_get_specific(nic_data);
@@ -1288,6 +1289,6 @@
 
 	/* Register interrupt handler */
-	int irq_cap;
-	rc = rtl8139_register_int_handler(nic_data, &irq_cap);
+	cap_irq_handle_t irq_handle;
+	rc = rtl8139_register_int_handler(nic_data, &irq_handle);
 	if (rc != EOK) {
 		goto err_pio;
@@ -1324,5 +1325,5 @@
 	ddf_fun_destroy(fun);
 err_srv:
-	unregister_interrupt_handler(dev, irq_cap);
+	unregister_interrupt_handler(dev, irq_handle);
 err_pio:
 	// rtl8139_pio_disable(dev);
Index: uspace/drv/nic/rtl8169/driver.c
===================================================================
--- uspace/drv/nic/rtl8169/driver.c	(revision 84239b1cd7c5ed286263ce4edb649da00b34b249)
+++ uspace/drv/nic/rtl8169/driver.c	(revision eadaeae8dacc68cf558028f23cc96b90a08b7361)
@@ -75,5 +75,6 @@
 static void rtl8169_send_frame(nic_t *nic_data, void *data, size_t size);
 static void rtl8169_irq_handler(ipc_call_t *icall, ddf_dev_t *dev);
-static inline errno_t rtl8169_register_int_handler(nic_t *nic_data, cap_handle_t *handle);
+static inline errno_t rtl8169_register_int_handler(nic_t *nic_data,
+    cap_irq_handle_t *handle);
 static inline void rtl8169_get_hwaddr(rtl8169_t *rtl8169, nic_address_t *addr);
 static inline void rtl8169_set_hwaddr(rtl8169_t *rtl8169, const nic_address_t *addr);
@@ -361,5 +362,6 @@
 }
 
-inline static errno_t rtl8169_register_int_handler(nic_t *nic_data, cap_handle_t *handle)
+inline static errno_t rtl8169_register_int_handler(nic_t *nic_data,
+    cap_irq_handle_t *handle)
 {
 	rtl8169_t *rtl8169 = nic_get_specific(nic_data);
@@ -429,6 +431,6 @@
 		goto err_pio;
 
-	int irq_cap;
-	rc = rtl8169_register_int_handler(nic_data, &irq_cap);
+	cap_irq_handle_t irq_handle;
+	rc = rtl8169_register_int_handler(nic_data, &irq_handle);
 	if (rc != EOK) {
 		ddf_msg(LVL_ERROR, "Failed to register IRQ handler (%s)", str_error_name(rc));
@@ -472,5 +474,5 @@
 err_srv:
 	/* XXX Disconnect from services */
-	unregister_interrupt_handler(dev, irq_cap);
+	unregister_interrupt_handler(dev, irq_handle);
 err_irq:
 err_pio:
