Index: uspace/lib/congfx/include/congfx/console.h
===================================================================
--- uspace/lib/congfx/include/congfx/console.h	(revision f59212cc53cffdc02ef17fd2d3891d1d19331fa2)
+++ uspace/lib/congfx/include/congfx/console.h	(revision 39ab17cd9ce258035862dec16670cbcddf765783)
@@ -47,4 +47,6 @@
 extern errno_t console_gc_create(console_ctrl_t *, FILE *, console_gc_t **);
 extern errno_t console_gc_delete(console_gc_t *);
+extern errno_t console_gc_suspend(console_gc_t *);
+extern errno_t console_gc_resume(console_gc_t *);
 extern gfx_context_t *console_gc_get_ctx(console_gc_t *);
 
Index: uspace/lib/congfx/src/console.c
===================================================================
--- uspace/lib/congfx/src/console.c	(revision f59212cc53cffdc02ef17fd2d3891d1d19331fa2)
+++ uspace/lib/congfx/src/console.c	(revision 39ab17cd9ce258035862dec16670cbcddf765783)
@@ -281,4 +281,37 @@
 }
 
+/** Free up console for other users, suspending GC operation.
+ *
+ * @param cgc Console GC
+ * @return EOK on success or an error code
+ */
+errno_t console_gc_suspend(console_gc_t *cgc)
+{
+	console_unmap(cgc->con, cgc->buf);
+	cgc->buf = NULL;
+
+	console_clear(cgc->con);
+	console_cursor_visibility(cgc->con, true);
+	return EOK;
+}
+
+/** Resume GC operation after suspend.
+ *
+ * @param cgc Console GC
+ * @return EOK on success or an error code
+ */ 
+errno_t console_gc_resume(console_gc_t *cgc)
+{
+	errno_t rc;
+
+	console_clear(cgc->con);
+
+	rc = console_map(cgc->con, cgc->rect.p1.x, cgc->rect.p1.y, &cgc->buf);
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
 /** Get generic graphic context from console GC.
  *
Index: uspace/lib/ui/include/ui/ui.h
===================================================================
--- uspace/lib/ui/include/ui/ui.h	(revision f59212cc53cffdc02ef17fd2d3891d1d19331fa2)
+++ uspace/lib/ui/include/ui/ui.h	(revision 39ab17cd9ce258035862dec16670cbcddf765783)
@@ -52,4 +52,6 @@
 extern bool ui_is_textmode(ui_t *);
 extern bool ui_is_fullscreen(ui_t *);
+extern errno_t ui_suspend(ui_t *);
+extern errno_t ui_resume(ui_t *);
 
 #endif
Index: uspace/lib/ui/src/ui.c
===================================================================
--- uspace/lib/ui/src/ui.c	(revision f59212cc53cffdc02ef17fd2d3891d1d19331fa2)
+++ uspace/lib/ui/src/ui.c	(revision 39ab17cd9ce258035862dec16670cbcddf765783)
@@ -40,4 +40,5 @@
 #include <fibril.h>
 #include <gfx/color.h>
+#include <gfx/cursor.h>
 #include <gfx/render.h>
 #include <io/console.h>
@@ -355,4 +356,45 @@
 }
 
+/** Free up console for other users.
+ *
+ * Release console resources for another application (that the current
+ * task is starting). After the other application finishes, resume
+ * operation with ui_resume(). No calls to UI must happen inbetween
+ * and no events must be processed (i.e. the calling function must not
+ * return control to UI.
+ *
+ * @param ui UI
+ * @return EOK on success or an error code
+ */
+errno_t ui_suspend(ui_t *ui)
+{
+	if (ui->cgc == NULL)
+		return EOK;
+
+	return console_gc_suspend(ui->cgc);
+}
+
+/** Resume suspended UI.
+ *
+ * Reclaim console resources (after child application has finished running)
+ * and restore UI operation previously suspended by calling ui_suspend().
+ *
+ * @param ui UI
+ * @return EOK on success or an error code
+ */
+errno_t ui_resume(ui_t *ui)
+{
+	errno_t rc;
+
+	if (ui->cgc == NULL)
+		return EOK;
+
+	rc = console_gc_resume(ui->cgc);
+	if (rc != EOK)
+		return rc;
+
+	return gfx_cursor_set_visible(console_gc_get_ctx(ui->cgc), false);
+}
+
 /** Terminate user interface.
  *
Index: uspace/lib/ui/test/ui.c
===================================================================
--- uspace/lib/ui/test/ui.c	(revision f59212cc53cffdc02ef17fd2d3891d1d19331fa2)
+++ uspace/lib/ui/test/ui.c	(revision 39ab17cd9ce258035862dec16670cbcddf765783)
@@ -67,4 +67,22 @@
 {
 	ui_destroy(NULL);
+}
+
+/** ui_suspend() / ui_resume() do nothing if we don't have a console */
+PCUT_TEST(suspend_resume)
+{
+	ui_t *ui = NULL;
+	errno_t rc;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(ui);
+
+	rc = ui_suspend(ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	rc = ui_resume(ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_destroy(ui);
 }
 
