Index: uspace/drv/block/usbmast/main.c
===================================================================
--- uspace/drv/block/usbmast/main.c	(revision 11d4c74790a59262e7cbf38a3e7529d4af5716c2)
+++ uspace/drv/block/usbmast/main.c	(revision c54b898a423eb0a631a4ff88a42b3d7107d02a27)
@@ -390,5 +390,5 @@
 static const usb_driver_ops_t usbmast_driver_ops = {
 	.device_add = usbmast_device_add,
-	.device_rem = usbmast_device_remove,
+	.device_remove = usbmast_device_remove,
 	.device_gone = usbmast_device_gone,
 };
Index: uspace/drv/bus/usb/usbdiag/main.c
===================================================================
--- uspace/drv/bus/usb/usbdiag/main.c	(revision 11d4c74790a59262e7cbf38a3e7529d4af5716c2)
+++ uspace/drv/bus/usb/usbdiag/main.c	(revision c54b898a423eb0a631a4ff88a42b3d7107d02a27)
@@ -186,5 +186,5 @@
 static const usb_driver_ops_t diag_driver_ops = {
 	.device_add = device_add,
-	.device_rem = device_remove,
+	.device_remove = device_remove,
 	.device_gone = device_gone,
 	.function_online = function_online,
Index: uspace/drv/bus/usb/usbflbk/main.c
===================================================================
--- uspace/drv/bus/usb/usbflbk/main.c	(revision 11d4c74790a59262e7cbf38a3e7529d4af5716c2)
+++ uspace/drv/bus/usb/usbflbk/main.c	(revision c54b898a423eb0a631a4ff88a42b3d7107d02a27)
@@ -68,5 +68,5 @@
 static const usb_driver_ops_t usbfallback_driver_ops = {
 	.device_add = usbfallback_device_add,
-	.device_rem = usbfallback_device_gone,
+	.device_remove = usbfallback_device_gone,
 	.device_gone = usbfallback_device_gone,
 };
Index: uspace/drv/bus/usb/usbhub/main.c
===================================================================
--- uspace/drv/bus/usb/usbhub/main.c	(revision 11d4c74790a59262e7cbf38a3e7529d4af5716c2)
+++ uspace/drv/bus/usb/usbhub/main.c	(revision c54b898a423eb0a631a4ff88a42b3d7107d02a27)
@@ -48,5 +48,5 @@
 static const usb_driver_ops_t usb_hub_driver_ops = {
 	.device_add = usb_hub_device_add,
-//	.device_rem = usb_hub_device_remove,
+//	.device_remove = usb_hub_device_remove,
 	.device_gone = usb_hub_device_gone,
 };
Index: uspace/drv/bus/usb/usbmid/main.c
===================================================================
--- uspace/drv/bus/usb/usbmid/main.c	(revision 11d4c74790a59262e7cbf38a3e7529d4af5716c2)
+++ uspace/drv/bus/usb/usbmid/main.c	(revision c54b898a423eb0a631a4ff88a42b3d7107d02a27)
@@ -162,5 +162,5 @@
 static const usb_driver_ops_t mid_driver_ops = {
 	.device_add = usbmid_device_add,
-	.device_rem = usbmid_device_remove,
+	.device_remove = usbmid_device_remove,
 	.device_gone = usbmid_device_gone,
 	.function_online = usbmid_function_online,
Index: uspace/drv/hid/usbhid/main.c
===================================================================
--- uspace/drv/hid/usbhid/main.c	(revision 11d4c74790a59262e7cbf38a3e7529d4af5716c2)
+++ uspace/drv/hid/usbhid/main.c	(revision c54b898a423eb0a631a4ff88a42b3d7107d02a27)
@@ -122,5 +122,5 @@
  * @return Error code.
  */
-static int usb_hid_device_rem(usb_device_t *dev)
+static int usb_hid_device_remove(usb_device_t *dev)
 {
 	assert(dev);
@@ -164,5 +164,5 @@
 static const usb_driver_ops_t usb_hid_driver_ops = {
 	.device_add = usb_hid_device_add,
-	.device_rem = usb_hid_device_rem,
+	.device_remove = usb_hid_device_remove,
 	.device_gone = usb_hid_device_gone,
 };
Index: uspace/lib/usbdev/include/usb/dev/driver.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/driver.h	(revision 11d4c74790a59262e7cbf38a3e7529d4af5716c2)
+++ uspace/lib/usbdev/include/usb/dev/driver.h	(revision c54b898a423eb0a631a4ff88a42b3d7107d02a27)
@@ -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 11d4c74790a59262e7cbf38a3e7529d4af5716c2)
+++ uspace/lib/usbdev/src/driver.c	(revision c54b898a423eb0a631a4ff88a42b3d7107d02a27)
@@ -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;
