Index: uspace/drv/bus/pci/pciintel/pci.c
===================================================================
--- uspace/drv/bus/pci/pciintel/pci.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/pci/pciintel/pci.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -215,22 +215,4 @@
 };
 
-static pci_bus_t *pci_bus_new(void)
-{
-	pci_bus_t *bus;
-	
-	bus = (pci_bus_t *) calloc(1, sizeof(pci_bus_t));
-	if (bus == NULL)
-		return NULL;
-	
-	fibril_mutex_initialize(&bus->conf_mutex);
-	return bus;
-}
-
-static void pci_bus_delete(pci_bus_t *bus)
-{
-	assert(bus != NULL);
-	free(bus);
-}
-
 static void pci_conf_read(pci_fun_t *fun, int reg, uint8_t *buf, size_t len)
 {
@@ -584,5 +566,5 @@
 	dnode->parent_sess = NULL;
 	
-	bus = pci_bus_new();
+	bus = ddf_dev_data_alloc(dnode, sizeof(pci_bus_t));
 	if (bus == NULL) {
 		ddf_msg(LVL_ERROR, "pci_add_device allocation failed.");
@@ -590,4 +572,6 @@
 		goto fail;
 	}
+	fibril_mutex_initialize(&bus->conf_mutex);
+
 	bus->dnode = dnode;
 	dnode->driver_data = bus;
@@ -655,7 +639,4 @@
 	
 fail:
-	if (bus != NULL)
-		pci_bus_delete(bus);
-	
 	if (dnode->parent_sess)
 		async_hangup(dnode->parent_sess);
Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -192,5 +192,4 @@
 		ddf_fun_destroy(instance->rh_fun); \
 	} \
-	free(instance); \
 	device->driver_data = NULL; \
 	usb_log_error(message); \
Index: uspace/drv/bus/usb/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbddev.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbhid/kbd/kbddev.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -734,5 +734,5 @@
 	int rc = usb_kbd_create_function(hid_dev, kbd_dev);
 	if (rc != EOK) {
-		usb_kbd_free(&kbd_dev);
+		usb_kbd_destroy(kbd_dev);
 		return rc;
 	}
@@ -779,40 +779,37 @@
  * @param kbd_dev Pointer to the structure to be destroyed.
  */
-void usb_kbd_free(usb_kbd_t **kbd_dev)
-{
-	if (kbd_dev == NULL || *kbd_dev == NULL) {
+void usb_kbd_destroy(usb_kbd_t *kbd_dev)
+{
+	if (kbd_dev == NULL) {
 		return;
 	}
 	
 	// hangup phone to the console
-	async_obsolete_hangup((*kbd_dev)->console_phone);
-	
-	if ((*kbd_dev)->repeat_mtx != NULL) {
+	async_obsolete_hangup(kbd_dev->console_phone);
+	
+	if (kbd_dev->repeat_mtx != NULL) {
 		//assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx));
 		// FIXME - the fibril_mutex_is_locked may not cause
 		// fibril scheduling
-		while (fibril_mutex_is_locked((*kbd_dev)->repeat_mtx)) {}
-		free((*kbd_dev)->repeat_mtx);
+		while (fibril_mutex_is_locked(kbd_dev->repeat_mtx)) {}
+		free(kbd_dev->repeat_mtx);
 	}
 	
 	// free all buffers
-	if ((*kbd_dev)->keys != NULL) {
-		free((*kbd_dev)->keys);
-	}
-	if ((*kbd_dev)->keys_old != NULL) {
-		free((*kbd_dev)->keys_old);
-	}
-	if ((*kbd_dev)->led_data != NULL) {
-		free((*kbd_dev)->led_data);
-	}
-	if ((*kbd_dev)->led_path != NULL) {
-		usb_hid_report_path_free((*kbd_dev)->led_path);
-	}
-	if ((*kbd_dev)->output_buffer != NULL) {
-		usb_hid_report_output_free((*kbd_dev)->output_buffer);
-	}
-
-	free(*kbd_dev);
-	*kbd_dev = NULL;
+	if (kbd_dev->keys != NULL) {
+		free(kbd_dev->keys);
+	}
+	if (kbd_dev->keys_old != NULL) {
+		free(kbd_dev->keys_old);
+	}
+	if (kbd_dev->led_data != NULL) {
+		free(kbd_dev->led_data);
+	}
+	if (kbd_dev->led_path != NULL) {
+		usb_hid_report_path_free(kbd_dev->led_path);
+	}
+	if (kbd_dev->output_buffer != NULL) {
+		usb_hid_report_output_free(kbd_dev->output_buffer);
+	}
 }
 
@@ -830,5 +827,5 @@
 			usb_kbd_mark_unusable(kbd_dev);
 		} else {
-			usb_kbd_free(&kbd_dev);
+			usb_kbd_destroy(kbd_dev);
 		}
 	}
Index: uspace/drv/bus/usb/usbhid/kbd/kbddev.h
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbddev.h	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbhid/kbd/kbddev.h	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -131,5 +131,5 @@
 int usb_kbd_is_ready_to_destroy(const usb_kbd_t *kbd_dev);
 
-void usb_kbd_free(usb_kbd_t **kbd_dev);
+void usb_kbd_destroy(usb_kbd_t *kbd_dev);
 
 void usb_kbd_push_ev(struct usb_hid_dev *hid_dev, usb_kbd_t *kbd_dev,
Index: uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.c
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbhid/kbd/kbdrepeat.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -80,6 +80,5 @@
 		if (!usb_kbd_is_initialized(kbd)) {
 			if (usb_kbd_is_ready_to_destroy(kbd)) {
-				usb_kbd_free(&kbd);
-				assert(kbd == NULL);
+				usb_kbd_destroy(kbd);
 			}
 			return;
Index: uspace/drv/bus/usb/usbhid/main.c
===================================================================
--- uspace/drv/bus/usb/usbhid/main.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbhid/main.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -93,5 +93,5 @@
 	if (rc != EOK) {
 		usb_log_error("Failed to initialize USB/HID device.\n");
-		usb_hid_free(&hid_dev);
+		usb_hid_destroy(hid_dev);
 		return rc;
 	}	
Index: uspace/drv/bus/usb/usbhid/mouse/mousedev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/mouse/mousedev.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbhid/mouse/mousedev.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -183,19 +183,16 @@
 /*----------------------------------------------------------------------------*/
 
-static void usb_mouse_free(usb_mouse_t **mouse_dev)
-{
-	assert(mouse_dev != NULL && *mouse_dev != NULL);
+static void usb_mouse_destroy(usb_mouse_t *mouse_dev)
+{
+	assert(mouse_dev != NULL);
 	
 	// hangup phone to the console
-	if ((*mouse_dev)->mouse_phone >= 0) {
-		async_obsolete_hangup((*mouse_dev)->mouse_phone);
-	}
-	
-	if ((*mouse_dev)->wheel_phone >= 0) {
-		async_obsolete_hangup((*mouse_dev)->wheel_phone);
-	}
-	
-	free(*mouse_dev);
-	*mouse_dev = NULL;
+	if (mouse_dev->mouse_phone >= 0) {
+		async_obsolete_hangup(mouse_dev->mouse_phone);
+	}
+	
+	if (mouse_dev->wheel_phone >= 0) {
+		async_obsolete_hangup(mouse_dev->wheel_phone);
+	}
 }
 
@@ -437,5 +434,5 @@
 	int rc = usb_mouse_create_function(hid_dev, mouse_dev);
 	if (rc != EOK) {
-		usb_mouse_free(&mouse_dev);
+		usb_mouse_destroy(mouse_dev);
 		return rc;
 	}
@@ -464,5 +461,5 @@
 {
 	if (data != NULL) {
-		usb_mouse_free((usb_mouse_t **)&data);
+		usb_mouse_destroy((usb_mouse_t *)data);
 	}
 }
Index: uspace/drv/bus/usb/usbhid/multimedia/multimedia.c
===================================================================
--- uspace/drv/bus/usb/usbhid/multimedia/multimedia.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbhid/multimedia/multimedia.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -167,19 +167,4 @@
 /*----------------------------------------------------------------------------*/
 
-static void usb_multimedia_free(usb_multimedia_t **multim_dev)
-{
-	if (multim_dev == NULL || *multim_dev == NULL) {
-		return;
-	}
-	
-	// hangup phone to the console
-	async_obsolete_hangup((*multim_dev)->console_phone);
-
-	free(*multim_dev);
-	*multim_dev = NULL;
-}
-
-/*----------------------------------------------------------------------------*/
-
 static int usb_multimedia_create_function(usb_hid_dev_t *hid_dev, 
     usb_multimedia_t *multim_dev)
@@ -247,8 +232,6 @@
 	
 	int rc = usb_multimedia_create_function(hid_dev, multim_dev);
-	if (rc != EOK) {
-		usb_multimedia_free(&multim_dev);
+	if (rc != EOK)
 		return rc;
-	}
 	
 	usb_log_debug(NAME " HID/multimedia structure initialized.\n");
@@ -267,5 +250,6 @@
 	if (data != NULL) {
 		usb_multimedia_t *multim_dev = (usb_multimedia_t *)data;
-		usb_multimedia_free(&multim_dev);
+		// hangup phone to the console
+		async_obsolete_hangup(multim_dev->console_phone);
 	}
 }
Index: uspace/drv/bus/usb/usbhid/usbhid.c
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbhid/usbhid.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -627,5 +627,5 @@
 	}
 	
-	usb_hid_free(&hid_dev);
+	usb_hid_destroy(hid_dev);
 }
 
@@ -646,41 +646,38 @@
 /*----------------------------------------------------------------------------*/
 
-void usb_hid_free(usb_hid_dev_t **hid_dev)
+void usb_hid_destroy(usb_hid_dev_t *hid_dev)
 {
 	int i;
 	
-	if (hid_dev == NULL || *hid_dev == NULL) {
+	if (hid_dev == NULL) {
 		return;
 	}
 	
 	usb_log_debug("Subdrivers: %p, subdriver count: %d\n", 
-	    (*hid_dev)->subdrivers, (*hid_dev)->subdriver_count);
-	
-	assert((*hid_dev)->subdrivers != NULL 
-	    || (*hid_dev)->subdriver_count == 0);
-	
-	for (i = 0; i < (*hid_dev)->subdriver_count; ++i) {
-		if ((*hid_dev)->subdrivers[i].deinit != NULL) {
-			(*hid_dev)->subdrivers[i].deinit(*hid_dev,
-			    (*hid_dev)->subdrivers[i].data);
+	    hid_dev->subdrivers, hid_dev->subdriver_count);
+	
+	assert(hid_dev->subdrivers != NULL 
+	    || hid_dev->subdriver_count == 0);
+	
+	for (i = 0; i < hid_dev->subdriver_count; ++i) {
+		if (hid_dev->subdrivers[i].deinit != NULL) {
+			hid_dev->subdrivers[i].deinit(hid_dev,
+			    hid_dev->subdrivers[i].data);
 		}
 	}
 	
 	// free the subdrivers info
-	if ((*hid_dev)->subdrivers != NULL) {
-		free((*hid_dev)->subdrivers);
+	if (hid_dev->subdrivers != NULL) {
+		free(hid_dev->subdrivers);
 	}
 
 	// destroy the parser
-	if ((*hid_dev)->report != NULL) {
-		usb_hid_free_report((*hid_dev)->report);
-	}
-
-	if ((*hid_dev)->report_desc != NULL) {
-		free((*hid_dev)->report_desc);
-	}
-
-	free(*hid_dev);
-	*hid_dev = NULL;
+	if (hid_dev->report != NULL) {
+		usb_hid_free_report(hid_dev->report);
+	}
+
+	if (hid_dev->report_desc != NULL) {
+		free(hid_dev->report_desc);
+	}
 }
 
Index: uspace/drv/bus/usb/usbhid/usbhid.h
===================================================================
--- uspace/drv/bus/usb/usbhid/usbhid.h	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbhid/usbhid.h	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -158,5 +158,5 @@
 int usb_hid_report_number(usb_hid_dev_t *hid_dev);
 
-void usb_hid_free(usb_hid_dev_t **hid_dev);
+void usb_hid_destroy(usb_hid_dev_t *hid_dev);
 
 #endif /* USB_HID_USBHID_H_ */
Index: uspace/drv/bus/usb/usbmast/main.c
===================================================================
--- uspace/drv/bus/usb/usbmast/main.c	(revision 1dc4a5e441cc195a33bd958ea4994dcd59141df0)
+++ uspace/drv/bus/usb/usbmast/main.c	(revision e2b9b3419fee2bcd7b8c7c52f092a8f64c857124)
@@ -145,15 +145,4 @@
 	usbmast_fun_t *mfun = NULL;
 
-	/* Allocate softstate */
-	mfun = calloc(1, sizeof(usbmast_fun_t));
-	if (mfun == NULL) {
-		usb_log_error("Failed allocating softstate.\n");
-		rc = ENOMEM;
-		goto error;
-	}
-
-	mfun->mdev = mdev;
-	mfun->lun = lun;
-
 	if (asprintf(&fun_name, "l%u", lun) < 0) {
 		usb_log_error("Out of memory.\n");
@@ -170,4 +159,16 @@
 
 	free(fun_name);
+
+	/* Allocate soft state */
+	mfun = ddf_dev_data_alloc(mdev->ddf_dev, sizeof(usbmast_fun_t));
+	if (mfun == NULL) {
+		usb_log_error("Failed allocating softstate.\n");
+		rc = ENOMEM;
+		goto error;
+	}
+
+	mfun->mdev = mdev;
+	mfun->lun = lun;
+
 	fun_name = NULL;
 
@@ -227,6 +228,4 @@
 	if (fun_name != NULL)
 		free(fun_name);
-	if (mfun != NULL)
-		free(mfun);
 	return rc;
 }
