Index: uspace/lib/dispcfg/src/dispcfg.c
===================================================================
--- uspace/lib/dispcfg/src/dispcfg.c	(revision 5b19d806b26e4a267739e5ac28bbe9194259b766)
+++ uspace/lib/dispcfg/src/dispcfg.c	(revision a0d4afebd9fe0295936a7a7123fcf78e3770e2b6)
@@ -335,4 +335,44 @@
 	exch = async_exchange_begin(dispcfg->sess);
 	rc = async_req_1_0(exch, DISPCFG_SEAT_DELETE, seat_id);
+
+	async_exchange_end(exch);
+	return rc;
+}
+
+/** Assign device to seat.
+ *
+ * @param dispcfg Display configuration
+ * @param svc_id Device service ID
+ * @param seat_id Seat ID
+ * @return EOK on success or an error code
+ */
+errno_t dispcfg_dev_assign(dispcfg_t *dispcfg, sysarg_t svc_id,
+    sysarg_t seat_id)
+{
+	async_exch_t *exch;
+	errno_t rc;
+
+	exch = async_exchange_begin(dispcfg->sess);
+	rc = async_req_2_0(exch, DISPCFG_DEV_ASSIGN, svc_id, seat_id);
+
+	async_exchange_end(exch);
+	return rc;
+}
+
+/** Unassign device from any specific seat.
+ *
+ * The device will fall back to the default seat.
+ *
+ * @param dispcfg Display configuration
+ * @param svc_id Device service ID
+ * @return EOK on success or an error code
+ */
+errno_t dispcfg_dev_unassign(dispcfg_t *dispcfg, sysarg_t svc_id)
+{
+	async_exch_t *exch;
+	errno_t rc;
+
+	exch = async_exchange_begin(dispcfg->sess);
+	rc = async_req_1_0(exch, DISPCFG_DEV_UNASSIGN, svc_id);
 
 	async_exchange_end(exch);
Index: uspace/lib/dispcfg/src/dispcfg_srv.c
===================================================================
--- uspace/lib/dispcfg/src/dispcfg_srv.c	(revision 5b19d806b26e4a267739e5ac28bbe9194259b766)
+++ uspace/lib/dispcfg/src/dispcfg_srv.c	(revision a0d4afebd9fe0295936a7a7123fcf78e3770e2b6)
@@ -259,4 +259,38 @@
 }
 
+static void dispcfg_dev_assign_srv(dispcfg_srv_t *srv, ipc_call_t *icall)
+{
+	sysarg_t svc_id;
+	sysarg_t seat_id;
+	errno_t rc;
+
+	svc_id = ipc_get_arg1(icall);
+	seat_id = ipc_get_arg2(icall);
+
+	if (srv->ops->dev_assign == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->dev_assign(srv->arg, svc_id, seat_id);
+	async_answer_0(icall, rc);
+}
+
+static void dispcfg_dev_unassign_srv(dispcfg_srv_t *srv, ipc_call_t *icall)
+{
+	sysarg_t svc_id;
+	errno_t rc;
+
+	svc_id = ipc_get_arg1(icall);
+
+	if (srv->ops->dev_unassign == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->dev_unassign(srv->arg, svc_id);
+	async_answer_0(icall, rc);
+}
+
 static void dispcfg_get_event_srv(dispcfg_srv_t *srv, ipc_call_t *icall)
 {
@@ -332,4 +366,10 @@
 		case DISPCFG_SEAT_DELETE:
 			dispcfg_seat_delete_srv(srv, &call);
+			break;
+		case DISPCFG_DEV_ASSIGN:
+			dispcfg_dev_assign_srv(srv, &call);
+			break;
+		case DISPCFG_DEV_UNASSIGN:
+			dispcfg_dev_unassign_srv(srv, &call);
 			break;
 		case DISPCFG_GET_EVENT:
