Index: uspace/app/devctl/devctl.c
===================================================================
--- uspace/app/devctl/devctl.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/app/devctl/devctl.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2011 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -198,4 +198,26 @@
 }
 
+static errno_t fun_quiesce(const char *path)
+{
+	devman_handle_t funh;
+	errno_t rc;
+
+	rc = devman_fun_get_handle(path, &funh, 0);
+	if (rc != EOK) {
+		printf(NAME ": Error resolving device function '%s' (%s)\n",
+		    path, str_error(rc));
+		return rc;
+	}
+
+	rc = devman_fun_quiesce(funh);
+	if (rc != EOK) {
+		printf(NAME ": Failed to offline function '%s' (%s)\n", path,
+		    str_error(rc));
+		return rc;
+	}
+
+	return EOK;
+}
+
 static errno_t drv_list(void)
 {
@@ -409,4 +431,15 @@
 			return 2;
 		}
+	} else if (str_cmp(argv[1], "quiesce") == 0) {
+		if (argc < 3) {
+			printf(NAME ": Argument missing.\n");
+			print_syntax();
+			return 1;
+		}
+
+		rc = fun_quiesce(argv[2]);
+		if (rc != EOK) {
+			return 2;
+		}
 	} else if (str_cmp(argv[1], "list-drv") == 0) {
 		rc = drv_list();
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty, Petr Manek
@@ -267,4 +268,27 @@
 }
 
+/** Quiesce host controller.
+ *
+ * @param[in] instance Host controller structure to use.
+ */
+int hc_quiesce(hc_device_t *hcd)
+{
+	hc_t *instance = hcd_to_hc(hcd);
+	uhci_regs_t *registers = instance->registers;
+
+	/* Reset everything, who knows what touched it before us */
+	pio_write_16(&registers->usbcmd, UHCI_CMD_GLOBAL_RESET);
+	fibril_usleep(50000); /* 50ms according to USB spec(root hub reset) */
+	pio_write_16(&registers->usbcmd, 0);
+
+	/* Reset hc, all states and counters. Hope that hw is not broken */
+	pio_write_16(&registers->usbcmd, UHCI_CMD_HCRESET);
+	do {
+		fibril_usleep(10);
+	} while ((pio_read_16(&registers->usbcmd) & UHCI_CMD_HCRESET) != 0);
+
+	return EOK;
+}
+
 /** Initialize UHCI hc hw resources.
  *
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty
@@ -164,4 +165,5 @@
 extern errno_t hc_setup_roothub(hc_device_t *);
 extern errno_t hc_gone(hc_device_t *);
+extern errno_t hc_quiesce(hc_device_t *);
 
 #endif
Index: uspace/drv/bus/usb/uhci/main.c
===================================================================
--- uspace/drv/bus/usb/uhci/main.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/drv/bus/usb/uhci/main.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Vojtech Horky, Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty, Petr Manek
@@ -61,4 +62,5 @@
 	.setup_root_hub = hc_setup_roothub,
 	.hc_gone = hc_gone,
+	.hc_quiesce = hc_quiesce
 };
 
Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2018 Ondrej Hlavaty, Petr Manek, Jaroslav Jindrak, Jan Hrach, Michal Staruch
  * All rights reserved.
@@ -746,4 +747,14 @@
 }
 
+/**
+ * Quiesce host controller.
+ */
+errno_t hc_quiesce(xhci_hc_t *hc)
+{
+	hc_stop(hc);
+	usb_log_info("HC quiesced.");
+	return EOK;
+}
+
 unsigned hc_speed_to_psiv(usb_speed_t speed)
 {
Index: uspace/drv/bus/usb/xhci/hc.h
===================================================================
--- uspace/drv/bus/usb/xhci/hc.h	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/drv/bus/usb/xhci/hc.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2018 Ondrej Hlavaty, Jan Hrach, Jaroslav Jindrak, Petr Manek
  * All rights reserved.
@@ -119,4 +120,5 @@
 extern errno_t hc_start(xhci_hc_t *);
 extern void hc_fini(xhci_hc_t *);
+extern errno_t hc_quiesce(xhci_hc_t *);
 
 extern void hc_ring_doorbell(xhci_hc_t *, unsigned, unsigned);
Index: uspace/drv/bus/usb/xhci/main.c
===================================================================
--- uspace/drv/bus/usb/xhci/main.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/drv/bus/usb/xhci/main.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2018 Ondrej Hlavaty, Petr Manek
  * All rights reserved.
@@ -94,4 +95,11 @@
 }
 
+static errno_t hcd_hc_quiesce(hc_device_t *hcd)
+{
+	xhci_hc_t *hc = hcd_to_hc(hcd);
+	hc_quiesce(hc);
+	return EOK;
+}
+
 static const hc_driver_t xhci_driver = {
 	.name = NAME,
@@ -103,4 +111,5 @@
 	.start = hcd_start,
 	.hc_gone = hcd_hc_gone,
+	.hc_quiesce = hcd_hc_quiesce
 };
 
Index: uspace/drv/nic/e1k/e1k.c
===================================================================
--- uspace/drv/nic/e1k/e1k.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/drv/nic/e1k/e1k.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Zdenek Bouska
  * All rights reserved.
@@ -220,8 +221,10 @@
 
 static errno_t e1000_dev_add(ddf_dev_t *);
+static errno_t e1000_dev_quiesce(ddf_dev_t *);
 
 /** Basic driver operations for E1000 driver */
 static driver_ops_t e1000_driver_ops = {
-	.dev_add = e1000_dev_add
+	.dev_add = e1000_dev_add,
+	.dev_quiesce = e1000_dev_quiesce
 };
 
@@ -2223,4 +2226,24 @@
 }
 
+/** Quiesce E1000 device.
+ *
+ * @param dev E1000 device.
+ *
+ */
+errno_t e1000_dev_quiesce(ddf_dev_t *dev)
+{
+	nic_t *nic = ddf_dev_data_get(dev);
+	e1000_t *e1000 = DRIVER_DATA_NIC(nic);
+	errno_t rc;
+
+	ddf_msg(LVL_DEBUG, "e1000_dev_quiesce()");
+
+	e1000_disable_interrupts(e1000);
+	rc = e1000_reset(nic);
+	if (rc != EOK)
+		ddf_msg(LVL_ERROR, "e1000_dev_quiesce failed");
+	return rc;
+}
+
 /** Read 16-bit value from EEPROM of E1000 adapter
  *
Index: uspace/lib/device/include/devman.h
===================================================================
--- uspace/lib/device/include/devman.h	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/lib/device/include/devman.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -52,4 +52,5 @@
 extern errno_t devman_drv_fun_online(devman_handle_t);
 extern errno_t devman_drv_fun_offline(devman_handle_t);
+extern errno_t devman_drv_fun_quiesce(devman_handle_t);
 extern errno_t devman_drv_fun_wait_stable(devman_handle_t);
 
@@ -71,7 +72,9 @@
 extern errno_t devman_fun_online(devman_handle_t);
 extern errno_t devman_fun_offline(devman_handle_t);
+extern errno_t devman_fun_quiesce(devman_handle_t);
 
 extern errno_t devman_add_device_to_category(devman_handle_t, const char *);
 extern errno_t devman_fun_sid_to_handle(service_id_t, devman_handle_t *);
+extern errno_t devman_quiesce_devices(const char *);
 extern errno_t devman_get_drivers(devman_handle_t **, size_t *);
 extern errno_t devman_driver_get_devices(devman_handle_t, devman_handle_t **,
Index: uspace/lib/device/include/ipc/devman.h
===================================================================
--- uspace/lib/device/include/ipc/devman.h	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/lib/device/include/ipc/devman.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -148,4 +148,5 @@
 	DEVMAN_DRV_FUN_ONLINE,
 	DEVMAN_DRV_FUN_OFFLINE,
+	DEVMAN_DRV_FUN_QUIESCE,
 	DEVMAN_DRV_FUN_WAIT_STABLE,
 	DEVMAN_REMOVE_FUNCTION
@@ -156,4 +157,5 @@
 	DRIVER_DEV_REMOVE,
 	DRIVER_DEV_GONE,
+	DRIVER_DEV_QUIESCE,
 	DRIVER_FUN_ONLINE,
 	DRIVER_FUN_OFFLINE,
@@ -171,4 +173,5 @@
 	DEVMAN_FUN_ONLINE,
 	DEVMAN_FUN_OFFLINE,
+	DEVMAN_FUN_QUIESCE,
 	DEVMAN_FUN_GET_PATH,
 	DEVMAN_FUN_SID_TO_HANDLE,
Index: uspace/lib/device/src/devman.c
===================================================================
--- uspace/lib/device/src/devman.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/lib/device/src/devman.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -343,4 +343,16 @@
 }
 
+errno_t devman_drv_fun_quiesce(devman_handle_t funh)
+{
+	async_exch_t *exch = devman_exchange_begin(INTERFACE_DDF_DRIVER);
+	if (exch == NULL)
+		return ENOMEM;
+
+	errno_t retval = async_req_1_0(exch, DEVMAN_DRV_FUN_QUIESCE, funh);
+
+	devman_exchange_end(exch);
+	return retval;
+}
+
 errno_t devman_drv_fun_wait_stable(devman_handle_t funh)
 {
@@ -506,4 +518,16 @@
 }
 
+errno_t devman_fun_quiesce(devman_handle_t funh)
+{
+	async_exch_t *exch = devman_exchange_begin(INTERFACE_DDF_CLIENT);
+	if (exch == NULL)
+		return ENOMEM;
+
+	errno_t retval = async_req_1_0(exch, DEVMAN_FUN_QUIESCE, funh);
+
+	devman_exchange_end(exch);
+	return retval;
+}
+
 static errno_t devman_get_handles_once(sysarg_t method, sysarg_t arg1,
     devman_handle_t *handle_buf, size_t buf_size, size_t *act_size)
@@ -632,4 +656,17 @@
 }
 
+errno_t devman_quiesce_devices(const char *path)
+{
+	devman_handle_t funh;
+	errno_t rc;
+
+	funh = 0;
+	rc = devman_fun_get_handle(path, &funh, 0);
+	if (rc != EOK)
+		return rc;
+
+	return devman_fun_quiesce(funh);
+}
+
 errno_t devman_get_drivers(devman_handle_t **drvs,
     size_t *count)
Index: uspace/lib/drv/generic/driver.c
===================================================================
--- uspace/lib/drv/generic/driver.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/lib/drv/generic/driver.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -237,4 +237,46 @@
 }
 
+static void driver_dev_quiesce(ipc_call_t *icall)
+{
+	devman_handle_t devh = ipc_get_arg1(icall);
+	ddf_fun_t *fun;
+	link_t *link;
+
+	fibril_mutex_lock(&devices_mutex);
+	ddf_dev_t *dev = driver_get_device(devh);
+	if (dev != NULL)
+		dev_add_ref(dev);
+	fibril_mutex_unlock(&devices_mutex);
+
+	if (dev == NULL) {
+		async_answer_0(icall, ENOENT);
+		return;
+	}
+
+	errno_t rc;
+
+	if (driver->driver_ops->dev_quiesce != NULL) {
+		rc = driver->driver_ops->dev_quiesce(dev);
+	} else {
+		/*
+		 * If the driver does not implement quiesce, we will
+		 * simply request all subordinate functions to quiesce.
+		 */
+		fibril_mutex_lock(&functions_mutex);
+		link = list_first(&functions);
+		while (link != NULL) {
+			fun = list_get_instance(link, ddf_fun_t, link);
+			if (fun->dev == dev)
+				ddf_fun_quiesce(fun);
+			link = list_next(link, &functions);
+		}
+		fibril_mutex_unlock(&functions_mutex);
+		rc = EOK;
+	}
+
+	dev_del_ref(dev);
+	async_answer_0(icall, rc);
+}
+
 static void driver_fun_online(ipc_call_t *icall)
 {
@@ -357,4 +399,7 @@
 		case DRIVER_DEV_GONE:
 			driver_dev_gone(&call);
+			break;
+		case DRIVER_DEV_QUIESCE:
+			driver_dev_quiesce(&call);
 			break;
 		case DRIVER_FUN_ONLINE:
@@ -903,4 +948,22 @@
 }
 
+/** Quiesce function.
+ *
+ * @param fun Function to quiesce
+ *
+ * @return EOK on success or an error code
+ *
+ */
+errno_t ddf_fun_quiesce(ddf_fun_t *fun)
+{
+	assert(fun->bound == true);
+
+	errno_t res = devman_drv_fun_quiesce(fun->handle);
+	if (res != EOK)
+		return res;
+
+	return EOK;
+}
+
 /** Add single match ID to inner function.
  *
Index: uspace/lib/drv/include/ddf/driver.h
===================================================================
--- uspace/lib/drv/include/ddf/driver.h	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/lib/drv/include/ddf/driver.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -86,5 +86,5 @@
 /** Generic device driver operations */
 typedef struct driver_ops {
-	/** Callback method for passing a new device to the device driver */
+	/** Ask driver to add a new device */
 	errno_t (*dev_add)(ddf_dev_t *);
 
@@ -94,4 +94,7 @@
 	/** Inform driver a device disappeared */
 	errno_t (*dev_gone)(ddf_dev_t *);
+
+	/** Ask driver to quiesce device (disable interrupts and DMA) */
+	errno_t (*dev_quiesce)(ddf_dev_t *);
 
 	/** Ask driver to online a specific function */
@@ -129,4 +132,5 @@
 extern errno_t ddf_fun_online(ddf_fun_t *);
 extern errno_t ddf_fun_offline(ddf_fun_t *);
+extern errno_t ddf_fun_quiesce(ddf_fun_t *);
 extern errno_t ddf_fun_add_match_id(ddf_fun_t *, const char *, int);
 extern void ddf_fun_set_ops(ddf_fun_t *, const ddf_dev_ops_t *);
Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty
@@ -101,4 +102,7 @@
 	/** HC is gone. */
 	int (*hc_gone)(hc_device_t *);
+
+	/** Quiesce HC. */
+	int (*hc_quiesce)(hc_device_t *);
 } hc_driver_t;
 
Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/lib/usbhost/src/hcd.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Jan Vesely
  * Copyright (c) 2018 Ondrej Hlavaty
@@ -58,4 +59,5 @@
 int hc_dev_remove(ddf_dev_t *);
 int hc_dev_gone(ddf_dev_t *);
+int hc_dev_quiesce(ddf_dev_t *);
 int hc_fun_online(ddf_fun_t *);
 int hc_fun_offline(ddf_fun_t *);
@@ -65,4 +67,5 @@
 	.dev_remove = hc_dev_remove,
 	.dev_gone = hc_dev_gone,
+	.dev_quiesce = hc_dev_quiesce,
 	.fun_online = hc_fun_online,
 	.fun_offline = hc_fun_offline,
@@ -358,4 +361,15 @@
 }
 
+errno_t hc_dev_quiesce(ddf_dev_t *dev)
+{
+	errno_t err = ENOTSUP;
+	hc_device_t *hcd = dev_to_hcd(dev);
+
+	if (hc_driver->hc_quiesce)
+		err = hc_driver->hc_quiesce(hcd);
+
+	return err;
+}
+
 errno_t hc_fun_online(ddf_fun_t *fun)
 {
Index: uspace/srv/devman/client_conn.c
===================================================================
--- uspace/srv/devman/client_conn.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/srv/devman/client_conn.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,5 +1,5 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2010 Lenka Trochtova
- * Copyright (c) 2013 Jiri Svoboda
  * All rights reserved.
  *
@@ -479,4 +479,39 @@
 }
 
+/** Quiesce function.
+ *
+ * Send a request to quiesce a function to the responsible driver.
+ */
+static void devman_fun_quiesce(ipc_call_t *icall)
+{
+	fun_node_t *fun;
+	dev_node_t *child;
+	errno_t rc;
+
+	fun = find_fun_node(&device_tree, ipc_get_arg1(icall));
+	if (fun == NULL) {
+		async_answer_0(icall, ENOENT);
+		return;
+	}
+
+	fibril_rwlock_read_lock(&device_tree.rwlock);
+
+	/* Check function state */
+	if (fun->state == FUN_REMOVED) {
+		fibril_rwlock_read_unlock(&device_tree.rwlock);
+		async_answer_0(icall, ENOENT);
+		return;
+	}
+
+	child = fun->child;
+	dev_add_ref(child);
+	fibril_rwlock_read_unlock(&device_tree.rwlock);
+
+	rc = driver_dev_quiesce(&device_tree, child);
+	fun_del_ref(fun);
+
+	async_answer_0(icall, rc);
+}
+
 /** Find handle for the function instance identified by its service ID. */
 static void devman_fun_sid_to_handle(ipc_call_t *icall)
@@ -790,4 +825,7 @@
 			devman_fun_offline(&call);
 			break;
+		case DEVMAN_FUN_QUIESCE:
+			devman_fun_quiesce(&call);
+			break;
 		case DEVMAN_FUN_SID_TO_HANDLE:
 			devman_fun_sid_to_handle(&call);
Index: uspace/srv/devman/driver.c
===================================================================
--- uspace/srv/devman/driver.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/srv/devman/driver.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -741,4 +741,27 @@
 }
 
+errno_t driver_dev_quiesce(dev_tree_t *tree, dev_node_t *dev)
+{
+	async_exch_t *exch;
+	errno_t retval;
+	driver_t *drv;
+	devman_handle_t handle;
+
+	assert(dev != NULL);
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "driver_dev_quiesce(%p)", dev);
+
+	fibril_rwlock_read_lock(&tree->rwlock);
+	drv = dev->drv;
+	handle = dev->handle;
+	fibril_rwlock_read_unlock(&tree->rwlock);
+
+	exch = async_exchange_begin(drv->sess);
+	retval = async_req_1_0(exch, DRIVER_DEV_QUIESCE, handle);
+	async_exchange_end(exch);
+
+	return retval;
+}
+
 errno_t driver_dev_gone(dev_tree_t *tree, dev_node_t *dev)
 {
Index: uspace/srv/devman/driver.h
===================================================================
--- uspace/srv/devman/driver.h	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/srv/devman/driver.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,5 +1,5 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2010 Lenka Trochtova
- * Copyright (c) 2013 Jiri Svoboda
  * All rights reserved.
  *
@@ -53,4 +53,5 @@
 extern void add_device(driver_t *, dev_node_t *, dev_tree_t *);
 extern errno_t driver_dev_remove(dev_tree_t *, dev_node_t *);
+extern errno_t driver_dev_quiesce(dev_tree_t *, dev_node_t *);
 extern errno_t driver_dev_gone(dev_tree_t *, dev_node_t *);
 extern errno_t driver_fun_online(dev_tree_t *, fun_node_t *);
Index: uspace/srv/devman/drv_conn.c
===================================================================
--- uspace/srv/devman/drv_conn.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/srv/devman/drv_conn.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -444,4 +444,42 @@
 
 	rc = fun_offline(fun);
+	if (rc != EOK) {
+		fun_busy_unlock(fun);
+		fun_del_ref(fun);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	fun_busy_unlock(fun);
+	fun_del_ref(fun);
+	async_answer_0(icall, EOK);
+}
+
+/** Quiesce function by driver request.
+ *
+ */
+static void devman_drv_fun_quiesce(ipc_call_t *icall, driver_t *drv)
+{
+	fun_node_t *fun;
+	errno_t rc;
+
+	fun = find_fun_node(&device_tree, ipc_get_arg1(icall));
+	if (fun == NULL) {
+		async_answer_0(icall, ENOENT);
+		return;
+	}
+
+	fun_busy_lock(fun);
+
+	fibril_rwlock_write_lock(&device_tree.rwlock);
+	if (fun->dev == NULL || fun->dev->drv != drv) {
+		fun_busy_unlock(fun);
+		fun_del_ref(fun);
+		async_answer_0(icall, ENOENT);
+		return;
+	}
+	fibril_rwlock_write_unlock(&device_tree.rwlock);
+
+	rc = fun_quiesce(fun);
 	if (rc != EOK) {
 		fun_busy_unlock(fun);
@@ -677,4 +715,7 @@
 			devman_drv_fun_offline(&call, driver);
 			break;
+		case DEVMAN_DRV_FUN_QUIESCE:
+			devman_drv_fun_quiesce(&call, driver);
+			break;
 		case DEVMAN_DRV_FUN_WAIT_STABLE:
 			devman_drv_fun_wait_stable(&call, driver);
Index: uspace/srv/devman/fun.c
===================================================================
--- uspace/srv/devman/fun.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/srv/devman/fun.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2010 Lenka Trochtova
  * All rights reserved.
@@ -428,4 +429,61 @@
 }
 
+errno_t fun_quiesce(fun_node_t *fun)
+{
+	errno_t rc;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "fun_quiesce(%s)", fun->pathname);
+	fibril_rwlock_read_lock(&device_tree.rwlock);
+
+	if (fun->state == FUN_OFF_LINE) {
+		fibril_rwlock_read_unlock(&device_tree.rwlock);
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "Function %s is off line.",
+		    fun->pathname);
+		return EOK;
+	}
+
+	if (fun->ftype != fun_inner) {
+		/* Nothing to do */
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "Nothing to do for external "
+		    "function %s\n", fun->pathname);
+		fibril_rwlock_read_unlock(&device_tree.rwlock);
+		return EOK;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "Quiescing inner function %s.",
+	    fun->pathname);
+
+	if (fun->child == NULL) {
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "Function %s child is NULL.",
+		    fun->pathname);
+		fibril_rwlock_read_unlock(&device_tree.rwlock);
+		return EOK;
+	}
+
+	dev_node_t *dev = fun->child;
+	device_state_t dev_state;
+
+	dev_add_ref(dev);
+	dev_state = dev->state;
+
+	fibril_rwlock_read_unlock(&device_tree.rwlock);
+
+	/* If device is owned by driver, ask driver to quiesce it. */
+	if (dev_state == DEVICE_USABLE) {
+		log_msg(LOG_DEFAULT, LVL_DEBUG, "Call driver_dev_quiesce() "
+		    "for %s.", fun->pathname);
+		rc = driver_dev_quiesce(&device_tree, dev);
+		if (rc != EOK) {
+			log_msg(LOG_DEFAULT, LVL_ERROR,
+			    "driver_dev_quiesce() -> %d", (int)rc);
+			dev_del_ref(dev);
+			return ENOTSUP;
+		}
+	}
+
+	dev_del_ref(dev);
+	return EOK;
+}
+
 /** @}
  */
Index: uspace/srv/devman/fun.h
===================================================================
--- uspace/srv/devman/fun.h	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/srv/devman/fun.h	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -1,5 +1,5 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2010 Lenka Trochtova
- * Copyright (c) 2013 Jiri Svoboda
  * All rights reserved.
  *
@@ -51,4 +51,5 @@
 extern errno_t fun_online(fun_node_t *);
 extern errno_t fun_offline(fun_node_t *);
+extern errno_t fun_quiesce(fun_node_t *);
 
 #endif
Index: uspace/srv/system/system.c
===================================================================
--- uspace/srv/system/system.c	(revision f35749ea567f56991e775945db2ae2ded40751e6)
+++ uspace/srv/system/system.c	(revision 8300c7235387052a3ffb96accd6cc6528ea75b5b)
@@ -35,4 +35,5 @@
  */
 
+#include <devman.h>
 #include <fibril.h>
 #include <futil.h>
@@ -522,4 +523,6 @@
 	/* Eject all volumes. */
 
+	log_msg(LOG_DEFAULT, LVL_NOTE, "Ejecting volumes.");
+
 	rc = vol_create(&vol);
 	if (rc != EOK) {
@@ -545,5 +548,19 @@
 
 	free(part_ids);
+	part_ids = NULL;
 	vol_destroy(vol);
+	vol = NULL;
+
+	/* Quiesce the device tree. */
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "Quiescing devices.");
+
+	rc = devman_quiesce_devices("/hw");
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR,
+		    "Failed to quiesce device tree.");
+		goto error;
+	}
+
 	return EOK;
 error:
