Index: uspace/drv/nic/e1k/e1k.c
===================================================================
--- uspace/drv/nic/e1k/e1k.c	(revision 89742941119cd77380ed4462dd354467dec103e5)
+++ uspace/drv/nic/e1k/e1k.c	(revision d51838f190d8e49cb00493b84858f7ad93996014)
@@ -40,9 +40,9 @@
 #include <thread.h>
 #include <byteorder.h>
-#include <irc.h>
 #include <as.h>
 #include <ddi.h>
 #include <ddf/log.h>
 #include <ddf/interrupt.h>
+#include <device/hw_res.h>
 #include <device/hw_res_parsed.h>
 #include <pci_dev_iface.h>
@@ -116,4 +116,8 @@
 /** E1000 device data */
 typedef struct {
+	/** DDF device */
+	ddf_dev_t *dev;
+	/** Parent session */
+	async_sess_t *parent_sess;
 	/** Device configuration */
 	e1000_info_t info;
@@ -1757,5 +1761,5 @@
 	e1000_enable_interrupts(e1000);
 	
-	int rc = irc_enable_interrupt(e1000->irq);
+	int rc = hw_res_enable_interrupt(e1000->parent_sess, e1000->irq);
 	if (rc != EOK) {
 		e1000_disable_interrupts(e1000);
@@ -1802,5 +1806,5 @@
 	e1000_disable_rx(e1000);
 	
-	irc_disable_interrupt(e1000->irq);
+	hw_res_disable_interrupt(e1000->parent_sess, e1000->irq);
 	e1000_disable_interrupts(e1000);
 	
@@ -1884,4 +1888,5 @@
 	
 	memset(e1000, 0, sizeof(e1000_t));
+	e1000->dev = dev;
 	
 	nic_set_specific(nic, e1000);
@@ -1998,4 +2003,10 @@
 		ddf_msg(LVL_ERROR, "Unable to allocate device softstate");
 		return ENOMEM;
+	}
+	
+	e1000->parent_sess = ddf_dev_parent_sess_get(dev);
+	if (e1000->parent_sess == NULL) {
+		ddf_msg(LVL_ERROR, "Failed connecting parent device.");
+		return EIO;
 	}
 	
@@ -2119,5 +2130,4 @@
 {
 	ddf_fun_t *fun;
-	assert(dev);
 	
 	/* Initialize device structure for E1000 */
Index: uspace/drv/nic/ne2k/dp8390.h
===================================================================
--- uspace/drv/nic/ne2k/dp8390.h	(revision 89742941119cd77380ed4462dd354467dec103e5)
+++ uspace/drv/nic/ne2k/dp8390.h	(revision d51838f190d8e49cb00493b84858f7ad93996014)
@@ -50,4 +50,6 @@
 #define __NET_NETIF_DP8390_H__
 
+#include <async.h>
+#include <ddf/driver.h>
 #include <fibril_synch.h>
 #include <nic.h>
@@ -223,4 +225,8 @@
 
 typedef struct {
+	/** DDF device */
+	ddf_dev_t *dev;
+	/** Parent session */
+	async_sess_t *parent_sess;
 	/* Device configuration */
 	void *base_port; /**< Port assigned from ISA configuration **/
Index: uspace/drv/nic/ne2k/ne2k.c
===================================================================
--- uspace/drv/nic/ne2k/ne2k.c	(revision 89742941119cd77380ed4462dd354467dec103e5)
+++ uspace/drv/nic/ne2k/ne2k.c	(revision d51838f190d8e49cb00493b84858f7ad93996014)
@@ -40,5 +40,5 @@
 #include <stdio.h>
 #include <errno.h>
-#include <irc.h>
+#include <device/hw_res.h>
 #include <stdlib.h>
 #include <str_error.h>
@@ -256,5 +256,5 @@
 			return rc;
 
-		rc = irc_enable_interrupt(ne2k->irq);
+		rc = hw_res_enable_interrupt(ne2k->parent_sess, ne2k->irq);
 		if (rc != EOK) {
 			ne2k_down(ne2k);
@@ -269,5 +269,5 @@
 	ne2k_t *ne2k = (ne2k_t *) nic_get_specific(nic_data);
 
-	(void) irc_disable_interrupt(ne2k->irq);
+	(void) hw_res_disable_interrupt(ne2k->parent_sess, ne2k->irq);
 	ne2k->receive_configuration = RCR_AB | RCR_AM;
 	ne2k_down(ne2k);
@@ -384,4 +384,11 @@
 	}
 	
+	ne2k->dev = dev;
+	ne2k->parent_sess = ddf_dev_parent_sess_get(dev);
+	if (ne2k->parent_sess == NULL) {
+		ne2k_dev_cleanup(dev);
+		return ENOMEM;
+	}
+	
 	int rc = ne2k_dev_init(nic_data);
 	if (rc != EOK) {
Index: uspace/drv/nic/rtl8139/driver.c
===================================================================
--- uspace/drv/nic/rtl8139/driver.c	(revision 89742941119cd77380ed4462dd354467dec103e5)
+++ uspace/drv/nic/rtl8139/driver.c	(revision d51838f190d8e49cb00493b84858f7ad93996014)
@@ -36,8 +36,8 @@
 #include <ddf/log.h>
 #include <ddf/interrupt.h>
+#include <device/hw_res.h>
 #include <io/log.h>
 #include <nic.h>
 #include <pci_dev_iface.h>
-#include <irc.h>
 #include <stdio.h>
 #include <str.h>
@@ -920,5 +920,5 @@
 	rtl8139_hw_int_set(rtl8139);
 
-	int rc = irc_enable_interrupt(rtl8139->irq);
+	int rc = hw_res_enable_interrupt(rtl8139->parent_sess, rtl8139->irq);
 	if (rc != EOK) {
 		rtl8139_on_stopped(nic_data);
@@ -976,5 +976,5 @@
 		return NULL;
 
-	rtl8139_t *rtl8139 = malloc(sizeof(rtl8139_t));
+	rtl8139_t *rtl8139 = calloc(1, sizeof(rtl8139_t));
 	if (!rtl8139) {
 		nic_unbind_and_destroy(dev);
@@ -982,5 +982,5 @@
 	}
 
-	memset(rtl8139, 0, sizeof(rtl8139_t));
+	rtl8139->dev = dev;
 
 	rtl8139->nic_data = nic_data;
@@ -1166,4 +1166,9 @@
 
 	ddf_msg(LVL_DEBUG, "rtl8139: dev_data created");
+	rtl8139->parent_sess = ddf_dev_parent_sess_get(dev);
+	if (rtl8139->parent_sess == NULL) {
+		ddf_msg(LVL_ERROR, "Error connecting parent device.");
+		return EIO;
+	}
 
 	/* Obtain and fill hardware resources info and connect to parent */
@@ -1258,5 +1263,4 @@
 	ddf_fun_t *fun;
 
-	assert(dev);
 	ddf_msg(LVL_NOTE, "RTL8139_dev_add %s (handle = %zu)",
 	    ddf_dev_get_name(dev), ddf_dev_get_handle(dev));
Index: uspace/drv/nic/rtl8139/driver.h
===================================================================
--- uspace/drv/nic/rtl8139/driver.h	(revision 89742941119cd77380ed4462dd354467dec103e5)
+++ uspace/drv/nic/rtl8139/driver.h	(revision d51838f190d8e49cb00493b84858f7ad93996014)
@@ -87,4 +87,8 @@
 /** RTL8139 device data */
 typedef struct rtl8139_data {
+	/** DDF device */
+	ddf_dev_t *dev;
+	/** Parent session */
+	async_sess_t *parent_sess;
 	/** I/O address of the device */
 	void *io_addr;
Index: uspace/drv/nic/rtl8169/driver.c
===================================================================
--- uspace/drv/nic/rtl8169/driver.c	(revision 89742941119cd77380ed4462dd354467dec103e5)
+++ uspace/drv/nic/rtl8169/driver.c	(revision d51838f190d8e49cb00493b84858f7ad93996014)
@@ -31,5 +31,4 @@
 #include <align.h>
 #include <byteorder.h>
-#include <irc.h>
 #include <libarch/barrier.h>
 
@@ -38,9 +37,10 @@
 #include <ddf/log.h>
 #include <ddf/interrupt.h>
+#include <device/hw_res.h>
+#include <device/hw_res_parsed.h>
 #include <io/log.h>
 #include <nic.h>
 #include <pci_dev_iface.h>
 
-#include <ipc/irc.h>
 #include <sysinfo.h>
 #include <ipc/ns.h>
@@ -396,12 +396,17 @@
 	rtl8169_t *rtl8169 = nic_get_specific(nic_data);
 
+	rtl8169->dev = dev;
+	rtl8169->parent_sess = ddf_dev_parent_sess_get(dev);
+	if (rtl8169->parent_sess == NULL)
+		return EIO;
+
 	/* Get PCI VID & PID */
-	rc = pci_config_space_read_16(ddf_dev_parent_sess_get(dev),
-	    PCI_VENDOR_ID, &rtl8169->pci_vid);
+	rc = pci_config_space_read_16(rtl8169->parent_sess, PCI_VENDOR_ID,
+	    &rtl8169->pci_vid);
 	if (rc != EOK)
 		return rc;
 
-	rc = pci_config_space_read_16(ddf_dev_parent_sess_get(dev),
-	    PCI_DEVICE_ID, &rtl8169->pci_pid);
+	rc = pci_config_space_read_16(rtl8169->parent_sess, PCI_DEVICE_ID,
+	    &rtl8169->pci_pid);
 	if (rc != EOK)
 		return rc;
@@ -745,5 +750,6 @@
 
 	pio_write_16(rtl8169->regs + IMR, 0xffff);
-	irc_enable_interrupt(rtl8169->irq);
+	/* XXX Check return value */
+	hw_res_enable_interrupt(rtl8169->parent_sess, rtl8169->irq);
 
 	return EOK;
Index: uspace/drv/nic/rtl8169/driver.h
===================================================================
--- uspace/drv/nic/rtl8169/driver.h	(revision 89742941119cd77380ed4462dd354467dec103e5)
+++ uspace/drv/nic/rtl8169/driver.h	(revision d51838f190d8e49cb00493b84858f7ad93996014)
@@ -49,4 +49,8 @@
 /** RTL8139 device data */
 typedef struct rtl8169_data {
+	/** DDF device */
+	ddf_dev_t *dev;
+	/** Parent session */
+	async_sess_t *parent_sess;
 	/** I/O address of the device */
 	void *regs_phys;
