Index: uspace/app/uidemo/uidemo.c
===================================================================
--- uspace/app/uidemo/uidemo.c	(revision 5e109e1dede8ff8cce30393b718b30ae302b32b1)
+++ uspace/app/uidemo/uidemo.c	(revision 307d4d20c1a64a4569fcf5d6ff9920ddb15ac560)
@@ -229,5 +229,4 @@
 }
 
-
 /** File/load menu entry selected.
  *
@@ -717,8 +716,16 @@
 	ui_checkbox_set_cb(demo.checkbox, &checkbox_cb, (void *) &demo);
 
-	rect.p0.x = 15;
-	rect.p0.y = 190;
-	rect.p1.x = 140;
-	rect.p1.y = 210;
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 20;
+		rect.p0.y = 12;
+		rect.p1.x = 40;
+		rect.p1.y = 13;
+	} else {
+		rect.p0.x = 15;
+		rect.p0.y = 190;
+		rect.p1.x = 140;
+		rect.p1.y = 210;
+	}
 	ui_checkbox_set_rect(demo.checkbox, &rect);
 
Index: uspace/lib/ui/private/checkbox.h
===================================================================
--- uspace/lib/ui/private/checkbox.h	(revision 5e109e1dede8ff8cce30393b718b30ae302b32b1)
+++ uspace/lib/ui/private/checkbox.h	(revision 307d4d20c1a64a4569fcf5d6ff9920ddb15ac560)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -66,4 +66,7 @@
 };
 
+extern errno_t ui_checkbox_paint_gfx(ui_checkbox_t *);
+extern errno_t ui_checkbox_paint_text(ui_checkbox_t *);
+
 #endif
 
Index: uspace/lib/ui/src/checkbox.c
===================================================================
--- uspace/lib/ui/src/checkbox.c	(revision 5e109e1dede8ff8cce30393b718b30ae302b32b1)
+++ uspace/lib/ui/src/checkbox.c	(revision 307d4d20c1a64a4569fcf5d6ff9920ddb15ac560)
@@ -146,10 +146,10 @@
 }
 
-/** Paint check box.
+/** Paint check box in graphics mode.
  *
  * @param checkbox Check box
  * @return EOK on success or an error code
  */
-errno_t ui_checkbox_paint(ui_checkbox_t *checkbox)
+errno_t ui_checkbox_paint_gfx(ui_checkbox_t *checkbox)
 {
 	gfx_coord2_t pos;
@@ -222,4 +222,65 @@
 error:
 	return rc;
+}
+
+/** Paint check box in text mode.
+ *
+ * @param checkbox Check box
+ * @return EOK on success or an error code
+ */
+errno_t ui_checkbox_paint_text(ui_checkbox_t *checkbox)
+{
+	gfx_coord2_t pos;
+	gfx_text_fmt_t fmt;
+	bool depressed;
+	errno_t rc;
+
+	/* Paint checkbox */
+
+	depressed = checkbox->held && checkbox->inside;
+
+	pos.x = checkbox->rect.p0.x;
+	pos.y = checkbox->rect.p0.y;
+
+	gfx_text_fmt_init(&fmt);
+	fmt.color = depressed ? checkbox->res->entry_act_bg_color :
+	    checkbox->res->wnd_text_color;
+	fmt.halign = gfx_halign_left;
+	fmt.valign = gfx_valign_top;
+
+	rc = gfx_puttext(checkbox->res->font, &pos, &fmt,
+	    checkbox->checked ? "[X]" : "[ ]");
+	if (rc != EOK)
+		goto error;
+
+	/* Paint checkbox label */
+
+	pos.x += 4;
+	fmt.color = checkbox->res->wnd_text_color;
+
+	rc = gfx_puttext(checkbox->res->font, &pos, &fmt, checkbox->caption);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_update(checkbox->res->gc);
+	if (rc != EOK)
+		goto error;
+
+	return EOK;
+error:
+	return rc;
+}
+
+/** Paint check box.
+ *
+ * @param checkbox Check box
+ * @return EOK on success or an error code
+ */
+errno_t ui_checkbox_paint(ui_checkbox_t *checkbox)
+{
+	if (checkbox->res->textmode)
+		return ui_checkbox_paint_text(checkbox);
+	else
+		return ui_checkbox_paint_gfx(checkbox);
 }
 
Index: uspace/lib/ui/test/checkbox.c
===================================================================
--- uspace/lib/ui/test/checkbox.c	(revision 5e109e1dede8ff8cce30393b718b30ae302b32b1)
+++ uspace/lib/ui/test/checkbox.c	(revision 307d4d20c1a64a4569fcf5d6ff9920ddb15ac560)
@@ -151,6 +151,6 @@
 }
 
-/** Paint check box */
-PCUT_TEST(paint)
+/** Paint check box in graphics mode */
+PCUT_TEST(paint_gfx)
 {
 	errno_t rc;
@@ -171,5 +171,35 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = ui_checkbox_paint(checkbox);
+	rc = ui_checkbox_paint_gfx(checkbox);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_checkbox_destroy(checkbox);
+	ui_resource_destroy(resource);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** Paint check box in text mode */
+PCUT_TEST(paint_text)
+{
+	errno_t rc;
+	gfx_context_t *gc = NULL;
+	test_gc_t tgc;
+	ui_resource_t *resource = NULL;
+	ui_checkbox_t *checkbox;
+
+	memset(&tgc, 0, sizeof(tgc));
+	rc = gfx_context_new(&ops, &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_resource_create(gc, true, &resource);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(resource);
+
+	rc = ui_checkbox_create(resource, "Hello", &checkbox);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_checkbox_paint_text(checkbox);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
