Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision d37514e8be9c7349ee2709bea78b4524fe9c6ed3)
@@ -280,4 +280,49 @@
 }
 
+static int online_device(bus_t *bus_base, hcd_t *hcd, device_t *dev_base)
+{
+	int err;
+
+	xhci_hc_t *hc = hcd_get_driver_data(hcd);
+	assert(hc);
+
+	xhci_bus_t *bus = bus_to_xhci_bus(bus_base);
+	assert(bus);
+
+	xhci_device_t *dev = xhci_device_get(dev_base);
+	assert(dev);
+
+	// TODO: Prepare the device for use. Reset? Configure?
+
+	if ((err = ddf_fun_online(dev_base->fun))) {
+		return err;
+	}
+
+	return EOK;
+}
+
+static int offline_device(bus_t *bus_base, hcd_t *hcd, device_t *dev_base)
+{
+	int err;
+
+	xhci_hc_t *hc = hcd_get_driver_data(hcd);
+	assert(hc);
+
+	xhci_bus_t *bus = bus_to_xhci_bus(bus_base);
+	assert(bus);
+
+	xhci_device_t *dev = xhci_device_get(dev_base);
+	assert(dev);
+
+	/* Tear down all drivers working with the device. */
+	if ((err = ddf_fun_offline(dev_base->fun))) {
+		return err;
+	}
+
+	// TODO: We want to keep the device addressed. Deconfigure?
+
+	return EOK;
+}
+
 static endpoint_t *create_endpoint(bus_t *base)
 {
@@ -442,4 +487,7 @@
 	.remove_device = remove_device,
 
+	.online_device = online_device,
+	.offline_device = offline_device,
+
 	.create_endpoint = create_endpoint,
 	.destroy_endpoint = destroy_endpoint,
Index: uspace/drv/bus/usb/xhci/main.c
===================================================================
--- uspace/drv/bus/usb/xhci/main.c	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
+++ uspace/drv/bus/usb/xhci/main.c	(revision d37514e8be9c7349ee2709bea78b4524fe9c6ed3)
@@ -164,7 +164,18 @@
 }
 
+static int xhci_fun_online(ddf_fun_t *fun)
+{
+	return hcd_ddf_device_online(fun);
+}
+
+static int xhci_fun_offline(ddf_fun_t *fun)
+{
+	return hcd_ddf_device_offline(fun);
+}
 
 static const driver_ops_t xhci_driver_ops = {
 	.dev_add = xhci_dev_add,
+	.fun_online = xhci_fun_online,
+	.fun_offline = xhci_fun_offline
 };
 
Index: uspace/lib/usbhost/include/usb/host/bus.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/bus.h	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
+++ uspace/lib/usbhost/include/usb/host/bus.h	(revision d37514e8be9c7349ee2709bea78b4524fe9c6ed3)
@@ -82,4 +82,7 @@
 	int (*remove_device)(bus_t *, hcd_t *, device_t *);
 
+	int (*online_device)(bus_t *, hcd_t *, device_t *);			/**< Optional */
+	int (*offline_device)(bus_t *, hcd_t *, device_t *);			/**< Optional */
+
 	/* The following operations are protected by a bus guard. */
 	endpoint_t *(*create_endpoint)(bus_t *);
@@ -123,4 +126,7 @@
 int bus_remove_device(bus_t *, hcd_t *, device_t *);
 
+int bus_online_device(bus_t *, hcd_t *, device_t *);
+int bus_offline_device(bus_t *, hcd_t *, device_t *);
+
 int bus_add_endpoint(bus_t *, device_t *, const usb_endpoint_desc_t *, endpoint_t **);
 endpoint_t *bus_find_endpoint(bus_t *, device_t *, usb_target_t, usb_direction_t);
Index: uspace/lib/usbhost/include/usb/host/ddf_helpers.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/ddf_helpers.h	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
+++ uspace/lib/usbhost/include/usb/host/ddf_helpers.h	(revision d37514e8be9c7349ee2709bea78b4524fe9c6ed3)
@@ -85,4 +85,6 @@
 void hcd_ddf_device_destroy(device_t *);
 int hcd_ddf_device_explore(hcd_t *, device_t *);
+int hcd_ddf_device_online(ddf_fun_t *);
+int hcd_ddf_device_offline(ddf_fun_t *);
 
 hcd_t *dev_to_hcd(ddf_dev_t *dev);
Index: uspace/lib/usbhost/src/bus.c
===================================================================
--- uspace/lib/usbhost/src/bus.c	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
+++ uspace/lib/usbhost/src/bus.c	(revision d37514e8be9c7349ee2709bea78b4524fe9c6ed3)
@@ -101,4 +101,28 @@
 }
 
+int bus_online_device(bus_t *bus, hcd_t *hcd, device_t *dev)
+{
+	assert(bus);
+	assert(hcd);
+	assert(dev);
+
+	if (!bus->ops.online_device)
+		return ENOTSUP;
+
+	return bus->ops.online_device(bus, hcd, dev);
+}
+
+int bus_offline_device(bus_t *bus, hcd_t *hcd, device_t *dev)
+{
+	assert(bus);
+	assert(hcd);
+	assert(dev);
+
+	if (!bus->ops.offline_device)
+		return ENOTSUP;
+
+	return bus->ops.offline_device(bus, hcd, dev);
+}
+
 int bus_add_endpoint(bus_t *bus, device_t *device, const usb_endpoint_desc_t *desc, endpoint_t **out_ep)
 {
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision d46ceb2b135bb1118b9cac35e2589807c28d3c97)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision d37514e8be9c7349ee2709bea78b4524fe9c6ed3)
@@ -448,4 +448,32 @@
 }
 
+int hcd_ddf_device_online(ddf_fun_t *fun)
+{
+	assert(fun);
+
+	hcd_t *hcd = dev_to_hcd(ddf_fun_get_dev(fun));
+	device_t *dev = ddf_fun_data_get(fun);
+	assert(dev);
+	assert(hcd->bus);
+
+	usb_log_info("Device(%d): Requested to be brought online.", dev->address);
+
+	return bus_online_device(hcd->bus, hcd, dev);
+}
+
+int hcd_ddf_device_offline(ddf_fun_t *fun)
+{
+	assert(fun);
+
+	hcd_t *hcd = dev_to_hcd(ddf_fun_get_dev(fun));
+	device_t *dev = ddf_fun_data_get(fun);
+	assert(dev);
+	assert(hcd->bus);
+
+	usb_log_info("Device(%d): Requested to be taken offline.", dev->address);
+
+	return bus_offline_device(hcd->bus, hcd, dev);
+}
+
 static int hcd_ddf_new_device(hcd_t *hcd, ddf_dev_t *hc, device_t *hub, unsigned port)
 {
