Index: uspace/srv/hid/display/display.c
===================================================================
--- uspace/srv/hid/display/display.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
+++ uspace/srv/hid/display/display.c	(revision a0d4afebd9fe0295936a7a7123fcf78e3770e2b6)
@@ -796,8 +796,8 @@
 {
 	assert(idevcfg->display == NULL);
-	assert(!link_used(&idevcfg->lidevcfgs));
+	assert(!link_used(&idevcfg->ldispidcfgs));
 
 	idevcfg->display = disp;
-	list_append(&idevcfg->lidevcfgs, &disp->idevcfgs);
+	list_append(&idevcfg->ldispidcfgs, &disp->idevcfgs);
 }
 
@@ -808,5 +808,5 @@
 void ds_display_remove_idevcfg(ds_idevcfg_t *idevcfg)
 {
-	list_remove(&idevcfg->lidevcfgs);
+	list_remove(&idevcfg->ldispidcfgs);
 	idevcfg->display = NULL;
 }
@@ -824,5 +824,5 @@
 		return NULL;
 
-	return list_get_instance(link, ds_idevcfg_t, lidevcfgs);
+	return list_get_instance(link, ds_idevcfg_t, ldispidcfgs);
 }
 
@@ -834,10 +834,10 @@
 ds_idevcfg_t *ds_display_next_idevcfg(ds_idevcfg_t *idevcfg)
 {
-	link_t *link = list_next(&idevcfg->lidevcfgs, &idevcfg->display->idevcfgs);
-
-	if (link == NULL)
-		return NULL;
-
-	return list_get_instance(link, ds_idevcfg_t, lidevcfgs);
+	link_t *link = list_next(&idevcfg->ldispidcfgs, &idevcfg->display->idevcfgs);
+
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, ds_idevcfg_t, ldispidcfgs);
 }
 
Index: uspace/srv/hid/display/idevcfg.c
===================================================================
--- uspace/srv/hid/display/idevcfg.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
+++ uspace/srv/hid/display/idevcfg.c	(revision a0d4afebd9fe0295936a7a7123fcf78e3770e2b6)
@@ -41,4 +41,5 @@
 #include "display.h"
 #include "idevcfg.h"
+#include "seat.h"
 
 /** Create input device configuration entry.
@@ -61,5 +62,5 @@
 
 	idevcfg->svc_id = svc_id;
-	idevcfg->seat = seat;
+	ds_seat_add_idevcfg(seat, idevcfg);
 
 	ds_display_add_idevcfg(display, idevcfg);
@@ -75,4 +76,5 @@
 {
 	ds_display_remove_idevcfg(idevcfg);
+	ds_seat_remove_idevcfg(idevcfg);
 	free(idevcfg);
 }
Index: uspace/srv/hid/display/seat.c
===================================================================
--- uspace/srv/hid/display/seat.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
+++ uspace/srv/hid/display/seat.c	(revision a0d4afebd9fe0295936a7a7123fcf78e3770e2b6)
@@ -43,4 +43,5 @@
 #include "cursor.h"
 #include "display.h"
+#include "idevcfg.h"
 #include "seat.h"
 #include "window.h"
@@ -79,4 +80,6 @@
 	}
 
+	list_initialize(&seat->idevcfgs);
+
 	ds_display_add_seat(display, seat);
 	seat->pntpos.x = 0;
@@ -96,5 +99,15 @@
 void ds_seat_destroy(ds_seat_t *seat)
 {
+	ds_idevcfg_t *idevcfg;
+
+	/* Remove all input device configuration entries pointing to this seat */
+	idevcfg = ds_seat_first_idevcfg(seat);
+	while (idevcfg != NULL) {
+		ds_idevcfg_destroy(idevcfg);
+		idevcfg = ds_seat_first_idevcfg(seat);
+	}
+
 	ds_display_remove_seat(seat);
+
 	free(seat->name);
 	free(seat);
@@ -549,4 +562,58 @@
 }
 
+/** Add input device configuration entry to seat.
+ *
+ * @param seat Seat
+ * @param idevcfg Input device configuration
+ */
+void ds_seat_add_idevcfg(ds_seat_t *seat, ds_idevcfg_t *idevcfg)
+{
+	assert(idevcfg->seat == NULL);
+	assert(!link_used(&idevcfg->lseatidcfgs));
+
+	idevcfg->seat = seat;
+	list_append(&idevcfg->lseatidcfgs, &seat->idevcfgs);
+}
+
+/** Remove input device configuration entry from seat.
+ *
+ * @param idevcfg Input device configuration entry
+ */
+void ds_seat_remove_idevcfg(ds_idevcfg_t *idevcfg)
+{
+	list_remove(&idevcfg->lseatidcfgs);
+	idevcfg->seat = NULL;
+}
+
+/** Get first input device configuration entry in seat.
+ *
+ * @param disp Display
+ * @return First input device configuration entry or @c NULL if there is none
+ */
+ds_idevcfg_t *ds_seat_first_idevcfg(ds_seat_t *seat)
+{
+	link_t *link = list_first(&seat->idevcfgs);
+
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, ds_idevcfg_t, lseatidcfgs);
+}
+
+/** Get next input device configuration entry in seat.
+ *
+ * @param idevcfg Current input device configuration entry
+ * @return Next input device configuration entry or @c NULL if there is none
+ */
+ds_idevcfg_t *ds_seat_next_idevcfg(ds_idevcfg_t *idevcfg)
+{
+	link_t *link = list_next(&idevcfg->lseatidcfgs, &idevcfg->seat->idevcfgs);
+
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, ds_idevcfg_t, lseatidcfgs);
+}
+
 /** @}
  */
Index: uspace/srv/hid/display/seat.h
===================================================================
--- uspace/srv/hid/display/seat.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
+++ uspace/srv/hid/display/seat.h	(revision a0d4afebd9fe0295936a7a7123fcf78e3770e2b6)
@@ -58,4 +58,8 @@
 extern void ds_seat_set_wm_cursor(ds_seat_t *, ds_cursor_t *);
 extern errno_t ds_seat_paint_pointer(ds_seat_t *, gfx_rect_t *);
+extern void ds_seat_add_idevcfg(ds_seat_t *, ds_idevcfg_t *);
+extern void ds_seat_remove_idevcfg(ds_idevcfg_t *);
+extern ds_idevcfg_t *ds_seat_first_idevcfg(ds_seat_t *);
+extern ds_idevcfg_t *ds_seat_next_idevcfg(ds_idevcfg_t *);
 
 #endif
Index: uspace/srv/hid/display/types/display/idevcfg.h
===================================================================
--- uspace/srv/hid/display/types/display/idevcfg.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
+++ uspace/srv/hid/display/types/display/idevcfg.h	(revision a0d4afebd9fe0295936a7a7123fcf78e3770e2b6)
@@ -45,5 +45,7 @@
 	struct ds_display *display;
 	/** Link to display->idevcfgs */
-	link_t lidevcfgs;
+	link_t ldispidcfgs;
+	/** Link to seat->idevcfgs */
+	link_t lseatidcfgs;
 	/** Service ID */
 	service_id_t svc_id;
Index: uspace/srv/hid/display/types/display/seat.h
===================================================================
--- uspace/srv/hid/display/types/display/seat.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
+++ uspace/srv/hid/display/types/display/seat.h	(revision a0d4afebd9fe0295936a7a7123fcf78e3770e2b6)
@@ -52,4 +52,6 @@
 	/** Seat name */
 	char *name;
+	/** Input device configurations mapping to this seat */
+	list_t idevcfgs;
 	/** Window this seat is focused on */
 	struct ds_window *focus;
