Index: uspace/lib/usbdev/include/usb/dev/driver.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/driver.h	(revision 5c75456d1c46306b7feaa50f199fd4f6d059a601)
+++ uspace/lib/usbdev/include/usb/dev/driver.h	(revision b60944bca829148fb902a29e4e88cbbecd57922f)
@@ -45,5 +45,7 @@
 	int (*device_add)(usb_device_t *);
 	/** Callback when a device is about to be removed from the system. */
-	int (*device_rem)(usb_device_t *);
+	int (*device_remove)(usb_device_t *);
+	/** Callback when a device has just been removed from the system (optional). */
+	int (*device_removed)(usb_device_t *);
 	/** Callback when a device was removed from the system. */
 	int (*device_gone)(usb_device_t *);
Index: uspace/lib/usbdev/src/driver.c
===================================================================
--- uspace/lib/usbdev/src/driver.c	(revision 5c75456d1c46306b7feaa50f199fd4f6d059a601)
+++ uspace/lib/usbdev/src/driver.c	(revision b60944bca829148fb902a29e4e88cbbecd57922f)
@@ -85,11 +85,21 @@
 	assert(driver);
 	assert(driver->ops);
-	if (driver->ops->device_rem == NULL)
+	if (driver->ops->device_remove == NULL)
 		return ENOTSUP;
+
 	/* Just tell the driver to stop whatever it is doing */
 	usb_device_t *usb_dev = ddf_dev_data_get(gen_dev);
-	const int ret = driver->ops->device_rem(usb_dev);
+	int ret = driver->ops->device_remove(usb_dev);
 	if (ret != EOK)
 		return ret;
+
+	/* Notify the driver after endpoints were unregistered. */
+	usb_device_destroy_pipes(usb_dev);
+	if (driver->ops->device_removed != NULL) {
+		ret = driver->ops->device_removed(usb_dev);
+		if (ret != EOK)
+			return ret;
+	}
+
 	usb_device_destroy_ddf(gen_dev);
 	return EOK;
