Index: uspace/lib/ui/include/types/ui/pbutton.h
===================================================================
--- uspace/lib/ui/include/types/ui/pbutton.h	(revision 39f67f157a66addf10fa7890f6808b158395c215)
+++ uspace/lib/ui/include/types/ui/pbutton.h	(revision b769ca098d928f48269bb338ea242585b13783e8)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -56,8 +56,9 @@
 } ui_pbutton_cb_t;
 
-/** Push button decoration ops */
-typedef struct ui_pbutton_decor_ops {
-	errno_t (*paint)(ui_pbutton_t *, void *, gfx_coord2_t *);
-} ui_pbutton_decor_ops_t;
+/** Push button ops */
+typedef struct ui_pbutton_ops {
+	errno_t (*decor_paint)(ui_pbutton_t *, void *, gfx_coord2_t *);
+	errno_t (*paint)(ui_pbutton_t *, void *);
+} ui_pbutton_ops_t;
 
 #endif
Index: uspace/lib/ui/include/ui/pbutton.h
===================================================================
--- uspace/lib/ui/include/ui/pbutton.h	(revision 39f67f157a66addf10fa7890f6808b158395c215)
+++ uspace/lib/ui/include/ui/pbutton.h	(revision b769ca098d928f48269bb338ea242585b13783e8)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -51,5 +51,5 @@
 extern ui_control_t *ui_pbutton_ctl(ui_pbutton_t *);
 extern void ui_pbutton_set_cb(ui_pbutton_t *, ui_pbutton_cb_t *, void *);
-extern void ui_pbutton_set_decor_ops(ui_pbutton_t *, ui_pbutton_decor_ops_t *,
+extern void ui_pbutton_set_ops(ui_pbutton_t *, ui_pbutton_ops_t *,
     void *);
 extern void ui_pbutton_set_flags(ui_pbutton_t *, ui_pbutton_flags_t);
Index: uspace/lib/ui/private/pbutton.h
===================================================================
--- uspace/lib/ui/private/pbutton.h	(revision 39f67f157a66addf10fa7890f6808b158395c215)
+++ uspace/lib/ui/private/pbutton.h	(revision b769ca098d928f48269bb338ea242585b13783e8)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -55,8 +55,8 @@
 	/** Callback argument */
 	void *arg;
-	/** Custom decoration ops or @c NULL */
-	struct ui_pbutton_decor_ops *decor_ops;
-	/** Decoration argument */
-	void *decor_arg;
+	/** Custom ops or @c NULL */
+	struct ui_pbutton_ops *ops;
+	/** Ops argument */
+	void *ops_arg;
 	/** Push button rectangle */
 	gfx_rect_t rect;
Index: uspace/lib/ui/src/pbutton.c
===================================================================
--- uspace/lib/ui/src/pbutton.c	(revision 39f67f157a66addf10fa7890f6808b158395c215)
+++ uspace/lib/ui/src/pbutton.c	(revision b769ca098d928f48269bb338ea242585b13783e8)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -142,15 +142,17 @@
 }
 
-/** Set push button decoration ops.
- *
- * @param pbutton Push button
- * @param ops Push button decoration callbacks
+/** Set push button ops.
+ *
+ * These allow overriding the function for painting the button or
+ * painting the button decoration.
+ *
+ * @param pbutton Push button
+ * @param ops Push button ops
  * @param arg Decoration ops argument
  */
-void ui_pbutton_set_decor_ops(ui_pbutton_t *pbutton,
-    ui_pbutton_decor_ops_t *ops, void *arg)
-{
-	pbutton->decor_ops = ops;
-	pbutton->decor_arg = arg;
+void ui_pbutton_set_ops(ui_pbutton_t *pbutton, ui_pbutton_ops_t *ops, void *arg)
+{
+	pbutton->ops = ops;
+	pbutton->ops_arg = arg;
 }
 
@@ -379,7 +381,7 @@
 	}
 
-	if (pbutton->decor_ops != NULL && pbutton->decor_ops->paint != NULL) {
+	if (pbutton->ops != NULL && pbutton->ops->decor_paint != NULL) {
 		/* Custom decoration */
-		rc = pbutton->decor_ops->paint(pbutton, pbutton->decor_arg,
+		rc = pbutton->ops->decor_paint(pbutton, pbutton->ops_arg,
 		    &pos);
 		if (rc != EOK)
@@ -503,8 +505,12 @@
 errno_t ui_pbutton_paint(ui_pbutton_t *pbutton)
 {
-	if (pbutton->res->textmode)
+	if (pbutton->ops != NULL && pbutton->ops->paint != NULL) {
+		/* Custom paint routine */
+		return pbutton->ops->paint(pbutton, pbutton->ops_arg);
+	} else if (pbutton->res->textmode) {
 		return ui_pbutton_paint_text(pbutton);
-	else
+	} else {
 		return ui_pbutton_paint_gfx(pbutton);
+	}
 }
 
Index: uspace/lib/ui/src/scrollbar.c
===================================================================
--- uspace/lib/ui/src/scrollbar.c	(revision 39f67f157a66addf10fa7890f6808b158395c215)
+++ uspace/lib/ui/src/scrollbar.c	(revision b769ca098d928f48269bb338ea242585b13783e8)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -112,6 +112,6 @@
 };
 
-static ui_pbutton_decor_ops_t ui_scrollbar_up_btn_decor_ops = {
-	.paint = ui_scrollbar_up_btn_decor_paint
+static ui_pbutton_ops_t ui_scrollbar_up_btn_ops = {
+	.decor_paint = ui_scrollbar_up_btn_decor_paint
 };
 
@@ -121,6 +121,6 @@
 };
 
-static ui_pbutton_decor_ops_t ui_scrollbar_down_btn_decor_ops = {
-	.paint = ui_scrollbar_down_btn_decor_paint
+static ui_pbutton_ops_t ui_scrollbar_down_btn_ops = {
+	.decor_paint = ui_scrollbar_down_btn_decor_paint
 };
 
@@ -202,6 +202,6 @@
 	    scrollbar);
 
-	ui_pbutton_set_decor_ops(scrollbar->up_btn,
-	    &ui_scrollbar_up_btn_decor_ops, (void *) scrollbar);
+	ui_pbutton_set_ops(scrollbar->up_btn, &ui_scrollbar_up_btn_ops,
+	    (void *)scrollbar);
 
 	ui_pbutton_set_flags(scrollbar->up_btn, ui_pbf_no_text_depress);
@@ -212,8 +212,8 @@
 
 	ui_pbutton_set_cb(scrollbar->down_btn, &ui_scrollbar_down_btn_cb,
-	    (void *) scrollbar);
-
-	ui_pbutton_set_decor_ops(scrollbar->down_btn,
-	    &ui_scrollbar_down_btn_decor_ops, (void *) scrollbar);
+	    (void *)scrollbar);
+
+	ui_pbutton_set_ops(scrollbar->down_btn, &ui_scrollbar_down_btn_ops,
+	    (void *)scrollbar);
 
 	ui_pbutton_set_flags(scrollbar->down_btn, ui_pbf_no_text_depress);
Index: uspace/lib/ui/src/wdecor.c
===================================================================
--- uspace/lib/ui/src/wdecor.c	(revision 39f67f157a66addf10fa7890f6808b158395c215)
+++ uspace/lib/ui/src/wdecor.c	(revision b769ca098d928f48269bb338ea242585b13783e8)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -66,6 +66,6 @@
 };
 
-static ui_pbutton_decor_ops_t ui_wdecor_btn_min_decor_ops = {
-	.paint = ui_wdecor_btn_min_paint
+static ui_pbutton_ops_t ui_wdecor_btn_min_ops = {
+	.decor_paint = ui_wdecor_btn_min_paint
 };
 
@@ -74,6 +74,6 @@
 };
 
-static ui_pbutton_decor_ops_t ui_wdecor_btn_max_decor_ops = {
-	.paint = ui_wdecor_btn_max_paint
+static ui_pbutton_ops_t ui_wdecor_btn_max_ops = {
+	.decor_paint = ui_wdecor_btn_max_paint
 };
 
@@ -82,6 +82,6 @@
 };
 
-static ui_pbutton_decor_ops_t ui_wdecor_btn_close_decor_ops = {
-	.paint = ui_wdecor_btn_close_paint
+static ui_pbutton_ops_t ui_wdecor_btn_close_ops = {
+	.decor_paint = ui_wdecor_btn_close_paint
 };
 
@@ -175,6 +175,6 @@
 		    (void *)wdecor);
 
-		ui_pbutton_set_decor_ops(wdecor->btn_min,
-		    &ui_wdecor_btn_min_decor_ops, (void *)wdecor);
+		ui_pbutton_set_ops(wdecor->btn_min, &ui_wdecor_btn_min_ops,
+		    (void *)wdecor);
 	}
 
@@ -189,6 +189,6 @@
 		    (void *)wdecor);
 
-		ui_pbutton_set_decor_ops(wdecor->btn_max,
-		    &ui_wdecor_btn_max_decor_ops, (void *)wdecor);
+		ui_pbutton_set_ops(wdecor->btn_max, &ui_wdecor_btn_max_ops,
+		    (void *)wdecor);
 	}
 
@@ -203,6 +203,6 @@
 		    (void *)wdecor);
 
-		ui_pbutton_set_decor_ops(wdecor->btn_close,
-		    &ui_wdecor_btn_close_decor_ops, (void *)wdecor);
+		ui_pbutton_set_ops(wdecor->btn_close, &ui_wdecor_btn_close_ops,
+		    (void *)wdecor);
 	}
 
