Index: uspace/drv/nic/e1k/e1k.c
===================================================================
--- uspace/drv/nic/e1k/e1k.c	(revision 8486c070d3e8193fcd8774597aa3c3438d3ba2c9)
+++ uspace/drv/nic/e1k/e1k.c	(revision 034c4202bb5b0bac8287593257471bb34ca29e2e)
@@ -32,4 +32,7 @@
  *
  */
+
+/* XXX Fix this */
+#define _DDF_DATA_IMPLANT
 
 #include <assert.h>
@@ -71,11 +74,19 @@
 	((e1000_t *) nic_get_specific(nic))
 
-/** device_t* -> nic_driver_data_t* cast */
+/** ddf_fun_t * -> nic_driver_data_t* cast */
+#define NIC_DATA_FUN(fun) \
+	((nic_t *) ddf_fun_data_get(fun))
+
+/** ddf_dev_t * -> nic_driver_data_t* cast */
 #define NIC_DATA_DEV(dev) \
-	((nic_t *) ((dev)->driver_data))
-
-/** device_t* -> e1000_t* cast */
+	((nic_t *) ddf_dev_data_get(dev))
+
+/** ddf_dev_t * -> e1000_t* cast */
 #define DRIVER_DATA_DEV(dev) \
 	(DRIVER_DATA_NIC(NIC_DATA_DEV(dev)))
+
+/** ddf_fun_t * -> e1000_t* cast */
+#define DRIVER_DATA_FUN(fun) \
+	(DRIVER_DATA_NIC(NIC_DATA_FUN(fun)))
 
 /** Cast pointer to uint64_t
@@ -305,11 +316,7 @@
  *
  */
-static int e1000_get_cable_state(ddf_fun_t *dev, nic_cable_state_t *state)
-{
-	assert(dev);
-	assert(DRIVER_DATA_DEV(dev));
-	assert(state);
-	
-	e1000_t *e1000 = DRIVER_DATA_DEV(dev);
+static int e1000_get_cable_state(ddf_fun_t *fun, nic_cable_state_t *state)
+{
+	e1000_t *e1000 = DRIVER_DATA_FUN(fun);
 	if (E1000_REG_READ(e1000, E1000_STATUS) & (STATUS_LU))
 		*state = NIC_CS_PLUGGED;
@@ -328,8 +335,8 @@
  *
  */
-static int e1000_get_operation_mode(ddf_fun_t *dev, int *speed,
+static int e1000_get_operation_mode(ddf_fun_t *fun, int *speed,
     nic_channel_mode_t *duplex, nic_role_t *role)
 {
-	e1000_t *e1000 = DRIVER_DATA_DEV(dev);
+	e1000_t *e1000 = DRIVER_DATA_FUN(fun);
 	uint32_t status = E1000_REG_READ(e1000, E1000_STATUS);
 	
@@ -376,5 +383,5 @@
  *
  */
-static int e1000_set_operation_mode(ddf_fun_t *dev, int speed,
+static int e1000_set_operation_mode(ddf_fun_t *fun, int speed,
     nic_channel_mode_t duplex, nic_role_t role)
 {
@@ -385,5 +392,5 @@
 		return EINVAL;
 	
-	e1000_t *e1000 = DRIVER_DATA_DEV(dev);
+	e1000_t *e1000 = DRIVER_DATA_FUN(fun);
 	
 	fibril_mutex_lock(&e1000->ctrl_lock);
@@ -424,7 +431,7 @@
  *
  */
-static int e1000_autoneg_enable(ddf_fun_t *dev, uint32_t advertisement)
-{
-	e1000_t *e1000 = DRIVER_DATA_DEV(dev);
+static int e1000_autoneg_enable(ddf_fun_t *fun, uint32_t advertisement)
+{
+	e1000_t *e1000 = DRIVER_DATA_FUN(fun);
 	
 	fibril_mutex_lock(&e1000->ctrl_lock);
@@ -452,7 +459,7 @@
  *
  */
-static int e1000_autoneg_disable(ddf_fun_t *dev)
-{
-	e1000_t *e1000 = DRIVER_DATA_DEV(dev);
+static int e1000_autoneg_disable(ddf_fun_t *fun)
+{
+	e1000_t *e1000 = DRIVER_DATA_FUN(fun);
 	
 	fibril_mutex_lock(&e1000->ctrl_lock);
@@ -491,7 +498,7 @@
  *
  */
-static int e1000_defective_get_mode(ddf_fun_t *device, uint32_t *mode)
-{
-	e1000_t *e1000 = DRIVER_DATA_DEV(device);
+static int e1000_defective_get_mode(ddf_fun_t *fun, uint32_t *mode)
+{
+	e1000_t *e1000 = DRIVER_DATA_FUN(fun);
 	
 	*mode = 0;
@@ -512,7 +519,7 @@
  *
  */
-static int e1000_defective_set_mode(ddf_fun_t *device, uint32_t mode)
-{
-	e1000_t *e1000 = DRIVER_DATA_DEV(device);
+static int e1000_defective_set_mode(ddf_fun_t *fun, uint32_t mode)
+{
+	e1000_t *e1000 = DRIVER_DATA_FUN(fun);
 	int rc = EOK;
 	
@@ -1038,5 +1045,5 @@
  *
  */
-static int e1000_vlan_set_tag(ddf_fun_t *device, uint16_t tag, bool add,
+static int e1000_vlan_set_tag(ddf_fun_t *fun, uint16_t tag, bool add,
     bool strip)
 {
@@ -1052,5 +1059,5 @@
 		return ENOTSUP;
 	
-	e1000_t *e1000 = DRIVER_DATA_DEV(device);
+	e1000_t *e1000 = DRIVER_DATA_FUN(fun);
 	
 	e1000->vlan_tag = tag;
@@ -1855,7 +1862,4 @@
 static e1000_t *e1000_create_dev_data(ddf_dev_t *dev)
 {
-	assert(dev);
-	assert(!dev->driver_data);
-	
 	nic_t *nic = nic_create_and_bind(dev);
 	if (!nic)
@@ -1896,5 +1900,5 @@
 	assert(dev);
 	
-	if (dev->driver_data != NULL)
+	if (ddf_dev_data_get(dev) != NULL)
 		nic_unbind_and_destroy(dev);
 }
@@ -1910,9 +1914,4 @@
 	
 	e1000_delete_dev_data(dev);
-	
-	if (dev->parent_sess != NULL) {
-		async_hangup(dev->parent_sess);
-		dev->parent_sess = NULL;
-	}
 }
 
@@ -1931,8 +1930,4 @@
     const hw_res_list_parsed_t *hw_resources)
 {
-	assert(dev != NULL);
-	assert(hw_resources != NULL);
-	assert(dev->driver_data != NULL);
-	
 	e1000_t *e1000 = DRIVER_DATA_DEV(dev);
 	
@@ -2003,5 +1998,5 @@
 	
 	uint16_t device_id;
-	rc = pci_config_space_read_16(dev->parent_sess, PCI_DEVICE_ID,
+	rc = pci_config_space_read_16(ddf_dev_parent_sess_get(dev), PCI_DEVICE_ID,
 	    &device_id);
 	if (rc != EOK) {
@@ -2121,5 +2116,5 @@
 	
 	/* Device initialization */
-	nic_t *nic = dev->driver_data;
+	nic_t *nic = ddf_dev_data_get(dev);
 	e1000_t *e1000 = DRIVER_DATA_NIC(nic);
 	
@@ -2147,6 +2142,6 @@
 		goto err_tx_structure;
 	nic_set_ddf_fun(nic, fun);
-	fun->ops = &e1000_dev_ops;
-	fun->driver_data = nic;
+	ddf_fun_set_ops(fun, &e1000_dev_ops);
+	ddf_fun_data_implant(fun, nic);
 	
 	rc = e1000_register_int_handler(nic);
@@ -2278,7 +2273,7 @@
  * @return Negative error code otherwise
  */
-static int e1000_set_addr(ddf_fun_t *dev, const nic_address_t *addr)
-{
-	nic_t *nic = NIC_DATA_DEV(dev);
+static int e1000_set_addr(ddf_fun_t *fun, const nic_address_t *addr)
+{
+	nic_t *nic = NIC_DATA_FUN(fun);
 	e1000_t *e1000 = DRIVER_DATA_NIC(nic);
 	
Index: uspace/drv/nic/ne2k/ne2k.c
===================================================================
--- uspace/drv/nic/ne2k/ne2k.c	(revision 8486c070d3e8193fcd8774597aa3c3438d3ba2c9)
+++ uspace/drv/nic/ne2k/ne2k.c	(revision 034c4202bb5b0bac8287593257471bb34ca29e2e)
@@ -38,4 +38,7 @@
  */
 
+/* XXX Fix this */
+#define _DDF_DATA_IMPLANT
+
 #include <stdio.h>
 #include <errno.h>
@@ -61,5 +64,5 @@
 #define IRQ_GET_TSR(call)  ((int) IPC_GET_ARG3(call))
 
-#define DRIVER_DATA(dev) ((nic_t *) ((dev)->driver_data))
+#define DRIVER_DATA(dev) ((nic_t *) ddf_dev_data_get(dev))
 #define NE2K(device) ((ne2k_t *) nic_get_specific(DRIVER_DATA(device)))
 
@@ -169,5 +172,5 @@
 static void ne2k_dev_cleanup(ddf_dev_t *dev)
 {
-	if (dev->driver_data != NULL) {
+	if (ddf_dev_data_get(dev) != NULL) {
 		ne2k_t *ne2k = NE2K(dev);
 		if (ne2k) {
@@ -177,8 +180,4 @@
 		nic_unbind_and_destroy(dev);
 	}
-	if (dev->parent_sess != NULL) {
-		async_hangup(dev->parent_sess);
-		dev->parent_sess = NULL;
-	}
 }
 
@@ -279,5 +278,5 @@
 static int ne2k_set_address(ddf_fun_t *fun, const nic_address_t *address)
 {
-	nic_t *nic_data = DRIVER_DATA(fun);
+	nic_t *nic_data = DRIVER_DATA(ddf_fun_get_dev(fun));
 	int rc = nic_report_address(nic_data, address);
 	if (rc != EOK) {
@@ -410,6 +409,6 @@
 	}
 	nic_set_ddf_fun(nic_data, fun);
-	fun->ops = &ne2k_dev_ops;
-	fun->driver_data = nic_data;
+	ddf_fun_set_ops(fun, &ne2k_dev_ops);
+	ddf_fun_data_implant(fun, nic_data);
 	
 	rc = ddf_fun_bind(fun);
Index: uspace/drv/nic/rtl8139/driver.c
===================================================================
--- uspace/drv/nic/rtl8139/driver.c	(revision 8486c070d3e8193fcd8774597aa3c3438d3ba2c9)
+++ uspace/drv/nic/rtl8139/driver.c	(revision 034c4202bb5b0bac8287593257471bb34ca29e2e)
@@ -27,4 +27,7 @@
  */
 
+/* XXX Fix this */
+#define _DDF_DATA_IMPLANT
+
 #include <assert.h>
 #include <errno.h>
@@ -212,13 +215,12 @@
 	rtl8139_regs_lock(rtl8139->io_port);
 
+	async_sess_t *pci_sess =
+		ddf_dev_parent_sess_get(nic_get_ddf_dev(rtl8139->nic_data));
+
 	if (bit_val) {
-		async_sess_t *pci_sess =
-			nic_get_ddf_dev(rtl8139->nic_data)->parent_sess;
 		uint8_t pmen;
 		pci_config_space_read_8(pci_sess, 0x55, &pmen);
 		pci_config_space_write_8(pci_sess, 0x55, pmen | 1 | (1 << 7));
 	} else {
-		async_sess_t *pci_sess =
-			nic_get_ddf_dev(rtl8139->nic_data)->parent_sess;
 		uint8_t pmen;
 		pci_config_space_read_8(pci_sess, 0x55, &pmen);
@@ -1052,11 +1054,6 @@
 	assert(dev);
 
-	if (dev->driver_data)
+	if (ddf_dev_data_get(dev))
 		nic_unbind_and_destroy(dev);
-
-	if (dev->parent_sess != NULL) {
-		async_hangup(dev->parent_sess);
-		dev->parent_sess = NULL;
-	}
 }
 
@@ -1080,22 +1077,22 @@
 
 	if (hw_resources->irqs.count != 1) {
-		ddf_msg(LVL_ERROR, "%s device: unexpected irq count", dev->name);
+		ddf_msg(LVL_ERROR, "%s device: unexpected irq count", ddf_dev_get_name(dev));
 		return EINVAL;
 	};
 	if (hw_resources->io_ranges.count != 1) {
-		ddf_msg(LVL_ERROR, "%s device: unexpected io ranges count", dev->name);
+		ddf_msg(LVL_ERROR, "%s device: unexpected io ranges count", ddf_dev_get_name(dev));
 		return EINVAL;
 	}
 
 	rtl8139->irq = hw_resources->irqs.irqs[0];
-	ddf_msg(LVL_DEBUG, "%s device: irq 0x%x assigned", dev->name, rtl8139->irq);
+	ddf_msg(LVL_DEBUG, "%s device: irq 0x%x assigned", ddf_dev_get_name(dev), rtl8139->irq);
 
 	rtl8139->io_addr = IOADDR_TO_PTR(hw_resources->io_ranges.ranges[0].address);
 	if (hw_resources->io_ranges.ranges[0].size < RTL8139_IO_SIZE) {
 		ddf_msg(LVL_ERROR, "i/o range assigned to the device "
-		    "%s is too small.", dev->name);
+		    "%s is too small.", ddf_dev_get_name(dev));
 		return EINVAL;
 	}
-	ddf_msg(LVL_DEBUG, "%s device: i/o addr %p assigned.", dev->name, rtl8139->io_addr);
+	ddf_msg(LVL_DEBUG, "%s device: i/o addr %p assigned.", ddf_dev_get_name(dev), rtl8139->io_addr);
 
 	return EOK;
@@ -1192,5 +1189,5 @@
 static int rtl8139_device_initialize(ddf_dev_t *dev)
 {
-	ddf_msg(LVL_DEBUG, "rtl8139_dev_initialize %s", dev->name);
+	ddf_msg(LVL_DEBUG, "rtl8139_dev_initialize %s", ddf_dev_get_name(dev));
 
 	int ret = EOK;
@@ -1201,5 +1198,5 @@
 	rtl8139_t *rtl8139 = rtl8139_create_dev_data(dev);
 	if (rtl8139 == NULL) {
-		ddf_msg(LVL_ERROR, "Not enough memory for initializing %s.", dev->name);
+		ddf_msg(LVL_ERROR, "Not enough memory for initializing %s.", ddf_dev_get_name(dev));
 		return ENOMEM;
 	}
@@ -1246,5 +1243,5 @@
 static int rtl8139_pio_enable(ddf_dev_t *dev)
 {
-	ddf_msg(LVL_DEBUG, NAME ": rtl8139_pio_enable %s", dev->name);
+	ddf_msg(LVL_DEBUG, NAME ": rtl8139_pio_enable %s", ddf_dev_get_name(dev));
 
 	rtl8139_t *rtl8139 = nic_get_specific(nic_get_from_ddf_dev(dev));
@@ -1253,5 +1250,5 @@
 	if (pio_enable(rtl8139->io_addr, RTL8139_IO_SIZE, &rtl8139->io_port)) {
 		ddf_msg(LVL_ERROR, "Cannot gain the port %lx for device %s.", rtl8139->io_addr,
-		    dev->name);
+		    ddf_dev_get_name(dev));
 		return EADDRNOTAVAIL;
 	}
@@ -1299,5 +1296,6 @@
 
 	assert(dev);
-	ddf_msg(LVL_NOTE, "RTL8139_dev_add %s (handle = %d)", dev->name, dev->handle);
+	ddf_msg(LVL_NOTE, "RTL8139_dev_add %s (handle = %d)",
+	    ddf_dev_get_name(dev), ddf_dev_get_handle(dev));
 
 	/* Init device structure for rtl8139 */
@@ -1340,6 +1338,6 @@
 	}
 	nic_set_ddf_fun(nic_data, fun);
-	fun->ops = &rtl8139_dev_ops;
-	fun->driver_data = nic_data;
+	ddf_fun_set_ops(fun, &rtl8139_dev_ops);
+	ddf_fun_data_implant(fun, nic_data);
 
 	rc = ddf_fun_bind(fun);
@@ -1355,5 +1353,5 @@
 
 	ddf_msg(LVL_NOTE, "The %s device has been successfully initialized.",
-	    dev->name);
+	    ddf_dev_get_name(dev));
 
 	return EOK;
