Index: uspace/lib/ui/src/list.c
===================================================================
--- uspace/lib/ui/src/list.c	(revision 806d761fabfa1adf9ffb45256e6afcd7160a1ce0)
+++ uspace/lib/ui/src/list.c	(revision 5f3188b820d64bcf193dac312a8069c4e69233ee)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -711,4 +711,82 @@
 }
 
+/** Move UI list entry one position up.
+ *
+ * @parm entry UI list entry
+ */
+void ui_list_entry_move_up(ui_list_entry_t *entry)
+{
+	ui_list_t *list = entry->list;
+	ui_list_entry_t *prev;
+
+	prev = ui_list_prev(entry);
+	if (prev == NULL) {
+		/* Entry is already on first position, nothing to do. */
+		return;
+	}
+
+	list_remove(&entry->lentries);
+	list_insert_before(&entry->lentries, &prev->lentries);
+
+	/* Make sure page stays on the same position/idx as it was before */
+	if (list->page == entry) {
+		list->page = prev;
+	} else if (list->page == prev) {
+		list->page = entry;
+	}
+
+	/*
+	 * Return cursor to the same position/idx as it was before,
+	 * but then move it using ui_list_cursor_move() to the new
+	 * position (this ensures scrolling when needed).
+	 */
+	if (list->cursor == entry) {
+		list->cursor = prev;
+		ui_list_cursor_move(list, entry, list->cursor_idx - 1);
+	} else if (list->cursor == prev) {
+		list->cursor = entry;
+		ui_list_cursor_move(list, prev, list->cursor_idx + 1);
+	}
+}
+
+/** Move UI list entry one position down.
+ *
+ * @parm entry UI list entry
+ */
+void ui_list_entry_move_down(ui_list_entry_t *entry)
+{
+	ui_list_t *list = entry->list;
+	ui_list_entry_t *next;
+
+	next = ui_list_next(entry);
+	if (next == NULL) {
+		/* Entry is already on last position, nothing to do. */
+		return;
+	}
+
+	list_remove(&entry->lentries);
+	list_insert_after(&entry->lentries, &next->lentries);
+
+	/* Make sure page stays on the same position/idx as it was before */
+	if (list->page == entry) {
+		list->page = next;
+	} else if (list->page == next) {
+		list->page = entry;
+	}
+
+	/*
+	 * Return cursor to the same position/idx as it was before,
+	 * but then move it using ui_list_cursor_move() to the new
+	 * position (this ensures scrolling when needed).
+	 */
+	if (list->cursor == entry) {
+		list->cursor = next;
+		ui_list_cursor_move(list, entry, list->cursor_idx + 1);
+	} else if (list->cursor == next) {
+		list->cursor = entry;
+		ui_list_cursor_move(list, next, list->cursor_idx - 1);
+	}
+}
+
 /** Destroy UI list entry.
  *
