Index: uspace/app/copy/copy.c
===================================================================
--- uspace/app/copy/copy.c	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/copy/copy.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -161,4 +161,7 @@
 	case fmgt_io_open:
 		fmt = "Error opening %s. (%s)\n";
+		break;
+	case fmgt_io_rename:
+		fmt = "Error renaming %s. (%s)\n";
 		break;
 	}
Index: uspace/app/meson.build
===================================================================
--- uspace/app/meson.build	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/meson.build	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -84,4 +84,5 @@
 	'pkg',
 	'redir',
+	'rename',
 	'sbi',
 	'shutdown',
Index: uspace/app/move/move.c
===================================================================
--- uspace/app/move/move.c	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/move/move.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -161,4 +161,7 @@
 	case fmgt_io_open:
 		fmt = "Error opening %s. (%s)\n";
+		break;
+	case fmgt_io_rename:
+		fmt = "Error renaming %s. (%s)\n";
 		break;
 	}
Index: uspace/app/nav/dlg/copydlg.c
===================================================================
--- uspace/app/nav/dlg/copydlg.c	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/nav/dlg/copydlg.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -186,4 +186,10 @@
 	if (rc != EOK)
 		goto error;
+
+	ui_entry_activate(edest);
+
+	/* Select all */
+	ui_entry_seek_start(edest, false);
+	ui_entry_seek_end(edest, true);
 
 	dialog->edest = edest;
Index: uspace/app/nav/dlg/movedlg.c
===================================================================
--- uspace/app/nav/dlg/movedlg.c	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/nav/dlg/movedlg.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -89,4 +89,5 @@
 	ui_resource_t *ui_res;
 	fmgt_flist_entry_t *entry;
+	int rv;
 	char *tmove = NULL;
 	unsigned count;
@@ -129,9 +130,11 @@
 	if (count == 1) {
 		entry = fmgt_flist_first(flist);
-		rc = asprintf(&tmove, "Move \"%s\" to:",
-		    entry->fname);
-	} else {
-		rc = asprintf(&tmove, "Move %u files/directories to:",
-		    count);
+		rv = asprintf(&tmove, "Move \"%s\" to:", entry->fname);
+		if (rv < 0)
+			goto error;
+	} else {
+		rv = asprintf(&tmove, "Move %u files/directories to:", count);
+		if (rv < 0)
+			goto error;
 	}
 
@@ -186,4 +189,10 @@
 	if (rc != EOK)
 		goto error;
+
+	ui_entry_activate(edest);
+
+	/* Select all */
+	ui_entry_seek_start(edest, false);
+	ui_entry_seek_end(edest, true);
 
 	dialog->edest = edest;
Index: uspace/app/nav/dlg/renamedlg.c
===================================================================
--- uspace/app/nav/dlg/renamedlg.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/nav/dlg/renamedlg.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,390 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/**
+ * @file Rename dialog
+ */
+
+#include <errno.h>
+#include <fmgt.h>
+#include <mem.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <str.h>
+#include <ui/fixed.h>
+#include <ui/label.h>
+#include <ui/pbutton.h>
+#include <ui/resource.h>
+#include <ui/ui.h>
+#include <ui/window.h>
+#include "renamedlg.h"
+
+static void rename_dlg_wnd_close(ui_window_t *, void *);
+static void rename_dlg_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
+
+ui_window_cb_t rename_dlg_wnd_cb = {
+	.close = rename_dlg_wnd_close,
+	.kbd = rename_dlg_wnd_kbd
+};
+
+static void rename_dlg_bok_clicked(ui_pbutton_t *, void *);
+static void rename_dlg_bcancel_clicked(ui_pbutton_t *, void *);
+
+ui_pbutton_cb_t rename_dlg_bok_cb = {
+	.clicked = rename_dlg_bok_clicked
+};
+
+ui_pbutton_cb_t rename_dlg_bcancel_cb = {
+	.clicked = rename_dlg_bcancel_clicked
+};
+
+/** Create Rename dialog.
+ *
+ * @param ui User interface
+ * @param old_path Old path
+ * @param new_name New name
+ * @param rdialog Place to store pointer to new dialog
+ * @return EOK on success or an error code
+ */
+errno_t rename_dlg_create(ui_t *ui, const char *old_path,
+    rename_dlg_t **rdialog)
+{
+	errno_t rc;
+	rename_dlg_t *dialog;
+	ui_window_t *window = NULL;
+	ui_wnd_params_t wparams;
+	ui_fixed_t *fixed = NULL;
+	ui_label_t *label = NULL;
+	ui_entry_t *enew_name = NULL;
+	ui_pbutton_t *bok = NULL;
+	ui_pbutton_t *bcancel = NULL;
+	gfx_rect_t rect;
+	ui_resource_t *ui_res;
+	char *trename = NULL;
+
+	dialog = calloc(1, sizeof(rename_dlg_t));
+	if (dialog == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	dialog->old_path = str_dup(old_path);
+	if (dialog->old_path == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	ui_wnd_params_init(&wparams);
+	wparams.caption = "Rename";
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		wparams.rect.p0.x = 0;
+		wparams.rect.p0.y = 0;
+		wparams.rect.p1.x = 40;
+		wparams.rect.p1.y = 9;
+	} else {
+		wparams.rect.p0.x = 0;
+		wparams.rect.p0.y = 0;
+		wparams.rect.p1.x = 300;
+		wparams.rect.p1.y = 155;
+	}
+
+	rc = ui_window_create(ui, &wparams, &window);
+	if (rc != EOK)
+		goto error;
+
+	ui_window_set_cb(window, &rename_dlg_wnd_cb, dialog);
+
+	ui_res = ui_window_get_res(window);
+
+	rc = ui_fixed_create(&fixed);
+	if (rc != EOK)
+		goto error;
+
+	rc = asprintf(&trename, "Rename \"%s\" to:", old_path);
+
+	rc = ui_label_create(ui_res, trename, &label);
+	if (rc != EOK)
+		goto error;
+
+	free(trename);
+	trename = NULL;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 3;
+		rect.p0.y = 2;
+		rect.p1.x = 17;
+		rect.p1.y = 3;
+	} else {
+		rect.p0.x = 10;
+		rect.p0.y = 35;
+		rect.p1.x = 190;
+		rect.p1.y = 50;
+	}
+
+	ui_label_set_rect(label, &rect);
+
+	rc = ui_fixed_add(fixed, ui_label_ctl(label));
+	if (rc != EOK)
+		goto error;
+
+	label = NULL;
+
+	rc = ui_entry_create(window, old_path, &enew_name);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 3;
+		rect.p0.y = 3;
+		rect.p1.x = 37;
+		rect.p1.y = 4;
+	} else {
+		rect.p0.x = 10;
+		rect.p0.y = 55;
+		rect.p1.x = 290;
+		rect.p1.y = 80;
+	}
+
+	ui_entry_set_rect(enew_name, &rect);
+
+	rc = ui_fixed_add(fixed, ui_entry_ctl(enew_name));
+	if (rc != EOK)
+		goto error;
+
+	ui_entry_activate(enew_name);
+
+	/* Select all */
+	ui_entry_seek_start(enew_name, false);
+	ui_entry_seek_end(enew_name, true);
+
+	dialog->enew_name = enew_name;
+	enew_name = NULL;
+
+	rc = ui_pbutton_create(ui_res, "OK", &bok);
+	if (rc != EOK)
+		goto error;
+
+	ui_pbutton_set_cb(bok, &rename_dlg_bok_cb, dialog);
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 10;
+		rect.p0.y = 6;
+		rect.p1.x = 20;
+		rect.p1.y = 7;
+	} else {
+		rect.p0.x = 55;
+		rect.p0.y = 120;
+		rect.p1.x = 145;
+		rect.p1.y = 148;
+	}
+
+	ui_pbutton_set_rect(bok, &rect);
+
+	ui_pbutton_set_default(bok, true);
+
+	rc = ui_fixed_add(fixed, ui_pbutton_ctl(bok));
+	if (rc != EOK)
+		goto error;
+
+	dialog->bok = bok;
+	bok = NULL;
+
+	rc = ui_pbutton_create(ui_res, "Cancel", &bcancel);
+	if (rc != EOK)
+		goto error;
+
+	ui_pbutton_set_cb(bcancel, &rename_dlg_bcancel_cb, dialog);
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 22;
+		rect.p0.y = 6;
+		rect.p1.x = 32;
+		rect.p1.y = 7;
+	} else {
+		rect.p0.x = 155;
+		rect.p0.y = 120;
+		rect.p1.x = 245;
+		rect.p1.y = 148;
+	}
+
+	ui_pbutton_set_rect(bcancel, &rect);
+
+	rc = ui_fixed_add(fixed, ui_pbutton_ctl(bcancel));
+	if (rc != EOK)
+		goto error;
+
+	dialog->bcancel = bcancel;
+	bcancel = NULL;
+
+	ui_window_add(window, ui_fixed_ctl(fixed));
+	fixed = NULL;
+
+	rc = ui_window_paint(window);
+	if (rc != EOK)
+		goto error;
+
+	dialog->window = window;
+	*rdialog = dialog;
+	return EOK;
+error:
+	if (trename != NULL)
+		free(trename);
+	if (bok != NULL)
+		ui_pbutton_destroy(bok);
+	if (bcancel != NULL)
+		ui_pbutton_destroy(bcancel);
+	if (label != NULL)
+		ui_label_destroy(label);
+	if (fixed != NULL)
+		ui_fixed_destroy(fixed);
+	if (window != NULL)
+		ui_window_destroy(window);
+	if (dialog->old_path != NULL)
+		free(dialog->old_path);
+	if (dialog != NULL)
+		free(dialog);
+	return rc;
+}
+
+/** Destroy rename dialog.
+ *
+ * @param dialog Rename dialog or @c NULL
+ */
+void rename_dlg_destroy(rename_dlg_t *dialog)
+{
+	if (dialog == NULL)
+		return;
+
+	free(dialog->old_path);
+	ui_window_destroy(dialog->window);
+	free(dialog);
+}
+
+/** Set Rename dialog callback.
+ *
+ * @param dialog Rename dialog
+ * @param cb Rename dialog callbacks
+ * @param arg Callback argument
+ */
+void rename_dlg_set_cb(rename_dlg_t *dialog, rename_dlg_cb_t *cb,
+    void *arg)
+{
+	dialog->cb = cb;
+	dialog->arg = arg;
+}
+
+/** Rename dialog window close handler.
+ *
+ * @param window Window
+ * @param arg Argument (rename_dlg_t *)
+ */
+static void rename_dlg_wnd_close(ui_window_t *window, void *arg)
+{
+	rename_dlg_t *dialog = (rename_dlg_t *) arg;
+
+	(void)window;
+	if (dialog->cb != NULL && dialog->cb->close != NULL) {
+		dialog->cb->close(dialog, dialog->arg);
+	}
+}
+
+/** Rename dialog window keyboard event handler.
+ *
+ * @param window Window
+ * @param arg Argument (rename_dlg_t *)
+ * @param event Keyboard event
+ */
+static void rename_dlg_wnd_kbd(ui_window_t *window, void *arg,
+    kbd_event_t *event)
+{
+	rename_dlg_t *dialog = (rename_dlg_t *) arg;
+	const char *new_name;
+
+	if (event->type == KEY_PRESS &&
+	    (event->mods & (KM_CTRL | KM_SHIFT | KM_ALT)) == 0) {
+		if (event->key == KC_ENTER) {
+			/* Confirm */
+			if (dialog->cb != NULL && dialog->cb->bok != NULL) {
+				new_name = ui_entry_get_text(dialog->enew_name);
+				dialog->cb->bok(dialog, dialog->arg, new_name);
+				return;
+			}
+		} else if (event->key == KC_ESCAPE) {
+			/* Cancel */
+			if (dialog->cb != NULL && dialog->cb->bcancel != NULL) {
+				dialog->cb->bcancel(dialog, dialog->arg);
+				return;
+			}
+		}
+	}
+
+	ui_window_def_kbd(window, event);
+}
+
+/** Rename dialog OK button click handler.
+ *
+ * @param pbutton Push button
+ * @param arg Argument (rename_dlg_t *)
+ */
+static void rename_dlg_bok_clicked(ui_pbutton_t *pbutton, void *arg)
+{
+	rename_dlg_t *dialog = (rename_dlg_t *) arg;
+	const char *new_name;
+
+	if (dialog->cb != NULL && dialog->cb->bok != NULL) {
+		new_name = ui_entry_get_text(dialog->enew_name);
+		dialog->cb->bok(dialog, dialog->arg, new_name);
+	}
+}
+
+/** Rename dialog cancel button click handler.
+ *
+ * @param pbutton Push button
+ * @param arg Argument (rename_dlg_t *)
+ */
+static void rename_dlg_bcancel_clicked(ui_pbutton_t *pbutton, void *arg)
+{
+	rename_dlg_t *dialog = (rename_dlg_t *) arg;
+
+	(void)pbutton;
+	if (dialog->cb != NULL && dialog->cb->bcancel != NULL) {
+		dialog->cb->bcancel(dialog, dialog->arg);
+	}
+}
+
+/** @}
+ */
Index: uspace/app/nav/dlg/renamedlg.h
===================================================================
--- uspace/app/nav/dlg/renamedlg.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/nav/dlg/renamedlg.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/**
+ * @file Rename dialog
+ */
+
+#ifndef DLG_RENAMEDLG_H
+#define DLG_RENAMEDLG_H
+
+#include <errno.h>
+#include <fmgt.h>
+#include <types/ui/ui.h>
+#include "../types/dlg/renamedlg.h"
+
+extern errno_t rename_dlg_create(ui_t *, const char *, rename_dlg_t **);
+extern void rename_dlg_set_cb(rename_dlg_t *, rename_dlg_cb_t *,
+    void *);
+extern void rename_dlg_destroy(rename_dlg_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/app/nav/menu.c
===================================================================
--- uspace/app/nav/menu.c	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/nav/menu.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -60,4 +60,5 @@
 	ui_menu_entry_t *mverify;
 	ui_menu_entry_t *mcopy;
+	ui_menu_entry_t *mrename;
 	ui_menu_entry_t *mmove;
 	ui_menu_entry_t *mdelete;
@@ -90,5 +91,5 @@
 	ui_menu_entry_set_cb(mnew, nav_menu_file_new_file, (void *) menu);
 
-	rc = ui_menu_entry_create(mfile, "New Di~r~ectory", "Ctrl-N", &mnewdir);
+	rc = ui_menu_entry_create(mfile, "New D~i~rectory", "Ctrl-N", &mnewdir);
 	if (rc != EOK)
 		goto error;
@@ -119,4 +120,10 @@
 
 	ui_menu_entry_set_cb(mcopy, nav_menu_file_copy, (void *) menu);
+
+	rc = ui_menu_entry_create(mfile, "~R~ename", "Ctrl-R", &mrename);
+	if (rc != EOK)
+		goto error;
+
+	ui_menu_entry_set_cb(mrename, nav_menu_file_rename, (void *) menu);
 
 	rc = ui_menu_entry_create(mfile, "~M~ove", "Ctrl-X", &mmove);
@@ -268,4 +275,17 @@
 }
 
+/** File / Rename menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (navigator_t *)
+ */
+void nav_menu_file_rename(ui_menu_entry_t *mentry, void *arg)
+{
+	nav_menu_t *menu = (nav_menu_t *)arg;
+
+	if (menu->cb != NULL && menu->cb->file_rename != NULL)
+		menu->cb->file_rename(menu->cb_arg);
+}
+
 /** File / Move menu entry selected.
  *
Index: uspace/app/nav/menu.h
===================================================================
--- uspace/app/nav/menu.h	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/nav/menu.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -52,4 +52,5 @@
 extern void nav_menu_file_verify(ui_menu_entry_t *, void *);
 extern void nav_menu_file_copy(ui_menu_entry_t *, void *);
+extern void nav_menu_file_rename(ui_menu_entry_t *, void *);
 extern void nav_menu_file_move(ui_menu_entry_t *, void *);
 extern void nav_menu_file_delete(ui_menu_entry_t *, void *);
Index: uspace/app/nav/meson.build
===================================================================
--- uspace/app/nav/meson.build	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/nav/meson.build	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -37,4 +37,5 @@
 	'dlg/newfiledlg.c',
 	'dlg/progress.c',
+	'dlg/renamedlg.c',
 	'dlg/verifydlg.c',
 	'copy.c',
@@ -47,4 +48,5 @@
 	'newfile.c',
 	'panel.c',
+	'rename.c',
 	'verify.c',
 )
@@ -59,4 +61,5 @@
 	'dlg/newfiledlg.c',
 	'dlg/progress.c',
+	'dlg/renamedlg.c',
 	'dlg/verifydlg.c',
 	'copy.c',
@@ -68,4 +71,5 @@
 	'newfile.c',
 	'panel.c',
+	'rename.c',
 	'verify.c',
 	'test/dlg/copydlg.c',
@@ -77,4 +81,5 @@
 	'test/dlg/newfiledlg.c',
 	'test/dlg/progress.c',
+	'test/dlg/renamedlg.c',
 	'test/dlg/verifydlg.c',
 	'test/main.c',
Index: uspace/app/nav/nav.c
===================================================================
--- uspace/app/nav/nav.c	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/nav/nav.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -59,4 +59,5 @@
 #include "nav.h"
 #include "panel.h"
+#include "rename.h"
 #include "verify.h"
 
@@ -77,4 +78,5 @@
 static void navigator_file_verify(void *);
 static void navigator_file_copy(void *);
+static void navigator_file_rename(void *);
 static void navigator_file_move(void *);
 static void navigator_file_delete(void *);
@@ -88,4 +90,5 @@
 	.file_verify = navigator_file_verify,
 	.file_copy = navigator_file_copy,
+	.file_rename = navigator_file_rename,
 	.file_move = navigator_file_move,
 	.file_delete = navigator_file_delete,
@@ -179,4 +182,7 @@
 			navigator_file_delete((void *)navigator);
 			break;
+		case KC_R:
+			navigator_file_rename((void *)navigator);
+			break;
 		case KC_Q:
 			ui_quit(navigator->ui);
@@ -715,4 +721,21 @@
 	/* flist ownership transferred */
 	navigator_delete_dlg(navigator, flist);
+}
+
+/** File / Rename menu entry selected */
+static void navigator_file_rename(void *arg)
+{
+	navigator_t *navigator = (navigator_t *)arg;
+
+	ui_file_list_entry_t *entry;
+	ui_file_list_entry_attr_t attr;
+	panel_t *panel;
+
+	panel = navigator_get_active_panel(navigator);
+	entry = ui_file_list_get_cursor(panel->flist);
+	ui_file_list_entry_get_attr(entry, &attr);
+
+	/* flist ownership transferred */
+	navigator_rename_dlg(navigator, attr.name);
 }
 
@@ -871,4 +894,7 @@
 		fmt = "Error deleting %s.";
 		break;
+	case fmgt_io_rename:
+		fmt = "Error renaming %s.";
+		break;
 	}
 
Index: uspace/app/nav/rename.c
===================================================================
--- uspace/app/nav/rename.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/nav/rename.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/**
+ * @file Navigator Rename file or directory.
+ */
+
+#include <fmgt.h>
+#include <stdlib.h>
+#include <str_error.h>
+#include <ui/fixed.h>
+#include <ui/filelist.h>
+#include <ui/msgdialog.h>
+#include <ui/resource.h>
+#include <ui/ui.h>
+#include <ui/window.h>
+#include <stdbool.h>
+#include <str.h>
+#include "dlg/renamedlg.h"
+#include "dlg/progress.h"
+#include "menu.h"
+#include "nav.h"
+#include "rename.h"
+#include "types/rename.h"
+
+static void rename_bok(rename_dlg_t *, void *, const char *);
+static void rename_bcancel(rename_dlg_t *, void *);
+static void rename_close(rename_dlg_t *, void *);
+
+static rename_dlg_cb_t rename_cb = {
+	.bok = rename_bok,
+	.bcancel = rename_bcancel,
+	.close = rename_close
+};
+
+static bool rename_abort_query(void *);
+static void rename_progress(void *, fmgt_progress_t *);
+
+static fmgt_cb_t rename_fmgt_cb = {
+	.abort_query = rename_abort_query,
+	.io_error_query = navigator_io_error_query,
+	.progress = rename_progress,
+};
+
+/** Open New Directory dialog.
+ *
+ * @param navigator Navigator
+ * @param old_path Old path
+ */
+void navigator_rename_dlg(navigator_t *navigator, const char *old_path)
+{
+	rename_dlg_t *dlg;
+
+	rename_dlg_create(navigator->ui, old_path, &dlg);
+	rename_dlg_set_cb(dlg, &rename_cb, (void *)navigator);
+}
+
+/** Rename worker function.
+ *
+ * @param arg Argument (navigator_rename_job_t)
+ */
+static void rename_wfunc(void *arg)
+{
+	fmgt_t *fmgt = NULL;
+	navigator_rename_job_t *job = (navigator_rename_job_t *)arg;
+	char *msg = NULL;
+	navigator_t *nav = job->navigator;
+	ui_msg_dialog_t *dialog = NULL;
+	ui_msg_dialog_params_t params;
+	errno_t rc;
+	int rv;
+
+	rc = fmgt_create(&fmgt);
+	if (rc != EOK) {
+		/* out of memory */
+		return;
+	}
+
+	fmgt_set_cb(fmgt, &rename_fmgt_cb, (void *)nav);
+	fmgt_set_init_update(fmgt, true);
+
+	rc = fmgt_rename(fmgt, job->old_path, job->new_name);
+	if (rc != EOK) {
+		rv = asprintf(&msg, "Error creating directory (%s).",
+		    str_error(rc));
+		if (rv < 0)
+			return;
+		goto error;
+	}
+
+	fmgt_destroy(fmgt);
+	ui_lock(nav->ui);
+	progress_dlg_destroy(nav->progress_dlg);
+	navigator_refresh_panels(nav);
+	ui_unlock(nav->ui);
+	free(job);
+	return;
+error:
+	fmgt_destroy(fmgt);
+	ui_lock(nav->ui);
+	progress_dlg_destroy(nav->progress_dlg);
+	navigator_refresh_panels(nav);
+	ui_msg_dialog_params_init(&params);
+	params.caption = "Error";
+	params.text = msg;
+	(void) ui_msg_dialog_create(nav->ui, &params, &dialog);
+	ui_unlock(nav->ui);
+	free(msg);
+}
+
+/** Rename dialog confirmed.
+ *
+ * @param dlg Rename dialog
+ * @param arg Argument (navigator_t *)
+ * @param new_name New name
+ */
+static void rename_bok(rename_dlg_t *dlg, void *arg, const char *new_name)
+{
+	navigator_t *nav = (navigator_t *)arg;
+	ui_msg_dialog_t *dialog = NULL;
+	navigator_rename_job_t *job;
+	ui_msg_dialog_params_t params;
+	progress_dlg_params_t pd_params;
+	char *msg = NULL;
+	errno_t rc;
+
+	job = calloc(1, sizeof(navigator_rename_job_t));
+	if (job == NULL)
+		return;
+
+	job->navigator = nav;
+	job->old_path = str_dup(dlg->old_path);
+	job->new_name = new_name;
+
+	if (job->old_path == NULL) {
+		free(job);
+		return;
+	}
+
+	rename_dlg_destroy(dlg);
+
+	progress_dlg_params_init(&pd_params);
+	pd_params.caption = "Creating new file";
+
+	rc = progress_dlg_create(nav->ui, &pd_params, &nav->progress_dlg);
+	if (rc != EOK) {
+		msg = str_dup("Out of memory.");
+		if (msg == NULL)
+			return;
+		goto error;
+	}
+
+	progress_dlg_set_cb(nav->progress_dlg, &navigator_progress_cb,
+	    (void *)nav);
+
+	rc = navigator_worker_start(nav, rename_wfunc, (void *)job);
+	if (rc != EOK) {
+		msg = str_dup("Out of memory.");
+		if (msg == NULL)
+			return;
+		goto error;
+	}
+
+	return;
+error:
+	ui_msg_dialog_params_init(&params);
+	params.caption = "Error";
+	params.text = msg;
+	(void) ui_msg_dialog_create(nav->ui, &params, &dialog);
+	free(msg);
+}
+
+/** Rename dialog cancelled.
+ *
+ * @param dlg Rename dialog
+ * @param arg Argument (navigator_t *)
+ */
+static void rename_bcancel(rename_dlg_t *dlg, void *arg)
+{
+	(void)arg;
+	rename_dlg_destroy(dlg);
+}
+
+/** Rename dialog closed.
+ *
+ * @param dlg Rename dialog
+ * @param arg Argument (navigator_t *)
+ */
+static void rename_close(rename_dlg_t *dlg, void *arg)
+{
+	(void)arg;
+	rename_dlg_destroy(dlg);
+}
+
+/** Rename abort query.
+ *
+ * @param arg Argument (navigator_t *)
+ * @return @c true iff abort is requested
+ */
+static bool rename_abort_query(void *arg)
+{
+	navigator_t *nav = (navigator_t *)arg;
+
+	return nav->abort_op;
+}
+
+/** Rename progress update.
+ *
+ * @param arg Argument (navigator_t *)
+ * @param progress Progress update
+ */
+static void rename_progress(void *arg, fmgt_progress_t *progress)
+{
+	navigator_t *nav = (navigator_t *)arg;
+
+	progress_dlg_set_progress(nav->progress_dlg, progress);
+}
+
+/** @}
+ */
Index: uspace/app/nav/rename.h
===================================================================
--- uspace/app/nav/rename.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/nav/rename.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/**
+ * @file Navigator Rename file or directory
+ */
+
+#ifndef RENAME_H
+#define RENAME_H
+
+#include "types/nav.h"
+
+extern void navigator_rename_dlg(navigator_t *, const char *);
+
+#endif
+
+/** @}
+ */
Index: uspace/app/nav/test/dlg/renamedlg.c
===================================================================
--- uspace/app/nav/test/dlg/renamedlg.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/nav/test/dlg/renamedlg.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <fmgt.h>
+#include <pcut/pcut.h>
+#include <ui/ui.h>
+#include "../../dlg/renamedlg.h"
+
+PCUT_INIT;
+
+PCUT_TEST_SUITE(renamedlg);
+
+static rename_dlg_cb_t rename_dlg_cb;
+
+/** Create and destroy rename dialog. */
+PCUT_TEST(create_destroy)
+{
+	ui_t *ui;
+	rename_dlg_t *dlg = NULL;
+	errno_t rc;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = rename_dlg_create(ui, "foo", &dlg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(dlg);
+
+	rename_dlg_destroy(dlg);
+
+	ui_destroy(ui);
+}
+
+/** Set callbacks for rename dialog. */
+PCUT_TEST(set_cb)
+{
+	ui_t *ui;
+	rename_dlg_t *dlg = NULL;
+	fmgt_flist_t *flist;
+	errno_t rc;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = fmgt_flist_create(&flist);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = rename_dlg_create(ui, "foo", &dlg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(dlg);
+
+	rename_dlg_set_cb(dlg, &rename_dlg_cb, NULL);
+
+	rename_dlg_destroy(dlg);
+
+	fmgt_flist_destroy(flist);
+	ui_destroy(ui);
+}
+
+PCUT_EXPORT(renamedlg);
Index: uspace/app/nav/types/dlg/renamedlg.h
===================================================================
--- uspace/app/nav/types/dlg/renamedlg.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/nav/types/dlg/renamedlg.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/**
+ * @file Rename dialog
+ */
+
+#ifndef TYPES_DLG_RENAMEDLG_H
+#define TYPES_DLG_RENAMEDLG_H
+
+#include <errno.h>
+#include <fmgt.h>
+#include <ui/entry.h>
+#include <ui/label.h>
+#include <ui/pbutton.h>
+#include <ui/window.h>
+#include <stdbool.h>
+
+/** Rename dialog */
+typedef struct rename_dlg {
+	/** Dialog window */
+	ui_window_t *window;
+	/** "Rename 'xxx'" */
+	ui_label_t *lrename;
+	/** New name text entry */
+	ui_entry_t *enew_name;
+	/** OK button */
+	ui_pbutton_t *bok;
+	/** Cancel button */
+	ui_pbutton_t *bcancel;
+	/** Rename dialog callbacks */
+	struct rename_dlg_cb *cb;
+	/** Callback argument */
+	void *arg;
+	/** Old file path */
+	char *old_path;
+} rename_dlg_t;
+
+/** Rename dialog callbacks */
+typedef struct rename_dlg_cb {
+	/** OK button was pressed */
+	void (*bok)(rename_dlg_t *, void *, const char *);
+	/** Cancel button was pressed */
+	void (*bcancel)(rename_dlg_t *, void *);
+	/** Window closure requested (e.g. via close button) */
+	void (*close)(rename_dlg_t *, void *);
+} rename_dlg_cb_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/app/nav/types/menu.h
===================================================================
--- uspace/app/nav/types/menu.h	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/app/nav/types/menu.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -55,4 +55,6 @@
 	/** File / Copy */
 	void (*file_copy)(void *);
+	/** File / Rename */
+	void (*file_rename)(void *);
 	/** File / Move */
 	void (*file_move)(void *);
Index: uspace/app/nav/types/rename.h
===================================================================
--- uspace/app/nav/types/rename.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/nav/types/rename.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/**
+ * @file Navigator Rename types
+ */
+
+#ifndef TYPES_RENAME_H
+#define TYPES_RENAME_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/** Navigator Rename job */
+typedef struct {
+	/** Navigator */
+	struct navigator *navigator;
+	/** Old path */
+	const char *old_path;
+	/** New name */
+	const char *new_name;
+} navigator_rename_job_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/app/rename/doc/doxygroups.h
===================================================================
--- uspace/app/rename/doc/doxygroups.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/rename/doc/doxygroups.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,4 @@
+/** @addtogroup rename rename
+ * @brief Rename file or directory
+ * @ingroup apps
+ */
Index: uspace/app/rename/meson.build
===================================================================
--- uspace/app/rename/meson.build	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/rename/meson.build	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2026 Jiri Svoboda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# - The name of the author may not be used to endorse or promote products
+#   derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+deps = [ 'clui', 'console', 'fmgt', 'input' ]
+src = files('rename.c')
Index: uspace/app/rename/rename.c
===================================================================
--- uspace/app/rename/rename.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/app/rename/rename.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup rename
+ * @{
+ */
+/** @file Rename file or directory.
+ */
+
+#include <capa.h>
+#include <errno.h>
+#include <fmgt.h>
+#include <io/console.h>
+#include <io/cons_event.h>
+#include <io/kbd_event.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <str.h>
+#include <str_error.h>
+#include <tinput.h>
+
+#define NAME  "rename"
+
+static fmgt_error_action_t rename_io_error_query(void *, fmgt_io_error_t *);
+
+static bool nonint = false;
+static bool quiet = false;
+
+static console_ctrl_t *con;
+
+static fmgt_cb_t rename_fmgt_cb = {
+	.io_error_query = rename_io_error_query
+};
+
+static void print_syntax(void)
+{
+	printf("Create new directory.\n");
+	printf("Syntax: %s [<options] <old-path> [<new-name>]\n", NAME);
+	printf("\t-h           help\n");
+	printf("\t-n           non-interactive\n");
+	printf("\t-q           quiet\n");
+}
+
+/** Called by fmgt to let user choose I/O error recovery action.
+ *
+ * @param arg Argument (not used)
+ * @param err I/O error report
+ * @return Error recovery action.
+ */
+static fmgt_error_action_t rename_io_error_query(void *arg,
+    fmgt_io_error_t *err)
+{
+	cons_event_t event;
+	kbd_event_t *ev;
+	errno_t rc;
+
+	(void)arg;
+
+	if (nonint)
+		return fmgt_er_abort;
+
+	fprintf(stderr, "I/O error renaming '%s' (%s).\n",
+	    err->fname, str_error(err->rc));
+	fprintf(stderr, "[A]bort or [R]etry?\n");
+
+	if (con == NULL)
+		return fmgt_er_abort;
+
+	while (true) {
+		rc = console_get_event(con, &event);
+		if (rc != EOK)
+			return fmgt_er_abort;
+
+		if (event.type == CEV_KEY && event.ev.key.type == KEY_PRESS) {
+			ev = &event.ev.key;
+			if ((ev->mods & KM_ALT) == 0 &&
+			    (ev->mods & KM_CTRL) == 0) {
+				if (ev->c == 'r' || ev->c == 'R')
+					return fmgt_er_retry;
+				if (ev->c == 'a' || ev->c == 'A')
+					return fmgt_er_abort;
+			}
+		}
+
+		if (event.type == CEV_KEY && event.ev.key.type == KEY_PRESS) {
+			ev = &event.ev.key;
+			if ((ev->mods & KM_ALT) == 0 &&
+			    (ev->mods & KM_SHIFT) == 0 &&
+			    (ev->mods & KM_CTRL) != 0) {
+				if (ev->key == KC_C)
+					return fmgt_er_abort;
+			}
+		}
+	}
+}
+
+int main(int argc, char *argv[])
+{
+	fmgt_t *fmgt = NULL;
+	errno_t rc;
+	int i;
+	char *old_path = NULL;
+	char *new_name = NULL;
+	tinput_t *tinput = NULL;
+	const char *base_name;
+
+	con = console_init(stdin, stdout);
+
+	i = 1;
+	while (i < argc && argv[i][0] == '-') {
+		if (str_cmp(argv[i], "-h") == 0) {
+			print_syntax();
+			return 0;
+		} else if (str_cmp(argv[i], "-n") == 0) {
+			++i;
+			nonint = true;
+		} else if (str_cmp(argv[i], "-q") == 0) {
+			++i;
+			quiet = true;
+		} else {
+			printf("Invalid option '%s'.\n", argv[i]);
+			print_syntax();
+			goto error;
+		}
+	}
+
+	/* Need at least old path argument. */
+	if (i >= argc) {
+		print_syntax();
+		goto error;
+	}
+
+	old_path = argv[i++];
+
+	/* Base original file name. */
+	base_name = str_rchr(old_path, '/');
+	if (base_name == NULL)
+		base_name = old_path;
+	else
+		++base_name;
+
+	/* New name? */
+	if (i < argc)
+		new_name = argv[i++];
+
+	if (i < argc) {
+		printf("Unexpected argument.\n");
+		print_syntax();
+		goto error;
+	}
+
+	if (new_name == NULL) {
+		tinput = tinput_new();
+		if (tinput == NULL)
+			goto error;
+		rc = tinput_set_prompt(tinput, "New name: ");
+		if (rc != EOK)
+			goto error;
+		rc = tinput_read_i(tinput, base_name, &new_name);
+		if (rc != EOK)
+			goto error;
+	}
+
+	rc = fmgt_create(&fmgt);
+	if (rc != EOK) {
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	fmgt_set_cb(fmgt, &rename_fmgt_cb, NULL);
+
+	rc = fmgt_rename(fmgt, old_path, new_name);
+	if (rc != EOK) {
+		printf("Error renaming file or directory: %s.\n", str_error(rc));
+		goto error;
+	}
+
+	fmgt_destroy(fmgt);
+	return 0;
+error:
+	if (fmgt != NULL)
+		fmgt_destroy(fmgt);
+	return 1;
+}
+
+/** @}
+ */
Index: uspace/lib/fmgt/include/fmgt.h
===================================================================
--- uspace/lib/fmgt/include/fmgt.h	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/lib/fmgt/include/fmgt.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -48,4 +48,5 @@
 #include "fmgt/newdir.h"
 #include "fmgt/newfile.h"
+#include "fmgt/rename.h"
 #include "fmgt/verify.h"
 #include "fmgt/walk.h"
Index: uspace/lib/fmgt/include/fmgt/rename.h
===================================================================
--- uspace/lib/fmgt/include/fmgt/rename.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/lib/fmgt/include/fmgt/rename.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup fmgt
+ * @{
+ */
+/**
+ * @file
+ * @brief Rename file or directory.
+ */
+
+#ifndef FMGT_RENAME_H
+#define FMGT_RENAME_H
+
+#include <errno.h>
+#include "types/fmgt.h"
+
+extern errno_t fmgt_rename(fmgt_t *, const char *, const char *);
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/fmgt/include/types/fmgt.h
===================================================================
--- uspace/lib/fmgt/include/types/fmgt.h	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/lib/fmgt/include/types/fmgt.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -73,5 +73,7 @@
 	fmgt_io_create,
 	/** Delete */
-	fmgt_io_delete
+	fmgt_io_delete,
+	/** Rename */
+	fmgt_io_rename
 } fmgt_io_op_type_t;
 
Index: uspace/lib/fmgt/meson.build
===================================================================
--- uspace/lib/fmgt/meson.build	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/lib/fmgt/meson.build	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -36,4 +36,5 @@
 	'src/newdir.c',
 	'src/newfile.c',
+	'src/rename.c',
 	'src/verify.c',
 	'src/walk.c'
@@ -49,4 +50,5 @@
 	'test/newdir.c',
 	'test/newfile.c',
+	'test/rename.c',
 	'test/verify.c',
 	'test/walk.c'
Index: uspace/lib/fmgt/private/fsops.h
===================================================================
--- uspace/lib/fmgt/private/fsops.h	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/lib/fmgt/private/fsops.h	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -38,4 +38,5 @@
 #define PRIVATE_FSOPS_H
 
+#include <offset.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -47,4 +48,5 @@
 errno_t fmgt_create_dir(fmgt_t *, const char *, bool);
 errno_t fmgt_remove(fmgt_t *, const char *);
+errno_t fmgt_rename_entry(fmgt_t *, const char *, const char *);
 errno_t fmgt_read(fmgt_t *, int, const char *, aoff64_t *, void *, size_t,
     size_t *);
Index: uspace/lib/fmgt/src/fsops.c
===================================================================
--- uspace/lib/fmgt/src/fsops.c	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/lib/fmgt/src/fsops.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -283,4 +283,37 @@
 }
 
+/** Rename file or directory.
+ *
+ * @param fmgt File management object
+ * @param old_path Original filesystem path
+ * @param new_name New name (does not need to be a full path)
+ * @return EOK on success or an error code
+ */
+errno_t fmgt_rename_entry(fmgt_t *fmgt, const char *old_path,
+    const char *new_name)
+{
+	fmgt_io_error_t err;
+	fmgt_error_action_t action;
+	errno_t rc;
+
+	do {
+		rc = vfs_rename_path(old_path, new_name);
+
+		if (rc == EOK)
+			break;
+
+		/* I/O error */
+		err.fname = old_path;
+		err.optype = fmgt_io_rename;
+		err.rc = rc;
+
+		fmgt_timer_stop(fmgt);
+		action = fmgt_io_error_query(fmgt, &err);
+		fmgt_timer_start(fmgt);
+	} while (action == fmgt_er_retry);
+
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/fmgt/src/rename.c
===================================================================
--- uspace/lib/fmgt/src/rename.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/lib/fmgt/src/rename.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup fmgt
+ * @{
+ */
+/** @file Rename file or directory.
+ */
+
+#include <errno.h>
+
+#include "fmgt.h"
+#include "../private/fmgt.h"
+#include "../private/fsops.h"
+
+/** Rename file or directory.
+ *
+ * @param fmgt File management object
+ * @param old_path Original path
+ * @param new_name New name (does not need to be a full path)
+ * @return EOK on success or an error code
+ */
+errno_t fmgt_rename(fmgt_t *fmgt, const char *old_path, const char *new_name)
+{
+	errno_t rc;
+
+	/* Clear statistics. */
+	fmgt_progress_init(fmgt);
+	fmgt_initial_progress_update(fmgt);
+
+	rc = fmgt_rename_entry(fmgt, old_path, new_name);
+
+	fmgt_final_progress_update(fmgt);
+	return rc;
+}
+
+/** @}
+ */
Index: uspace/lib/fmgt/test/main.c
===================================================================
--- uspace/lib/fmgt/test/main.c	(revision a927af7a94bc0a231b58cf501c89c9a899350c71)
+++ uspace/lib/fmgt/test/main.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -37,4 +37,5 @@
 PCUT_IMPORT(move);
 PCUT_IMPORT(newfile);
+PCUT_IMPORT(rename);
 PCUT_IMPORT(verify);
 PCUT_IMPORT(walk);
Index: uspace/lib/fmgt/test/rename.c
===================================================================
--- uspace/lib/fmgt/test/rename.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
+++ uspace/lib/fmgt/test/rename.c	(revision 96ef0d1ee1d922b46d3abfde10768da513506f70)
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2026 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <fmgt.h>
+#include <pcut/pcut.h>
+#include <stdio.h>
+#include <str.h>
+#include <vfs/vfs.h>
+
+PCUT_INIT;
+
+PCUT_TEST_SUITE(newdir);
+
+#define TEMP_DIR "/tmp"
+
+/** New directory can be created. */
+PCUT_TEST(rename)
+{
+	fmgt_t *fmgt = NULL;
+	char *dname1 = NULL;
+	errno_t rc;
+	int rv;
+
+	rc = vfs_cwd_set(TEMP_DIR);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Suggest unique directory name. */
+	rc = fmgt_new_dir_suggest(&dname1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = fmgt_create(&fmgt);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* See if we can actually create the directory. */
+	rc = fmgt_new_dir(fmgt, dname1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Remove the directory. */
+	rv = remove(dname1);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+
+	free(dname1);
+	fmgt_destroy(fmgt);
+}
+
+PCUT_EXPORT(rename);
