Index: uspace/lib/ui/src/ui.c
===================================================================
--- uspace/lib/ui/src/ui.c	(revision b1f0a141d37cd3a919a708e87dbff0bd6527788e)
+++ uspace/lib/ui/src/ui.c	(revision e846bec09622fa9fc4533e50f14c82898f0558c9)
@@ -338,5 +338,7 @@
 	switch (event->type) {
 	case CEV_KEY:
+		ui_lock(ui);
 		ui_window_send_kbd(awnd, &event->ev.key);
+		ui_unlock(ui);
 		break;
 	case CEV_POS:
@@ -348,6 +350,9 @@
 		claim = ui_wdecor_pos_event(awnd->wdecor, &pos);
 		/* Note: If event is claimed, awnd might not be valid anymore */
-		if (claim == ui_unclaimed)
+		if (claim == ui_unclaimed) {
+			ui_lock(ui);
 			ui_window_send_pos(awnd, &pos);
+			ui_unlock(ui);
+		}
 
 		break;
@@ -454,9 +459,20 @@
 errno_t ui_suspend(ui_t *ui)
 {
-	if (ui->cgc == NULL)
+	errno_t rc;
+
+	assert(!ui->suspended);
+
+	if (ui->cgc == NULL) {
+		ui->suspended = true;
 		return EOK;
+	}
 
 	(void) console_set_caption(ui->console, "");
-	return console_gc_suspend(ui->cgc);
+	rc = console_gc_suspend(ui->cgc);
+	if (rc != EOK)
+		return rc;
+
+	ui->suspended = true;
+	return EOK;
 }
 
@@ -477,6 +493,10 @@
 	cons_event_t ev;
 
-	if (ui->cgc == NULL)
+	assert(ui->suspended);
+
+	if (ui->cgc == NULL) {
+		ui->suspended = false;
 		return EOK;
+	}
 
 	rc = console_get_pos(ui->console, &col, &row);
@@ -510,9 +530,25 @@
 		return rc;
 
+	ui->suspended = false;
+
 	awnd = ui_window_get_active(ui);
 	if (awnd != NULL)
 		(void) console_set_caption(ui->console, awnd->wdecor->caption);
 
-	return gfx_cursor_set_visible(console_gc_get_ctx(ui->cgc), false);
+	rc = gfx_cursor_set_visible(console_gc_get_ctx(ui->cgc), false);
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
+/** Determine if UI is suspended.
+ *
+ * @param ui UI
+ * @return @c true iff UI is suspended
+ */
+bool ui_is_suspended(ui_t *ui)
+{
+	return ui->suspended;
 }
 
