Index: uspace/drv/bus/usb/usbmid/explore.c
===================================================================
--- uspace/drv/bus/usb/usbmid/explore.c	(revision 6df4adc4aea8c14cd625c1a630fbf15d7f75c19d)
+++ uspace/drv/bus/usb/usbmid/explore.c	(revision 9e2132ab753037f2efee552bfdbd219511065e77)
@@ -111,16 +111,4 @@
 		}
 
-		usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t));
-		if (iface == NULL) {
-			//TODO: Do something about that failure.
-			break;
-		}
-
-		link_initialize(&iface->link);
-		iface->fun = NULL;
-		iface->interface_no = interface->interface_number;
-		iface->interface = interface;
-
-		list_append(&iface->link, list);
 
 		usb_log_info("Creating child for interface %d (%s).\n",
@@ -128,11 +116,15 @@
 		    usb_str_class(interface->interface_class));
 
-		const int rc = usbmid_spawn_interface_child(usb_dev, iface,
+		usbmid_interface_t *iface = NULL;
+		const int rc = usbmid_spawn_interface_child(usb_dev, &iface,
 		    &usb_dev->descriptors.device, interface);
 		if (rc != EOK) {
+			//TODO: Do something about that failure.
 			usb_log_error("Failed to create interface child for "
 			    "%d (%s): %s.\n", interface->interface_number,
 			    usb_str_class(interface->interface_class),
 			    str_error(rc));
+		} else {
+			list_append(&iface->link, list);
 		}
 	}
Index: uspace/drv/bus/usb/usbmid/usbmid.c
===================================================================
--- uspace/drv/bus/usb/usbmid/usbmid.c	(revision 6df4adc4aea8c14cd625c1a630fbf15d7f75c19d)
+++ uspace/drv/bus/usb/usbmid/usbmid.c	(revision 9e2132ab753037f2efee552bfdbd219511065e77)
@@ -30,7 +30,4 @@
  * @{
  */
-
-/* XXX Fix this */
-#define _DDF_DATA_IMPLANT
 
 /**
@@ -81,9 +78,5 @@
 		return ret;
 	}
-	/* NOTE: usbmid->interface points somewhere, but we did not
-	 * allocate that space, so don't touch */
 	ddf_fun_destroy(mid_iface->fun);
-	/* NOTE: mid_iface is invalid at this point, it was assigned to
-	 * mid_iface->fun->driver_data and freed in ddf_fun_destroy */
 	return EOK;
 }
@@ -98,5 +91,5 @@
  */
 int usbmid_spawn_interface_child(usb_device_t *parent,
-    usbmid_interface_t *iface,
+    usbmid_interface_t **iface_ret,
     const usb_standard_device_descriptor_t *device_descriptor,
     const usb_standard_interface_descriptor_t *interface_descriptor)
@@ -145,4 +138,11 @@
 	}
 	clean_match_ids(&match_ids);
+	ddf_fun_set_ops(child, &child_device_ops);
+
+	usbmid_interface_t *iface = ddf_fun_data_alloc(child, sizeof(*iface));
+
+	iface->fun = child;
+	iface->interface_no = interface_descriptor->interface_number;
+	link_initialize(&iface->link);
 
 	rc = ddf_fun_bind(child);
@@ -152,8 +152,5 @@
 		return rc;
 	}
-
-	iface->fun = child;
-	ddf_fun_data_implant(child, iface);
-	ddf_fun_set_ops(child, &child_device_ops);
+	*iface_ret = iface;
 
 	return EOK;
Index: uspace/drv/bus/usb/usbmid/usbmid.h
===================================================================
--- uspace/drv/bus/usb/usbmid/usbmid.h	(revision 6df4adc4aea8c14cd625c1a630fbf15d7f75c19d)
+++ uspace/drv/bus/usb/usbmid/usbmid.h	(revision 9e2132ab753037f2efee552bfdbd219511065e77)
@@ -50,6 +50,4 @@
 	/** Function container. */
 	ddf_fun_t *fun;
-	/** Interface descriptor. */
-	const usb_standard_interface_descriptor_t *interface;
 	/** Interface number. */
 	int interface_no;
@@ -65,5 +63,5 @@
 
 int usbmid_explore_device(usb_device_t *);
-int usbmid_spawn_interface_child(usb_device_t *, usbmid_interface_t *,
+int usbmid_spawn_interface_child(usb_device_t *, usbmid_interface_t **,
     const usb_standard_device_descriptor_t *,
     const usb_standard_interface_descriptor_t *);
