Index: uspace/drv/bus/usb/usbmid/main.c
===================================================================
--- uspace/drv/bus/usb/usbmid/main.c	(revision 344a0acbd420565da0e55a0f408840c4987e6e76)
+++ uspace/drv/bus/usb/usbmid/main.c	(revision 38e68ab30fdc6d101f408c31e7db3072467d6ed6)
@@ -66,7 +66,49 @@
 }
 
+static int usbmid_device_gone(usb_device_t *dev)
+{
+	assert(dev);
+	usb_log_info("USB MID gone: `%s'.\n", dev->ddf_dev->name);
+
+	/* Remove ctl function */
+	usb_mid_t *usb_mid = dev->driver_data;
+	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);
+
+	/* Now remove all other functions */
+	while (!list_empty(&usb_mid->interface_list)) {
+		link_t *item = list_first(&usb_mid->interface_list);
+		list_remove(item);
+
+		usbmid_interface_t *iface = list_get_instance(item,
+		    usbmid_interface_t, link);
+
+		usb_log_info("Removing child for interface %d (%s).\n",
+		    iface->interface_no,
+		    usb_str_class(iface->interface->interface_class));
+
+		const int 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;
+		}
+	}
+	free(usb_mid);
+	return ret;
+}
+
 /** USB MID driver ops. */
 static usb_driver_ops_t mid_driver_ops = {
 	.device_add = usbmid_device_add,
+	.device_gone = usbmid_device_gone,
 };
 
Index: uspace/drv/bus/usb/usbmid/usbmid.c
===================================================================
--- uspace/drv/bus/usb/usbmid/usbmid.c	(revision 344a0acbd420565da0e55a0f408840c4987e6e76)
+++ uspace/drv/bus/usb/usbmid/usbmid.c	(revision 38e68ab30fdc6d101f408c31e7db3072467d6ed6)
@@ -79,4 +79,18 @@
 };
 
+int usbmid_interface_destroy(usbmid_interface_t *mid_iface)
+{
+	assert(mid_iface);
+	assert_link_not_used(&mid_iface->link);
+	const int ret = ddf_fun_unbind(mid_iface->fun);
+	if (ret != EOK) {
+		return ret;
+	}
+	/* NOTE: interface memebr points somewhere, but we did not
+	 * allocate that space, s leave it be */
+	ddf_fun_destroy(mid_iface->fun);
+	free(mid_iface);
+	return EOK;
+}
 
 /** Spawn new child device from one interface.
Index: uspace/drv/bus/usb/usbmid/usbmid.h
===================================================================
--- uspace/drv/bus/usb/usbmid/usbmid.h	(revision 344a0acbd420565da0e55a0f408840c4987e6e76)
+++ uspace/drv/bus/usb/usbmid/usbmid.h	(revision 38e68ab30fdc6d101f408c31e7db3072467d6ed6)
@@ -69,4 +69,5 @@
     const usb_standard_interface_descriptor_t *);
 void usbmid_dump_descriptors(uint8_t *, size_t);
+int usbmid_interface_destroy(usbmid_interface_t *mid_iface);
 
 #endif
