Index: uspace/drv/bus/usb/usbmid/explore.c
===================================================================
--- uspace/drv/bus/usb/usbmid/explore.c	(revision e462909e04b1c7a6f3480de93f06d41fa58ba016)
+++ uspace/drv/bus/usb/usbmid/explore.c	(revision 8be7819e446d3ad8391ac21c6f806e6e55e61bd6)
@@ -139,14 +139,15 @@
 	int rc;
 
-	int dev_class = dev->descriptors.device.device_class;
+	unsigned dev_class = dev->descriptors.device.device_class;
 	if (dev_class != USB_CLASS_USE_INTERFACE) {
 		usb_log_warning(
-		    "Device class: %d (%s), but expected class 0.\n",
-		    dev_class, usb_str_class(dev_class));
+		    "Device class: %u (%s), but expected class %u.\n",
+		    dev_class, usb_str_class(dev_class),
+		    USB_CLASS_USE_INTERFACE);
 		usb_log_error("Not multi interface device, refusing.\n");
 		return false;
 	}
 
-	/* Short cuts to save on typing ;-). */
+	/* Shortcuts to save on typing ;-). */
 	const void *config_descriptor_raw = dev->descriptors.configuration;
 	size_t config_descriptor_size = dev->descriptors.configuration_size;
@@ -163,4 +164,5 @@
 	}
 
+	/* Create driver soft-state. */
 	usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t));
 	if (!usb_mid) {
@@ -169,5 +171,5 @@
 	}
 
-	/* Create control function */
+	/* Create control function. */
 	usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
 	if (usb_mid->ctl_fun == NULL) {
@@ -175,7 +177,7 @@
 		return false;
 	}
-
 	usb_mid->ctl_fun->ops = &mid_device_ops;
 
+	/* Bind control function. */
 	rc = ddf_fun_bind(usb_mid->ctl_fun);
 	if (rc != EOK) {
@@ -192,10 +194,10 @@
 	    &usb_mid->interface_list);
 
+	/* Start child function for every interface. */
 	list_foreach(usb_mid->interface_list, link) {
-		usbmid_interface_t *iface = list_get_instance(link,
-		    usbmid_interface_t, link);
+		usbmid_interface_t *iface = usbmid_interface_from_link(link);
 
 		usb_log_info("Creating child for interface %d (%s).\n",
-		    (int) iface->interface_no,
+		    iface->interface_no,
 		    usb_str_class(iface->interface->interface_class));
 
Index: uspace/drv/bus/usb/usbmid/main.c
===================================================================
--- uspace/drv/bus/usb/usbmid/main.c	(revision e462909e04b1c7a6f3480de93f06d41fa58ba016)
+++ uspace/drv/bus/usb/usbmid/main.c	(revision 8be7819e446d3ad8391ac21c6f806e6e55e61bd6)
@@ -74,16 +74,45 @@
 {
 	assert(dev);
-	int ret = ENOTSUP;
+
+	/* Remove ctl function */
 	usb_mid_t *usb_mid = dev->driver_data;
-	assert(usb_mid);
+	int ret = ddf_fun_unbind(usb_mid->ctl_fun);
+	if (ret != EOK) {
+		usb_log_error("Failed to unbind USB MID ctl function: %s.\n",
+		    str_error(ret));
+		return ret;
+	}
+	ddf_fun_destroy(usb_mid->ctl_fun);
 
-	/* Signal all interface functions */
-	list_foreach(usb_mid->interface_list, item) {
+	/* Remove all children */
+	while (!list_empty(&usb_mid->interface_list)) {
+		link_t *item = list_first(&usb_mid->interface_list);
+		list_remove(item);
+
 		usbmid_interface_t *iface = usbmid_interface_from_link(item);
 
-		usb_log_info("Signaling remove to child for interface "
-		    "%d (%s).\n", iface->interface_no,
+		usb_log_info("Removing child for interface %d (%s).\n",
+		    iface->interface_no,
 		    usb_str_class(iface->interface->interface_class));
-		// TODO cascade the call.
+
+		/* Tell the child to go off-line. */
+		int pret = ddf_fun_offline(iface->fun);
+		if (pret != EOK) {
+			usb_log_warning("Failed to turn off child for interface"
+			    " %d (%s): %s\n", iface->interface_no,
+			    usb_str_class(iface->interface->interface_class),
+			    str_error(pret));
+			ret = pret;
+		}
+
+		/* Now remove the child. */
+		pret = usbmid_interface_destroy(iface);
+		if (pret != EOK) {
+			usb_log_error("Failed to remove child for interface "
+			    "%d (%s): %s\n", iface->interface_no,
+			    usb_str_class(iface->interface->interface_class),
+			    str_error(pret));
+			ret = pret;
+		}
 	}
 	return ret;
@@ -117,5 +146,5 @@
 		usbmid_interface_t *iface = usbmid_interface_from_link(item);
 
-		usb_log_info("Removing child for interface %d (%s).\n",
+		usb_log_info("Child for interface %d (%s) gone.\n",
 		    iface->interface_no,
 		    usb_str_class(iface->interface->interface_class));
Index: uspace/drv/bus/usb/usbmid/usbmid.c
===================================================================
--- uspace/drv/bus/usb/usbmid/usbmid.c	(revision e462909e04b1c7a6f3480de93f06d41fa58ba016)
+++ uspace/drv/bus/usb/usbmid/usbmid.c	(revision 8be7819e446d3ad8391ac21c6f806e6e55e61bd6)
@@ -110,7 +110,7 @@
 	 * class name something humanly understandable.
 	 */
-	rc = asprintf(&child_name, "%s%d",
+	rc = asprintf(&child_name, "%s%hhu",
 	    usb_str_class(interface_descriptor->interface_class),
-	    (int) interface_descriptor->interface_number);
+	    interface_descriptor->interface_number);
 	if (rc < 0) {
 		return ENOMEM;
