Index: uspace/drv/bus/usb/usbdiag/main.c
===================================================================
--- uspace/drv/bus/usb/usbdiag/main.c	(revision 0eadfd1e27518dc073e37ac4e81a1ba5a5e0929f)
+++ uspace/drv/bus/usb/usbdiag/main.c	(revision dfa1fc89908768ada2f867e2261572377b56e1e8)
@@ -91,6 +91,4 @@
 	}
 
-	usbdiag_dev_destroy(diag_dev);
-
 	return EOK;
 
@@ -99,6 +97,24 @@
 }
 
+static int device_cleanup(usbdiag_dev_t *diag_dev)
+{
+	/* TODO: Join some fibrils? */
+
+	/* Free memory. */
+	usbdiag_dev_destroy(diag_dev);
+	return EOK;
+}
+
+static int device_removed(usb_device_t *dev)
+{
+	usb_log_info("Device '%s' removed.", usb_device_get_name(dev));
+
+	usbdiag_dev_t *diag_dev = usb_device_to_usbdiag_dev(dev);
+	return device_cleanup(diag_dev);
+}
+
 static int device_gone(usb_device_t *dev)
 {
+	int rc;
 	usb_log_info("Device '%s' gone.", usb_device_get_name(dev));
 
@@ -106,10 +122,14 @@
 
 	/* TODO: Make sure nothing is going on with the device. */
-	/* TODO: Unregister device DDF function. */
-	/* TODO: Remove device from list */
-
-	usbdiag_dev_destroy(diag_dev);
-
-	return EOK;
+
+	if ((rc = ddf_fun_unbind(diag_dev->fun))) {
+		usb_log_error("Failed to unbind DDF function: %s\n", str_error(rc));
+		goto err;
+	}
+
+	return device_cleanup(diag_dev);
+
+err:
+	return rc;
 }
 
@@ -187,4 +207,5 @@
 	.device_add = device_add,
 	.device_remove = device_remove,
+	.device_removed = device_removed,
 	.device_gone = device_gone,
 	.function_online = function_online,
