Index: uspace/drv/bus/usb/usbhid/main.c
===================================================================
--- uspace/drv/bus/usb/usbhid/main.c	(revision 40a3bfaf4a4c874663c6221fda926b56ea78293e)
+++ uspace/drv/bus/usb/usbhid/main.c	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
@@ -124,7 +124,13 @@
 static int usb_hid_device_rem(usb_device_t *dev)
 {
-	// TODO: Stop device polling
-	// TODO: Call deinit (stops autorepeat too)
-	return ENOTSUP;
+	assert(dev);
+	usb_hid_dev_t *hid_dev = usb_device_data_get(dev);
+	assert(hid_dev);
+
+	/* TODO: Stop device polling prior to deinit. Now it fails on endpoint error. */
+
+	usb_hid_deinit(hid_dev);
+	usb_log_debug2("%s destruction complete.\n", usb_device_get_name(dev));
+	return EOK;
 }
 
Index: uspace/drv/bus/usb/usbmid/main.c
===================================================================
--- uspace/drv/bus/usb/usbmid/main.c	(revision 40a3bfaf4a4c874663c6221fda926b56ea78293e)
+++ uspace/drv/bus/usb/usbmid/main.c	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
@@ -147,4 +147,16 @@
 }
 
+static int usbmid_function_online(ddf_fun_t *fun)
+{
+	/* TODO: What if this is the control function? */
+	return ddf_fun_online(fun);
+}
+
+static int usbmid_function_offline(ddf_fun_t *fun)
+{
+	/* TODO: What if this is the control function? */
+	return ddf_fun_offline(fun);
+}
+
 /** USB MID driver ops. */
 static const usb_driver_ops_t mid_driver_ops = {
@@ -152,4 +164,6 @@
 	.device_rem = usbmid_device_remove,
 	.device_gone = usbmid_device_gone,
+	.function_online = usbmid_function_online,
+	.function_offline = usbmid_function_offline
 };
 
Index: uspace/lib/usbdev/include/usb/dev/driver.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/driver.h	(revision 40a3bfaf4a4c874663c6221fda926b56ea78293e)
+++ uspace/lib/usbdev/include/usb/dev/driver.h	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
@@ -48,4 +48,8 @@
 	/** Callback when a device was removed from the system. */
 	int (*device_gone)(usb_device_t *);
+	/** Callback asking the driver to online a specific function. */
+	int (*function_online)(ddf_fun_t *);
+	/** Callback asking the driver to offline a specific function. */
+	int (*function_offline)(ddf_fun_t *);
 } usb_driver_ops_t;
 
Index: uspace/lib/usbdev/src/driver.c
===================================================================
--- uspace/lib/usbdev/src/driver.c	(revision 40a3bfaf4a4c874663c6221fda926b56ea78293e)
+++ uspace/lib/usbdev/src/driver.c	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
@@ -117,8 +117,42 @@
 }
 
+/** Callback when the driver is asked to online a specific function.
+ *
+ * This callback is a wrapper for USB specific version of @c fun_online.
+ *
+ * @param gen_dev Device function structure as prepared by DDF.
+ * @return Error code.
+ */
+static int generic_function_online(ddf_fun_t *fun)
+{
+	assert(driver);
+	assert(driver->ops);
+	if (driver->ops->function_online == NULL)
+		return ENOTSUP;
+	return driver->ops->function_online(fun);
+}
+
+/** Callback when the driver is asked to offline a specific function.
+ *
+ * This callback is a wrapper for USB specific version of @c fun_offline.
+ *
+ * @param gen_dev Device function structure as prepared by DDF.
+ * @return Error code.
+ */
+static int generic_function_offline(ddf_fun_t *fun)
+{
+	assert(driver);
+	assert(driver->ops);
+	if (driver->ops->function_offline == NULL)
+		return ENOTSUP;
+	return driver->ops->function_offline(fun);
+}
+
 static driver_ops_t generic_driver_ops = {
 	.dev_add = generic_device_add,
 	.dev_remove = generic_device_remove,
 	.dev_gone = generic_device_gone,
+	.fun_online = generic_function_online,
+	.fun_offline = generic_function_offline,
 };
 static driver_t generic_driver = {
