Index: uspace/lib/ui/include/ui/paint.h
===================================================================
--- uspace/lib/ui/include/ui/paint.h	(revision d68239a1866f9eae07514ac5246d8925006600dd)
+++ uspace/lib/ui/include/ui/paint.h	(revision 86fff9712bf6c2a6891033ebd6d851fba27dd6ca)
@@ -63,4 +63,6 @@
 extern errno_t ui_paint_right_triangle(gfx_context_t *, gfx_coord2_t *,
     gfx_coord_t);
+extern errno_t ui_paint_cross(gfx_context_t *, gfx_coord2_t *, gfx_coord_t,
+    gfx_coord_t, gfx_coord_t);
 extern errno_t ui_paint_text_box(ui_resource_t *, gfx_rect_t *,
     ui_box_style_t, gfx_color_t *);
Index: uspace/lib/ui/src/checkbox.c
===================================================================
--- uspace/lib/ui/src/checkbox.c	(revision d68239a1866f9eae07514ac5246d8925006600dd)
+++ uspace/lib/ui/src/checkbox.c	(revision 86fff9712bf6c2a6891033ebd6d851fba27dd6ca)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2022 Jiri Svoboda
  * All rights reserved.
  *
@@ -52,4 +52,7 @@
 	checkbox_box_h = 16,
 	checkbox_label_margin = 8,
+	checkbox_cross_n = 5,
+	checkbox_cross_w = 2,
+	checkbox_cross_h = 2
 };
 
@@ -188,14 +191,14 @@
 
 	if (checkbox->checked) {
-		box_center.x = (box_inside.p0.x + box_inside.p1.x) / 2;
-		box_center.y = (box_inside.p0.y + box_inside.p1.y) / 2;
-
-		gfx_text_fmt_init(&fmt);
-		fmt.font = checkbox->res->font;
-		fmt.color = checkbox->res->entry_fg_color;
-		fmt.halign = gfx_halign_center;
-		fmt.valign = gfx_valign_center;
-
-		rc = gfx_puttext(&box_center, &fmt, "X");
+		rc = gfx_set_color(checkbox->res->gc,
+		    checkbox->res->entry_fg_color);
+		if (rc != EOK)
+			goto error;
+
+		box_center.x = (box_inside.p0.x + box_inside.p1.x) / 2 - 1;
+		box_center.y = (box_inside.p0.y + box_inside.p1.y) / 2 - 1;
+
+		rc = ui_paint_cross(checkbox->res->gc, &box_center,
+		    checkbox_cross_n, checkbox_cross_w, checkbox_cross_h);
 		if (rc != EOK)
 			goto error;
Index: uspace/lib/ui/src/paint.c
===================================================================
--- uspace/lib/ui/src/paint.c	(revision d68239a1866f9eae07514ac5246d8925006600dd)
+++ uspace/lib/ui/src/paint.c	(revision 86fff9712bf6c2a6891033ebd6d851fba27dd6ca)
@@ -365,4 +365,5 @@
  * @param pos Center position
  * @param n Length of triangle side
+ * @return EOK on success or an error code
  */
 errno_t ui_paint_up_triangle(gfx_context_t *gc, gfx_coord2_t *pos,
@@ -391,4 +392,5 @@
  * @param pos Center position
  * @param n Length of triangle side
+ * @return EOK on success or an error code
  */
 errno_t ui_paint_down_triangle(gfx_context_t *gc, gfx_coord2_t *pos,
@@ -417,4 +419,5 @@
  * @param pos Center position
  * @param n Length of triangle side
+ * @return EOK on success or an error code
  */
 errno_t ui_paint_left_triangle(gfx_context_t *gc, gfx_coord2_t *pos,
@@ -443,4 +446,5 @@
  * @param pos Center position
  * @param n Length of triangle side
+ * @return EOK on success or an error code
  */
 errno_t ui_paint_right_triangle(gfx_context_t *gc, gfx_coord2_t *pos,
@@ -456,4 +460,65 @@
 		rect.p1.x = pos->x + n / 2 - i + 1;
 		rect.p1.y = pos->y + i + 1;
+		rc = gfx_fill_rect(gc, &rect);
+		if (rc != EOK)
+			return rc;
+	}
+
+	return EOK;
+}
+
+/** Paint diagonal cross (X).
+ *
+ * @param gc Graphic context
+ * @param pos Center position
+ * @param n Length of each leg
+ * @param w Pen width
+ * @param h Pen height
+ * @return EOK on success or an error code
+ */
+errno_t ui_paint_cross(gfx_context_t *gc, gfx_coord2_t *pos,
+    gfx_coord_t n, gfx_coord_t w, gfx_coord_t h)
+{
+	gfx_coord_t i;
+	gfx_rect_t rect;
+	errno_t rc;
+
+	rect.p0.x = pos->x;
+	rect.p0.y = pos->y;
+	rect.p1.x = pos->x + w;
+	rect.p1.y = pos->y + h;
+	rc = gfx_fill_rect(gc, &rect);
+	if (rc != EOK)
+		return rc;
+
+	for (i = 1; i < n; i++) {
+		rect.p0.x = pos->x - i;
+		rect.p0.y = pos->y - i;
+		rect.p1.x = pos->x - i + w;
+		rect.p1.y = pos->y - i + h;
+		rc = gfx_fill_rect(gc, &rect);
+		if (rc != EOK)
+			return rc;
+
+		rect.p0.x = pos->x - i;
+		rect.p0.y = pos->y + i;
+		rect.p1.x = pos->x - i + w;
+		rect.p1.y = pos->y + i + h;
+		rc = gfx_fill_rect(gc, &rect);
+		if (rc != EOK)
+			return rc;
+
+		rect.p0.x = pos->x + i;
+		rect.p0.y = pos->y - i;
+		rect.p1.x = pos->x + i + w;
+		rect.p1.y = pos->y - i + h;
+		rc = gfx_fill_rect(gc, &rect);
+		if (rc != EOK)
+			return rc;
+
+		rect.p0.x = pos->x + i;
+		rect.p0.y = pos->y + i;
+		rect.p1.x = pos->x + i + w;
+		rect.p1.y = pos->y + i + h;
 		rc = gfx_fill_rect(gc, &rect);
 		if (rc != EOK)
Index: uspace/lib/ui/src/wdecor.c
===================================================================
--- uspace/lib/ui/src/wdecor.c	(revision d68239a1866f9eae07514ac5246d8925006600dd)
+++ uspace/lib/ui/src/wdecor.c	(revision 86fff9712bf6c2a6891033ebd6d851fba27dd6ca)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2022 Jiri Svoboda
  * All rights reserved.
  *
@@ -50,7 +50,13 @@
 
 static void ui_wdecor_btn_clicked(ui_pbutton_t *, void *);
+static errno_t ui_wdecor_btn_close_paint(ui_pbutton_t *, void *,
+    gfx_coord2_t *);
 
 static ui_pbutton_cb_t ui_wdecor_btn_close_cb = {
 	.clicked = ui_wdecor_btn_clicked
+};
+
+static ui_pbutton_decor_ops_t ui_wdecor_btn_close_decor_ops = {
+	.paint = ui_wdecor_btn_close_paint
 };
 
@@ -62,5 +68,8 @@
 	wdecor_tbar_h = 22,
 	wdecor_frame_w = 4,
-	wdecor_frame_w_text = 1
+	wdecor_frame_w_text = 1,
+	wdecor_close_cross_n = 5,
+	wdecor_close_cross_w = 2,
+	wdecor_close_cross_h = 1
 };
 
@@ -98,4 +107,7 @@
 	ui_pbutton_set_cb(wdecor->btn_close, &ui_wdecor_btn_close_cb,
 	    (void *)wdecor);
+
+	ui_pbutton_set_decor_ops(wdecor->btn_close,
+	    &ui_wdecor_btn_close_decor_ops, (void *)wdecor);
 
 	wdecor->res = resource;
@@ -647,4 +659,27 @@
 }
 
+/** Paint close button decoration.
+ *
+ * @param pbutton Push button
+ * @param arg Argument (ui_wdecor_t *)
+ * @param pos Center position
+ */
+static errno_t ui_wdecor_btn_close_paint(ui_pbutton_t *pbutton,
+    void *arg, gfx_coord2_t *pos)
+{
+	ui_wdecor_t *wdecor = (ui_wdecor_t *)arg;
+	gfx_coord2_t p;
+	errno_t rc;
+
+	rc = gfx_set_color(wdecor->res->gc, wdecor->res->btn_text_color);
+	if (rc != EOK)
+		return rc;
+
+	p.x = pos->x - 1;
+	p.y = pos->y - 1;
+	return ui_paint_cross(wdecor->res->gc, &p, wdecor_close_cross_n,
+	    wdecor_close_cross_w, wdecor_close_cross_h);
+}
+
 /** @}
  */
Index: uspace/lib/ui/test/paint.c
===================================================================
--- uspace/lib/ui/test/paint.c	(revision d68239a1866f9eae07514ac5246d8925006600dd)
+++ uspace/lib/ui/test/paint.c	(revision 86fff9712bf6c2a6891033ebd6d851fba27dd6ca)
@@ -332,4 +332,26 @@
 }
 
+/** Paint diagonal cross (X) */
+PCUT_TEST(cross)
+{
+	errno_t rc;
+	gfx_context_t *gc = NULL;
+	test_gc_t tgc;
+	gfx_coord2_t center;
+
+	memset(&tgc, 0, sizeof(tgc));
+	rc = gfx_context_new(&ops, &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	center.x = 0;
+	center.y = 0;
+
+	rc = ui_paint_cross(gc, &center, 5, 1, 2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
 /** Paint text box */
 PCUT_TEST(text_box)
