Index: uspace/app/taskbar/clock.c
===================================================================
--- uspace/app/taskbar/clock.c	(revision 9bec33a84b5a9f9363c4b72dcbca2923f22877fb)
+++ uspace/app/taskbar/clock.c	(revision 983052cc42855347de98acc1f926d82ed26c7a5d)
@@ -322,7 +322,12 @@
 {
 	taskbar_clock_t *clock = (taskbar_clock_t *) arg;
+	ui_t *ui;
+
+	ui = ui_window_get_ui(clock->window);
+	ui_lock(ui);
 
 	fibril_mutex_lock(&clock->lock);
-	(void) taskbar_clock_paint(clock);
+	if (!ui_is_suspended(ui_window_get_ui(clock->window)))
+		(void) taskbar_clock_paint(clock);
 
 	if (!clock->timer_cleanup) {
@@ -336,4 +341,5 @@
 
 	fibril_mutex_unlock(&clock->lock);
+	ui_unlock(ui);
 }
 
Index: uspace/app/taskbar/wndlist.c
===================================================================
--- uspace/app/taskbar/wndlist.c	(revision 9bec33a84b5a9f9363c4b72dcbca2923f22877fb)
+++ uspace/app/taskbar/wndlist.c	(revision 983052cc42855347de98acc1f926d82ed26c7a5d)
@@ -254,5 +254,5 @@
 		wndlist_set_entry_rect(wndlist, entry);
 		if (paint)
-			return ui_pbutton_paint(entry->button);
+			return wndlist_paint_entry(entry);
 	}
 
@@ -320,5 +320,5 @@
 			wndlist_set_entry_rect(wndlist, e);
 			if (paint) {
-				rc = ui_pbutton_paint(e->button);
+				rc = wndlist_paint_entry(e);
 				if (rc != EOK)
 					return rc;
@@ -402,9 +402,9 @@
 	ui_pbutton_set_light(entry->button, active);
 
-	rc = ui_pbutton_paint(entry->button);
+	rc = wndlist_paint_entry(entry);
 	if (rc != EOK)
 		return rc;
 
-	return wndlist_repaint(wndlist);
+	return EOK;
 }
 
@@ -470,20 +470,41 @@
 }
 
-/** Unpaint window list entry.
+/** Paint window list entry.
  *
  * @param entry Window list entry
  * @return EOK on success or an error code
  */
+errno_t wndlist_paint_entry(wndlist_entry_t *entry)
+{
+	ui_t *ui;
+
+	ui = ui_window_get_ui(entry->wndlist->window);
+	if (ui_is_suspended(ui))
+		return EOK;
+
+	return ui_pbutton_paint(entry->button);
+}
+
+/** Unpaint window list entry.
+ *
+ * @param entry Window list entry
+ * @return EOK on success or an error code
+ */
 errno_t wndlist_unpaint_entry(wndlist_entry_t *entry)
 {
 	errno_t rc;
+	ui_t *ui;
 	gfx_context_t *gc;
 	ui_resource_t *res;
 	gfx_color_t *color;
 
+	ui = ui_window_get_ui(entry->wndlist->window);
 	gc = ui_window_get_gc(entry->wndlist->window);
 	res = ui_window_get_res(entry->wndlist->window);
 	color = ui_resource_get_wnd_face_color(res);
 
+	if (ui_is_suspended(ui))
+		return EOK;
+
 	rc = gfx_set_color(gc, color);
 	if (rc != EOK)
@@ -510,5 +531,9 @@
 	wndlist_t *wndlist = (wndlist_t *)arg;
 	wndmgt_window_info_t *winfo = NULL;
+	ui_t *ui;
 	errno_t rc;
+
+	ui = ui_window_get_ui(wndlist->window);
+	ui_lock(ui);
 
 	rc = wndmgt_get_window_info(wndlist->wndmgt, wnd_id, &winfo);
@@ -526,8 +551,10 @@
 
 	wndmgt_free_window_info(winfo);
+	ui_unlock(ui);
 	return;
 error:
 	if (winfo != NULL)
 		wndmgt_free_window_info(winfo);
+	ui_unlock(ui);
 }
 
@@ -541,10 +568,17 @@
 	wndlist_t *wndlist = (wndlist_t *)arg;
 	wndlist_entry_t *entry;
+	ui_t *ui;
+
+	ui = ui_window_get_ui(wndlist->window);
+	ui_lock(ui);
 
 	entry = wndlist_entry_by_id(wndlist, wnd_id);
-	if (entry == NULL)
+	if (entry == NULL) {
+		ui_unlock(ui);
 		return;
+	}
 
 	(void) wndlist_remove(wndlist, entry, true);
+	ui_unlock(ui);
 }
 
@@ -559,17 +593,26 @@
 	wndmgt_window_info_t *winfo = NULL;
 	wndlist_entry_t *entry;
+	ui_t *ui;
 	errno_t rc;
 
+	ui = ui_window_get_ui(wndlist->window);
+	ui_lock(ui);
+
 	entry = wndlist_entry_by_id(wndlist, wnd_id);
-	if (entry == NULL)
+	if (entry == NULL) {
+		ui_unlock(ui);
 		return;
+	}
 
 	rc = wndmgt_get_window_info(wndlist->wndmgt, wnd_id, &winfo);
-	if (rc != EOK)
+	if (rc != EOK) {
+		ui_unlock(ui);
 		return;
+	}
 
 	(void) wndlist_update(wndlist, entry, winfo->caption,
 	    winfo->nfocus != 0);
 	wndmgt_free_window_info(winfo);
+	ui_unlock(ui);
 }
 
@@ -660,4 +703,7 @@
 errno_t wndlist_repaint(wndlist_t *wndlist)
 {
+	if (ui_is_suspended(ui_window_get_ui(wndlist->window)))
+		return EOK;
+
 	return ui_window_paint(wndlist->window);
 }
Index: uspace/app/taskbar/wndlist.h
===================================================================
--- uspace/app/taskbar/wndlist.h	(revision 9bec33a84b5a9f9363c4b72dcbca2923f22877fb)
+++ uspace/app/taskbar/wndlist.h	(revision 983052cc42855347de98acc1f926d82ed26c7a5d)
@@ -63,4 +63,5 @@
 extern size_t wndlist_count(wndlist_t *);
 extern errno_t wndlist_repaint(wndlist_t *);
+extern errno_t wndlist_paint_entry(wndlist_entry_t *);
 extern errno_t wndlist_unpaint_entry(wndlist_entry_t *);
 
Index: uspace/lib/ui/include/ui/ui.h
===================================================================
--- uspace/lib/ui/include/ui/ui.h	(revision 9bec33a84b5a9f9363c4b72dcbca2923f22877fb)
+++ uspace/lib/ui/include/ui/ui.h	(revision 983052cc42855347de98acc1f926d82ed26c7a5d)
@@ -57,4 +57,5 @@
 extern errno_t ui_suspend(ui_t *);
 extern errno_t ui_resume(ui_t *);
+extern bool ui_is_suspended(ui_t *);
 extern void ui_lock(ui_t *);
 extern void ui_unlock(ui_t *);
Index: uspace/lib/ui/private/ui.h
===================================================================
--- uspace/lib/ui/private/ui.h	(revision 9bec33a84b5a9f9363c4b72dcbca2923f22877fb)
+++ uspace/lib/ui/private/ui.h	(revision 983052cc42855347de98acc1f926d82ed26c7a5d)
@@ -61,4 +61,6 @@
 	/** Output owned by UI, clean up when destroying UI */
 	bool myoutput;
+	/** @c true iff UI is suspended */
+	bool suspended;
 	/** @c true if terminating */
 	bool quit;
Index: uspace/lib/ui/src/ui.c
===================================================================
--- uspace/lib/ui/src/ui.c	(revision 9bec33a84b5a9f9363c4b72dcbca2923f22877fb)
+++ uspace/lib/ui/src/ui.c	(revision 983052cc42855347de98acc1f926d82ed26c7a5d)
@@ -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;
 }
 
Index: uspace/lib/ui/test/ui.c
===================================================================
--- uspace/lib/ui/test/ui.c	(revision 9bec33a84b5a9f9363c4b72dcbca2923f22877fb)
+++ uspace/lib/ui/test/ui.c	(revision 983052cc42855347de98acc1f926d82ed26c7a5d)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -69,5 +69,7 @@
 }
 
-/** ui_suspend() / ui_resume() do nothing if we don't have a console */
+/** ui_suspend() / ui_resume() do nothing if we don't have a console,
+ * ui_is_suspended() returns suspend status
+ */
 PCUT_TEST(suspend_resume)
 {
@@ -79,8 +81,15 @@
 	PCUT_ASSERT_NOT_NULL(ui);
 
+	PCUT_ASSERT_FALSE(ui_is_suspended(ui));
+
 	rc = ui_suspend(ui);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_TRUE(ui_is_suspended(ui));
+
 	rc = ui_resume(ui);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_FALSE(ui_is_suspended(ui));
 
 	ui_destroy(ui);
