Index: uspace/app/devctl/devctl.c
===================================================================
--- uspace/app/devctl/devctl.c	(revision e5556e4a11175054df13aab078fc6d3c831cc8c2)
+++ uspace/app/devctl/devctl.c	(revision 43dd8028069d3f1680a1f7a3f3ad25488e4fe07f)
@@ -199,4 +199,24 @@
 }
 
+static int drv_load(const char *drvname)
+{
+	int rc;
+	devman_handle_t drvh;
+
+	rc = devman_driver_get_handle(drvname, &drvh);
+	if (rc != EOK) {
+		printf("Failed resolving driver '%s' (%d).\n", drvname, rc);
+		return rc;
+	}
+
+	rc = devman_driver_load(drvh);
+	if (rc != EOK) {
+		printf("Failed loading driver '%s' (%d).\n", drvname, rc);
+		return rc;
+	}
+
+	return EOK;
+}
+
 static void print_syntax(void)
 {
@@ -206,4 +226,5 @@
 	printf("\tdevctl offline <function>]\n");
 	printf("\tdevctl list-drv\n");
+	printf("\tdevctl load-drv <driver-name>\n");
 }
 
@@ -242,4 +263,14 @@
 		if (rc != EOK)
 			return 2;
+	} else if (str_cmp(argv[1], "load-drv") == 0) {
+		if (argc < 3) {
+			printf(NAME ": Argument missing.\n");
+			print_syntax();
+			return 1;
+		}
+
+		rc = drv_load(argv[2]);
+		if (rc != EOK)
+			return 2;
 	} else {
 		printf(NAME ": Invalid argument '%s'.\n", argv[1]);
Index: uspace/lib/c/generic/devman.c
===================================================================
--- uspace/lib/c/generic/devman.c	(revision e5556e4a11175054df13aab078fc6d3c831cc8c2)
+++ uspace/lib/c/generic/devman.c	(revision 43dd8028069d3f1680a1f7a3f3ad25488e4fe07f)
@@ -598,4 +598,39 @@
 }
 
+int devman_driver_get_handle(const char *drvname, devman_handle_t *handle)
+{
+	async_exch_t *exch;
+
+	exch = devman_exchange_begin(DEVMAN_CLIENT);
+	if (exch == NULL)
+		return ENOMEM;
+	
+	ipc_call_t answer;
+	aid_t req = async_send_0(exch, DEVMAN_DRIVER_GET_HANDLE, &answer);
+	sysarg_t retval = async_data_write_start(exch, drvname,
+	    str_size(drvname));
+	
+	devman_exchange_end(exch);
+	
+	if (retval != EOK) {
+		async_forget(req);
+		return retval;
+	}
+	
+	async_wait_for(req, &retval);
+	
+	if (retval != EOK) {
+		if (handle != NULL)
+			*handle = (devman_handle_t) -1;
+		
+		return retval;
+	}
+	
+	if (handle != NULL)
+		*handle = (devman_handle_t) IPC_GET_ARG1(answer);
+	
+	return retval;
+}
+
 int devman_driver_get_name(devman_handle_t handle, char *buf, size_t buf_size)
 {
@@ -622,4 +657,16 @@
 }
 
+int devman_driver_load(devman_handle_t drvh)
+{
+	async_exch_t *exch = devman_exchange_begin(DEVMAN_CLIENT);
+	if (exch == NULL)
+		return ENOMEM;
+	
+	int rc = async_req_1_0(exch, DEVMAN_DRIVER_LOAD, drvh);
+	
+	devman_exchange_end(exch);
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/c/include/devman.h
===================================================================
--- uspace/lib/c/include/devman.h	(revision e5556e4a11175054df13aab078fc6d3c831cc8c2)
+++ uspace/lib/c/include/devman.h	(revision 43dd8028069d3f1680a1f7a3f3ad25488e4fe07f)
@@ -72,6 +72,8 @@
 extern int devman_fun_sid_to_handle(service_id_t, devman_handle_t *);
 extern int devman_get_drivers(devman_handle_t **, size_t *);
+extern int devman_driver_get_handle(const char *, devman_handle_t *);
 extern int devman_driver_get_name(devman_handle_t, char *, size_t);
 extern int devman_driver_get_state(devman_handle_t, driver_state_t *);
+extern int devman_driver_load(devman_handle_t);
 
 #endif
Index: uspace/lib/c/include/ipc/devman.h
===================================================================
--- uspace/lib/c/include/ipc/devman.h	(revision e5556e4a11175054df13aab078fc6d3c831cc8c2)
+++ uspace/lib/c/include/ipc/devman.h	(revision 43dd8028069d3f1680a1f7a3f3ad25488e4fe07f)
@@ -177,6 +177,8 @@
 	DEVMAN_FUN_SID_TO_HANDLE,
 	DEVMAN_GET_DRIVERS,
+	DEVMAN_DRIVER_GET_HANDLE,
 	DEVMAN_DRIVER_GET_NAME,
-	DEVMAN_DRIVER_GET_STATE
+	DEVMAN_DRIVER_GET_STATE,
+	DEVMAN_DRIVER_LOAD
 } client_to_devman_t;
 
Index: uspace/srv/devman/client_conn.c
===================================================================
--- uspace/srv/devman/client_conn.c	(revision e5556e4a11175054df13aab078fc6d3c831cc8c2)
+++ uspace/srv/devman/client_conn.c	(revision 43dd8028069d3f1680a1f7a3f3ad25488e4fe07f)
@@ -450,4 +450,27 @@
 }
 
+/** Find driver by name. */
+static void devman_driver_get_handle(ipc_callid_t iid, ipc_call_t *icall)
+{
+	char *drvname;
+	
+	int rc = async_data_write_accept((void **) &drvname, true, 0, 0, 0, 0);
+	if (rc != EOK) {
+		async_answer_0(iid, rc);
+		return;
+	}
+	
+	driver_t *driver = driver_find_by_name(&drivers_list, drvname);
+	
+	free(drvname);
+	
+	if (driver == NULL) {
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+	
+	async_answer_1(iid, EOK, driver->handle);
+}
+
 /** Get driver name. */
 static void devman_driver_get_name(ipc_callid_t iid, ipc_call_t *icall)
@@ -502,4 +525,23 @@
 	
 	async_answer_1(iid, EOK, (sysarg_t) drv->state);
+}
+
+/** Forcibly load a driver. */
+static void devman_driver_load(ipc_callid_t iid, ipc_call_t *icall)
+{
+	driver_t *drv;
+	int rc;
+	
+	drv = driver_find(&drivers_list, IPC_GET_ARG1(*icall));
+	if (drv == NULL) {
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+	
+	fibril_mutex_lock(&drv->driver_mutex);
+	rc = start_driver(drv) ? EOK : EIO;
+	fibril_mutex_unlock(&drv->driver_mutex);
+
+	async_answer_0(iid, rc);
 }
 
@@ -548,4 +590,7 @@
 			devman_get_drivers(callid, &call);
 			break;
+		case DEVMAN_DRIVER_GET_HANDLE:
+			devman_driver_get_handle(callid, &call);
+			break;
 		case DEVMAN_DRIVER_GET_NAME:
 			devman_driver_get_name(callid, &call);
@@ -553,4 +598,7 @@
 		case DEVMAN_DRIVER_GET_STATE:
 			devman_driver_get_state(callid, &call);
+			break;
+		case DEVMAN_DRIVER_LOAD:
+			devman_driver_load(callid, &call);
 			break;
 		default:
