Index: uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h
===================================================================
--- uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h	(revision 806d761fabfa1adf9ffb45256e6afcd7160a1ce0)
+++ uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h	(revision 1065785624b01c7c4223433d1f80ed91ad7907e2)
@@ -47,4 +47,6 @@
 extern smenu_entry_t *tbarcfg_smenu_first(tbarcfg_t *);
 extern smenu_entry_t *tbarcfg_smenu_next(smenu_entry_t *);
+extern smenu_entry_t *tbarcfg_smenu_last(tbarcfg_t *);
+extern smenu_entry_t *tbarcfg_smenu_prev(smenu_entry_t *);
 extern const char *smenu_entry_get_caption(smenu_entry_t *);
 extern const char *smenu_entry_get_cmd(smenu_entry_t *);
@@ -57,4 +59,6 @@
     bool, smenu_entry_t **);
 extern errno_t smenu_entry_destroy(smenu_entry_t *);
+extern errno_t smenu_entry_move_up(smenu_entry_t *);
+extern errno_t smenu_entry_move_down(smenu_entry_t *);
 
 #endif
Index: uspace/lib/tbarcfg/src/tbarcfg.c
===================================================================
--- uspace/lib/tbarcfg/src/tbarcfg.c	(revision 806d761fabfa1adf9ffb45256e6afcd7160a1ce0)
+++ uspace/lib/tbarcfg/src/tbarcfg.c	(revision 1065785624b01c7c4223433d1f80ed91ad7907e2)
@@ -101,5 +101,4 @@
  * @return EOK on success or an error code
  */
-#include <stdio.h>
 errno_t tbarcfg_open(const char *repopath, tbarcfg_t **rtbcfg)
 {
@@ -160,6 +159,4 @@
 			terminal = "n";
 
-		printf("terminal=%s\n", terminal);
-
 		rc = smenu_entry_new(tbcfg, nentry, caption, cmd,
 		    str_cmp(terminal, "y") == 0, NULL);
@@ -230,4 +227,36 @@
 }
 
+/** Get last start menu entry.
+ *
+ * @param tbcfg Taskbar configuration
+ * @return Previous entry or @c NULL if the menu is empty
+ */
+smenu_entry_t *tbarcfg_smenu_last(tbarcfg_t *tbcfg)
+{
+	link_t *link;
+
+	link = list_last(&tbcfg->entries);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, smenu_entry_t, lentries);
+}
+
+/** Get previous start menu entry.
+ *
+ * @param cur Current entry
+ * @return Previous entry or @c NULL if @a cur is the last entry
+ */
+smenu_entry_t *tbarcfg_smenu_prev(smenu_entry_t *cur)
+{
+	link_t *link;
+
+	link = list_prev(&cur->lentries, &cur->smenu->entries);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, smenu_entry_t, lentries);
+}
+
 /** Get start menu entry caption.
  *
@@ -317,16 +346,12 @@
 }
 
-/** Save any changes to start menu entry.
- *
- * @param entry Start menu entry
- */
-errno_t smenu_entry_save(smenu_entry_t *entry)
-{
-	sif_trans_t *trans = NULL;
-	errno_t rc;
-
-	rc = sif_trans_begin(entry->smenu->repo, &trans);
-	if (rc != EOK)
-		goto error;
+/** Save start menu entry using transaction.
+ *
+ * @param entry Start menu entry
+ * @param trans Transaction
+ */
+static errno_t smenu_entry_save_trans(smenu_entry_t *entry, sif_trans_t *trans)
+{
+	errno_t rc;
 
 	rc = sif_node_set_attr(trans, entry->nentry, "cmd", entry->cmd);
@@ -340,4 +365,26 @@
 	rc = sif_node_set_attr(trans, entry->nentry, "terminal",
 	    entry->terminal ? "y" : "n");
+	if (rc != EOK)
+		goto error;
+
+	return EOK;
+error:
+	return rc;
+}
+
+/** Save any changes to start menu entry.
+ *
+ * @param entry Start menu entry
+ */
+errno_t smenu_entry_save(smenu_entry_t *entry)
+{
+	sif_trans_t *trans = NULL;
+	errno_t rc;
+
+	rc = sif_trans_begin(entry->smenu->repo, &trans);
+	if (rc != EOK)
+		goto error;
+
+	rc = smenu_entry_save_trans(entry, trans);
 	if (rc != EOK)
 		goto error;
@@ -463,6 +510,5 @@
 		goto error;
 
-	rc = smenu_entry_new(smenu, nentry, caption, cmd, terminal ? "y" : "n",
-	    &entry);
+	rc = smenu_entry_new(smenu, nentry, caption, cmd, terminal, &entry);
 	if (rc != EOK)
 		goto error;
@@ -481,5 +527,5 @@
 }
 
-/** Destroy start menu entry..
+/** Destroy start menu entry.
  *
  * @param entry Start menu entry
@@ -509,4 +555,114 @@
 }
 
+/** Move start menu entry up.
+ *
+ * @param entry Start menu entry
+ * @return EOK on success or an error code
+ */
+errno_t smenu_entry_move_up(smenu_entry_t *entry)
+{
+	errno_t rc;
+	sif_trans_t *trans = NULL;
+	sif_node_t *nnode = NULL;
+	sif_node_t *old_node;
+	smenu_entry_t *prev;
+
+	rc = sif_trans_begin(entry->smenu->repo, &trans);
+	if (rc != EOK)
+		goto error;
+
+	prev = tbarcfg_smenu_prev(entry);
+	if (prev == NULL) {
+		/* Entry is already at first position, nothing to do. */
+		return EOK;
+	}
+
+	rc = sif_node_insert_before(trans, prev->nentry, "entry", &nnode);
+	if (rc != EOK)
+		goto error;
+
+	old_node = entry->nentry;
+	entry->nentry = nnode;
+
+	rc = smenu_entry_save_trans(entry, trans);
+	if (rc != EOK) {
+		entry->nentry = old_node;
+		goto error;
+	}
+
+	sif_node_destroy(trans, old_node);
+
+	rc = sif_trans_end(trans);
+	if (rc != EOK) {
+		entry->nentry = old_node;
+		goto error;
+	}
+
+	list_remove(&entry->lentries);
+	list_insert_before(&entry->lentries, &prev->lentries);
+	return EOK;
+error:
+	if (nnode != NULL)
+		sif_node_destroy(trans, nnode);
+	if (trans != NULL)
+		sif_trans_abort(trans);
+	return rc;
+}
+
+/** Move start menu entry down.
+ *
+ * @param entry Start menu entry
+ * @return EOK on success or an error code
+ */
+errno_t smenu_entry_move_down(smenu_entry_t *entry)
+{
+	errno_t rc;
+	sif_trans_t *trans = NULL;
+	sif_node_t *nnode = NULL;
+	sif_node_t *old_node;
+	smenu_entry_t *next;
+
+	rc = sif_trans_begin(entry->smenu->repo, &trans);
+	if (rc != EOK)
+		goto error;
+
+	next = tbarcfg_smenu_next(entry);
+	if (next == NULL) {
+		/* Entry is already at last position, nothing to do. */
+		return EOK;
+	}
+
+	rc = sif_node_insert_after(trans, next->nentry, "entry", &nnode);
+	if (rc != EOK)
+		goto error;
+
+	old_node = entry->nentry;
+	entry->nentry = nnode;
+
+	rc = smenu_entry_save_trans(entry, trans);
+	if (rc != EOK) {
+		entry->nentry = old_node;
+		goto error;
+	}
+
+	sif_node_destroy(trans, old_node);
+
+	rc = sif_trans_end(trans);
+	if (rc != EOK) {
+		entry->nentry = old_node;
+		goto error;
+	}
+
+	list_remove(&entry->lentries);
+	list_insert_after(&entry->lentries, &next->lentries);
+	return EOK;
+error:
+	if (nnode != NULL)
+		sif_node_destroy(trans, nnode);
+	if (trans != NULL)
+		sif_trans_abort(trans);
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/tbarcfg/test/tbarcfg.c
===================================================================
--- uspace/lib/tbarcfg/test/tbarcfg.c	(revision 806d761fabfa1adf9ffb45256e6afcd7160a1ce0)
+++ uspace/lib/tbarcfg/test/tbarcfg.c	(revision 1065785624b01c7c4223433d1f80ed91ad7907e2)
@@ -101,4 +101,38 @@
 }
 
+/** Iterating over start menu entries backwards */
+PCUT_TEST(last_prev)
+{
+	errno_t rc;
+	tbarcfg_t *tbcfg;
+	char fname[L_tmpnam], *p;
+	smenu_entry_t *e1 = NULL, *e2 = NULL;
+	smenu_entry_t *e;
+
+	p = tmpnam(fname);
+	PCUT_ASSERT_NOT_NULL(p);
+
+	rc = tbarcfg_create(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "A", "a", false, &e1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(e1);
+
+	rc = smenu_entry_create(tbcfg, "B", "b", false, &e2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(e2);
+
+	e = tbarcfg_smenu_last(tbcfg);
+	PCUT_ASSERT_EQUALS(e2, e);
+	e = tbarcfg_smenu_prev(e);
+	PCUT_ASSERT_EQUALS(e1, e);
+	e = tbarcfg_smenu_prev(e);
+	PCUT_ASSERT_NULL(e);
+
+	tbarcfg_close(tbcfg);
+	remove(fname);
+}
+
 /** Getting menu entry properties */
 PCUT_TEST(get_caption_cmd_term)
@@ -274,3 +308,195 @@
 }
 
+/** Move start menu entry up */
+PCUT_TEST(entry_move_up)
+{
+	errno_t rc;
+	tbarcfg_t *tbcfg;
+	char fname[L_tmpnam], *p;
+	smenu_entry_t *e1, *e2, *e3;
+	smenu_entry_t *f;
+	const char *caption;
+	const char *cmd;
+
+	p = tmpnam(fname);
+	PCUT_ASSERT_NOT_NULL(p);
+
+	rc = tbarcfg_create(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "A", "a", false, &e1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "B", "b", false, &e2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "C", "c", false, &e3);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	f = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_EQUALS(e1, f);
+
+	/* Moving the first entry up should have no effect */
+
+	rc = smenu_entry_move_up(e1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	f = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_EQUALS(e1, f);
+
+	/* Moving the second entry up should move it to first position */
+
+	rc = smenu_entry_move_up(e2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	f = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_EQUALS(e2, f);
+
+	/* Moving the last entry up should move it to second position */
+
+	rc = smenu_entry_move_up(e3);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	f = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_EQUALS(e2, f);
+
+	f = tbarcfg_smenu_next(f);
+	PCUT_ASSERT_EQUALS(e3, f);
+
+	f = tbarcfg_smenu_next(f);
+	PCUT_ASSERT_EQUALS(e1, f);
+
+	tbarcfg_close(tbcfg);
+
+	/* Re-open repository */
+
+	rc = tbarcfg_open(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Check that new order of entries persisted */
+
+	f = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_NOT_NULL(f);
+
+	caption = smenu_entry_get_caption(f);
+	PCUT_ASSERT_STR_EQUALS("B", caption);
+	cmd = smenu_entry_get_cmd(f);
+	PCUT_ASSERT_STR_EQUALS("b", cmd);
+
+	f = tbarcfg_smenu_next(f);
+	PCUT_ASSERT_NOT_NULL(f);
+
+	caption = smenu_entry_get_caption(f);
+	PCUT_ASSERT_STR_EQUALS("C", caption);
+	cmd = smenu_entry_get_cmd(f);
+	PCUT_ASSERT_STR_EQUALS("c", cmd);
+
+	f = tbarcfg_smenu_next(f);
+	PCUT_ASSERT_NOT_NULL(f);
+
+	caption = smenu_entry_get_caption(f);
+	PCUT_ASSERT_STR_EQUALS("A", caption);
+	cmd = smenu_entry_get_cmd(f);
+	PCUT_ASSERT_STR_EQUALS("a", cmd);
+
+	tbarcfg_close(tbcfg);
+	remove(fname);
+}
+
+/** Move start menu entry down */
+PCUT_TEST(entry_move_down)
+{
+	errno_t rc;
+	tbarcfg_t *tbcfg;
+	char fname[L_tmpnam], *p;
+	smenu_entry_t *e1, *e2, *e3;
+	smenu_entry_t *f;
+	const char *caption;
+	const char *cmd;
+
+	p = tmpnam(fname);
+	PCUT_ASSERT_NOT_NULL(p);
+
+	rc = tbarcfg_create(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "A", "a", false, &e1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "B", "b", false, &e2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "C", "c", false, &e3);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	f = tbarcfg_smenu_last(tbcfg);
+	PCUT_ASSERT_EQUALS(e3, f);
+
+	/* Moving the last entry down should have no effect */
+
+	rc = smenu_entry_move_down(e3);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	f = tbarcfg_smenu_last(tbcfg);
+	PCUT_ASSERT_EQUALS(e3, f);
+
+	/* Moving the second entry down should move it to last position */
+
+	rc = smenu_entry_move_down(e2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	f = tbarcfg_smenu_last(tbcfg);
+	PCUT_ASSERT_EQUALS(e2, f);
+
+	/* Moving the first entry down should move it to second position */
+
+	rc = smenu_entry_move_down(e1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	f = tbarcfg_smenu_last(tbcfg);
+	PCUT_ASSERT_EQUALS(e2, f);
+
+	f = tbarcfg_smenu_prev(f);
+	PCUT_ASSERT_EQUALS(e1, f);
+
+	f = tbarcfg_smenu_prev(f);
+	PCUT_ASSERT_EQUALS(e3, f);
+
+	tbarcfg_close(tbcfg);
+
+	/* Re-open repository */
+
+	rc = tbarcfg_open(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Check that new order of entries persisted */
+
+	f = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_NOT_NULL(f);
+
+	caption = smenu_entry_get_caption(f);
+	PCUT_ASSERT_STR_EQUALS("C", caption);
+	cmd = smenu_entry_get_cmd(f);
+	PCUT_ASSERT_STR_EQUALS("c", cmd);
+
+	f = tbarcfg_smenu_next(f);
+	PCUT_ASSERT_NOT_NULL(f);
+
+	caption = smenu_entry_get_caption(f);
+	PCUT_ASSERT_STR_EQUALS("A", caption);
+	cmd = smenu_entry_get_cmd(f);
+	PCUT_ASSERT_STR_EQUALS("a", cmd);
+
+	f = tbarcfg_smenu_next(f);
+	PCUT_ASSERT_NOT_NULL(f);
+
+	caption = smenu_entry_get_caption(f);
+	PCUT_ASSERT_STR_EQUALS("B", caption);
+	cmd = smenu_entry_get_cmd(f);
+	PCUT_ASSERT_STR_EQUALS("b", cmd);
+
+	tbarcfg_close(tbcfg);
+	remove(fname);
+}
+
 PCUT_EXPORT(tbarcfg);
Index: uspace/lib/ui/include/ui/list.h
===================================================================
--- uspace/lib/ui/include/ui/list.h	(revision 806d761fabfa1adf9ffb45256e6afcd7160a1ce0)
+++ uspace/lib/ui/include/ui/list.h	(revision 1065785624b01c7c4223433d1f80ed91ad7907e2)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -57,4 +57,6 @@
 extern errno_t ui_list_entry_append(ui_list_t *,
     ui_list_entry_attr_t *, ui_list_entry_t **);
+extern void ui_list_entry_move_up(ui_list_entry_t *);
+extern void ui_list_entry_move_down(ui_list_entry_t *);
 extern void ui_list_entry_delete(ui_list_entry_t *);
 extern void *ui_list_entry_get_arg(ui_list_entry_t *);
Index: uspace/lib/ui/src/list.c
===================================================================
--- uspace/lib/ui/src/list.c	(revision 806d761fabfa1adf9ffb45256e6afcd7160a1ce0)
+++ uspace/lib/ui/src/list.c	(revision 1065785624b01c7c4223433d1f80ed91ad7907e2)
@@ -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.
  *
Index: uspace/lib/ui/test/list.c
===================================================================
--- uspace/lib/ui/test/list.c	(revision 806d761fabfa1adf9ffb45256e6afcd7160a1ce0)
+++ uspace/lib/ui/test/list.c	(revision 1065785624b01c7c4223433d1f80ed91ad7907e2)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -904,4 +904,166 @@
 }
 
+/** ui_list_entry_move_up() moves entry up */
+PCUT_TEST(entry_move_up)
+{
+	ui_t *ui;
+	ui_window_t *window;
+	ui_wnd_params_t params;
+	ui_list_t *list;
+	ui_list_entry_attr_t attr;
+	ui_list_entry_t *e1, *e2, *e3;
+	ui_list_entry_t *e;
+	errno_t rc;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Test";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_list_create(window, true, &list);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_list_entry_attr_init(&attr);
+
+	/* Create entries */
+
+	attr.caption = "a";
+	attr.arg = (void *)1;
+	rc = ui_list_entry_append(list, &attr, &e1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	attr.caption = "b";
+	attr.arg = (void *)2;
+	rc = ui_list_entry_append(list, &attr, &e2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	attr.caption = "c";
+	attr.arg = (void *)3;
+	rc = ui_list_entry_append(list, &attr, &e3);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	e = ui_list_first(list);
+	PCUT_ASSERT_EQUALS(e1, e);
+
+	/* Moving first entry up should have no effect */
+	ui_list_entry_move_up(e1);
+
+	e = ui_list_first(list);
+	PCUT_ASSERT_EQUALS(e1, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_EQUALS(e2, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_EQUALS(e3, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_NULL(e);
+
+	/* Move second entry up */
+	ui_list_entry_move_up(e2);
+
+	e = ui_list_first(list);
+	PCUT_ASSERT_EQUALS(e2, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_EQUALS(e1, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_EQUALS(e3, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_NULL(e);
+
+	ui_list_destroy(list);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** ui_list_entry_move_down() moves entry down */
+PCUT_TEST(entry_move_down)
+{
+	ui_t *ui;
+	ui_window_t *window;
+	ui_wnd_params_t params;
+	ui_list_t *list;
+	ui_list_entry_attr_t attr;
+	ui_list_entry_t *e1, *e2, *e3;
+	ui_list_entry_t *e;
+	errno_t rc;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Test";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_list_create(window, true, &list);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_list_entry_attr_init(&attr);
+
+	/* Create entries */
+
+	attr.caption = "a";
+	attr.arg = (void *)1;
+	rc = ui_list_entry_append(list, &attr, &e1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	attr.caption = "b";
+	attr.arg = (void *)2;
+	rc = ui_list_entry_append(list, &attr, &e2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	attr.caption = "c";
+	attr.arg = (void *)3;
+	rc = ui_list_entry_append(list, &attr, &e3);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	e = ui_list_first(list);
+	PCUT_ASSERT_EQUALS(e1, e);
+
+	/* Moving last entry down should have no effect */
+	ui_list_entry_move_down(e3);
+
+	e = ui_list_first(list);
+	PCUT_ASSERT_EQUALS(e1, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_EQUALS(e2, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_EQUALS(e3, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_NULL(e);
+
+	/* Move second-to-last entry down */
+	ui_list_entry_move_down(e2);
+
+	e = ui_list_first(list);
+	PCUT_ASSERT_EQUALS(e1, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_EQUALS(e3, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_EQUALS(e2, e);
+
+	e = ui_list_next(e);
+	PCUT_ASSERT_NULL(e);
+
+	ui_list_destroy(list);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
 /** ui_list_entry_delete() deletes entry */
 PCUT_TEST(entry_delete)
